ModbusTCP协议,上位机通讯测试实例分享

目的:

寻找S7-1200作为服务端与计算机ModbusTCP通讯的具体方式,为PC端APP提供通讯依据。

需要准备的工具

S7-1200 CPU1212 DC/ DC/ DC一台,网线,24VDC电源, ProfiNet口通过交换机与PC连接。PC端用Modbus Poll客户端(目的是验证数据正确性)

协议说明

modbus tcp数据报文结构
请求:00 00 00 00 00 06 09 03 00 00 00 01
响应:00 00 00 00 00 05 09 03 02 00 00
一次modbus tcp读取保持寄存器的通信分析(省略了ip/tcp头):从左向右分析该数据报文:
请求:
00 00传输标志,两个字节长度,表示Modbus询问/应答的传输,默认是00 00;
00 00协议标识,两个字节长度,0表示Modbus,1表示UNI-TE,一般默认为00 00;
00 06数据长度,用来指示接下来数据的长度,单位字节;
09地址码,用以标识连接在串行线或者网络上的远程服务端的地址;
03功能码,此时代码03为读取保持寄存器数据;
00 00寄存器地址;
00 01寄存器数量;

响应:
00 00为此次通信事务处理标识符,应答报文要求与先前对应的请求保持一致;
00 00为协议标识符,与先前对应的请求保持一致;
00 05为数据长度,用来指示接下来数据的长度,单位字节;
09为设备地址,应答报文要求与先前对应的请求保持一致;
03为功能码,正常情况下应答报文要求与先前对应的请求保持一致,如果出错则返回80h+先前的功能码;
02指示接下来数据的字节长度;
00 00为被读取的保持寄存器中的数据值,即要求被读取的地址为00 00的保持寄存器中的数值为00 00。

ModbusTCP协议,上位机通讯测试实例分享_第1张图片

其他命令码测试

a) 01 Read Coils(0x)读取输出Q地址
发送:00 09 00 00 00 06 01 01 00 00 00 01
含义:报文头00 09 00 00 00 06;00 09每帧递增;00 00 ModbusTCP;00 06是后面还有6字节数据。报文内容是读取站号01地址00 00开始的1个位地址。
回收:00 09 00 00 00 04 01 01 01 00
ModbusTCP协议,上位机通讯测试实例分享_第2张图片

b) 02 Read Discrete Inputs(1x) 读取输入I地址
发送:00 09 00 00 00 06 01 02 00 00 00 01
含义:报文头00 09 00 00 00 06,00 09每帧递增,00 00ModbusTCP专属,00 06是后面还有6字节数据。报文内容是读取站号01地址00 00开始的1个输入位地址。
回收:00 09 00 00 00 04 01 02 01 00
含义:报文头00 09 00 00 00 04同上,报文内容是站号01读1个输入位地址(对应到S7-1200地址偏移范围可知是I区)返回了1个字节,结果是01。也就是I0.0是true。

发送:00 09 00 00 00 06 01 02 00 00 00 0A
回收:00 10 00 00 00 05 01 02 02 00 00
c) 03 Read Holding Registers(4x)
发送:00 09 00 00 00 06 01 03 00 00 00 01
回收:00 09 00 00 00 04 01 03 02 00 00
读取设定DataBlock的偏移为0的1个数据,返回结果是0x0000。经验证与PLC监控值相同。

#附录一
源代码资源地址,如果有问题可以给我发邮件[email protected],我会及时回复,互相学习
https://download.csdn.net/download/u011383812/10755005

你可能感兴趣的:(通讯)