c# - 串行通信 - 通过 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(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]);
}
如您所见,我尝试使用数组中的十六进制值,并将它们发送到寄存器。
如何修改第一个代码示例以便能够向下发送 HEX 值,并将字符写入第一个图像的寄存器空间?
解决方案
我认为您无法在设备的寄存器中写入字符。您不需要将十六进制值存储到短数组中。只需将字符存储到数组中,在将它们写入寄存器之前将它们转换为字节。
注 - 将写入设备寄存器的任何数据都应以字节为单位。