本篇作为modbusrtu问题的基础篇,先讲讲modbus相关的协议,后篇再讲问题是如何解决的,是怎么的一个思路。
先列个引子,问题:现场plc接设备,比如泵、液位计、鼓风机等设备,然后plc接dtu进行4G数据传输,云服务器接受数据并进行设备数据的显示及反控。
一张脑图了解modbus的框架:
一、 Modbus的定义
Modbus通信协议:由Modicon公司(现在的施耐德电气Schneider Electric)于1979年为可编程逻辑控制(即PLC)通信而发表。目前,Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。Modbus作为目前工业领域应用(比如说:PLC)最广泛的协议。
相对其它通信协议modbus 协议的特点:免费;简单;接口丰富。
(1)Modbus协议标准开放、公开发表且无版权要求。
(2)Modbus协议支持多种电气接口,包括RS232、RS485、TCP/IP等,还可以在各种介质上传输,如双绞线、光纤、红外、无线等。
(3)Modbus协议消息帧格式简单、紧凑、通俗易懂。用户理解和使用简单,厂商容易开发和集成,方便形成工业控制网络 Modbus协议是一种应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型,协议本身并没有定义物理层,只是定义了控制器能够认识和使用的消息结构。
二、 Modbus的内容
先了解两个概念:线圈和寄存器。
线圈:从电气角度来看,在电气回路中,一般都是靠接触器或中间继电器来实现控制,接触器或中继最终靠的是线圈的得电和失电来控制触点闭合和断开,因此用线圈表示布尔量;
寄存器:用来暂时存放参与运算的数据和运算结果,具有接收数据、存放数据和输出数据的功能。
而寄存器在计算机中,就是用来存储数据的,因此非布尔的数据放在寄存器里。
而按照两种类型形成了modbus的存储,由于有读有写就会有4种不同的组合,而为了方便使用,定义了代码。
由于存储区有4个,对4个存储区进行读写就有了更多的组合,由于输入线圈及输入寄存器只能读,所以一共有6种情况。但写入又分成单个写入和多个写入,于是又多了两种情况,于是便有了8种情况(modbus核心功能码)。
三、 Modbus协议分类
Modbus协议目前存在Modbus RTU、Modbus ASCII、Modbus TCP三个版本。通信介质: 包括串口和网口。
说协议之前先说下位(bit)、字节(byte)、字(word)之间的关系。
ASCII参照
计算机底层都是二进制代码,不一致需进行转换,但16进制用的多,不用十进制,因为16是2的倍数,更易表达,ASCII字符集采用的就是8bit,可以用2个16进制表示。目前上位机使用的基本都是16进制。
1word=2byte=16bit
高八位,低八位
内存里,一个单元是一个字节,也就是8位,16位的指令,就是同时操作连续的2个内存地址,将这连续的2个内存地址当成一个单位,所以就有高8位和低8位之分。
由于计算机仅识别二进制描述的数字,所以对一个内存地址,也就是8位二进制,如:0000 0001,0000就是高四位,0001就是低四位。
Why?
对于8位处理器,不存在此问题,但16、32、64位时就会存在此问题,会存在哪个在前,哪个在后的问题。
下面说说modbus协议。
Modbus-TCP:由TCP头+地址+PDU组成,
Modbus-RTU:由地址+PDU+CRC校验组成
a:Modbus为一问一答协议,发送一个请求后要等待回复才能发送第二个请求。
b:Modbus-RTU的物理接口为串口。
c:Modbus-TCP的物理接口为以太网。
Modbus报文如下所示:
Modbus通讯如下所示:
【在modbus协议中】
主机发送modbus请求,从机根据请求内容向主机返回响应。在modbus协议中,主机总是主动方,从机总是被动方。
四、 Modbus报文解析
Modbus协议2种通信模式交换信息:单播模式和广播模式。
不管是请求报文还是答复报文,数据结构如下:
即报文(帧数据)由4部分构成:地址(Slave Number)+功能码(Function Codes)+数据(Data)+校验(Check) 。其中的地址代表从设备的ID地址,作为寻址的信息。功能码表示当前的请求执行具体什么操作,比如读还是写。数据代表需要通讯的业务数据,可以根据实际情况来确定。最后一个校验则是验证数据是否有误。其中的功能码说明如下:
栗子:
a.请求:01 03 00 00 00 02 C4 0B
01:设备地址 ,设备地址为1
03:功能码 ,当前为03读取请求
00 00:寄存器起始地址,从00 00寄存器开始读取
00 02:读取寄存器长度 ,读取2个长度,代表读2个寄存器,即4个字节。
C4 0B:CRC效验和
回复:01 03 04 00 0C 00 02 BB F1
01:设备地址 ,设备地址为1
03:功能码,当前为03读取回复
04:数据长度 ,包含4个字节的数据
00 0C:寄存器1数值
00 02:寄存器2数值
BB F1:CRC效验和
03,04长度为寄存器。
以读报文为例:
01,02:
发包:01 01 00 00 00 08 XX XX
回包:01 01 01 00 XX XX
此处00 08代表读8位,即一个字节,因此回包的数据长度为01。
01,02长度为位。
反控: