Modbus TCP Little Endian Byte Swop



我正在使用FluentModbus,也尝试过EasyModbus,以与Delta SE CPU通信,只要我读/写单个寄存器,我就可以很好地通信,问题是我需要转换到Little Endian ByteSwap来访问PLC Doubles和Floats,我已经用我不久前为excel购买的ModbussPoll测试了这一点。

知道我该怎么解决这个问题吗?

感谢

感谢您的帮助。

这适用于

var ReadunitIdentifier = (byte)0xFF;
var ReadstartingAddress = (ushort)40;
var Readcount = (ushort)4;

if (modbusTcpClient.IsConnected)
{
try
{
var byteData = modbusTcpClient.ReadHoldingRegisters<byte>(ReadunitIdentifier, ReadstartingAddress, Readcount);
byte highByte0 = byteData[0];
byte lowByte0 = byteData[1];
byte highByte1 = byteData[2];
byte lowByte1 = byteData[3];
byte[] doubleBytes =
{
lowByte0, highByte0,lowByte1,highByte1
};
SharedVariables.LoadcellScaled = BitConverter.ToInt32(doubleBytes, 0);
}

由于版本v2.1.0,您应该能够提供服务器的字节布局(小端与大端(:

var client = new ModbusTcpClient(...);
client.Connect(..., ModbusEndianness.BigEndian);
var value = client.ReadHoldingRegisters<float>(...);

使用ModbusEndianness.BigEndian,您可以告诉客户端需要一个大端序服务器,这将使客户端根据客户端的操作系统体系结构(主要是小端序(对字节进行重新排序。

BEWARE-我在上面读到的大部分内容都令人困惑和困惑。

Modbus通常使用"大/小端序"来指代其传输较大32位(或原则上较大(值的16位卡盘的顺序。

Modbus的几乎所有用途都不会在每个16位值内交换字节。

因此,如果您有一个十六进制值0x32321100字节序,则表示您发送两个寄存器值0x3232和0x1100 的顺序

一些Modbus软件包将支持"字节交换",因此您可以将16位值0x3232作为16位值0x2233发送。如果您将接收到的两个寄存器放在x86内存中的相邻位置,然后告诉程序将其解释为32位整数,则此值可能会有所值。

但在遇到这种糟糕的做事方式之前,我们已经使用Modbus外围设备工作了15年。

现在,如果你是一个真正的极客,并且开始思考比特和字节在串行总线上来回传输的顺序,你可以把自己想象成一个大黑洞。只需忽略这一点,并根据完整的16位Modbus寄存器值进行思考。

最新更新