Modbus TCP通讯协议与LabVIEW中实际使用

1. Modbus TCP通讯协议介绍

modbus TCP协议是一种基于TCP/IP的通信协议,用于工业自动化设备之间的数据传输,其数据帧由两部分组成:MBAP(报文头)和PDU(协议数据单元)

1.1 组成

1) MBAP报文头:MBAP为报文头,长度为7字节,组成如下

image

2) PDU协议数据单元:

image

1.2 常见功能码示例

1) 功能码03(0x03):读保持寄存器

image
image

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

image
image

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

image
image

1.3 注意事项

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

image

2. 实际使用案例

2.1 背景介绍

使用LabVIEW 2013与西门子PLC 200smart进行modbus TCP/IP通讯
LabVIEW本机地址:192.168.0.103 PLC地址:192.168.0.20

2.2 简单举例使用

1) 网上截图的示例:

image

2) 通讯程序框图

程序框图如下:
image
前面板如下:
image

2.3 实际项目中的应用

1.初始化TCP指令

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


image

2.读多个寄存器(功能码0x03)

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


下位机数据写入与读取:
image
image
上位机数据处理:
image
image

3.写单个寄存器(功能码0x06)

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


下位机数据写入与读取:
image
上位机数据处理:
image
4.写多个寄存器(功能码0x10)

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


下位机数据写入多个寄存器:
image
上位机数据处理:
image
image

备注

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

posted @ 2026-02-11 17:54  MH07  阅读(596)  评论(0)    收藏  举报