线圈=寄存器

线圈状态=寄存器数值

读多个寄存器

请求

MBAP报文头 设备地址 功能码 读取寄存器起始地址 读取寄存器个数
6字节 1字节 1字节 2字节 2字节

响应

MBAP报文头 设备地址 功能码 返回有效字节数 数据
6字节 1字节 1字节 1字节 N字节

工具方法

十六进制字符串转字节数组

private byte[] HexStringToByteArray(string hexString)
{
    hexString = hexString.Replace(" ", "");
    if ((hexString.Length % 2) != 0)
        hexString = "0" + hexString;
    byte[] returnBytes = new byte[hexString.Length / 2];
    for (int i = 0; i < returnBytes.Length; i++)
        returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
    return returnBytes;
}

字节数组转十六进制字符串

/* 输出:01-F5(以"-"分割,可用 Replace("-", "") 方法消除)
 * BitConverter.ToString(new byte[]{ 0x01, 0xF5 });
 */
BitConverter.ToString(BYTE_ARRAY);

十六进制字符串转十进制数

/* 输出:501
 * Int32.Parse("01F5", System.Globalization.NumberStyles.HexNumber);
 */
int num = Int32.Parse(HexString, System.Globalization.NumberStyles.HexNumber);

打印字节数组

/* 输出:1,11110101
 * PrintByteArray(new byte[]{ 0x01, 0xF5 });
 */
private void PrintByteArray(byte[] byteArray) {
    String byteStr = null;
    foreach (byte b in byteArray)
    {
        if (byteStr == null)
            byteStr = Convert.ToString(b, 2);
        else
            byteStr += "," + Convert.ToString(b, 2);
    }
    Console.WriteLine(byteStr);
}

参考列表