DLT645规约, MODBUS规约, CDT92规约, 从站101规约()一 DLT645规约初始化切换到第1块表主站查询“正向有功数据块”从站应答数据主站查询“反向有功数据块””从站应答数据主站查询“正向无功总电能”从站应答数据主站查询“反向无功总电能”从站应答数据切换到下一块表帧格式阐明代码帧起始符68H地址域A0A1A2A3A4A5帧起始符68H控制码C数据长度域L数据域DATA 校验码CS结束符16H 1. 帧起始符固定为 68H 2. 地址域A0 ~ A5 地址域由6个字节构成,每字节2位BCD码, 低地址字节在先,高地址字节在后当使用的地址码长度局限性6字节时,高位用十六进制AAH或00补足6字节,根据电表厂家规定选择本地址为时,为广播地址3. 控制码C格式如下所示功能码后续帧标志从站异常标志传播方向D7D6D5D4D3D2D1D0 D7 = 0: 由主站发出的命令帧D7 = 1: 由从站发出的应答帧D6 = 0: 从站对的应答D6 = 1: 从站对异常信息的应答D5 = 0: 无后续数据帧D5 = 1: 有后续数据帧D4 ~ D0:祈求及应答功能码 00000:保存 00001:读数据 00010:读后续数据 00011:重读数据 00100:写数据 01000:广播校时 01010:写设备地址 01100:更改通信速率 01111:修改密码 10000:最大需量清零4. 数据长度L L为数据域的字节数。
读数据时L<=200,写数据时L<=50,L=0表达无数据域5. 数据域DATA数据域涉及 数据标记 和 数据等传播时发送方按字节进行加0x33解决,接受方按字节进行减33H解决a) 数据区的第1,2个字节是数据标记: 目前我们使用的程序是读4种电量的数据块,共20个电量. “0x1f 0x90”表达正向有功数据块; (报文里加0x33后是0x52 0xC3)“0x2f 0x90”表达反向有功数据块; (报文里加0x33后是0x62 0xC3)“0x1f 0x91”表达正向无功数据块; (报文里加0x33后是0x52 0xC4)“0x2f 0x91”表达反向无功数据块. (报文里加0x33后是0x62 0xC4) 查询命令的数据区只涉及2个字节的数据标记, 应答报文的数据区涉及: 类型标记+电度数据(b) 以上每种数据块涉及5个电量, 依次是: 总电能, 尖峰, 峰, 平, 谷 维护软件里20个电量的定义顺序:正向有功总电量反向有功总电量正向无功总电量反向无功总电量正向有功 尖峰 峰 平 谷反向有功 尖峰 峰 平 谷正向无功 尖峰 峰 平 谷反向无功 尖峰 峰 平 谷6. 校验码CS从帧起始符开始到校验码之间的所有字节的算术和,模256。
不计超过256的溢出值7. 结束符16H标记一帧的结束,其值为16H.报文示例主站在发送帧信息之前,先发送3个字节0xFE以唤醒接受方.地址域和数据均先传送低位字节,后传送高位字节电度值的4个字节都是按 +33H传送. 对于配地址文献(.gy)的, 以表地址为 2 为例1. 主站查询“正向有功数据块”Txd: FE FE FE 68 32 18 19 37 62 15 68 01 02 52 c3 SUM 16从站应答:Rxd: 68 32 18 19 37 62 15 68 81 16 52 c3 ab 89 67 45 54 46 47 48 33 33 33 33 33 33 33 33 33 33 33 33 SUM 16分析: 两个68之间的6个字节是地址 第11,12个字节是数据标记:0x52 0xc3分别减0x33后为 0x1f 0x90 = 正向有功 每种数据块传5个电度值,依次为: 总正向有功, 尖峰, 峰, 平, 谷 ab 89 67 45, 分别 -0x33后是 78 56 34 12 , 实际值就是1234567854 46 47 48, 分别 -0x33后是 21 13 14 15 , 实际值就是1514132133 33 33 33, 分别 -0x33后是 00 00 00 00 , 实际值就是02. 主站查询“反向有功数据块”Txd: FE FE FE 68 32 18 19 37 62 15 68 01 02 62 c3 5D 16从站应答:Rxd: 68 32 18 19 37 62 15 68 81 16 62 c3 ab 89 67 45 54 46 47 48 33 33 33 33 33 33 33 33 33 33 33 33 SUM 16分析: 两个68之间的6个字节是地址 0x62 0xc3 是数据标记, 减0x33后为 0x2f 0x90 : 反向有功 每种数据块传5个电度值,依次为: 总反向有功, 尖峰, 峰, 平, 谷 ab 89 67 45, 分别 -0x33后是 78 56 34 12 , 实际值就是1234567854 46 47 48, 分别 -0x33后是 21 13 14 15 , 实际值就是1514132133 33 33 33, 分别 -0x33后是 00 00 00 00 , 实际值就是03 . 查询“正向无功数据块” Txd: FE FE FE 68 32 18 19 37 62 15 68 01 02 52 c4 4E 16从站应答:Rxd: 68 32 18 19 37 62 15 68 81 16 52 c4 ab 89 67 45 54 46 47 48 33 33 33 33 33 33 33 33 33 33 33 33 SUM 16分析: 两个68之间的6个字节是地址 0x52 0xc4 是数据标记, 减0x33后为 0x1f 0x91 : 正向无功 每种数据块传5个电度值,依次为: 总正向无功, 尖峰, 峰, 平, 谷 ab 89 67 45, 分别 -0x33后是 78 56 34 12 , 实际值就是1234567854 46 47 48, 分别 -0x33后是 21 13 14 15 , 实际值就是1514132133 33 33 33, 分别 -0x33后是 00 00 00 00 , 实际值就是04. 查询“反向无功数据块”Txd: FE FE FE 68 32 18 19 37 62 15 68 01 02 62 c4 5E 16从站应答:Rxd: 68 32 18 19 37 62 15 68 81 16 62 c4 ab 89 67 45 54 46 47 48 33 33 33 33 33 33 33 33 33 33 33 33 SUM 16分析: 两个68之间的6个字节是地址 0x62 0xc4 是数据标记, 减0x33后为 0x2f 0x91 : 反向无功 每种数据块传5个电度值,依次为: 总反向无功, 尖峰, 峰, 平, 谷 ab 89 67 45, 分别 -0x33后是 78 56 34 12 , 实际值就是1234567854 46 47 48, 分别 -0x33后是 21 13 14 15 , 实际值就是1514132133 33 33 33, 分别 -0x33后是 00 00 00 00 , 实际值就是0二 . MODBUS规约基本报文格式是:主站发送:地址功能码寄存器起始地址高位寄存器起始地址低位寄存器数目高位寄存器数目低位CRC16位校验1字节1字节1字节1字节1字节1字节2字节子站应答: 地址功能码数据长度数据1数据2…数据NCRC16位校验1字节1字节1字节根据数据类型定2字节一般状况下,子站的遥测、遥信等实时量及定值等参数都寄存在特定地址范畴的寄存器内,实时量是只读的,参数是可读可写的,主站只是按照子站指定的地址读写寄存器就行了。
由于多种设备数据寄存器地址各不相似,寄存器内寄存的数据也多种多样:八位二进制组、字符型、整型、浮点型、时间日期型……,并且读写操作的功能码也不相似,因此程序中通用modbus 规约从配备文献protocol.cfg中读取这些信息,一套程序就可以使用多种装置了配备文献重要内容如下:[D0010003] max_info_num = 2 info_type_0 = 0 info_comm_func_0 = 3 info_regi_star_0 = 3011 info_regi_numb_0 = 4info_mtdb_star_0 = 0info_mtdb_numb_0 = 8 info_type_1 = 1info_comm_func_1 = 3info_regi_star_1 = 4info_regi_numb_1 = 3info_mtdb_star_1 = 0info_mtdb_numb_1 = 3注意,程序对脚本检测严格,下装到装置里的文献要去掉有效行内的注释内容,并保证有效行末尾没有空格附: 多种数据类型目前原则程序里的modbus规约只解决如下0和1两种类型.全规也版本的modbus程序下有 “多数据类型modbus” , 这里面的程序可解决如下所有数据类型. 0: 遥信,一位代表一种遥信, 一种寄存器字涉及了16个遥信 1: 遥测,一种寄存器代表一种遥测,值 = 高字节*256+低字节 2~100: 自定义数据类型个别现场有程序上的特殊改动,如果用到了特定类型的数据,使用这个范畴内的数据代码 101: 高字节遥测,使用寄存器字中的高字节表达一种遥测 102: 低字节遥测,使用寄存器字中的低字节表达一种遥测 103: 单字节遥测, 一种字节代表一种遥测; 高字节遥测排在低字节之前 104: 浮点数,接连的两个寄存器表达一种浮点数,由低到高,保存一位小数 105: 浮点数,接连的两个寄存器表达一种浮点数,由低到高,保存二位小数 106: 浮点数,接连的两个寄存器表达一种浮点数,由低到高,保存三位小数 107: 浮点数,接连的两个寄存器表达一种浮点。