本人现在在做modbus rtu 协议 上位机与智能仪表通信 希望高手指点一下
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了本人现在在做modbus rtu 协议 上位机与智能仪表通信 希望高手指点一下相关的知识,希望对你有一定的参考价值。
自己程序谢了 读仪表地址01的值,读到txt2.text中
程序如下:
Private Sub Form_Load()
'初始化串口
MSComm1.CommPort = 1 '选择串口
MSComm1.Settings = "9600,E,8,1" '设置通信参数
MSComm1.InputMode = comInputModeBinary '设置接受数据为二进制形式
MSComm1.InBufferSize = 512
MSComm1.OutBufferSize = 512
MSComm1.InputLen = 0 '从接受缓冲区读取全部数据
Timer1.Interval = 100
Timer1.Enabled = True
Timer2.Interval = 10
Timer2.Enabled = False
'MSComm1.SThreshold = 1
' If Not MSComm1.PortOpen Then
MSComm1.PortOpen = True
' End If
End Sub
Function crc16(ByRef cmdstring() As Byte, ByVal j As Integer)
Dim data As Integer
Dim i As Integer
Dim k As Integer
Dim Addressreg_crc As Long
Addressreg_crc = &HFFFF
For i = 0 To j
Addressreg_crc = Addressreg_crc Xor cmdstring(i)
For k = 0 To 7
data = Addressreg_crc And &H1
If data Then
Addressreg_crc = Addressreg_crc \ 2
' Addressreg_crc = Addressreg_crc And &H7FFF
Addressreg_crc = Addressreg_crc Xor &HA001
Else
Addressreg_crc = Addressreg_crc \ 2
' Addressreg_crc = Addressreg_crc And &H7FFF
End If
Next k
Next i
Hibyte = Addressreg_crc And &HFF
Lobyte = (Addressreg_crc And &HFF00) / &H100
End Function
Private Sub timer1_timer()
MSComm1.OutBufferCount = 0 '清空接受缓冲区
Dim sendstr(8) As Byte
sendstr(0) = &H1
sendstr(1) = &H3
sendstr(2) = &H0
sendstr(3) = &H1
sendstr(4) = &H0
sendstr(5) = &H1
Call crc16(sendstr(), 5)
sendstr(5) = Hibyte
sendstr(6) = Lobyte
MSComm1.Output = sendstr '发送查询命令
Timer2.Enabled = True '启动定时器2
End Sub
' Private Function Hex2(ByRef c As String) As String
' Hex2 = Hex(CInt(c))
'If Len(Hex2) < 2 Then
'Hex2 = "0" & Hex2
'End If
'End Function
Private Sub Timer2_Timer()
Dim inputbuf As String '接收数组
Dim inputsafebuf() As Byte '安全数组
Dim index As Integer
inputbuf = ""
' MSComm1.RThreshold = 7
inputsafebuf = MSComm1.Input '将输入缓冲区中的数据放入安全数组中
Select Case MSComm1.CommEvent
Case comEvReceive
For index = 0 To UBound(inputsafebuf) - 1
If Len(Hex(inputsafebuf(index))) = 1 Then
inputbuf = inputbuf & "0" & inputsafebuf(index)
Else
inputbuf = inputbuf & inputsafebuf(index)
End If
Next index '将安全数组中的数据放入接收数组中
' n = Val("&H" & CStr(Mid(inputbuf, 5, 2))) '字符数
' If Mid(inputbuf, 1, 2) = 1 And Mid(inputbuf, 3, 2) = 3 And Mid(inputbuf, 5, 2) = 2 Then
txt2.Text = Val("&H" & CStr(Mid(inputbuf, 7, 4)))
' End If
Case comEvSend
Exit Sub
End Select
End Sub
程序前添加注释符的行,是我初步调试觉得没有必要的程序
追问
说的很准,我是学自动化的,毕业之后选择了做软件,我喜欢这一行业,DCS、PLC我们在课程里接触过,自己没做过案例。
上面的程序,希望你能帮着看看,就是读不出来仪表上的数。
谢谢
现在调试出来了
追答调试出来了 就结束问题吧
参考技术C 你程序调通了,就可以了,你是想问什么问题啊追问我跟下位机仪表调试了 ,就是通不过 ,现在不知道怎么改程序了 ,希望你能指点指点,本人万分感谢
本回答被提问者采纳以上是关于本人现在在做modbus rtu 协议 上位机与智能仪表通信 希望高手指点一下的主要内容,如果未能解决你的问题,请参考以下文章
本人想通过moxa nport5650实现下位机modbus与上位机wincc通讯,从wincc采集nport里数据该怎么做?