vb.net和仪表通讯 vb通讯控件

VB和三菱Q系列PLC通信

1.0 通讯组件概述

成都创新互联公司作为成都网站建设公司,专注成都网站建设、网站设计,有关成都定制网站方案、改版、费用等问题,行业涉及成都iso认证等多个领域,已为上千家企业服务,得到了客户的尊重与认可。

通讯组件用于PC与可编程控制器(PLC)、智能仪表等进行数据通讯,适用于基于PC高级语言的工业自动化控制系统。组件采用动态链接库文件(*.DLL)的形式,在PC系统的项目工程里引用该组件,调用相应的属性与方法函数,即可快速实现PC与PLC的高效数据交换。

DLL通讯组件无须安装,直接复制到工程文件目录,方便打包安装部署;无须任何配置,直接调用函数,与应用开发无缝衔接;多年工程经验的软件团队开发测试,经过本公司及客户的海量实际工程应用检验,稳定可靠;采用稳定高效的内部协议,无须编写PLC内部程序配合,直接访问PLC的内存,通讯响应快速;内建动态管理的多独立线程连接,同时支持外部应用的多线程结构调用;兼容WINDOWS系统下的所有开发环境,包括各种版本的VB.NET、C#、VC++,以及DEIPHI 、VB、LabView等;支持几乎所有PLC的CPU自带通讯口、通讯扩展模块。

你可以在技成看视频教程,这个案例比较经典,看视频更容易理解。

VB用Modbus RTU协议和仪表通讯的问题

这两个问题应该是同一个原因,Integer类型不够大。

在VB6里,Integer是有符号的,其取值范围是 -32767 到 32676。

试试看用 Long 取代 Integer 吧,应该能行。

再说说ModBus,读取指令 02 03 14 50 00 01 指定了读取一个单位(16位)的数据。

如果数据超过了65536,一个16位就显示不过来了,试试读取两个字的数据吧。

当然,也有部分设备使用某个特定数组来表示溢出,查查说明书应该会有收获。

发送问题也是类似的,如果该地址数据是有符号的,那么上限就是32767。

试试写两个字(32位)的数据。

谁有VB和OMRON PLC 通信例子啊?能否发个原始代码? 再次特别感谢!

提供一个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

VB6.0 PC与智能仪表COM通讯modbus协议485

你在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中都有相应的类和方法,不便详述。


分享名称:vb.net和仪表通讯 vb通讯控件
网页URL:http://ybzwz.com/article/doppghj.html