——
参考自
《机电控制系统》 李勇
《Modbus RTU 串口通信在工业自动化系统中的应用》沈林晖
《RS485 总线通信协议的设计与实现》冯子陵
中国国家标准化管理委员会起草并制定的《基于Modbus协议的工业自动化网络规范》,详细给出了Modbus协议标准的三个部分:Modbus应用协议,Modbus协议在串行链路上的实现和Modbus协议在TCP/IP上的实现。
MODBUS通信协议是一种串行通信协议,从功能上看就是一种现场总线。其主从 ( Master-Slave) 通信机理(相当于互联网的客户机/服务器通信机理)支持同时连接一个主设备和247个以内任意数量的从设备(实际所支持的从机数要由所用通信设备决定)。
Modbus协议一般可以分为三层:
层名 | 位置 |
---|---|
应用层 | 最高层 |
主从协议栈部分 | 中间层 |
数据链路层 | 底层 |
MODBUS支持多种电气接口,如RS-232、RS-485、TCP/IP等,且可在多种介质上传输,如双绞线、光纤、红外、无线等。
MODBUS拥有三种传输模式:ASCII模式、RTU模式和TCP模式,不允许混合使用。
在实际的应用过程中,设计者可自行修改,设计专用的通信协议。
工业现场常用RS-485来改正RS-232的不足,后者抗干扰能力较弱且容易信号失真。
接线方式: 所有的 485+连在一起, 所有的 485-连在一起,这是由于RS-485特殊的信号传输模式。
之所以图中有虚线箭头( 包括 RS485 网络中), 是因为理论上在两个网络中, 只要各个 PLC 不发数据, 网络中任意 PLC 都可以用来作为主站, 其它 PLC 作为从站; 但是由于多个 PLC 之间没有一个统一的时钟基准, 容易出现在同一时刻有多个 PLC 发送数据, 会导致通讯冲突失败, 因此不建议这样使用。
MODBUS为应用层报文传输协议,仅定义了通信的消息结构。
MODBUS定义了消息帧格局和内容的公共格式,描述了控制器访问另一设备的过程、被访问者如何做出应答响应,以及怎样侦测差错和提交差错信息。MODBUS是主从访问的单主控制网络,主站没有站地址,每个从站都有自己的地址编号,范围0~255。从站之间无法相互通信。
MODBUS使用主从技术,只有主机能启动数据传输周期,一次只发送一个请求报文到指定的从站,称为查询,然后等待从站响应;其它从设备得到请求报文后检查并分析数据包, 然后处理查询所要求的动作,并返送对查询做出的回应,没有主站的请求从站不会发送任何数据;主站接收到响应报文检查数据包, 无误之后再对接收的数据做相应处理,如果检查有误则重发请求报文。
主设备可以与从设备单独通信或通过广播方式同时与所有从设备进行通信,后者所有从设备不用作任何回应;此外如果接收到的消息帧含有未知指令,则主站或从站都不会进行回应。
主站和从站之间的数据交换是通过功能码来控制的, 不同的功能码访问不同的数据区, 有的功能码是对状态位操作的, 有的功能码是对 16 位寄存器操作的。
MODBUS通过消息帧传输信息,与底层通信层无关。
主设备查询和从设备回应的消息帧格式类似。
一个消息帧包含4类信息,按发送的先后顺序排列,其通用格式为:
地址域 | 功能域 | 数据域 | 错误检测域 |
---|
表中地址域内容为从设备地址(一个字节)。当从设备发送回应消息时,需把自己的地址放入回应的地址域中,一边主设备知道时哪一个设备作出的回应。
地址0用作广播地址,此时所有的从设备都能够识别并接收;248-255为保留地址;主站不分配地址,即没有地址。
modbus的操作对象有四种:线圈、离散输入、输入寄存器、保持寄存器。
功能域中包含功能码,从设备将据此执行对应的功能(一个字节);当从设备回应时,使用功能代码与来指示正常回应还是异常回应:正常回应时回应同样的功能代码;对异常回应,从设备还需在其最高位置置1,此外还需将一个专用代码放到回应罅隙的数据域以通知主设备。
功能码可参照下图:
一些功能码是通用的,一些适用于特定设备,一些保留备用。
Modbus 寄存器、地址与功能码
Modbus 地址与 Modbus 的功能码是两个层次的概念。
根据 Modbus 通信协议,Modbus 数据的地址使用 00xxx、10xxx、30xxx 和 40xxx 的形式,这四个地址分别储存数字量输出、数字量输入、模拟量输入、模拟量输出(DI、DO、AI、AO)相关数据。
下表中罗列了modbus地址 以及对应的 支持对该地址中储存数据进行操作的功能码。从下表中可以看到除了0、1、3、4开头的地址,还出现了其它映射地址,不过最常用的还是0、1、3、4,例如西门子系PLC在进行modbus通信时就只支持这四个地址,其它的modbus通讯测试软件如modbus slave和modbus poll也只支持0、1、3、4。
modbus协议最开始是用来解决PLC的通信协议问题的,主要用于处理输入输出数字量信号以及模拟量信号,因此modbus协议中各类寄存器就是从信号的输入输出引申出来的,这些寄存器用来储存输入、输出的模拟量或数字量。
常用的有四类寄存器,寄存器名与其对应的modbus地址等见下表,括号内为寄存器的另一种名字:
寄存器名 | 地址 | 存取方式 | 储存数据类型 |
---|---|---|---|
离散输出(线圈)寄存器 | 00001至09999 | 读写 | DO/数字量输出 |
离散(数字)输入寄存器 | 10000至19999 | 只读 | DI/数字量输入 |
输入(模拟输入)寄存器 | 30000至39999 | 只读 | AI/模拟量输入 |
保持(模拟)寄存器 | 40000至49999 | 读写 | AO/模拟量输出 |
合起来讲,modbus通信协议规定了四类寄存器,每个寄存器储存不同类型的数据,支持的功能码也不同,每个寄存器拥有一个唯一的modbus地址。现在的PLC编程中,已经很少用到功能码,只需填入需要操作数据的modbus地址以及存取方式(读或写)即可实现数据交互。
数据域中存放需要被功能码操作的具体数据(n个字节,可以为0),包括了开关量或寄存器地址、待处理项的数目、域中实际数据字节数。数据可由ASCII字符或RTU字符组成。正常执行,从设备返回主设备请求信息;出现异常,返回异常代码,供主设备判断下一步行动。主设备应用程序得到异常的回应后,典型处理过程时重发消息,或诊断发给从设备的消息并报告给操作员。
在错误检测域中(ASCII模式为一个字节,RTU模式为两个字节),MODBUS采用两种错误检测方法:奇偶校验和帧检测,后者包含LRC(Longitudinal Redundancy Check,纵向冗余校验)和CRC(Cyclic Redundancy Check,循环冗余校验)。
对于组网复杂的大型通信系统,由于Modbus协议主从方式的工作机制,会造成通信繁琐,延长通信时间;当通信过程中信息量过大时,会造成网络堵塞。网络堵塞会导致信息难以发送,通信补偿,严重时可能导致整个通信网络崩溃。为避免网络堵塞,需要对总线中的流量进行控制,即流量控制。
流量控制可以根据网络负载量进行动态调整网络流量,并根据每个连接链路的需求和链路当前状况有效地分配带宽。
可采用简单的停止等待协议实现流量控制。若待发送的数据超过限值,则将数据分几帧后进行传输。发送方每次发送出一帧后,会停止发送,等待接收端的应答。若收到确认帧,则发送下一帧,否则等待确认帧。若发送端在规定的时间内没有收到确认帧,则重发上一帧。
主 PLC 给从 PLC 发送数据时, 如果主 PLC 在前一次发送数据后, 从 PLC 还没来得及将全部数据接收完, 此时主 PLC 再次给从 PLC 发送数据时, 容易导致从 PLC 接收数据发生错误。可通过添加通讯前延时等待时间设置来解决此问题, 即从站 PLC 接收完数据, 需要延时一定的时间, 才能再接收下一次通讯数据。
此案例为流量控制的另一种体现。