C# 台达PLC串口通信(WinForm)写入数据与LRC校验码

C# 台达PLC串口通信(WinForm)写入数据与LRC校验码

编码文章call10242025-03-04 10:48:2819A+A-

输出Y0:

try
{
    Y = !Y; // 切换状态

    // 根据Y7的状态发送相应的数据
    if ( Y)
    {

        string command = ":01050500FF00F6\r\n"; // 完整的命令,以ASCII码形式发送
        serialPort.Write(command);// 发送数据以置1
        button5.BackColor = Color.Green;
    }
    else
    {

        string command = ":010505000000F5\r\n"; // 
        serialPort.Write(command); // 发送数据以置0
        button5.BackColor = Color.Red;
    }
}
catch
{
    MessageBox.Show("请先打开串口");
}

写入D1的值:

private void button22_Click(object sender, EventArgs e)
{
    string aa = ":";
    string Aa = "01061001";
    string B = textBox3.Text; // 获取输入的值

    if (string.IsNullOrEmpty(B))
    {
        MessageBox.Show("请输入数据");
        return;
    }
    if (!serialPort.IsOpen) // 检查串口是否已经打开
    {
        MessageBox.Show("请先打开串口");
        return;
    }
    else
    {
        int H = int.Parse(B); // 将输入的值解析为整数
        string bb = H.ToString("X4"); // 将整数转换为4位16进制字符串
        string ab = Aa + bb; // 将A与hexValue串联起来

        // 将拼接后的字符串转换为16进制,并以空格隔开
        string K = string.Join(" ", Enumerable.Range(0, ab.Length / 2).Select(i => ab.Substring(i * 2, 2)));
       
        string data = K;
        int lrc = 0;
        for (int i = 0; i < data.Length; i += 3) // 注意这里是每两个字符加一个空格,所以是每三个字符一组
        {
            lrc += Convert.ToInt32(data.Substring(i, 2), 16); // 将每两个字符转换为16进制数并相加
        }
        lrc = (~lrc + 1) & 0xFF; // 取反加一并截取低8位
        string lrcHex = lrc.ToString("X2"); // 将LRC校验码转换为16进制字符串
                                            //MessageBox.Show("LRC校验码为:" + lrcHex);
        string D = "\r\n";
        string cc = aa + ab + lrcHex + D; // 将串联起来
                                         
        serialPort.Write(cc);
        MessageBox.Show("写入成功");
    }
}

LRC校验码:

private void button4_Click(object sender, EventArgs e)
{
    
    string input = textBox1.Text;
    string[] inputArray = input.Split(' ');//请输入数据,以空格分隔:
    byte[] data = new byte[inputArray.Length];
    for (int i = 0; i < inputArray.Length; i++)
    {
        data[i] = Convert.ToByte(inputArray[i], 16);
    }
    byte lrc = CalculateLRC(data);
    MessageBox.Show("LRC校验码为: 0x" + lrc.ToString("X2"));
}
public static byte CalculateLRC(byte[] data)
{
    byte lrc = 0;
    foreach (byte b in data)
    {
        lrc += b;
        lrc = (byte)(lrc & 0xFF); // 保留最低8位
    }
    lrc = (byte)((lrc ^ 0xFF) + 1); // 取反加1
    return lrc;
}

#冬日生活打卡季##什么是地磁暴 对日常生活有影响吗#

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4