首页 > 解决方案 > 串行通信 - 通过 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]);
  }

如您所见,我尝试使用数组中的十六进制值,并将它们发送到寄存器。

这是我试图为 ASCII 字母写入的寄存器的图像

这是我应该使用的十六进制代码

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

标签: c#serial-portmodbus

解决方案


我认为您无法在设备的寄存器中写入字符。您不需要将十六进制值存储到短数组中。只需将字符存储到数组中,在将它们写入寄存器之前将它们转换为字节。

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


推荐阅读