协议定义
Modbus 是使用主从关系实现的请求-响应协议。
Modbus协议引入了不同的应用程序数据单元来更改串行通信使用的数据包格式,或允许使用TCP/IP和用户数据报协议(UDP)网络。 其通信协议理解也比较简单,其帧结构如下(ADU中包含PDU):
ADU:应用数据单元
PDU:协议数据单元
协议数据单元PDU(功能码和数据)
PDU(Packet Data Unit)及其处理代码构成了Modbus应用协议规范的核心。
Modbus PDU格式被定义为一个功能代码,后面跟着一组关联的数据。 该数据的大小和内容由功能代码定义,整个PDU(功能代码和数据)的大小不能超过253个字节。 每个功能代码都有一个特定的行为,从设备可以根据所需的应用程序行为灵活地实现这些行为。
从设备会验证功能代码、数据地址和数据范围等输入。 然后执行所请求的操作并发送与代码相符的响应。 如果此过程中的任何步骤失败,则会向请求程序返回异常。
PDU由一个单字节的功能代码组成,后面跟着多达252字节的针对特定函数的数据。
功能代码是第一个需要验证的项。 如果功能代码没有被接收到请求的设备识别,则会回应一个异常。 如果功能代码被接受,则从设备根据功能定义开始分解数据。
数据类型
modbus的操作对象有四种:线圈状态、离散量输入、保持寄存器和输入寄存器
线圈:PLC的输出位,开关量,在MODBUS中可读可写 (比如输出某个IO的高低电平)
离散量:PLC的输入位,开关量,在MODBUS中只读 (比如某个按键的状态)
输入寄存器:PLC中只能从模拟量输入端改变的寄存器,在MODBUS中只读 (比如温度值)
保持寄存器:PLC中用于输出模拟量信号的寄存器,在MODBUS中可读可写 (比如多个IO的输出量)
这些数据库定义了所包含数据的类型和访问权限。 从设备可以直接访问这些数据,因为这些数据由设备本地托管。 Modbus可访问的数据通常是设备主存的一个子集。 相反,Modbus主设备必须通过各种功能代码请求访问这些数据。
这些区块允许您限制或允许访问不同的数据元素,并且为应用层提供简化的机制来访问不同的数据类型。
这些区块是完全概念性的。 它们可能作为独立的内存地址存在于给定的系统中,但也可能重叠。 例如,线圈状态1可能存在于与保持寄存器1所代表的字的第一位相同的内存中。 寻址方案完全由从设备定义,其对每个内存区的解释是设备数据模型的重要组成部分。
数据模型寻址
该规范将每个区块定义为包含多达65,536(216)个元素的地址空间。 在PDU的定义中,Modbus定义了每个数据元素的地址,范围从0到65,535。但是,每个数据元素的编号从1到n,其中n的最大值为65,536。也就是说,线圈状态1位于地址0的线圈状态区块中,而保持寄存器54位于从机被定义为保持寄存器的内存部分中的地址53。
规范允许的全部范围不需要给定设备实现。 例如,设备可能会选择不执行线圈、离散输入或输入寄存器,而只使用保持寄存器150至175和200至225。这是完全可以接受的,并且通过例外来处理无效的访问尝试。
数据寻址范围
虽然规范将不同的数据类型定义为存在于不同的区块中,并为每种类型分配一个本地地址范围,但这并不一定会转化为用于记录或理解给定设备的Modbus可访问内存的直观编址方案。 为了简化对内存区块位置的理解,引入了一种编号方案,其将前缀添加到所讨论的数据的地址中。
例如,设备手册不会引用地址13寄存器14的数据项,而是引用地址4,014,40,014或400,014的数据项。在任何情况下,第一个数字都是4,表示保持寄存器,剩余数字则表示指定地址。 4XXX、4XXXX和4XXXXX的区别取决于设备使用的地址空间。 如果所有65,536个寄存器都在使用中,应该使用4XXXXX符号,因为其允许范围为400,001~465,536。如果只使用几个寄存器,通常的做法是使用范围4,001到4,999。
在这种寻址方案中,每种数据类型都被分配了一个前缀:
线圈状态存在前缀为0的情况。这意味着4001的引用可能指的是保持寄存器1或线圈4001。因此,建议所有新寻址方案都采用带前导零的6位寻址,并在文档中进行标注。 因此,保持寄存器1的地址为400,001,而线圈4001的地址则为004,001。
数据地址起始值
内存地址和参考数字之间的差异会由给定应用程序选择的索引进一步复杂化。 如前所述,保存寄存器1位于地址零。 通常,参考号码是1索引,这意味着给定范围的起始值为1。 因此,400,001就表示为地址0的保持寄存器00001。一些做法选择以零开始其范围,这意味着400,000转换为地址零的保持寄存器。
如下为寄存器索引方案,1索引范围应用较为广泛,强烈建议采用。
数据的大端和小端
多寄存器数据(单精度浮点值),可以通过将数据拆分到两个寄存器,轻松地在Modbus中传输。 由于这不是由标准定义的,因此分割的字节顺序没有规定。 尽管每个无符号字必须以网络(big-endian)字节顺序发送以满足标准,但许多设备会颠倒多字节数据的字节顺序。 下图所示的是一个不常见但有效的例子。
字符串可以很容易地存储在Modbus寄存器中。 为了简单起见,一些方法要求字符串长度为2的倍数,并使用控制来填充额外的空间。 字节顺序也是字符串交互中的一个变量。 字符串格式可能包含也可能不包含NULL作为最终值
Modbus功能码
根据对象的不同,modbus的功能码:
评论区