Modbus是工业通信设备中最常用的协议之一,网关向Modbus设备发送命令以获取设备的值。
在Modbus网络上的所有设备中,通常只有一个主设备,它会向其他从设备发送不同的命令。Modbus主设备会向网络上的所有设备广播消息,但只有分配了Modbus地址来接受命令的设备才会接受该命令,其余设备将拒绝该命令。基本的Modbus命令可以指示RTU更改其某个寄存器中的值、控制或读取I/O端口,以及命令设备发回其寄存器中包含的一个或多个值。
在工业环境中使用Modbus的主要原因是:
它是专为工业应用而开发的
它是公开发布的,免版税
它易于部署和维护
它移动原始位或字,而不会对供应商施加太多限制
在Modbus协议上轻松获得SCADA系统
Modbus协议有多种类型:
ModbusTCP
ModbusRTU
ModbusASCII
ModbusPlus
ModbusDaniels
ModbusTek-Air
ModbusOmniflow
其中最流行的是ModbusRTU和ModbusTCP/IP。
ModbusRTU是一种串行通信协议,可连接同一网络上的不同设备,并使它们之间可以进行通信。
ModbusTCP涵盖使用TCP/IP协议通过“内部网”或“互联网”环境进行Modbus通信。目前,该协议最常见的用途是将PLC、I/O模块和网关通过以太网连接到其他简单现场总线或I/O网络。
总会有这样一个问题:为什么使用面向连接的TCP/IP协议而不是面向数据报的UDP。主要原因是通过将单个“通信”隔离在可以识别、取消和监督的连接中来保持对单个“通信”的控制,而无需对客户端和服务器应用程序执行特定操作。这使该机制能够容忍网络性能变化,并且还提供了添加防火墙和代理等安全功能的空间。
MODBUS/TCP/IP处理两种不同的情况。在协议层面上,连接很容易被识别。单个连接可用于执行多个独立通信。此外,TCP/IP允许大量并发连接,因此用户决定重新使用旧连接或重新连接到常用连接。
Modbus通过设备之间的串行线路传输。最简单的设置是使用一条串行电缆连接两个设备(主设备和从设备)上的串行端口。
数据以一系列1和0(称为位)的形式发送。每个位都以电压的形式发送。0以正电压的形式发送,1以负电压的形式发送。位发送得非常快。典型的传输速度为9600波特(每秒位数)。
Modbus协议定义了一个独立于底层通信层的协议数据单元(PDU)。ModbusRTU是最常用的,它是PDU的二进制表示,在PDU之前有寻址,末尾附加有CRC。ModbusASCII是使用所有可打印字符(通常是两倍的字节数)表示的相同PDU。ModbusTCP本质上与ModbusRTU完全相同,只是CRC不在应用层字节字符串中,而留给TCP层自动处理。RTU数据包的TCP封装中还有一些额外的寻址字节。
无论协议变体如何,功能代码、寄存器编号和寻址都是相同的。寄存器类型相同,即为Modbus设备定义了相同的数据块。
从设备中的信息存储在四个不同的表中。
每个表有9999个数据点,可以存储不同的值。
每个线圈有1位,并给出x0000和x9999之间的数据地址。
每个寄存器是1个字=16位=2个字节,并且数据地址在x0000和x9999之间。
数字40001、10000等应作为位置的地址。这些数字永远不会显示在实际消息中。实际地址将是存储数字的偏移量。因此,如果设备具有Modbus的ADU(应用程序定义单元)寻址,则地址0001将位于偏移量40001处,而对于PDU(协议定义单元),它将位于偏移量40002处。
Modbus映射是支持Modbus作为通信协议的任何特定设备的简单点列表。
Modbus映射应包含以下信息:
设备读取和存储什么类型的数据(例如温度或压力)
数据存储在哪个地址(例如40001处的电压A-N)
数据存储的格式是什么(例如位、UINT16、SINT16等)
如果需要,提供点的工程单位。
有关设备是否具有ADU或PDU寻址的信息。
大多数设备都预装了Modbus寄存器。在某些情况下,制造商还允许操作员根据自己的要求配置设备。
MODBUS设备可以配置为偶校验或奇校验,或无奇偶校验。这决定了字符数据帧的奇偶校验位的设置方式。如果选择偶校验或奇校验,则计算每个字符帧数据部分中的1位数量。RTU模式下的每个字符包含8位。然后,奇偶校验位将设置为0或1,从而导致1位总数为偶数(偶校验)或奇数(奇校验)。
RTU模式消息帧包括一种基于循环冗余校验(CRC)的错误检查方法。消息帧的错误检查字段包含一个16位值(两个8位字节),其中包含对消息内容执行的循环冗余校验(CRC)计算的结果。
代码
名称
含义
01
非法功能
查询中收到的功能代码不是服务器(或从属设备)允许的操作。这可能是因为功能代码仅适用于较新的设备,并且未在所选单元中实现。它也可能表明服务器(或从属设备)处于错误状态,无法处理此类请求,例如因为它未配置并被要求返回寄存器值。
02
非法数据地址
查询中收到的数据地址不是服务器(或从属设备)允许的地址。更具体地说,参考编号和传输长度的组合无效。对于具有100个寄存器的控制器,PDU将第一个寄存器的地址设为0,将最后一个寄存器的地址设为99。如果提交的请求的起始寄存器地址为96,寄存器数量为4,则该请求将成功(至少在地址方面)对寄存器96、97、98、99进行操作。如果提交的请求的起始寄存器地址为96,寄存器数量为5,则该请求将失败,并出现异常代码0x02“非法数据地址”,因为它尝试对寄存器96、97、98、99和100进行操作,而没有地址为100的寄存器。
03
非法数据值
查询数据字段中包含的值不是服务器(或从属设备)允许的值。这表明复杂请求的其余部分的结构存在错误,例如隐含的长度不正确。它具体并不意味着提交存储在寄存器中的数据项具有超出应用程序预期的值,因为MODBUS协议不知道任何特定寄存器的任何特定值的意义。
04
从设备故障
当服务器(或从设备)尝试执行请求的操作时发生不可恢复的错误。
05
确认
专门与编程命令结合使用。服务器(或从设备)已接受请求并正在处理它,但这样做需要很长时间。返回此响应是为了防止客户端(或主设备)中发生超时错误。客户端(或主设备)接下来可以发出轮询程序完成消息来确定处理是否完成。
06
从设备忙
专门与编程命令结合使用。服务器(或从设备)正在处理长时间的程序命令。客户端(或主设备)应在服务器(或从设备)空闲时重新传输该消息。
08
内存奇偶校验错误
专门与功能代码20和21以及引用类型6结合使用,表示扩展文件区域未能通过一致性检查。服务器(或从设备)尝试读取记录文件,但检测到内存中的奇偶校验错误。客户端(或主设备)可以重试该请求,但服务器(或从设备)设备上可能需要服务。
0A
网关路径不可用
专门与网关结合使用,表示网关无法分配从输入端口到输出端口的内部通信路径来处理请求。通常意味着网关配置不正确或过载。
0B
网关目标设备响应失败
专门与网关结合使用,表示未从目标设备获得响应。通常意味着该设备不在网络上。
版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。