C#中的通信(写单线圈和写多线圈)

写单线圈

cs 复制代码
if (flag == 5)
{
    List<byte> datas = new List<byte>();
    datas.Add(0x01);
    datas.Add(0x05);
​
    ushort addr = 11;// 起始地址
    datas.Add((byte)(addr / 256));
    datas.Add((byte)(addr % 256));
    datas.Add(0x00);// 表示置为off
    datas.Add(0x00);
​
    datas = CRC16(datas);// Modbus
    SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
    serialPort.Open();
    // 发送读取请求报文
    serialPort.Write(datas.ToArray(), 0, datas.Count);
}
 static List<byte> CRC16(List<byte> value, ushort poly = 0xA001, ushort crcInit = 0xFFFF)
 {
     if (value == null || !value.Any())
         throw new ArgumentException("");
​
     //运算
     ushort crc = crcInit;
     for (int i = 0; i < value.Count; i++)
     {
         crc = (ushort)(crc ^ (value[i]));
         for (int j = 0; j < 8; j++)
         {
             crc = (crc & 1) != 0 ? (ushort)((crc >> 1) ^ poly) : (ushort)(crc >> 1);
         }
     }
     byte hi = (byte)((crc & 0xFF00) >> 8);  //高位置
     byte lo = (byte)(crc & 0x00FF);         //低位置
​
     List<byte> buffer = new List<byte>();
     buffer.AddRange(value);
     buffer.Add(lo);
     buffer.Add(hi);
     return buffer;
 }

写多线圈

cs 复制代码
if (flag == 6)
{
    List<byte> datas = new List<byte>();
    datas.Add(0x01);
    datas.Add(0x0F);// 十进制  15
​
    ushort addr = 10;// 起始地址
    datas.Add((byte)(addr / 256));
    datas.Add((byte)(addr % 256));
    // 写入数量:写入多个个寄存器
​
    // 
    List<bool> status = new List<bool>() {
        true, false, true, true, true, false, true, false, true, true 
    };
    // C#设备中已有的状态
    // 逻辑   
​
    // 写了入寄存器数量
    datas.Add((byte)(status.Count / 256));
    datas.Add((byte)(status.Count % 256));
    // 0101 1101    0x5D
    // 0000 0011    0x03
​
​
    // 0001 1101    0x1D
​
    // 0000 0000  数据初始值
​
    // 0000 0001   temp   <<0
    // 0000 0001  第一次或运算结果
​
    // 第二次没有结果   因为为false不用管
    // 0000 0100   temp   <<2
    // 0000 0101  第三次或运算结果
    // 0000 1000   temp   <<3
    // 0000 1101  第四次或运算结果
    // 0001 0000   temp   <<4
    // 0001 1101  第五次或运算结果
​
    List<byte> vbs = new List<byte>();
    //byte data = 0;
    int index = 0;
    for (int i = 0; i < status.Count; i++)
    {
        //status.Count  =10   每8个一个字节
        if (i % 8 == 0)
            vbs.Add(0x00);// 初始值
        index = vbs.Count - 1;
​
        if (status[i])
        {
            // True
            byte temp = (byte)(1 << (i % 8));
            vbs[index] |= temp;
        }
        else
        {
            // False  取反操作
​
        }
    }
    datas.Add((byte)vbs.Count);// 写入字节数
    datas.AddRange(vbs);
​
    datas = CRC16(datas);// Modbus
    SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
    serialPort.Open();
    // 发送读取请求报文
    serialPort.Write(datas.ToArray(), 0, datas.Count);
​
​
    // 连续写
}
static List<byte> CRC16(List<byte> value, ushort poly = 0xA001, ushort crcInit = 0xFFFF)
{
    if (value == null || !value.Any())
        throw new ArgumentException("");
​
    //运算
    ushort crc = crcInit;
    for (int i = 0; i < value.Count; i++)
    {
        crc = (ushort)(crc ^ (value[i]));
        for (int j = 0; j < 8; j++)
        {
            crc = (crc & 1) != 0 ? (ushort)((crc >> 1) ^ poly) : (ushort)(crc >> 1);
        }
    }
    byte hi = (byte)((crc & 0xFF00) >> 8);  //高位置
    byte lo = (byte)(crc & 0x00FF);         //低位置
​
    List<byte> buffer = new List<byte>();
    buffer.AddRange(value);
    buffer.Add(lo);
    buffer.Add(hi);
    return buffer;
}

读线圈消息帧格式 - 0x01、0x02

请求

响应

写单线圈消息帧 - 0x05

请求 响应

写多线圈消息帧 -- 0x0F

请求

响应

相关推荐
江山如画,佳人北望14 小时前
C#程序入门
开发语言·windows·c#
与火星的孩子对话15 小时前
Unity进阶课程【六】Android、ios、Pad 终端设备打包局域网IP调试、USB调试、性能检测、控制台打印日志等、C#
android·unity·ios·c#·ip
future141215 小时前
C#每日学习日记
java·学习·c#
军训猫猫头18 小时前
1.如何对多个控件进行高效的绑定 C#例子 WPF例子
开发语言·算法·c#·.net
葬歌倾城1 天前
JSON的缩进格式方式和紧凑格式方式
c#·json
Eiceblue1 天前
使用 C# 发送电子邮件(支持普通文本、HTML 和附件)
开发语言·c#·html·visual studio
小小小小王王王2 天前
hello判断
开发语言·c#
金增辉2 天前
基于C#的OPCServer应用开发,引用WtOPCSvr.dll
c#
future14122 天前
C#学习日记
开发语言·学习·c#
傻啦嘿哟2 天前
Python 办公实战:用 python-docx 自动生成 Word 文档
开发语言·c#