Modbus上位机:摩尔信使MThings,可接入管理PLC、电表、各类传感器等设备,全功能调试、运维、组态、告警、历史数据、数据网关。
先干了这碗鸡汤
第一句,Modbus协议是一种简单的应用层协议。
但是,各行如隔山,入门者遇见Modbus协议犹觉面至绝壁。
本文以自身多年从业经验分享MODBUS的学习经验。
对协议的陌生感主要还是不熟悉设计协议人的惯常套路,在此先要洗个脑。大部分协议大致包含3个部分:交互流程、报文格式、数据定义。
交互流程中不仅介绍通信过程中有哪些角色,同时定义了角色之间可完成哪些功能及其实现步骤。
通常协议中将交互流程和报文格式放在一起定义,建议阅读者先从流程入手,不要直接去关注报文格式的具体定义。
数据定义看似是一份协议的延伸,但却是实际开发调试过程中的重点,大部分问题往往出现在双方对数据定义的理解偏差。
Modbus协议簇概览
常说的MODBUS实际上包含多种协议,包括:MODBUS-RTU、MODBUS-ASCII、MODBUS-TCP。拿工控行业通常的设备组网看,三兄弟应用的范围如下:
而实际应用时,由于改造需求,存在将MODBUS-RTU/ASCII应用在以太网中。
RTU相比较ASCII具备更紧凑的报文流,传输效率更高,目前MODBUS-ASCII已经应用较少。
三种协议的交互流程的定义基本一致,但是报文格式定义存在明显区分:
交互流程
现行MODBUS标准中定义了19中交互流程,分别对应一种功能码,其中常用流程所对应功能码是01~06、15、16,主要完成4种数据的读写。交互流程都遵循主从交互模式,一句话总结:主机发送请求后,从机响应相应数据。
由于MODBUS-RTU/ASCII协议常用于非平衡传输总线(例如RS485),协议要求严格遵循同步请求模式,即主机发送请求后直至接收从机回复数据或超时无响应,主机才能发送其它请求,同时总线上只能有一个主机。
即使MODBUS-RTU/ASCII协议应用于以太网,由于应用协议没有设计请求响应帧之间的匹配机制,在同一链接中依旧要遵循上述要求。
而MODBUS-TCP协议专为以太网这种平衡式传输网络而设计,提供了简单的帧序号机制,进而支持主机异步方式发送请求,可充分利用网络带宽。在异步模式下,主机性能一般高于从设备性能,主机应能够限制异步请求规模,防止从机资源溢出。
报文格式
参考《Modbus_Application_Protocol_V1_1b3.pdf》
数据定义
交互流程和报文格式在MODBUS协议标准中被定义的非常清晰,而对数据定义的处理却在不同的厂家产生了很大的差异。
首先,说到MODBUS数据,就直接讲寄存器是不对的。MODBUS标准中定义4种数据块:
数据块 | 单位长度 | 访问类型 | 前导数 | 读功能码 |
线圈状态 | 1 Bit | RW | 0 | 0X01 |
离散输入 | 1 Bit | RO | 1 | 0X02 |
保持寄存器 | 2 Bytes | RW | 4 | 0X03 |
输入寄存器 | 2 Bytes | RO | 3 | 0X04 |
基于数据块的单位长度,可将4种数据块分为两类:位(BIT)数据和寄存器(REG)数据,结合读写属性,数据块之间的关系如下图:
数据是数据块中的具体定义,不同数据块中的数据定义是相互独立的。如何理解这个独立?比如说地址为100的输入寄存器和地址为100的保持寄存器可以是完全不同的数据。
如何去描述一条MODBUS数据定义?
定义一条数据应该包括:隶属数据块、数据名称、数据地址、数据量、数据类型(协议类型)、数据系数(浮点数据被整形传输时涉及)、字节序(寄存器数据量为1、2、4时涉及)、字序(寄存器数据量为2、4时涉及)。