Modbus协议概述


概述

Modbus 是由 Modicon(现为施耐德电气公司的一个品牌) 在 1979 年为可编程逻辑控制(即PLC)通信而发表的。目前,Modbus已经成为工业领域通信协议的业界标准,是工业领域应用最广泛的协议。

在中国, Modbus 已经成为国家标准。
标准编号:GB/T19582-2008
标准名称:《基于 Modbus 协议的工业自动化网络规范》
分 3 个部分:
《GB/T 19582.1-2008 第 1 部分:Modbus 应用协议》
《GB/T 19582.2-2008 第 2 部分:Modbus 协议在串行链路上的实现指南》
《GB/T 19582.3-2008 第 3 部分:Modbus 协议在 TCP/IP 上的实现指南》

相较于其他协议的特点:

  • Modbus协议标准开放、公开发表且没有版权要求。
  • Modbus协议支持多种电气接口,包括RS232、RS485、TCP/IP等,可以在各种介质上传输,如双绞线、光纤、红外、无线等。
  • Modbus协议消息帧格式简单、紧凑、通俗易懂。用户理解使用简单,厂商容易开发和集成,方便形成工业控制网络。
  • Modbus协议是一种应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型,协议本身没有定义物理层,只是定义了控制器能够识别和使用的消息结构。

协议分类

  • 串口
    • Modbus RTU(Remote Terminal Unit 远程终端单元):这种方式通常采用RS-485做为物理层,一般利用芯片的串口实现数据报文的收发,报文数据采用二进制数据进行通信。
    • Modbus ASCII :报文使用 ASCII 字符。ASCII 格式使用纵向冗余校验和。Modbus ASCII 报文由冒号 (“:”)开始 和换行符 (CR/LF) 结尾构成。
  • 以太网
    • Modbus TCP/IP 或 Modbus TCP :这是一种 Modbus 变体版本,使用 TCP/IP 网络进行通信,通过 502 端口进行连接。报文不需要校验和计算,因为以太网底层已经实现了CRC32 数据完整性校验。
    • Modbus over TCP/IP 或 Modbus over TCP 或 Modbus RTU/IP :这也是一种 Modbus 变体,与 Modbus TCP 的不同之处在于,与 Modbus RTU 一样,校验和包含在报文中。
    • Modbus UDP:也有在UDP上传输Modbus报文的,需要做错误重传机制。

存储区(数据模型)

PLC数据的传输离不开存储和读写操作,为了更好存储不同的数据类型,我们可以理解modbus会将布尔和非布尔的数据分开存储。

  • 线圈(Coils):从电气角度来看,在电气控制回路中,一般都是靠接触器或中间继电器来实现控制,接触器或中继最终靠的是线圈的得电和失电来控制触点闭合和断开,因此用线圈表示布尔量;
  • 寄存器(Registers):用来暂时存放参与运算的数据和运算结果,具有接收数据、存放数据和输出数据的功能。寄存器在计算机中,就是用来存储数据的,因此非布尔的数据放在寄存器里。

存储类型 & 存储区名称

Modbus的线圈和寄存器应该也按照只读、读写来进一步细分,因此就形成了Modbus的存储区,如下表所示:

存储类型存储区名称读写存储对象存储区代号
线圈输入线圈只读布尔量1 bit1区
线圈输出线圈可读可写布尔量1 bit0区
寄存器输入寄存器只读寄存器16 bit3区
寄存器保持寄存器可读可写寄存器16 bit4区

存储区范围

无论是什么存储区,都会有一个范围的限制。
Modbus规定每个存储区的最大范围是65536(相对地址0-65535)即长地址模型

存储区名称存储区代号绝对地址范围相对地址范围
输入线圈1区100001-1655350-65535
输出线圈0区000001-0655350-65535
输入寄存器3区300001-3655350-65535
保持寄存器4区400001-4655350-65535

但实际使用中,一般用不了这么多地址,因此为了方便有一种短地址模型

存储区名称存储区代号绝对地址范围相对地址范围
输入线圈1区10001-199990-9998
输出线圈0区00001-099990-9998
输入寄存器3区30001-399990-9998
保持寄存器4区40001-499990-9998

常说的PLC地址的组成

它是由存储区编号加上一个地址索引组成,我们把这样的PLC地址,理解为绝对地址,后面的地址索引,理解为相对地址

对于Modbus来说:绝对地址=区号+相对地址

协议的目的是为了数据传输,也就是为了读取数据和写入数据,我们已经确定好4个存储区,存储不同的数据类型,那么接下来我们就要对这些存储区进行读写,那么可能会产生很多种不同的行为。于是有了功能码这个概念。

功能码

功能码目的:行为代号,区分行为动作

读取和写入是2种行为,存储区有4个,但是我们知道输入线圈和输入寄存器是只读的,因此不能进行写入,除去这2种的话,应该会产生6种不同的行为

行为序号具体行为
1读取输入线圈
2读取输出线圈
3读取输入寄存器
4读取保持寄存器
5写入输出线圈
6写入保持寄存器

然而,Modbus规约将写入输出线圈和写入保持寄存器这2种行为,又进一步做了细分,包括写入单个和写入多个,因此原来的6种行为就变成了8种行为,同时给每种行为设置一个代号,就形成了下图所示的功能码列表:

功能码功能说明
0x01读取输出线圈
0x02读取输入线圈
0x03读取保持寄存器
0x04读取输入寄存器
0x05写入单个线圈
0x06写入单个寄存器
0x0F写入多个线圈
0x10写入多个寄存器

(Modbus规约中的功能码其实不止这8个,还有一些功能码是用于诊断或异常码,但是一般很少使用,这8种功能码是最主要的核心功能码。)

报文格式

一个报文就是一帧数据, 指的是一串完整的指令数据。

Modbus-RTU报文格式

从站地址(1个字节)+ 功能码(1个字节)+ 数据部分(N个字节)+ CRC检验(2个字节)

从站地址功能码数据部分CRC检验
1 byte1 byten bytes2 bytes

Modbus-ASCII报文格式

开始字符(:)+ 从站地址(2个字节)+ 功能码(2个字节)+ 数据部分(N个字节)+ CRC检验(2个字节)+ 结束字符(CR LF)

开始字符从站地址功能码数据部分CRC检验结束字符
:2 bytes2 bytesn bytes2 bytesCR LF

Modbus-TCP报文格式

事务处理标识符(2个字节)+ 协议标识符(2个字节)+ 长度(2个字节)+ 单元标识符(1个字节)+ 功能码(1个字节)+ 数据部分(N个字节)

事务处理标识符协议标识符长度单元标识符功能码数据部分
2 bytes2 bytes2 bytes1 byte1 byten bytes

Modbus TCP 不使用校验,因为TCP协议是一个面向连接的可靠协议

报文其他注意点

1. 位(Bit)与 字节(Byte)

  • 计算机中最小的数据单位是位(Bit),但是一般计算机系统能读取和定位到最小的信息单位是字节(Byte)。
  • 1 Byte = 8 Bit

2. 二进制(BIN) & 十进制(DEC) & 十六进制(HEX)

  • 使用不同的进制方式来表示同个数值(同一个数值的不同表示方式)
  • 0000 0000 = 0x00
  • 1111 1111 = 0xFF
  • Modbus协议一般使用两个十六进制码来表示一个字节
  • 网络编程,数据交换的时候需要对字节进行解析都是1个Byte1个Byte的处理,1个Byte可以用0xFF两个16进制来表达。
  • 数据存储,存储到硬件中是0101的方式,存储到系统中的表达方式都是byte方式。
  • 一些常用值的定义,比如:我们经常用到的html中color表达,就是用的16进制方式,4个16进制位可以表达好几百万的颜色。(0x
    表示16进制)

3. 高地址位 & 低地址位

  • 内存里,一个单元是一个字节,也就是8位。
  • 如果是16位的指令,就是同时操作连续的2个内存地址,将这连续的2个内存地址当成一个单位,所以就有高8位和低8位之分。
  • 由于计算机仅识别二进制描述的数字,所以对一个内存地址,也就是8位二进制,如:0000 0001,0000就是高四位,0001就是低四位。

4. 小端(Little-Endian) & 大端(Big-Endian)

  • 大小端问题源自计算机科学中的字节序问题
  • 大端模式(Big Endian):在大端模式下,数据的高位字节(MSB)存储在低地址处,低位字节(LSB)存储在高地址处。
    (低高高低,低地址高字节,高地址低字节)
    低地址 -------------------------> 高地址
    0x12 | 0x34 | 0x56 | 0x78
  • 小端模式(Little Endian):在小端模式下,数据的低位字节存储在低地址处,高位字节存储在高地址处。
    (低低高高,低地址低字节,高地址高字节)
    低地址 -------------------------> 高地址
    0x78 | 0x56 | 0x34 | 0x12

大小端出现原因
计算机系统是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但对于位数大于8位的处理器,如16位或32位的处理器,由于寄存器宽度大于一个字节,那么必然存在一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式的出现。

Modbus中的字节序

  • MODBUS-RTU: 它使用的是大端模式(Big Endian)。在MODBUS-RTU协议中,所有的数据交换都是以大端字节序进行的。这意味着在发送和接收数据时,高位字节(MSB)总是被发送或接收在前,低位字节(LSB)在后。例如,如果有一个16位的寄存器值0x1234,在MODBUS-RTU中会先发送0x12,然后发送0x34。
  • MODBUS-TCP:
    MODBUS-TCP协议本身并不规定字节序,因为它是在IP网络层面上运行的,而IP网络通信通常使用大端字节序。然而,当MODBUS-TCP用于与MODBUS-RTU设备通信时,它通常会遵循MODBUS-RTU的约定,即使用大端模式。这是因为MODBUS-TCP通常作为MODBUS-RTU数据的封装,保持数据的一致性。
    但是,如果MODBUS-TCP用于其他上下文,比如在不同平台或设备之间的通信,可能需要根据接收端的字节序来转换数据。例如,如果一个使用小端字节序的设备接收到来自MODBUS-TCP的数据,可能需要将数据从大端转换为小端,以确保数据的正确解释。
  • 跨平台数据交换:
    当MODBUS通信涉及到不同硬件平台或操作系统时,字节序问题尤为重要。例如,如果一个使用小端字节序的PC机需要与使用大端字节序的嵌入式系统通信,就必须在发送和接收数据时进行字节序的转换。
  • 设备配置和诊断:
    在设备配置和诊断过程中,如果涉及到读取或写入寄存器值,这些值在MODBUS协议中是以大端字节序传输的。因此,即使设备内部可能使用小端字节序存储数据,通信时也需要转换为大端字节序。
  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值