电力-MODBUS_RTU通讯规约一

目录: 一、简介 1、简介 2、简单理解MODBUS通信协议 3、表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协议规范”。   -------------------------------------------------------------------------------------------------------------- 一、简介 1、简介 ModBus通讯规约允许PDM系列仪表/变送器与施耐德、西门子、AB、GE等多个国际著名品牌的可编程顺序控制器(PLC)、RTU、SCADA系统、DCS或与第三方具有ModBus兼容的监控系统之间进行信息交换和数据传送。 PDM系列仪表/变送器只要简单地增加一套基于计算机(或工控机)的监控软件(如:组态王、Intouch、FIX、synall等)就可以构成一套电力监控系统。 ModBus通讯规约有两种传送方式:RTU和ASCII ModBus TCP/IP是RTU模式的延伸:基于ModBus以太网   电力-MODBUS_RTU通讯规约一 ---------------------------- 广泛的系统集成: 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个字符(更大点也可以),然后在串口的接收中断服务程序中,先将定时器的计数寄存器清零,然后重新开   始定时,如果接收的不是最后一个字节,那么在下个字节来的时候定时器就会又从零开始计数,如果后面再没有数据进来的话,定   时器就会因为定时时间到而进入定时器中断,就表示数据接收结束了。   ------------------------------------------------------- 2、简单理解MODBUS通信协议 电力-MODBUS_RTU通讯规约一 对于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 保留 用于异常应答
---------------------------- 表2、ModBus功能码与数据类型对应表
代码 功能 数据类型
1
2
3 整型、字符型、状态字、浮点型
4 整型、状态字、浮点型
5
6 整型、字符型、状态字、浮点型
8 N/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 是随便写的,没任何意义。   ------------------------------------------------------- 3、表1与表2名词解释 1)功能码含义 读: 01_DI:  读内部比特量输出状态,如告警、变位、故障、异常等。
02_DO:读外部开关量输入状态,如光耦输入、继电器输入等。
03_AO:读内部输出量的寄存器,如一些配置参数、定值的读取等。
04_AI:  读外部输入量的寄存器,如外部电压电流模拟量,温湿度等。 功能码01、02读到的位满8个组合成一个字节,可以用功能码04读取;线圈可以直接定义成一个位变量或者直接置某变量的某一位   写: 功能码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码。数据区的数据都是两个字节,并且高位在前(电能量除外)。   注:1PDM-820AC/ACM/ACRPDM-800AC/ACM具有“03”、“06”、“10”功能码;        2、如果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 电力-MODBUS_RTU通讯规约一
  -------------------------------------------------------------------------------------------------------------- 四、错误校验码(CRC校验) 主机或从机可用校验码进行判别接收信息是否正确。由于电子噪声或一些其它干扰,信息在传输过程中有时会发生错误,错误校验码(CRC)可以检验主机或从机在通讯数据传送过程中的信息是否有误,错误的数据可以放弃(无论是发送还是接收),这样增加了系统的安全和效率。 MODBUS通讯协议的CRC(冗余循环码)包含2个字节,即16位二进制数。CRC码由发送设备(主机)计算,放置于发送信息帧的尾部。接收信息的设备(从机)再重新计算接收到信息的CRC,比较计算得到的CRC是否与接收到的相符,如果两者不相符,则表明出错。   在进行CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算。 ● CRC码的计算方法是: 1.预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器; 2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器; 3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位; 4.如果移出位为0:重复第3步(再次右移一位);      如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或; 5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理; 6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理; 7.将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换; 8.最后得到的CRC寄存器内容即为:CRC码。   -------------------------------------------------------------------------------------------------------------- 五、通讯错误信息及数据的处理        当PDM表检测到除了CRC码出错以外的错误时,必须向主机回送信息,功能码的最高位置为1,即从机返送给主机的功能码是在主机发送的功能码的基础上加128 。以下的这些代码表明有意外的错误发生。PDM从主机接收到的信息如有CRC错误,则将被PDM表忽略。        PDM返送的错误码的格式如下(CRC码除外):         地址码: 1字节         功能码: 1字节(最高位为1)         错误码: 1字节         CRC码: 2字节        PDM响应回送如下错误码:         81.非法的功能码。           接收到的功能码PDM表不支持。         82.非法的数据位置。           指定的数据位置超出PDM表的范围。         83.非法的数据值。           接收到主机发送的数据值超出PDM相应地址的数据范围。   --------------------------------------------------------------------------------------------------------------
上一篇:LTE下行链路公共信道(DLSCH)中的早期终止机制


下一篇:终于弄懂 CRC 循环冗余校验 辽