串行通信-通过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]);
  }

因此,如您所见,我试图使用数组中的十六进制值,并将其向下发送到寄存器。

This is the image for the registers I am attempting to write to for the ASCII letters

This is the HEX codes I should use

如何修改一个代码示例以能够发送HEX值,并在第一个图像的寄存器空间中写出字符?

解决方法

我认为您无法在设备的寄存器中写入字符。 您无需将十六进制值存储到short数组中。只需将字符存储到数组中,然后再将它们写入寄存器,将它们转换为字节即可。

注意-任何要写入设备寄存器的数据都应以字节为单位。