重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1.0 通讯组件概述
成都创新互联公司作为成都网站建设公司,专注成都网站建设、网站设计,有关成都定制网站方案、改版、费用等问题,行业涉及成都iso认证等多个领域,已为上千家企业服务,得到了客户的尊重与认可。
通讯组件用于PC与可编程控制器(PLC)、智能仪表等进行数据通讯,适用于基于PC高级语言的工业自动化控制系统。组件采用动态链接库文件(*.DLL)的形式,在PC系统的项目工程里引用该组件,调用相应的属性与方法函数,即可快速实现PC与PLC的高效数据交换。
DLL通讯组件无须安装,直接复制到工程文件目录,方便打包安装部署;无须任何配置,直接调用函数,与应用开发无缝衔接;多年工程经验的软件团队开发测试,经过本公司及客户的海量实际工程应用检验,稳定可靠;采用稳定高效的内部协议,无须编写PLC内部程序配合,直接访问PLC的内存,通讯响应快速;内建动态管理的多独立线程连接,同时支持外部应用的多线程结构调用;兼容WINDOWS系统下的所有开发环境,包括各种版本的VB.NET、C#、VC++,以及DEIPHI 、VB、LabView等;支持几乎所有PLC的CPU自带通讯口、通讯扩展模块。
你可以在技成看视频教程,这个案例比较经典,看视频更容易理解。
这两个问题应该是同一个原因,Integer类型不够大。
在VB6里,Integer是有符号的,其取值范围是 -32767 到 32676。
试试看用 Long 取代 Integer 吧,应该能行。
再说说ModBus,读取指令 02 03 14 50 00 01 指定了读取一个单位(16位)的数据。
如果数据超过了65536,一个16位就显示不过来了,试试读取两个字的数据吧。
当然,也有部分设备使用某个特定数组来表示溢出,查查说明书应该会有收获。
发送问题也是类似的,如果该地址数据是有符号的,那么上限就是32767。
试试写两个字(32位)的数据。
提供一个VB.NET与OMRON以太网通讯的代码,是我项目里面复制出来的:
Dim Handle1 As Int32 'PLC的连接句柄
Dim EntLink As Boolean '连接标志
Dim PLC As New FinsTcp.PlcClient '引用OMRON的通讯组件
Private Sub butLink_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butLink.Click
Dim re As Short
Dim restr As String = ""
re = PLC.EntLink(Trim(txtLocalIP.Text), Val(txtLocalPort.Text), Trim(txtRemoteIP.Text), Val(txtRemotePort.Text), "DEMO", Handle1)
txtReLink.Text = re.ToString
If re = 0 Then
EntLink = True
MsgBox("PLC联接成功! ")
Else
EntLink = False
MsgBox("PLC联接失败: " restr)
End If
End Sub
Private Sub butClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butClose.Click
Dim re As Short
EntLink = False
re = PLC.DeLink(Handle1)
txtReClose.Text = re.ToString
End Sub
Private Sub butRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butRead.Click
Dim re As Short
Dim i As Short
Dim RD() As Object
ReDim RD(Val(txtReadCnt.Text - 1))
If Not EntLink Then
MsgBox("还未与PLC建立联接!")
Exit Sub
End If
Dim mry As FinsTcp.PlcClient.PlcMemory = cmbReadMry.SelectedIndex + 1
Dim typ As FinsTcp.PlcClient.DataType = cmbReadType.SelectedIndex + 1
re = PLC.CmdRead(Handle1, mry, typ, CUShort(Val(txtReadAdd.Text)), CUShort(Val(txtReadCnt.Text)), RD)
txtReRead.Text = re.ToString
lstRead.Items.Clear()
For i = 0 To UBound(RD) Step 1
If Not IsNothing(RD(i)) Then lstRead.Items.Add(RD(i))
Next i
If re 0 Then
Timer1.Enabled = False
butScan.Text = "Cycle R/W"
End If
End Sub
Private Sub butWrite_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butWrite.Click
Dim re As Short
Dim i As Short
Dim temp() As String
Dim WD() As Object
If Not EntLink Then
MsgBox("还未与PLC建立联接!")
Exit Sub
End If
ReDim WD(Val(txtWriteCnt.Text) - 1)
temp = Split(txtWrite.Text, vbCrLf)
For i = 0 To UBound(WD) Step 1
If i UBound(temp) Then
WD(i) = 0
Else
WD(i) = Trim(temp(i))
End If
Next i
Dim mry As FinsTcp.PlcClient.PlcMemory = cmbWriteMry.SelectedIndex + 1
Dim typ As FinsTcp.PlcClient.DataType = cmbWriteType.SelectedIndex + 1
re = PLC.CmdWrite(Handle1, mry, typ, CUShort(Val(txtWriteAdd.Text)), CUShort(Val(txtWriteCnt.Text)), WD)
txtReWrite.Text = re.ToString
If re 0 Then
Timer1.Enabled = False
butScan.Text = "Cycle R/W"
End If
End Sub
你在VB中通过串口类中的方法向仪表发送MODBUS指令,然后解析返回数据即可。MODBUS读寄存器指令,你问题中的表号,一般叫做设备ID,设备ID是一个字节,从0到255,0一般不用,比如设备ID是1,读取4XXX寄存器的指令是 十六进制03,起始地址是1037(前面的4去掉),连续读取两个寄存器,也就是寄存器长度为2,每个寄存器两个字节,返回数据就应该是四个字节,最后是两个字节的CRC16校验码。指令是这样的
01(设备ID) 03(读寄存器) 10 37(起始地址) 00 02(寄存器个数) CL CH(CRC16校验码)
CRC16校验码我没法给你算,你需要在程序中实现指令的重组和CRC16校验码的生成,解析时,在返回数据的指定位置截取下连续的四个字节数据,转换为浮点数即可。VB中都有相应的类和方法,不便详述。