Modbus TCP通讯协议与LabVIEW中实际使用
1. Modbus TCP通讯协议介绍
modbus TCP协议是一种基于TCP/IP的通信协议,用于工业自动化设备之间的数据传输,其数据帧由两部分组成:MBAP(报文头)和PDU(协议数据单元)
1.1 组成
1) MBAP报文头:MBAP为报文头,长度为7字节,组成如下

2) PDU协议数据单元:

1.2 常见功能码示例
1) 功能码03(0x03):读保持寄存器


2) 功能码06(0x06):写单个寄存器


3) 功能码16(0x10):写多个寄存器


1.3 注意事项
功能码决定了操作类型,常见的功能码如下。PDU数据字段的内容和长度根据功能码的不同而变换,需根据具体需求构造。

2. 实际使用案例
2.1 背景介绍
使用LabVIEW 2013与西门子PLC 200smart进行modbus TCP/IP通讯
LabVIEW本机地址:192.168.0.103 PLC地址:192.168.0.20
2.2 简单举例使用
1) 网上截图的示例:

2) 通讯程序框图
程序框图如下:

前面板如下:

2.3 实际项目中的应用
1.初始化TCP指令
说明:PLC地址为192.168.0.20,端口号为502,这里只做初始化,如果没有错误,就开始读;如果连接不上,就重新初始化。(因为我这是放在实时下位机的,没办法弹窗,如果写在上位机,可以给个弹窗提示)

2.读多个寄存器(功能码0x03)
说明:从寄存器地址0000,开始读19个寄存器。把返回的数据帧进行字符串截图,截取38个字节(一个寄存器占2个字节,如0000为2个字节),这里不用高低字节转换也可以,我这是从20版程序改的,为了改动小,所以没改。再插一句,20版可以直接使用TCP的类,不需要写报文,写起来更简单一点,只是早期的LabVIEW版本没有这个类,所以这里写的报文。
下位机数据写入与读取:


上位机数据处理:


3.写单个寄存器(功能码0x06)
说明:寄存器地址0003,写入对应数值。为了方便上位机数据随时更新,所以这里用了一个拼接字符串,将报文指令分为了两个部分。这里注意一下,因为我写的是开关量,一个只占一位,一个寄存器16位,所以上位机进行了一下数据拼接。(U8强制转化为字符串占1个字节,U16强制转换为字符串占2个字节,这里强制转换只是把类型转换了,长度不会改变)
下位机数据写入与读取:

上位机数据处理:

4.写多个寄存器(功能码0x10)
说明:从寄存器0010开始写4个寄存器数据。注意一下,这个PDU的数据比较长,功能码+起始寄存器地址+写入寄存器数量+写入字节长度+寄存器值XX。因为我这里PLC定义的是双字,所以一个数据占两个寄存器,所以上位机处理数据的时候是将SGL数据强制转换为字符串。(如果上位机写的数据为单精度,则占2个寄存器;如果为双精度,则占4个寄存器,这里根据实际数据类型写)
下位机数据写入多个寄存器:

上位机数据处理:


备注
只是作为工作学习过程中的记录与分享

浙公网安备 33010602011771号