.net Modbus TCP小端字节Swop
我正在使用FluentModbus,也尝试过EasyModbus,为了与Delta SE CPU通信,只要我读/写单个寄存器,我就可以很好地通信,问题是我需要转换为Little Endian ByteSwap以访问PLC的双精度和浮点数,我已经用我不久前为excel购买的Modbus Spoll对此进行了测试 你知道我该怎么解决这个问题吗 谢谢你的帮助 这很有效.net Modbus TCP小端字节Swop,.net,modbus-tcp,.net,Modbus Tcp,我正在使用FluentModbus,也尝试过EasyModbus,为了与Delta SE CPU通信,只要我读/写单个寄存器,我就可以很好地通信,问题是我需要转换为Little Endian ByteSwap以访问PLC的双精度和浮点数,我已经用我不久前为excel购买的Modbus Spoll对此进行了测试 你知道我该怎么解决这个问题吗 谢谢你的帮助 这很有效 var ReadunitIdentifier = (byte)0xFF; var ReadstartingAddres
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);
}
var ReadunitIdentifier=(字节)0xFF;
var ReadstartingAddress=(ushort)40;
var Readcount=(ushort)4;
if(modbusTcpClient.IsConnected)
{
尝试
{
var byteData=modbusTcpClient.ReadHoldingRegisters(ReadunitIdentifier、ReadstartingAddress、Readcount);
字节highByte0=字节数据[0];
字节lowByte0=字节数据[1];
字节highByte1=字节数据[2];
字节lowByte1=字节数据[3];
字节[]双字节=
{
低字节0,高字节0,低字节1,高字节1
};
SharedVariables.LoadcellScaled=BitConverter.ToInt32(双字节,0);
}
自版本v2.1.0以来,您应该能够提供服务器的字节布局(小端与大端):
var-client=newmodbustcpclient(…);
client.Connect(…,ModbusEndianness.BigEndian);
var value=client.ReadHoldingRegisters(…);
使用ModbusEndianness.BigEndian
时,您告诉客户机需要一个big-endian服务器,它将使客户机根据客户机的操作系统架构(主要是小endian)重新排序字节。请用您使用的语言标记它(我猜是针对.NET的)对于EasyModbus,请看一看;re-FluentModbus,这方面似乎有一些内容。不幸的是,由于Modbus标准没有涵盖这一点,如果上述内容没有帮助,您可能需要实施自己的解决方案(easy Modbus源应为您指明正确的方向)。谢谢,我已将其设置为LittleEndian,但仍需要执行byteswop。抱歉,我不够清楚。请尝试ModBusendianess.BigEndian
告诉LittleEndian客户端,服务器在其Modbus消息中使用big endian字节布局。这将消除手动交换字节的必要性。