工业通讯寄存器字节顺序分析说明
通信调试中,字节序是个常见概念,比如本地字节序、网络字节序。
字节存储机制又分两种:大端(Big-Endian)和小端(Little-Endian)。
MODBUS协议中同样存在字节序概念,存储机制同字节序。不同的是,MODBUS数据帧中对寄存器地址定义为大端字节序,但是数据部分在不同厂家的定义方式可能不同,甚*同一厂家某一型号设备中,对不同数据的字节序定义也不统一。
例如:01 03 04 12 34 56 78 81 07 (读保持寄存器响应报文)
其中,回复数据长度4Bytes, 原始数据为0X12345678,从报文看,其字节序即为大端。
但是,MODBUS寄存器在传输4字节浮点数时,有些设备厂家给出字序要求,声明字序为小端,即当原始数据是0X12345678时,传输它的报文字节流应该这样:
01 03 04 56 78 12 34 66 D5
使用IEEE 754规范,可进行字节顺序交换位置
Float Big-endian 字节顺序:A B C D
Float Little-endian 字节顺序:D C B A
Float Big-endian byte swap 字节顺序:B A D C
Float Little-endian byte swap 字节顺序:C D A B
假设存储表就是一张纸,当输入一个数据的时候,软件就会为我们开辟一个地址往表中存放数据,比如往这个地址写入一个四字节16进制数据:47 41 45 4D。
对存储表的高位和低位的理解,可以把每个空格都当作一个位置,从0~1000开始计数,写在*前的就是低位,比如说存放四个字母GAME的地址低位到高位就是G到E。
将数据放入寄存器中,可以把寄存器比做一个水桶,我们放入数据的时候肯定是把"水先倒到水桶的底部,比如,把GAME放入到水桶中的话,水桶中存放的数据就成了EMAG ,也就是 45 4D 41 47 (注意:计算机中每个字节存储的是两个16进制的字符)。
PLC 32位寄存器使用字,即使用两个16位的寄存器组成一个32位的寄存器。
日系(三菱)PLC的32位的寄存器高地位排列是高地址存高16位数据,低地址存低位16位数据。
欧系(西门子)PLC的32位的寄存器高地位排列是高地址存低16位数据,低地址存高16位数据。
在实际配置中,主要涉及到对modbus、PLC这些需要定义寄存器具体数据格式的场景,每家设备定义或者每个现场的设备程序不一样,数据解析处理的方式就有所区别了。
如图,是铁牛智能网关产品关于modbus和西门子PLC寄存器解析方式配置说明:
Modbus 3号命令,保持寄存器
S7-1200 I 寄存器 (开关量输入)
S7-1200 M 寄存器 (开关量/模拟量)
S7-1200 DB块寄存器 (开关量/模拟量)
如图,是铁牛智能网关产品常用寄存器数据点位的寄存器解析配置示例:
数据类型:包括浮点、整形、布尔、字符串;
读写方向:包括只读、只写、读写;
寄存器类型:包括开关量输入、开关量读写、模拟量输入、模拟量读写,对应modbus 2号命令、1 5号命令、4号命令、3 6 16号命令;
寄存器地址:根据设备寄存器点表进行配置,modbus默认从0开始(即40001);
解析方式:包括常用的数据解析类型,见上图“Modbus 3号命令,保持寄存器”;
位偏移:单个寄存器内BIT位,用于存放开关量信号,比如一个modbus寄存器包括16位;
BCD码解析:是否将模拟量数据按照BCD码(二-十进制码)处理。(注:BCD 码 (Binary-Coded Decimal)亦称二进码十进制数或二-十进制代码。 用 4 位二进制数来表示 1 位十进制数中的 0~9 这 10 个数字。)
铁牛智能网关结合Tnbuild工程软件,基本可以实现对工业现场数据类型解析全覆盖,如果遇到特殊的数据解析规则,我们可以根据实际需求进行对接开发、灵活配置,实现工业现场通讯的高效处理和灵活传输!