组态王MODBUS TCP数据报格式

在大家通读Modbus协议时,总是会碰到一些容易混淆的名词,从而导致对于协议的解读出现问题,在本文中,我
们对于Modbus协议中可能会给大家造成困惑的名词作相关的解释。

1.功能码:功能码在modbus协议用于表示信息帧的功能,常用的功能码有03,04,06,16等,其中03功能码的作

用是读保持寄存器内容,04功能码的作用是读输入寄存器内容(输入寄存器和保持寄存器的区别看下文),06功

能码的内容是预置单个保持寄存器,16功能码的内容则是预置多个保持寄存器。

2.输入寄存器和保持寄存器:04功能码的作用就是读输入寄存器,而03功能码的作用则是读保持寄存器,很多人

在看到这两个功能码的时候总是希望找到这两个功能码的区别,保持寄存器和输入寄存器到底是什么区别,

modbus协议最开始是用来解决PLC的通信协议问题的,主要用于输入输出数字量信号以及模拟量信号,所谓的输

入寄存器就是从模拟量信号输入引申出来的,即输入寄存器只能从模拟量信号输入端改变寄存器,而主机则不能

通过下发指令改变输入寄存器的数据,而保持寄存器则是用于输出模拟量信号的,主机是可以改变寄存器数据,

也就是说对于主机而言,输入寄存器是只读的,而保持寄存器是可以读写的,当主机用06,16功能码的指令去预

置输入寄存器的时候,设备会返回一个代码为0x81的错误代码,即企图写只读寄存器。

3.Modbus中的数据地址格式:在Modbus协议中,经常会出现类似于3xxxx,4xxxx寄存器,这个表示的是寄存器支

持的数据类型。我们用列表来说明,还有Modbus数据地址格式是从0开始,比如以下一个寄存器40009,即表示保

持寄存器,寄存器地址为00 08,类似的数据地址格式经常在组态软件以及PLC系统中用到。

映射地址 使用的功能码 地址类型 存取方式 描述
0XXXX 01,05,15 离散输出 读写 每个卷表示单个开关位
1XXXX 02 离散输入 只读 每个卷表示单个开关位
2XXXX 03,04,06,16 浮点寄存器 只读/读写 两个连续16位寄存器表示一个浮点数
3XXXX 04 输入寄存器 只读 每个寄存器表示一个16位无符号整数
4XXXX 03,06,16 保持寄存器 读写 每个寄存器表示一个16位无符号整数
5XXXX 03,04,06,16 ASCII字符 读写 每个寄存器表示两个ASCII码
4.Modbus RTU/ASCII/TCP:Modbus协议最开始是用于可编程逻辑控制器(PLC)之间的通讯,由于其具有的开放性

,大量的用于现场智能仪表。Modbus协议有多个变种,其中最著名的是Modbus RTU/Modbus ASCII和Modbus TCP

通信协议。其中RTU/ASCII协议是基于串行口通信,而TCP协议则是基于以太网通信。他们之间的区别和联系请参

考本站其他页面内容:Modbus RTU/TCP协议解析以及Modbus RTU/ASCII通信协议异同点。

5.Modbus错误代码表,modbus有功能码,校验码,异常功能码和错误代码,其中异常功能码和错误代码非常容易

混淆,一般来说异常功能码指的是某个功能码执行的时候出现的相应异常功能码,一般都是在功能码的基础上加

上0x80,比如03功能码出现的异常码是0x83异常功能码,16功能码对应出现的异常功能码则是0x90,而错误代码

则是表示出现错误的具体情况,比如寄存器地址不存在,不管是读还是写,如果该寄存器地址不存在的话,错误

代码为02。具体情况请参阅本站其他页面文章。

/***************************以上摘自http://www.485-can-tcp.com/technology/232485/TheModbus.htm********************************/

以下实际结果如下:

测试条件:组态王选择 MODBUS-TCP 做客户端, 服务器为树莓派3B,IP 192.168.1.200, 端口6000

组太王设置通信参数:192.168.1.200 :6000 22/30  //IP 192.168.1.200 PORT 6000 DEVICE 22

定义三个变量 寄存器分别是 40001 40002 40005,主界面定义三个文本框,选择模拟量输入+模拟量输出, 更新时间1000ms 连通后

组态王发送
00 00 00 00 00 06 16 03 00 00 00 05   //读取模拟量的值

00 00 为此次通信事务处理标识符,一般每次通信之后将被要求加1以区别不同的通信数据报文; 实际测试这个值没有变化 一直是00 00 
00 00 表示协议标识符,00 00为modbus协议;
00 06 为数据长度,用来指示接下来数据的长度,单位字节;
16 地址码 设备地址22
03 读功能码
00 00 起始地址码 组态王从1开始计数,00 00 即40001
00 05 数据长度 5个16位数值(word数量)

回应
00 00 00 00 00 0d 16 03 0a 00 01 00 02 00 03 00 04 00 05
00 00 为此次通信事务处理标识符,应答报文要求与先前对应的请求保持一致;
00 00 为协议标识符,与先前对应的请求保持一致;
00 0d 为数据长度,用来指示接下来数据的长度,单位字节
16 设备地址 应答报文要求与先前对应的请求保持一致;
03 为功能码,正常情况下应答报文要求与先前对应的请求保持一致,如果出错则返回80h+先前的功能码;
0a 指示接下来数据的字节长度; 应该是请求的数据字节数05 x2 对应10个字节
00 01 00 02 00 03 00 04 00 05 数据高低位数值

结果组态王文本框分别显示 01 02 05

在组态王中,向40001寄存器写入 33

组态王发送

00 00 00 00 00 06 16 06 00 00 00 21
00 00 为此次通信事务处理标识符,一般每次通信之后将被要求加1以区别不同的通信数据报文; 实际测试保持00 00 
00 00 表示协议标识符,00 00为modbus协议;
00 06 为数据长度,用来指示接下来数据的长度,单位字节;
06 写单保持寄存器功能码
16 地址码 设备地址22
00 00 单保持寄存器地址,这里是40001
00 21 单保持寄存器数据,00 21 即33

回应
00 00 00 00 00 06 16 06 00 00 00 21
00 00 为此次通信事务处理标识符,应答报文要求与先前对应的请求保持一致;
00 00 为协议标识符,与先前对应的请求保持一致;
00 06 为数据长度,用来指示接下来数据的长度,单位字节
16 设备地址 应答报文要求与先前对应的请求保持一致;
06 为写功能码,正常情况下应答报文要求与先前对应的请求保持一致,如果出错则返回80h+先前的功能码
00 00 单保持寄存器地址,这里是40001
00 21 单保持寄存器数据,00 21 即33

即原封不动的将数据发回去

测试过程中没有出现任何通讯错误, 树莓派检测组态王发送来的数据,也没有发现任何不合理数据。

在不给组态王发送数据或者一直发送错误数据的情况下,组态王会间断的发送 00 00 00 00 00 06 16 01 ff ff 00 01, 不知为何,01是读线圈的命令码,解析后是读地址为ffff的一个线圈的状态,不明白是心跳检测还是别的 没有找到相关资料,在检测到这个报文的时候我原封不动的发回去,未见任何异常。望有高人指点!

时间: 2024-11-05 17:24:28

组态王MODBUS TCP数据报格式的相关文章

以太网帧、TCP与UDP段以及IP数据报格式总结

传输层及其以下的机制由内核提供,是操作系统的一部分,应?层由?户进程提供应?层数据通过协议栈发到?络上时,每层协议都要加上?个数据?部(header),称为封装.不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在?络层叫做数据报(datagram),在链路层叫做帧(frame). 1.以太网帧格式 ?源地址和?的地址是指?卡的硬件地址(也叫MAC地址),长度是48位,是在?卡出?时固化的.Linux下可以?ifconfig命令看?下,"HWaddr 00:15:F2:14:9

Linux 网络编程——TCP 和 UDP 数据报格式详解

TCP 报文格式 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TCP 报文段的报头有 10 个必需的字段和 1 个可选字段.报头至少为 20 字节.报头后面的数据是可选项. 1)源端口(16位) 标识发送报文的计算机端口或进程.一个 TCP 报文段必须包括源端口号,使目的主机知道应该向何处发送确认报文. 2)目的端口(16位) 标识接收报文的目的主机的端口或进程. 3) 序号(也叫序列号)(32位) 用

Modbus tcp 格式说明 通讯机制 附C#测试工具用于学习,测试

前言: 之前的博客介绍了如何用C#来读写modbus tcp服务器的数据,文章:http://www.cnblogs.com/dathlin/p/7885368.html 当然也有如何创建一个服务器文章:http://www.cnblogs.com/dathlin/p/7782315.html 但是上面的两篇文章是已经封装好的API,只要调用就可以实现功能了,对于想了解modbus tcp的原理的人可能就不适合了,最近有不少网友的想要了解这个协议,所以在这里再写一篇介绍Modbus tcp的文章

开放型Modbus/TCP 规范

修订版 1.0,1999 年3 月29 日Andy SwalesSchneider 电气公司[email protected]目录目录............................................................................................................................ 21.该规范的发展概况...............................................

MODBUS TCP/IP协议规范详细介绍

1.该规范的发展概况 原始版本1997年9月3日作为公共评论的草案. 再版1999年3月29日,即修订版1.0. 没有大的技术改动,仅作了补充说明.增加了附录A和B作为对一些常用执行问题的回应. 该Modbus/TCP规范在万维网上公开发行.它表明开发者的意愿是把它作为工业自动化领域具有互用性的标准. 既然MODBUS和MODBUS/TCP作为事实上的"实际"标准,而且很多生产商已经实现了它的功能,此规范主要是阐述在互连网上具有普遍可用性的基于TCP通讯协议的MODBUS报文的特殊编码

TCP报文格式,TCP的三次握手和四次挥手&hosts文件

1.TCP报文格式 TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接 序号(4字节=32位): 37 59 56 75 用来标识TCP发端向TCP收端发送的数据字节流 确认序号(4字节=32位): 由于该报文为SYN报文,ACK标志为0,故没有确认序号(ACK标志为1时确认序号才有效)TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1 一旦连接建立,该值将始终发送(同ACK标志) 头部长度:该字段占用4位,用来表示报文首部

Modbus库开发笔记之四:Modbus TCP Client开发

这一次我们封装Modbus TCP Client应用.同样的我们也不是做具体的应用,而是实现TCP客户端的基本功能.我们将TCP客户端的功能封装为函数,以便在开发具体应用时调用. 对于TCP客户端我们主要实现的功能有两个:其一是生成访问TCP服务器的命令,总共支持8中功能码.其二是对TCP服务器端返回的信息进行解析并根据结果进行各种操作,同样也是支持8中功能吗的操作.具体软件访问结构如下: 1.访问命令的生成 客户端作为主动交互端,需要向服务器发各种操作请求命令.所以对于TCP客户端来说,首先要

组态王常见问题解答

一.在XP系统安装完组态王软件和驱动在打开运行时信息栏出现"您没有正确安装KVCOM.SYS驱动程序". [答:] (1)建议在安装前先把电脑上的杀毒软件先关闭,以免安装时对部分程序的影响. (2)若还出现此类问题,可以尝试把装好的组态软件在电脑上卸载掉,然后重新 启动安装,这个有时是系统造成的,建议多装几次.(我的就是这样后来装 好的)若实在还是不行,建议换个XP系统,应该是系统环境的问题. 二.打开组态王软件,在切换到view界面时弹出"历史库:打开工程映射区内存失败&q

国标电表DLT645转MODBUS TCP协议转换器,工业设备,浪涌三级保护

DL/T645转ModbusTcp协议转换器 MRD-5021具有1 路RS485及1路以太网接口,最多支持同时采集5个DL/T645-1997或者5个2007协议国标电表设备,支持DL/T645协议的自适应,然后将所需要的采集数据转换为Modbus Tcp协议.方便和PLC.DCS.组态等工业相关设备对接. 说明书:http://files.cnblogs.com/mored/DLT645-ModbusTcp%E4%BA%A7%E5%93%81MRD-5021%E8%AF%B4%E6%98%8