环球电气之家-午夜精彩视频-中国专业电气电子产品行业服务网站!

產品分類

當前位置: 首頁 > 工業電氣產品 > 端子與連接器 > 線路板連接器

類型分類:
科普知識
數據分類:
線路板連接器

西門子S7-200 ModBus從站通訊程序

發布日期:2022-04-17 點擊率:27 品牌:西門子_Siemens

一直看到有些朋友在問ModBus主從站的通訊問題,今天抽空兒給大家發幾篇。

 

事先申明,我是調用的主從站庫,庫本身并不是我編寫的,我沒有那么大的能耐。

 

另外,上位機是用VB編寫,VB本身不是很熟,如果有什么錯誤,請大家海諒。

 

最后,這僅僅只是一個測試程序,如果各位想用到商業方面,還需要各位自己去完善。

 

說明:PLC從站,PC作主站,用ModBus協議進行通訊。PC機讀取PLCVW區的數據;PC機還讀取PLC內部I或者O地址的狀態。

 

///////////////////////////////////////

 

以下是PLC程序實現,方便貼出,已轉換為STL

 

TITLE=程序注釋

 

Network 1 // 網絡標題

 

// 在第一個循環周期內初始化Modbus從站協議

 

LD SM0.1

 

CALL SBR3, 1, 12, 9600, 0, 0, 128, 32, 1000, &VB0, M10.1, MB11

 

Network 2

 

// 在每個循環周期內執行Modbus 從站協議

 

LD SM0.0

 

CALL SBR1, M10.2, MB12

 

Network 3

 

LD SM0.0

 

MOVW AIW0, VW100

 

/I +54, VW100

 

MOVW AIW2, VW102

 

/I +54, VW102

 

MOVW AIW4, VW104

 

/I +54, VW104

 

MOVW AIW6, VW106

 

/I +54, VW106

 

Network 4

 

LD SM0.0

 

= Q0.0

 

Network 5

 

LD I0.0

 

= Q0.1

 

Network 6

 

LD I0.1

 

= Q0.2

 

///////////////////////////////////

 

以下是VB源碼

 

Option Explicit

 

Private Declare Function GetTickCount Lib "kernel32" () As Long

 

Dim x1

 

Dim p11, p12, p13, p14, p15, p16, p17, p18

 

Function CRC16(data() As Byte) As String

 

Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器

 

Dim CL As Byte, CH As Byte '多項式碼&HA001

 

Dim SaveHi As Byte, SaveLo As Byte

 

Dim i As Integer

 

Dim Flag As Integer

 

CRC16Lo = &HFF

 

CRC16Hi = &HFF

 

CL = &H1

 

CH = &HA0

 

For i = 0 To UBound(data)

 

CRC16Lo = CRC16Lo Xor data(i) '每一個數據與CRC寄存器進行異或

 

For Flag = 0 To 7

 

SaveHi = CRC16Hi

 

SaveLo = CRC16Lo

 

CRC16Hi = CRC16Hi  2 '高位右移一位

 

CRC16Lo = CRC16Lo  2 '低位右移一位

 

If ((SaveHi And &H1) = &H1) Then '如果高位字節最后一位為1

 

CRC16Lo = CRC16Lo Or &H80 '則低位字節右移后前面補1

 

End If '否則自動補0

 

If ((SaveLo And &H1) = &H1) Then '如果LSB為1,則與多項式碼進行異或

 

CRC16Hi = CRC16Hi Xor CH

 

CRC16Lo = CRC16Lo Xor CL

 

End If

 

Next Flag

 

Next i

 

Dim ReturnData(1) As Byte

 

ReturnData(0) = CRC16Hi 'CRC高位

 

ReturnData(1) = CRC16Lo 'CRC低位

 

CRC16 = ReturnData

 

End Function

 

Private Sub about_Click()

 

frmabout.Show

 

End Sub

 

Private Sub Form_Load() '初始化

 

Timer1.Enabled = False '定時器1無效

 

Timer1.Interval = 1000 '定時器1時間為1S

 

Timer2.Enabled = True '定時器2有效

 

Timer2.Interval = 1000 '定時器2時間為1S

 

Text1.Text = ""

 

Text2.Text = ""

 

Text3.Text = ""

 

Text4.Text = ""

 

Text5.Text = ""

 

Text6.Text = ""

 

Text8.Text = ""

 

Text10.Text = ""

 

MSComm1.CommPort = 1 '設定端口號

 

MSComm1.Settings = "9600,n,8,1" '設定通訊波特率

 

MSComm1.InBufferSize = 1024 '接收緩沖器大小

 

MSComm1.OutBufferSize = 1024 '輸出緩沖器大小

 

MSComm1.InputMode = comInputModeBinary '以二進制傳輸

 

MSComm1.RThreshold = 1 '

 

MSComm1.SThreshold = 0

 

MSComm1.InputLen = 0 '讀取接收緩沖器所有字符

 

MSComm1.OutBufferCount = 0 '清空發送緩沖區

 

MSComm1.InBufferCount = 0 '清空接收緩沖區

 

If MSComm1.PortOpen = False Then

 

Command3.Caption = "打開串口"

 

Else

 

Command3.Caption = "關閉串口"

 

End If

 

End Sub

 

Private Sub Command1_Click()

 

Timer1.Enabled = True

 

End Sub

 

Private Sub Command2_Click() '退出程序,定時器1無效

 

Timer1.Enabled = False

 

Cls

 

Unload Me

 

End Sub

 

Private Sub Command3_Click()

 

On Error Resume Next

 

If MSComm1.PortOpen = False Then

 

MSComm1.PortOpen = True

 

Else

 

MSComm1.PortOpen = False

 

End If

 

If MSComm1.PortOpen Then '打開關閉按鈕顯示文字

 

Command3.Caption = "關閉串口"

 

Else

 

Command3.Caption = "打開串口"

 

End If

 

If Err Then '打開串口失敗,則顯示出錯信息

 

MsgBox Error$, 48, "錯誤信息"

 

Exit Sub

 

End If

 

End Sub

 

Private Sub Timer1_Timer() '讀V存儲區數據

 

Dim CRC() As Byte

 

Dim FGetData As String

 

Dim aa() As Byte

 

Dim s As String

Dim str As String

 

Dim i As Integer

 

Dim bb, cc As String

 

ReDim aa(5) As Byte '定義動態數組

 

aa(0) = &HC

 

aa(1) = &H3

 

aa(2) = &H0

 

aa(3) = &H32

 

aa(4) = &H0

 

aa(5) = &H4

 

CRC = CRC16(aa)

 

str = CRC

 

s = ""

 

For i = 1 To LenB(str)

 

s = s + he(AscB(MidB(str, i, 1)))

 

Next i

 

bb = Right(s, 2)

 

cc = Mid(s, 1, 2)

 

If Len(s) < 4 Then

 

cc = Mid(s, 1, 1)

 

End If

 

ReDim Preserve aa(0 To 7) As Byte

 

aa(6) = Val("&H" & bb)

 

aa(7) = Val("&H" & cc)

 

MSComm1.OutBufferCount = 0 '清空輸出寄存器

 

MSComm1.Output = aa

 

FGetData = ReceiveData

 

Text5.Text = FGetData

 

p11 = Val("&H" & Mid(FGetData, 7, 4))

 

p12 = Val("&H" & Mid(FGetData, 11, 4))

 

p13 = Val("&H" & Mid(FGetData, 15, 4))

 

p14 = Val("&H" & Mid(FGetData, 19, 4))

 

End Sub

 

Private Sub Command4_Click() 'I狀態

 

Dim CRC() As Byte

 

Dim FGetData As String

 

Dim aa() As Byte

 

Dim s As String

 

Dim str As String

 

Dim i As Integer

 

Dim bb, cc As String

 

ReDim aa(5) As Byte '定義動態數組

 

aa(0) = &HC

 

aa(1) = &H2

 

aa(2) = &H0

 

aa(3) = &H0

 

aa(4) = &H0

 

aa(5) = &H1

 

CRC = CRC16(aa)

 

str = CRC

 

s = ""

 

For i = 1 To LenB(str)

 

s = s + he(AscB(MidB(str, i, 1)))

 

Next i

 

bb = Right(s, 2)

 

cc = Mid(s, 1, 2)

 

If Len(s) < 4 Then

 

cc = Mid(s, 1, 1)

 

End If

 

ReDim Preserve aa(0 To 7) As Byte

 

aa(6) = Val("&H" & bb)

 

aa(7) = Val("&H" & cc)

 

MSComm1.OutBufferCount = 0 '清空輸出寄存器

 

MSComm1.Output = aa

 

FGetData = IReceiveData

 

p17 = Val("&H" & Mid(FGetData, 7, 2))

 

p18 = Val("&H" & Mid(FGetData, 9, 2))

 

End Sub

 

Private Sub Command5_Click() 'Q狀態

 

Dim CRC() As Byte

 

Dim FGetData As String

 

Dim aa() As Byte

 

Dim s As String

 

Dim str As String

 

Dim i As Integer

 

Dim bb, cc As String

 

ReDim aa(5) As Byte '定義動態數組

 

aa(0) = &HC

 

aa(1) = &H1

 

aa(2) = &H0

 

aa(3) = &H0

 

aa(4) = &H0

 

aa(5) = &H1

 

CRC = CRC16(aa)

 

str = CRC

 

s = ""

 

For i = 1 To LenB(str)

 

s = s + he(AscB(MidB(str, i, 1)))

 

Next i

 

bb = Right(s, 2)

 

cc = Mid(s, 1, 2)

 

If Len(s) < 4 Then

 

cc = Mid(s, 1, 1)

 

End If

 

ReDim Preserve aa(0 To 7) As Byte

 

aa(6) = Val("&H" & bb)

 

aa(7) = Val("&H" & cc)

 

MSComm1.OutBufferCount = 0 '清空輸出寄存器

 

MSComm1.Output = aa

 

FGetData = QReceiveData

 

p15 = Val("&H" & Mid(FGetData, 7, 2))

 

p16 = Val("&H" & Mid(FGetData, 9, 2))

 

End Sub

 

Private Function ReceiveData() As String '返回V存儲器區數據

 

Dim FGetData As String

 

Dim t1 As Long

 

Dim av As Variant

 

Dim i As Integer

 

Dim ReDataLen As Integer

 

FGetData = ""

 

t1 = GetTickCount() '取時間,做延時用

 

Do '循環等待接收數據

 

DoEvents

 

If MSComm1.InBufferCount > 0 Then '串口有數據了

 

ReDataLen = MSComm1.InBufferCount '取數據長度

 

av = MSComm1.Input '將串口數據取出來

 

For i = 0 To ReDataLen - 1

 

FGetData = FGetData & Right("00" & he(av(i)), 2)

 

Next i

 

End If

 

If Len(FGetData) >= 6 Then

 

If Len(FGetData) > Val("&H" & Mid(FGetData, 5, 2)) * 2 + 8 Then

 

ReceiveData = FGetData

 

Exit Function

 

End If

 

End If

 

If GetTickCount - t1 > 2000 Then '2秒沒收完就不收了

 

ReceiveData = ""

 

Exit Function

 

End If

 

Loop

 

End Function

 

Private Function IReceiveData() As String '反回I狀態

 

Dim FGetData As String

 

Dim t1 As Long

 

Dim av As Variant

 

Dim i As Integer

 

Dim ReDataLen As Integer

 

FGetData = ""

 

t1 = GetTickCount() '取時間,做延時用

 

Do '循環等待接收數據

 

DoEvents

 

If MSComm1.InBufferCount > 0 Then '串口有數據了

 

ReDataLen = MSComm1.InBufferCount '取數據長度

av = MSComm1.Input '將串口數據取出來

 

For i = 0 To ReDataLen - 1

 

FGetData = FGetData & Right("00" & he(av(i)), 2)

 

Next i

 

End If

 

If Len(FGetData) >= 6 Then

 

If Len(FGetData) > Val("&H" & Mid(FGetData, 5, 2)) * 2 + 8 Then

 

IReceiveData = FGetData

 

Exit Function

 

End If

 

End If

 

If GetTickCount - t1 > 2000 Then '2秒沒收完就不收了

 

IReceiveData = ""

 

Exit Function

 

End If

 

Loop

 

End Function

 

Private Function QReceiveData() As String '反回Q狀態

 

Dim FGetData As String

 

Dim t1 As Long

 

Dim av As Variant

 

Dim i As Integer

 

Dim ReDataLen As Integer

 

FGetData = ""

 

t1 = GetTickCount() '取時間,做延時用

 

Do '循環等待接收數據

 

DoEvents

 

If MSComm1.InBufferCount > 0 Then '串口有數據了

 

ReDataLen = MSComm1.InBufferCount '取數據長度

 

av = MSComm1.Input '將串口數據取出來

 

For i = 0 To ReDataLen - 1

 

FGetData = FGetData & Right("00" & he(av(i)), 2)

 

Next i

 

End If

 

If Len(FGetData) >= 6 Then

 

If Len(FGetData) > Val("&H" & Mid(FGetData, 5, 2)) * 2 + 8 Then

 

QReceiveData = FGetData

 

Exit Function

 

End If

 

End If

 

If GetTickCount - t1 > 2000 Then '2秒沒收完就不收了

 

QReceiveData = ""

 

Exit Function

 

End If

 

Loop

 

End Function

 

Private Sub Timer2_Timer()

 

x1 = x1 + 1

 

Text10.Text = str(x1)

 

Text1.Text = str(p11)

 

Text2.Text = str(p12)

 

Text3.Text = str(p13)

 

Text4.Text = str(p14)

 

Text7.Text = str(p15)

 

If Text7.Text = 1 Then Text7.BackColor = RGB(255, 0, 255)

 

If Text7.Text = 0 Then Text7.BackColor = RGB(0, 255, 255)

 

'Text6.Text = str(p16)

 

Text9.Text = str(p17)

 

If Text9.Text = 1 Then Text9.BackColor = RGB(255, 0, 255)

 

If Text9.Text = 0 Then Text9.BackColor = RGB(0, 255, 255)

 

'Text8.Text = str(p18)

 

End Sub

 

下一篇: PLC、DCS、FCS三大控

上一篇: 索爾維全系列Solef?PV

推薦產品

更多
主站蜘蛛池模板: 广东佛电电器有限公司|防雷开关|故障电弧断路器|智能量测断路器 广东西屋电气有限公司-广东西屋电气有限公司 | 电地暖-电采暖-发热膜-石墨烯电热膜品牌加盟-暖季地暖厂家 | 浙江美尔凯特智能厨卫股份有限公司 | 常州律师事务所_常州律所_常州律师-江苏乐天律师事务所 | 杭州成人高考_浙江省成人高考网上报名| 非标压力容器_碳钢储罐_不锈钢_搪玻璃反应釜厂家-山东首丰智能环保装备有限公司 | 无线遥控更衣吊篮_IC卡更衣吊篮_电动更衣吊篮配件_煤矿更衣吊篮-力得电子 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 翅片管换热器「型号全」_厂家-淄博鑫科环保 | 深圳成考网-深圳成人高考报名网 深圳工程师职称评定条件及流程_深圳职称评审_职称评审-职称网 | 回转支承-转盘轴承-回转驱动生产厂家-洛阳隆达轴承有限公司 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | 防火门|抗爆门|超大门|医疗门|隔声门-上海加汇门业生产厂家 | 防水套管厂家_刚性防水套管_柔性防水套管_不锈钢防水套管-郑州中泰管道 | 北京遮阳网-防尘盖土网-盖土草坪-迷彩网-防尘网生产厂家-京兴科技 | 广州展览制作|展台制作工厂|展览设计制作|展览展示制作|搭建制作公司 | 水厂自动化|污水处理中控系统|水利信息化|智慧水务|智慧农业-山东德艾自动化科技有限公司 | 电加热导热油炉-空气加热器-导热油加热器-翅片电加热管-科安达机械 | 烟雾净化器-滤筒除尘器-防爆除尘器-除尘器厂家-东莞执信环保科技有限公司 | 一体化污水处理设备_生活污水处理设备_全自动加药装置厂家-明基环保 | 深圳激光打标机_激光打标机_激光焊接机_激光切割机_同体激光打标机-深圳市创想激光科技有限公司 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 精密五金冲压件_深圳五金冲压厂_钣金加工厂_五金模具加工-诚瑞丰科技股份有限公司 | NM-02立式吸污机_ZHCS-02软轴刷_二合一吸刷软轴刷-厦门地坤科技有限公司 | 换网器_自动换网器_液压换网器--郑州海科熔体泵有限公司 | 防弹玻璃厂家_防爆炸玻璃_电磁屏蔽玻璃-四川大硅特玻科技有限公司 | 民用音响-拉杆音响-家用音响-ktv专用音响-万昌科技 | 异噻唑啉酮-均三嗪-三丹油-1227-中北杀菌剂厂家 | 高楼航空障碍灯厂家哪家好_航空障碍灯厂家_广州北斗星障碍灯有限公司 | 重庆中专|职高|技校招生-重庆中专招生网 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛调查出轨取证公司_青岛婚外情取证-青岛探真调查事务所 | 不锈钢丸厂家,铝丸,铸钢丸-淄博智源铸造材料有限公司 | 合肥弱电工程_安徽安防工程_智能化工程公司-合肥雷润 | 通风天窗,通风气楼,屋顶通风天窗,屋顶通风天窗公司 | 代写标书-专业代做标书-商业计划书代写「深圳卓越创兴公司」 | 北京浩云律师事务所-企业法律顾问_破产清算等公司法律服务 | 制丸机,小型中药制丸机,全自动制丸机价格-甘肃恒跃制药设备有限公司 | 办公室家具公司_办公家具品牌厂家_森拉堡办公家具【官网】 | 山楂片_雪花_迷你山楂片_山楂条饼厂家-青州市丰源食品厂 | 橡胶接头|可曲挠橡胶接头|橡胶软接头安装使用教程-上海松夏官方网站 |