汇川Autoshop之Modbus通讯数据格式之大小端模式

首先说明的是汇川的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 数据的字节序特点

  1. 标准MODBUS协议规定:
  2. 数据传输默认使用 大端模式(Big Endian)
  3. 即:高位字节(Most Significant Byte, MSB)在前,低位字节(Least Significant Byte, LSB)在后。
  4. 寄存器的排列:
  5. 每个寄存器为16位(2字节)。
  6. 例如,读一个寄存器值 0x1234,传输顺序是 [0x12][0x34]。
  7. 多寄存器数据(如32位或64位数据)的字节序:
  8. 不同厂商实现可能有差异,常见的排列方式有:大端高字在前(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两个寄存器地址的,如下图




原文链接:,转发请注明来源!