Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Modbus TCP小端字节Swop_.net_Modbus Tcp - Fatal编程技术网

.net Modbus TCP小端字节Swop

.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

我正在使用FluentModbus,也尝试过EasyModbus,为了与Delta SE CPU通信,只要我读/写单个寄存器,我就可以很好地通信,问题是我需要转换为Little Endian ByteSwap以访问PLC的双精度和浮点数,我已经用我不久前为excel购买的Modbus Spoll对此进行了测试

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

谢谢你的帮助

这很有效

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字节布局。这将消除手动交换字节的必要性。