电力-ModBus_RTU通讯规约1

目录:

一、简介

1.1 简介

1.2 简单理解ModBus通信协议

1.3 表1与表2名词解释

1)功能码含义   2)实现方法

二、通讯信息传输过程

1.1 地址码

1.2 功能码

1.3 数据区

三、ModBus功能码

3.1 功能码“02”:读1路或多路开关量输入状态

3.2 功能码“01”:读1路或多路开关量输出状态

3.3 功能码“03”:读多路寄存器输入

3.4 功能码“05”:写1路开关量输出(遥控)

3.5 功能码“06”:写单路寄存器

3.6 功能码“10”:写多路寄存器

3.7 功能码“03”:读事件记录

四、​错误校验码(CRC校验)​

五、通讯错误信息及数据的处理


相关参考搜索我的百度网盘“Modbus-国家标准-完整版、ModBus_RTU通讯自定义范例和Modbus TCP_IP协议规范”。

下续:电力-ModBus_RTU通讯规约2


一、简介

1.1 简介

Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。

ModBus通讯协议允许PDM系列仪表/变送器与施耐德、西门子、AB、GE等多个国际著名品牌的可编程顺序控制器(PLC)、RTU、SCADA系统、DCS或与第三方具有ModBus兼容的监控系统之间进行信息交换和数据传送。

PDM系列仪表/变送器只要简单地增加一套基于计算机(或工控机)的监控软件(如:组态王、Intouch、FIX、synall等)就可以构成一套电力监控系统。

ModBus通讯规约有两种数据传送方式:HEX码和ASCII码,分别称为ModBus-RTU和ModBus-ASCII,前者直接数据传送,而后者需将数据变换为ASCII码后传送,因此ModBus-RTU协议的通讯效率较高、处理简单、使用广泛。ModBus TCP/IP是RTU模式的延伸,它基于ModBus以太网。

----------------------------

广泛的系统集成:

PDM系列仪表/变送器提供了标准的RS-485/422通讯接口及ModBus通讯协议,这个通讯协议已广泛被国内外电力行业及工控行业作为系统集成的标准。

----------------------------

通讯数据的类型及格式:

信息传输为异步方式,并以字节为单位。在主站和从站之间传递的通讯信息是11位的字格式:

字格式(串行数据)
11位二进制
起始位
1位
数据位
8位
奇偶校验位
1位:有奇偶校验位/无:无奇偶校验位
停止位
1位:有奇偶校验位/2位:无奇偶校验位
通讯数据(信息帧)格式
数据格式:
地址码
功能码
数据区
错误校检
数据长度:
1字节
1字节
N字节
16位CRC码(冗余循环码)

注:1)1个字节由8位二进制数组成(既8 bit)

       2)ModBus是Modicon公司的注册商标

       3)“从机”在本文件中既为PDM

----------------------------

判断Modbus一帧数据结束的方法:在RTU方式下,ModBus协议是根据3.5个字符时间内有没有接收数据来判断是否接受完成。

串行数据一般采用11位的字格式,那么3.5个字符就是3.5*11 = 38.5位。如果没有校验位,采用10位的字格式,那么3.5个字符就是3.5*10 = 35位。

波特率是每秒传输的二进制位的个数,比如9600bps,即每1秒传输9600位,那么传输38.5个二进制位需要的时间:38.5/9.6 = 4.0104167mS,Modbus_RTU要求一帧数据起始到结束至少要不小于3.5个字符时间。

先给定时器定时大概3.5个字符(更大点也可以),然后在串口的接收中断服务程序中,先将定时器的计数寄存器清零,然后重新开始定时。如果接收的不是最后一个字节,那么在下个字节来的时候定时器就会又从零开始计数。如果后面再没有数据进来的话,定时器就会因为定时时间到而进入定时器中断,就表示数据接收结束了。

1.2 简单理解ModBus通信协议

对于01 16 1000 1234 ABCD这段代码的含义说明如下:

向地址01的控制器1000地址处写入1234 。

地址域:就是指 从站的地址,比如一个仪表,这个地址就是它的通讯地址;

功能码:就是你要做的事情,通讯的目的 就是读写数据,所以 ModBus 功能码虽然很多,但是只有两个是我们常用的,就是读和写。读的功能码是03,写的功能码是16。注意,这里的读写都是一次性写16个位,也就是一个WORD(包含数据地址与数据),功能码如表2。

----------------------------

表1、ModBus功能码

功能码名称作用
1 0x01读取线圈状态取得一组逻辑线圈的当前状态(ON/OFF)
2 0x02读取输入状态取得一组开关输入的当前状态(ON/OFF)
3 0x03读取保持寄存器在一个或多个保持寄存器中取得当前的二进制值
4 0x04读取输入寄存器在一个或多个输入寄存器中取得当前的二进制值
5 0x05强置单线圈强置一个逻辑线圈的通断状态
6 0x06预置单寄存器把具体二进值装入一个保持寄存器
7 0x07读取异常状态取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态。
8 0x08回送诊断校验把诊断校验报文送从机,以对通信处理进行评鉴。
9 0x09编程(只用于484)使主机模拟编程器作用,修改PC从机逻辑。
10 0x0A控询(只用于484)可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送。
11 0x0B读取事件计数可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时。
12 0x0C读取通信事件记录可是主机检索每台从机的ModBus事务处理通信事件记录(比如传送53条报文)。如果某项事务处理完成,记录会给出有关错误。
13 0x0D编程(184/384 484 584)可使主机模拟编程器功能修改PC从机逻辑
14 0x0E探询(184/384 484 584)可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送。
15 0x0F强置多线圈强置一串连续逻辑线圈的通断。
16 0x10预置多寄存器把具体的二进制值装入一串连续的保持寄存器。
17 0x11报告从机标识可使主机判断编址从机的类型及该从机运行指示灯的状态。
18 0x12(884和MICRO 84)可使主机模拟编程功能,修改PC状态逻辑。
19 0x13重置通信链路发生非可修改错误后,是从机复位于已知状态,可重置顺序字节。
20 0x14读取通用参数(584L)显示扩展存储器文件中的数据信息。
21 0x15写入通用参数(584L)把通用参数写入扩展存储文件,或修改之。
22~64保留作扩展功能备用
65~72保留以备用户功能所用留作用户功能的扩展编码
73~119非法功能
120~127保留留作内部作用
128~255保留用于异常应答

电力相关定义:

ModScan32用来模拟主设备。它可以发送指令到从机设备(使用Modbus协议的终端设备)中,从机响应之后,就可以在界面上返回相应寄存器的数据。

----------------------------

表2、ModBus功能码与数据类型对应表
代码功能数据类型
1
2
3整型、字符型状态字浮点型
4整型、状态字、浮点型
5
6整型、字符型、状态字、浮点型
8N/A重复“回路反馈”信息
15
16整型、字符型、状态字、浮点型

----------------------------

表3、Modbus寄存器

寄存器种类说明PLC类比举例说明
离散输入
状态DI
输入端口。通过外部设定改变输入状态,可读但不可写DI数字量输入面板上的按键、开关状态,电机的故障状态
线圈状态DO输出端口。可设定端口的输出状态,也可以读取该位的输出状态,可分为两种不同的执行状态,例如保持型或边沿触发型DO数字量
输出
电磁阀输出、电机的启停控制信号、
LED显示等
保持
寄存器AO
输出参数或保持参数,控制器运行时被设定的某些参数。
可读可写
AO模拟量模拟量输出设定值,PID运行参数
输入
寄存器AI
输入参数。控制器运行时从外部设备获得的参数。
可读但不可写
AI模拟量输入模拟量输入

Modbus协议定义了4种基本数据类型:只读位数据DI可读写位数据DO只读16位数据AI可读写16位数据AO这些数据分别被称为输入状态线圈状态输入寄存器保持寄存器

DI数字输入,离散输入,一个地址一个数据位,用户只能读取它的状态,不能修改。
比如面板上的按键、开关状态,电机的故障状态
DO数字输出,线圈输出,一个地址一个数据位,用户可以置位、复位,可以回读状态。
比如电磁阀输出,电机的启停控制信号、LED显示等
AI模拟输入,输入寄存器,一个地址16位数据,用户只能读,不能修改,比如一个电压值的读数
AO模拟输出,保持寄存器,一个地址16位数据,用户可以写,也可以回读,比如一个控制变频器的电流值

无论这些东西被叫做什么名字,其内容不外乎这几种,输入的信号用户只能看不能改,输出的信号用户控制,并可以回读。离散的数据只有一位,模拟的数据有16位。

----------------------------

数据 就是我们传递的消息,这个对于我们来说才是最终目的。1000 1234 就是我们传递的消息,是我们要告诉从站的内容,它又分两部分:地址和内容。

如果把从站比喻成一个大楼地址域就是大楼的门牌号,而数据里的地址就是大楼的房间号,换成变频器也就是变频器的参数地址。所以这段帧 就是这样理解:告诉01大楼的1000房间,1234 往01变频器的1000参数写1234。

差错校验:是为了防止出错而做的保护,就是双方约定的各种计算方法,也就是我们在实际应用中的偶校验、奇校验、停止位等等。 这里的ABCD是随便写的,没任何意义。

1.3 表1与表2名词解释

1)功能码含义

(1)读:

01_DI:  读内部比特量输出状态,如告警、变位、故障、异常等。

02_DO:读外部开关量输入状态,如光耦输入、继电器输入等。

03_AO:读内部输出量的寄存器,如一些配置参数、定值的读取等。

04_AI:  读外部输入量的寄存器,如外部电压电流模拟量,温湿度等。

功能码01、02读到的位满8个组合成一个字节,可以用功能码04读取;线圈可以直接定义成一个位变量或者直接置某变量的某一位。

(2)写:

功能码05:写内部单个开关量状态;如光耦输出、继电器输出等。

功能码06:写内部单个寄存器的值;如更改配置参数、定值等。

功能码15:写内部多个开关量状态;如同05。

功能码16:写内部多个寄存器的值;如同06;对时是写多个寄存器,用此功能码。

功能码11:通信超时或错误时询问用

功能码12:询问从机检测到的各种故障、异常事件

2)实现方法

先定义一个变量区如: uint modbus_data [50],再定义那些保持寄存器和输入寄存器,如下:

保持寄存器:M30001-M300022  // 存放设置的参数,用 03读,16写

输入寄存器:M40001-M40028  // 存放实时数据,如启动、运行、停止、待机以及错误代码 ,用04读

#define M30001  modbus_data[0]
#define M30002  modbus_data[1]
…………
#define M30021  modbus_data[20]
#define M30022  modbus_data[21]
#define M40001  modbus_data[22]
#define M40002  modbus_data[23]
…………
#define M400021  modbus_data[48]
#define M400028  modbus_data[49]

参考:www.amobbs.com/thread-3339982-2-1.html

二、通讯信息传输过程

当通讯命令由发送设备(主机)发送至接收设备(从机)时,符合相应地址码的从机接收通讯命令,并根据功能码及相关要求读取信息,如果CRC校验无误,则执行相应的任务,然后把执行结果(数据)返送给主机。返回的信息中包括地址码、功能码、执行后的数据以及CRC校验码,如果CRC校验出错就不返回任何信息。

----------------------------

1.1 地址码

       地址码是每次通讯信息帧的第一字节(8位),从0到255。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送信息。当从机回送信息时,回送数据均以各自的地址码开始。主机发送的地址码表明将发送到的从机地址,而从机返回的地址码表明回送的从机地址。相应的地址码表明该信息来自于何处。

1.2 功能码

       功能码是每次通讯信息帧传送的第二个字节。ModBus通讯规约可定义的功能码为1到127。PDM系列仪表/变送器仅用到其中的一部分功能码。作为主机请求发送,通过功能码告诉从机应执行什么动作。作为从机响应,从机返回的功能码与从主机发送来的功能码一样,并表明从机已响应主机并且已进行相关的操作。

表1 Modbus部分功能码

功能码
定 义
操 作(二进制)
0x02
读开关量输入
读取一路或多路开关量状态输入数据
0x01
读开关量输出
读取一路或多路开关量输出状态数据
0x03
读寄存器数据
读取一个或多个寄存器的数据
0x05
写开关量输出
控制一路继电器“合/分”输出
0x06
写单路寄存器
把一组二进制数据写入单个寄存器
0x10
写多路寄存器
把多组二进制数据写入多个寄存器

1.3 数据区

数据区包括需要由从机返送何种信息或执行什么动作。这些信息可以是数据(如:开关量输入/输出、模拟量输入/输出、寄存器等等)、参考地址等。例如,主机通过功能码03告诉从机返回寄存器的值(包含要读取寄存器的起始地址及读取寄存器的长度),则返回的数据包括寄存器的数据长度及数据内容。对于不同的从机,地址和数据信息都不相同(应给出通讯信息表)。

PDM 系列仪表/变送器采用Modbus通讯规约,主机(PLC、RTU、PC机、DCS等)利用通讯命令(功能码03),可以任意读取其数据寄存器(其数据信息表详见附录)。PDM系列仪表/变送器的数据寄存器存储的电量多达几百个(如:电流、电压、功率、0~31次谐波分量等),并且都是16位(2字节)的二进制数据,并且高位在前;一次最多可读取寄存器数(既各种电量的数量)是50个。 

PDM响应的命令格式是从机地址、功能码、数据区及CRC码。数据区的数据都是两个字节,并且高位在前(电能量除外)。 

注:

①PDM-820AC/ACM/ACR、PDM-800AC/ACM具有“03”、“06”、“10”功能码;

②如果PDM采用Modbus ASCII通讯协议,其通讯数据格式为;7个数据位,1个停止位,偶校验。

三、ModBus功能码

3.1 功能码“02:读1路或多路开关量输入状态

例如:主机要读取地址为01,开关量DI1—DI4的输入状态。读取告警、变位、故障、异常等。

从机(PDM)数据寄存器的地址和数据为:

起始位地址
DI寄存器数据(16进制)
备 注
0000
0B
DI1/DI2/DI4状态为“1”,DI3状态为
“0”
主机发送的报文格式为:
主机发送
字节数
发送的信息
备 注
从机地址
1
01   
发送至地址为01的从机
功能码
1
02   
读开关量输入状态
起始BIT位
2
0000 
起始BIT位地址为0000
读数据长度
2
0004 
读取4路开关量输入状态位
CRC码
2
79C9
由主机计算得到CRC码
从机(PDM)响应返回的报文格式:
从机响应
字节数
返回的信息
备 注
从机地址
1
01  
来自从机01
功能码
1
02   
读开关量输入状态
数据长度
1
01   
1个字节(8个BIT位)
DI状态数据
1
0B
DI寄存器内容
CRC码
2
E04F 
由从机计算得到CRC码

3.2 功能码“01:读1路或多路开关量输出状态

例如:主机要读取地址为01,开关量DO1,DO2的输出状态。读取电磁阀输出、电机的启停控制信LED显示等。

从机(PDM)数据寄存器的地址和数据为:

起始位地址
DO寄存器数据(16进制)
备 注
0000
02
DO2输出状态为“1”,DO1输出状态为“0”
主机发送的报文格式:
主机发送
字节数
发送的信息
备 注
从机地址
1
01   
发送至地址为01的从机
功能码
1
01   
读开关量输出状态
起始BIT位
2
0000 
起始BIT位地址为0000
读数据长度
2
0002 
读取2路继电器输出状态位
CRC码
2
BDCB
由主机计算得到CRC码
从机(PDM)响应返回的报文格式:
从机响应
字节数
返回的信息
备 注
从机地址
1
01  
来自从机01
功能码
1
01   
读开关量输出状态
数据长度
1
01   
1个字节(8个BIT位)
DO状态数据
1
02
DO寄存器内容
CRC码
2
D049 
由从机计算得到CRC码

3.3 功能码“03”:读多路寄存器输入

例如:主机要读取地址为01,起始地址为0116的3个从机寄存器数据。读取多路定值,比如模拟量输出设定值,PID运行参数。

从机(PDM)数据寄存器的地址和数据为:

寄存器地址
寄存器数据(16进制)
对应PDM电量
0116
1784
UA
0117
1780
UB
0118
178A
UC
主机发送的报文格式:
主机发送
字节数
发送的信息
备 注
从机地址
1
01   
发送至地址为01的从机
功能码
1
03   
读取寄存器
起始地址
2
0116 
起始地址为0116
数据长度
3
0003 
读取3个寄存器(共6个字节)
CRC码
2
E5F3
由主机计算得到CRC码
从机(PDM)响应返回的报文格式:
从机响应
字节数
返回的信息
备 注
从机地址
1
01  
来自从机01
功能码
1
03   
读取寄存器
读取字
1
06   
3个寄存器共6个字节
寄存器数据1
2
1784
地址为0116内存的内容
寄存器数据2
2
1780
地址为0117内存的内容
寄存器数据3
2
178A 
地址为0118内存的内容
CRC码
2
5847  
由从机计算得到CRC码

3.4 功能码“05:写1路开关量输出(遥控)

例1:开关量输出点DO1,其当前状态为“分”,主机要控制该路继电器“合”。强置一个逻辑线圈的通断状态控制命令为:

“FF00”为控制继电器“合”;“0000”为控制继电器“分”;

主机发送的报文格式:

主机发送
字节数
发送的信息
备 注
从机地址
1
01   
发送至地址为01的从机
功能码
1
05   
写开关量输出状态
输出BIT位
2
0000 
对应输出继电器BIT位(DO1)
控制命令
2
FF00 
控制该路继电器输出为“合”状态位
CRC码
2
8C3A
由主机计算得到CRC码

从机(PDM)响应返回的报文格式:与主机发送的报文格式及数据内容完全相同。

例2:开关量输出点DO2,其当前状态为“合”,主机要控制该路继电器“分”。

主机发送的报文格式:

主机发送
字节数
发送的信息
备 注
从机地址
1
01   
发送至地址为01的从机
功能码
1
05   
写开关量输出状态
输出BIT位
2
0001 
对应输出继电器BIT位(DO2)
控制命令
2
0000 
控制该路继电器输出为“合”状态位
CRC码
2
9C0A
由主机计算得到CRC码

从机(PDM)响应返回的报文格式:与主机发送的报文格式及数据内容完全相同。

3.5 功能码“06”:写单路寄存器

例如:主机要把数据07D0,保存到地址为002C的从机寄存器中去(从机地址码为01)。通讯数据保存结束后,地址为002C的PDM表原存储信息为:

地址
原来存储数据(16进制)
002C
04B0
主机发送的报文格式:
主机发送
字节数
发送的信息
举 例
从机地址
1
01   
发送至地址为01的从机
功能码
1
06   
写单路寄存器
起始地址
2
002C 
要写入的寄存器地址
写入数据
2
07D0 
对应的新数据
CRC码
2
4BAF
由主机计算得到的CRC码

从机(PDM)响应返回的报文格式: 与主机发送的报文格式及数据内容完全相同。

3.6 功能码“10”:写多路寄存器

主机利用这个功能码把多个数据保存到PDM表的数据存储器中去。Modbus通讯规约中的寄存器指的是16位(即2字节),并且高位在前。这样PDM的存储器都是二个字节。由于Modbus通讯规约允许每次最多保存60个寄存器,因此PDM一次也最多允许保存60个数据寄存器。比如对时。

例如:主机要把0064,0010保存到地址为002C,002D的从机寄存器中去(从机地址码为01)。通讯数据保存结束后,地址为002C/002D的PDM表内存储信息为:

地址
原来存储数据(16进制)
002C
04B0
002D
1388
主机发送的报文格式:
主机发送
字节数
发送信息
举 例
从机地址
1
01
发送至从机01
功能码
1
10
写多路寄存器
起始地址
2
002C
要写入的寄存器的起始地址
保存数据字长度
2
0002
保存数据的字长度(共2字)
保存数据字节长
1
04
保存数据的字节长度(共4字节)
保存数据1
2
04B0
数据地址002C
保存数据2
2
1388
数据地址002D
CRC码
2
FC63
由主机计算得到的CRC码
 从机(PDM)响应返回的报文格式:
从机响应
字节数
字节数
举 例
从机地址
1
01
来自从机01
功能码
1
10
写多路寄存器
起始地址
2
002C
起始地址为002C
保存数据字长度
2
0002
保存2个字长度的数据
CRC码
2
8001
由从机计算得到的CRC码

3.7 功能码“03”:读事件记录

采用功能码03H向保持寄存器地址0x0001,读一个字,产生读一个事件记录的作用。

主站发送: 从机地址 功能码 事件记录地址H 事件记录地址L 事件记录个数H 事件记录个数L CRC码H CRC码L 01 03 00 01 00 01 D5 CA 子站响应: 从机地址 功能码 字节数 事件条目数H 事件条目数L 事件代码H

(事件组号) 事件代码L

(事件代码) 动作值

02:合; 01:分 01 03 0C 00 01 04 09 02 毫秒L 毫秒H 分钟 小时 日 月份 年份 CRC码H CRC码L A5 4D 19 12 17 01 07 2F EB

四、错误校验码(CRC校验)

五、通讯错误信息及数据的处理

当PDM表检测到除了CRC码出错以外的错误时,必须向主机回送信息,功能码的最高位置为1,即从机返送给主机的功能码是在主机发送的功能码的基础上加128。以下的这些代码表明有意外的错误发生。PDM从主机接收到的信息如有CRC错误,则将被PDM表忽略。

PDM返送的错误码的格式如下(CRC码除外):

地址码1字节
功能码1字节(最高位为1)
错误码1字节
CRC码2字节

PDM响应回送如下错误码:

81非法的功能码接收到的功能码PDM表示不支持
82非法的数据位置指定的数据位置超出PDM表的范围
83非法的数据值接收到主机发送的数据值超出PDM相应地址的数据范围

首先要有一个具体目标,那些所有你认为必须前置的知识,都可以在完成目标的过程中学到。觉得不错,动动发财的小手点个赞哦!

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱上电路设计

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值