文章要说明Modbus TCP协议的相关内容。此协议是1996年施耐德公司推出的基于TCP/IP协议的Modbus协议。
一、协议的特点
此协议与Modbus-RTU协议最大的不同就是,使用了在TCP/IP协议上的专用的报文头识别Modbus应用数据单元。这种报文头被称为MBAP报文头。
报文头的长度是7个字节,分别有:事务处理标识符,长度为两个字节,用于事务处理配对。它是Modbus的事务处理码,每次通信后就要加一。协议标识符,长度为两个字节,用于系统内的多路复用。当它的值是0(00 00),表示使用Modbus协议。长度,由两个字节构成,用于说明下面还有多少个字节的数量。这样即使TCP将整个报文分为多个信息包传输,接收者也能识别报文的边界。单元标识符,由一个字节构成,当Modbus客户端在请求中设置这个域,在响应中服务器必须利用相同的值返回这个域,可以将其理解为设备地址。报文头之后的功能码和数据部分与Modbus-RTU协议相似。接下来我们还是以实际的报文加以说明。
二、实验设备介绍
实验中将网络调试助手软件作为客户机(主站),MT1004或MT2003远程I/O模块作为服务器(从站)。
MT1004有16个DO输出端口(线圈),
MT2003有8组AI端口,
它们可以测量电压和电流信号。模块的配套软件可以查询它的详细信息也具有修改端口号等功能。我们将端口号尽量设置在2000以上,避免与其他协议产生冲突。打开MT软件,找到模块的IP地址、网关、端口等信息。在网络调试助手的网络设置中,选择TCP Client协议类型,输入远程主机地址为192.168.1.200,远程主机端口为2000。接着改变电脑的IP地址,使它们处于同一个网段内。打开电脑的网络设置,选择以太网,点击属性,选中Internet协议版本4,点击属性,输入IP地址:192.168.1.111,子网掩码255.255.255.0,点击确定。返回网络调试助手,点击连接,这样就可以在客户端和服务器之间建立通信。此次通信我们没有将模块并联到一起,所以两模块的参数设置都是相同的。(此段内容是软件及电脑的设置内容,详细内容在文章下方推荐的视频链接中可以看到。)
三、报文详细说明
打开网络调试软件,点击左上角电脑图标,在工具选项中选择MODBUS调试器,在出现的窗口中选择Modbus-TCP协议。现在我们想读取模块DO 5~DO 10的状态。根据指令填写字节,设备默认ID是01,Do在Modbus中被称为线圈,所以选择01命令。这里我们给出协议中四种数据类型的特征以及常用功能码汇总。
打开MT1004模块的用户手册选择相应的寄存器地址。
通道5的地址是00006,输入的地址应该是0x0005。读取数据的长度是6个。所以生成的报文为:00 04 00 00 00 06 01 01 00 05 00 06。
我们尝试分析这个报文:00 04,是报文头的事务处理标识,点击更新我们能看到它会加一,变为00 05;
00 00,是协议标识,说明使用Modbus协议;00 06,说明之后有六个字节的报文内容;01,是单元标识符,也就是设备地址;01,是功能码,表示读取线圈状态;00 05,是寄存器起始地址;00 06,是读取的线圈数量。调整接收设置的格式为HEX,服务器(从机)返回的响应报文是:00 05 00 00 00 04 01 01 01 00。
00 05,是此次通信的事务处理标识,与请求报文保持一致;00 00,是协议标识符,与请求报文一致;00 04,是提示之后有4个字节长度的内容;01,是设备地址;01,是功能码,与请求报文相同;01,说明接下来的报文长度;00,表明DO线圈均处于断开状态(0000 0000),高位用零补充。
接下来我们以闭合、断开的规律改变通道5~10的线圈状态,也就是进行写线圈操作,它的命令是0F。生成的报文是:00 07 00 00 00 08 01 0F 00 05 00 06 01 15。
报文的解释是:00 07,事务处理标识符;00 00,协议标识,说明使用Modbus协议;00 08,说明接下来有8个字节的报文长度;01,是设备地址;0F,是功能码,请求执行写线圈操作;00 05,是寄存器的起始地址;00 06,是写寄存器的个数;01,说明之后有一个字节的内容;15,反映了要写入的寄存器状态,我们将其写成二进制是:0001 0101,对应通道是10、9、8、7、6、5,最高两位以0补齐。
响应报文是:00 07 00 00 00 06 01 0F 00 05 00 06。
对它的解释是:00 07为事务处理标识符;00 00为协议标识符;00 06说明后面有6个字节的报文长度;01为设备地址;0F为功能码;00 05是开始寄存器的地址;00 06是服务器一共改写了6个线圈的状态,我们可以打开软件看一下。可见已经成功为线圈写入状态。
最后,我们将压力传感器连接到MT2003模块的AI 5通道上,尝试读取采集卡的输入寄存器的值,功能码是:04。设备的接线图如下图所示:
打开用户手册,AI 5 的寄存器地址是6(十进制),
所以生成的响应报文是:00 05 00 00 00 06 01 04 00 05 00 01。
返回的响应报文是:00 05 00 00 00 05 01 04 02 61 11。
通过报文可以看到,模块寄存器中的值是61 11,它反映了模块采集到的电流值的大小。将其转换为十进制是24849。根据用户手册,4mA~20mA的电流值对应0~65535(十进制)的数据值,所以24849对映的电流值为10.07mA。依据压力传感器的技术指标,其测量到的压力大小约为39.1MPa。计算过程如下图所示。
Modbus-TCP协议产生错误时返回的报文与Modbus-RTU协议一样,都是功能码加0x80后跟着一个字节的错误代码。大家可以观看我们发布的Modbus-RTU协议的文章,这里我们就不再赘述了。
以上就是Modbus-TCP协议的相关内容。
Modbus-TCP协议的视频链接是:https://www.bilibili.com/video/BV1Ed4y1D7jH/?spm_id_from=333.999.0.0&vd_source=a840efafc4eaad82ef9b216d7904def0
Modbus-RTU协议的说明链接是:https://blog.csdn.net/Smacq/article/details/127067002文章来源:https://www.toymoban.com/news/detail-506554.html
文章中使用的软件是Modbus Poll,使用的模块可进入https://www.smacq.cn/查看。文章来源地址https://www.toymoban.com/news/detail-506554.html
到了这里,关于Modbus-TCP协议说明的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!