天天看点

ModBus协议基础

作者:晖晖yyds

本篇作为modbusrtu问题的基础篇,先讲讲modbus相关的协议,后篇再讲问题是如何解决的,是怎么的一个思路。

先列个引子,问题:现场plc接设备,比如泵、液位计、鼓风机等设备,然后plc接dtu进行4G数据传输,云服务器接受数据并进行设备数据的显示及反控。

一张脑图了解modbus的框架:

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种不同的组合,而为了方便使用,定义了代码。

ModBus协议基础

由于存储区有4个,对4个存储区进行读写就有了更多的组合,由于输入线圈及输入寄存器只能读,所以一共有6种情况。但写入又分成单个写入和多个写入,于是又多了两种情况,于是便有了8种情况(modbus核心功能码)。

ModBus协议基础

三、 Modbus协议分类

Modbus协议目前存在Modbus RTU、Modbus ASCII、Modbus TCP三个版本。通信介质: 包括串口和网口。

说协议之前先说下位(bit)、字节(byte)、字(word)之间的关系。

ModBus协议基础

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协议基础

Modbus-TCP:由TCP头+地址+PDU组成,

Modbus-RTU:由地址+PDU+CRC校验组成

a:Modbus为一问一答协议,发送一个请求后要等待回复才能发送第二个请求。

b:Modbus-RTU的物理接口为串口。

c:Modbus-TCP的物理接口为以太网。

Modbus报文如下所示:

ModBus协议基础

Modbus通讯如下所示:

ModBus协议基础

【在modbus协议中】

主机发送modbus请求,从机根据请求内容向主机返回响应。在modbus协议中,主机总是主动方,从机总是被动方。

四、 Modbus报文解析

Modbus协议2种通信模式交换信息:单播模式和广播模式。

不管是请求报文还是答复报文,数据结构如下:

ModBus协议基础

即报文(帧数据)由4部分构成:地址(Slave Number)+功能码(Function Codes)+数据(Data)+校验(Check) 。其中的地址代表从设备的ID地址,作为寻址的信息。功能码表示当前的请求执行具体什么操作,比如读还是写。数据代表需要通讯的业务数据,可以根据实际情况来确定。最后一个校验则是验证数据是否有误。其中的功能码说明如下:

ModBus协议基础

栗子:

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长度为位。

反控:

ModBus协议基础