C# 串行通信-通过Modbus发送十六进制数据
我不熟悉使用Modbus通信,我在这里发现了一些其他相关的线程,但不幸的是,这是针对其他语言的,或者使用TCP而不是Modbus的RTU连接 所以我有一段C代码可以用来发送数据:C# 串行通信-通过Modbus发送十六进制数据,c#,serial-port,modbus,C#,Serial Port,Modbus,我不熟悉使用Modbus通信,我在这里发现了一些其他相关的线程,但不幸的是,这是针对其他语言的,或者使用TCP而不是Modbus的RTU连接 所以我有一段C代码可以用来发送数据: byte address = Convert.ToByte(txtSlaveID.Text); ushort start = Convert.ToUInt16(txtWriteRegister.Text); short[] value = new short[1]; if(Int16.TryParse
byte address = Convert.ToByte(txtSlaveID.Text);
ushort start = Convert.ToUInt16(txtWriteRegister.Text);
short[] value = new short[1];
if(Int16.TryParse(txtWriteValue.Text, out short numberValue))
{
value[0] = numberValue; //This part works!
}
else
{
value = new short[3] { 0x52, 0x4E, 0x56 }; //This is where I am trying to send letters/ASCII
}
try
{
mb.SendFc16(address, start, (ushort)value.Length, value);
}
catch (Exception err)
{
WriteLog("Error in write function: " + err.Message);
}
WriteLog(mb.modbusStatus);
因此,当我想要向下发送一个值时,这段代码可以工作。构建数据包需要短阵列和以下步骤:
//Put write values into message prior to sending:
for (int i = 0; i < registers; i++)
{
message[7 + 2 * i] = (byte)(values[i] >> 8);
message[8 + 2 * i] = (byte)(values[i]);
}
//在发送前将写入值放入消息中:
用于(int i=0;i<寄存器;i++)
{
消息[7+2*i]=(字节)(值[i]>>8);
消息[8+2*i]=(字节)(值[i]);
}
如你所见,我试图在数组中使用十六进制值,并将它们发送到寄存器
如何修改第一个代码示例,使其能够向下发送十六进制值,并将字符写入第一个图像中的寄存器空间?我认为您无法在设备的寄存器中写入字符。 您不需要将十六进制值存储到短数组中。只需将字符存储到数组中,然后再将其写入寄存器并将其转换为字节
注意-写入设备寄存器的数据应以字节为单位。无法回答问题。没有任何意义,示例代码缺少变量的定义。RTU只有8位,所以我不知道为什么要移位8位,而缺少CRC计算。请参阅Wiki:Jay-什么不起作用(您是否收到Modbus错误,或者显示器是否不符合您的预期?)-如果您能够识别Modbus代码的来源(是否来自库?),这也会有所帮助。ASCII是8位,而保持寄存器是16位,所以很可能显示器要求每个寄存器有两个字符。