首先说明的是汇川的MODBUS通讯是大端模式,高位在前,低位在后。
那么如果传感器的数据格式是小端的数据格式那该怎样获取数据呢?后面我说下怎样实现,下面先说下modbus通讯的大小端模式的区别和怎样区分。
在MODBUS通讯中,大端模式(Big Endian)和小端模式(Little Endian)是指数据的字节序存储方式。字节序决定了多字节数据(如16位、32位)的高位字节和低位字节在数据流中的排列顺序。
1. 大端模式(Big Endian)
- 高位字节在前,低位字节在后。
- 从地址上看,低地址存储的是数据的高位字节。
示例:
以一个16位(2字节)数据 0x1234 为例:
- 存储顺序:[0x12][0x34]
- 地址顺序:地址 0 -> 0x12,地址 1 -> 0x34
2. 小端模式(Little Endian)
- 低位字节在前,高位字节在后。
- 从地址上看,低地址存储的是数据的低位字节。
示例:
以同样的16位数据 0x1234 为例:
- 存储顺序:[0x34][0x12]
- 地址顺序:地址 0 -> 0x34,地址 1 -> 0x12
MODBUS 数据的字节序特点
- 标准MODBUS协议规定:
- 数据传输默认使用 大端模式(Big Endian)。
- 即:高位字节(Most Significant Byte, MSB)在前,低位字节(Least Significant Byte, LSB)在后。
- 寄存器的排列:
- 每个寄存器为16位(2字节)。
- 例如,读一个寄存器值 0x1234,传输顺序是 [0x12][0x34]。
- 多寄存器数据(如32位或64位数据)的字节序:
- 不同厂商实现可能有差异,常见的排列方式有:大端高字在前(Big Endian High-Word First):默认MODBUS标准,先发送高16位寄存器。小端低字在前(Little Endian Low-Word First):部分设备特定实现。
多寄存器示例(32位数据)
大端模式,高字在前(标准MODBUS)
32位数据 0x12345678,分为两部分:
- 高16位寄存器:0x1234
- 低16位寄存器:0x5678
传输顺序:
- 高寄存器:[0x12][0x34]
- 低寄存器:[0x56][0x78]
小端模式,低字在前
32位数据 0x12345678,存储顺序调整为:
- 高16位寄存器:0x5678
- 低16位寄存器:0x1234
传输顺序:
- 低寄存器:[0x78][0x56]
- 高寄存器:[0x34][0x12]
如果传感器的数据格式是小端模式,低位在前,高位在后,那么我们需要将数据高低位给他转换一下,才可以得到正确的数据。
那么下面隆重的请出我们的转换指令:
SWAP/DSWAP将指定变量S的高低字节的值进行互相交换。
将收到的小端数据,用这个指令转换后就是我们需要的数据。
SWAP是16位数据,DWSAP是32位数据。
我用modbus_Slave从站发送数据给plc
下图是数据未转换之前从站0地址寄存器的值是十进制的10;
10换成2进制 32位的是 1010;前面的0省略掉了。
然后我们看下将D220高低位转换后的数据
转换后 的D220 十进制为2560;二进制数为101000000000,对应图2中M0至M8为OFF;M9和M11ON;M10OFF;
DWBIT指令是将32位寄存器值传给32个位元件,这样可以直观的观看寄存器2进制的数据。
最后说下,16 位指令时,高8位与低8 位的值进行互相交换
32 位指令时,两个寄存器的高8 位与低8 位的值各自进行互相交换
32位的D220是包含D220和D221两个寄存器地址的,如下图