问题描述
我不熟悉使用Modbus通信,我在这里找到了其他一些相关的线程,但不幸的是,它用于其他语言或使用TCP而不是Modbus使用RTU连接。
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值,并在第一个图像的寄存器空间中写出字符?
解决方法
我认为您无法在设备的寄存器中写入字符。 您无需将十六进制值存储到short数组中。只需将字符存储到数组中,然后再将它们写入寄存器,将它们转换为字节即可。
注意-任何要写入设备寄存器的数据都应以字节为单位。