modbus简介

参考资料:Modbus软件开发实战指南

Modbus是一种串口通信协议,随着技术的发展modbus也有对应的TCP/IP版本(标准端口502)。本文只记录modbus串口协议相关内容。

在串口modbus协议网络中多个串口设备连接到一根总线上,所以这个网络中的任何设备都可以接收到其他设备发出的报文。Modbus串口协议网络中只存在一个主设备(master),所有的主动请求命令都由这个master发出,其他设备称为slave,只能对master发出的命令做出响应。

常见的Modbus调试软件有modbus poll和modbus slave,前者可以模拟master设备,后者模拟slave设备(下载地址)。在一台电脑上模拟串口需要虚拟串口软件VSPD

Modbus有两种编码方式:RTU和ASCII,二者不能混用,即同一个系统中只能存在一种编码方式。RTU是二进制形式;ASCII将RTU中的一个字节拆成两个字节,每个字节对应一个ASCII码,并且ASCII格式的帧由冒号作为帧头。本文主要介绍RTU格式的帧。

Modbus的报文格式(RTU)如下所示:

地址(1byte)

功能码(1byte)

数据(0~n)

校验位(2byte)

地址:

       取值范围1~247,0为广播地址,slave对地址为0的报文做出动作之后不发出应答报文。

功能码:

       三个类别:标准中定义的;自定义的(65~72和100~110);预留的。

       Slave收到指令后如果出现异常则将接收到的命令中的功能码最高位置1并将指令发出,所以功能码128~255为异常响应码。

       功能码分为两类,位操作与字操作。位操作的基本单元是bit,字操作最小单位是2byte。

数据:

       数据的基本单位是字节(byte),数据位包含两种类型的数据:寄存器的起止和有效数据。对于包含有效数据的数据区间,第一个字节表示数据区间有效数据的字节数。如果数据位表示的是寄存器的起始和结束位置,则数据区间有4个字节,前两个字节表示寄存器的起始位置,后两个字节表示读取的字节数。

校验位:

       RTU报文最后两个字节是校验位,一般使用的算法是CRC-16。

Modbus寄存器地址分配

寄存器种类

PLC地址

Modbus协议地址

简称

读写状态

线圈状态

00001~09999

0000H~FFFFH

  0x

WR

离散输入状态

10001~19999

0000H~FFFFH

1x

R

保持寄存器

40001~49999

0000H~FFFFH

4x

WR

输入寄存器

30001~39999

0000H~FFFFH

3x

R

Modbus协议地址和设备(PLC)地址有一个映射关系,设备地址均映射到modbus协议中的0000H~FFFFH,因为不同寄存器的命令不同所以不会出现冲突。

 

Modbus报文示例(RTU,16进制):

Master发出的报文:01 03 00 00 00 0A C5 CD

01:设备地址为1

功能码03:读保持寄存器

00 00 :寄存器起始地址为0

00 0A:读10个字(20个字节)

C5 CD:校验码

结合功能码03可知读PLC40001~40020,共20个字节。

Slave返回的报文:

01 03 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A 8F 16

01:设备地址

03:读保持寄存器

0x14:数据区域有20字节的有效数据

0x14后的20个字节都是有效数据

8F 16:校验位

原文地址:https://www.cnblogs.com/jiahu-Blog/p/8652120.html