c# 运用serialport与PLC串口通讯,读取(例如D200)的数据 80C

网上下的 c# 运用serialport与PLC串口通讯程序,小白看不太懂下的程序,求大神帮忙分析下,主要想知道程序中的tebox1、textbox4、textbox5、textbox6、textbox7分别对应图中哪个空,对应的空应填写什么,例如想读取三菱F3X系列PLC D200的数据,初始地址填200?那设备地址和长度填啥?
界面如下:图片说明

主要程序如下:

    private void btn_open_Click(object sender, EventArgs e)
    {
        int nSelect;
        btn_open.Enabled = false;
        Object selectedItem = cbxCOMPort.SelectedItem;
        sp.PortName = selectedItem.ToString();//串口
        selectedItem = cbxBaudRate.SelectedItem;
        sp.BaudRate = int.Parse(selectedItem.ToString());//波特率
        nSelect = cbxDataBits.SelectedIndex;//数据位
        switch (nSelect)
        {
            case 0:
                sp.DataBits = 8;
                break;
            case 1:
                sp.DataBits = 7;
                break;
            case 2:
                sp.DataBits = 6;
                break;
            case 3:
                sp.DataBits = 5;
                break;
        }
        nSelect = cbxParity.SelectedIndex;
        switch (nSelect)
        {
            case 0:
                sp.Parity = Parity.None;
                break;
            case 1:
                sp.Parity = Parity.Odd;
                break;
            case 2:
                sp.Parity = Parity.Even;
                break;
            case 3:
                sp.Parity = Parity.Mark;
                break;
            case 4:
                sp.Parity = Parity.Space;
                break;
        }
        nSelect = cbxStopBits.SelectedIndex;
        switch (nSelect)
        {
            case 0:
                sp.StopBits = StopBits.None;
                break;
            case 1:
                sp.StopBits = StopBits.One;
                break;
            case 2:
                sp.StopBits = StopBits.OnePointFive;
                break;
            case 3:
                sp.StopBits = StopBits.Two;
                break;
        }
        sp.Open();
        btn_close.Enabled = true;
    }

    private void btn_send_Click(object sender, EventArgs e)
    {
        textBox1.Text = "";
        int n = 6;
        byte[] buf = new byte[n];
        string ee = textBox4.Text;
        buf[0] = Convert.ToByte(ee);
        if (comboBox1.Text == "3X")
        {
            buf[1] = Convert.ToByte(3);
        }
        else
        {
            buf[1] = Convert.ToByte(4);
        }
        if (int.Parse(textBox5.Text) <= 255)
        {
            buf[2] = Convert.ToByte(0);
            buf[3] = Convert.ToByte(int.Parse(textBox5.Text));
        }
        else
        {
            if (Convert.ToString(int.Parse(textBox5.Text), 16).Length < 4)
            {
                int b = Convert.ToInt32(Convert.ToString(int.Parse(textBox5.Text), 16).Substring(0, 1), 16);
                buf[2] = Convert.ToByte(b);
                int c = Convert.ToInt32(Convert.ToString(int.Parse(textBox5.Text), 16).Substring(1, 2), 16);
                buf[3] = Convert.ToByte(c);
            }
            else
            {
                int b = Convert.ToInt32(Convert.ToString(int.Parse(textBox5.Text), 16).Substring(0, 2), 16);
                buf[2] = Convert.ToByte(b);
                int c = Convert.ToInt32(Convert.ToString(int.Parse(textBox5.Text), 16).Substring(2, 2), 16);
                buf[3] = Convert.ToByte(c);
            }
        }


        if (int.Parse(textBox6.Text) <= 255)
        {
            buf[4] = Convert.ToByte(0);
            buf[5] = Convert.ToByte(int.Parse(textBox6.Text));
        }
        else
        {
            if (Convert.ToString(int.Parse(textBox6.Text), 16).Length < 4)
            {
                int d = Convert.ToInt32(Convert.ToString(int.Parse(textBox6.Text), 16).Substring(0, 1), 16);
                buf[4] = Convert.ToByte(d);
                int f = Convert.ToInt32(Convert.ToString(int.Parse(textBox6.Text), 16).Substring(1, 2), 16);
                buf[5] = Convert.ToByte(f);
            }
            else
            {
                int d = Convert.ToInt32(Convert.ToString(int.Parse(textBox6.Text), 16).Substring(0, 2), 16);
                buf[4] = Convert.ToByte(d);
                int f = Convert.ToInt32(Convert.ToString(int.Parse(textBox6.Text), 16).Substring(2, 2), 16);
                buf[5] = Convert.ToByte(f);
            }
        }
        p = int.Parse(textBox6.Text) * 2 + 5;
        byte[] buf1 = new byte[n + 2];
        byte[] ReturnData = new byte[2];
        ReturnData = CRC16_C(buf);
        for (int i = 0; i < n; i++)
        {
            buf1[i] = buf[i];
        }
        buf1[n] = ReturnData[1];
        buf1[n + 1] = ReturnData[0];
        sp.Write(buf1.ToArray(), 0, n + 2);
    }
    void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {

        int n = sp.BytesToRead;
        byte[] TxData = new byte[n];//声明一个临时数组存储当前来的串口数据
        sp.Read(TxData, 0, n); //读取缓冲数据 
        m = m + n;
        this.Invoke((EventHandler)
           (delegate
                {

                    Array.Resize(ref  TxData2, m);//改写数组大小
                    TxData.CopyTo(TxData2, m - TxData.Length);
                    if (m == p)
                    {
                        byte[] data = new byte[p - 2];
                        for (int i = 0; i < TxData2.Length - 2; i++)
                        {
                            data[i] = TxData2[i];
                        }
                        byte[] data2 = new byte[2];
                        data2[0] = TxData2[TxData2.Length - 2];
                        data2[1] = TxData2[TxData2.Length - 1];
                        byte[] data1 = new byte[2];
                        data1 = CRC16_C(data);
                        if (data1[0] == data2[1] && data1[1] == data2[0])
                        {
                            for (int j = 3; j <= m - 4; j = j + 2)
                            {
                                string s1 = TxData2[j].ToString();
                                string s2 = TxData2[j + 1].ToString();
                                string s = s1 + s2;
                                int g = Convert.ToInt32(s, 10);
                                string h = g.ToString();
                                textBox1.Text += h + "  ";
                            }
                            textBox7.Text = "读取成功";
                        }
                        else
                        {
                            textBox7.Text = "读取失败";
                        }
                        m = 0;
                    }

                }
           )
        );
    }
    public byte[] CRC16_C(byte[] data)
    {
        byte CRC16Lo;
        byte CRC16Hi;
        byte CL; byte CH;
        byte SaveHi; byte SaveLo;
        byte[] tmpData;
        int Flag;
        CRC16Lo = 0xFF;
        CRC16Hi = 0xFF;
        CL = 0x01;
        CH = 0xA0;
        tmpData = data;
        for (int i = 0; i < tmpData.Length; i++)
        {
            CRC16Lo = (byte)(CRC16Lo ^ tmpData[i]);
            for (Flag = 0; Flag <= 7; Flag++)
            {
                SaveHi = CRC16Hi;
                SaveLo = CRC16Lo;
                CRC16Hi = (byte)(CRC16Hi >> 1);
                CRC16Lo = (byte)(CRC16Lo >> 1);
                if ((SaveHi & 0x01) == 0x01)
                {
                    CRC16Lo = (byte)(CRC16Lo | 0x80);
                }

                if ((SaveLo & 0x01) == 0x01)
                {
                    CRC16Hi = (byte)(CRC16Hi ^ CH);
                    CRC16Lo = (byte)(CRC16Lo ^ CL);
                }
            }
        }
        byte[] ReturnData = new byte[2];
        ReturnData[0] = CRC16Hi;
        ReturnData[1] = CRC16Lo;
        return ReturnData;

4个回答

点击你想要查看的控件,串口后面的combobox,你右键属性,然后就可以查看对应控件的name名称了。

qq_42027587
qq_42027587 回复qq_23126581: 所以能不能帮忙看看我这个下的程序对应的应该填什么,十分感谢
一年多之前 回复
qq_23126581
渊渟无迹静涛君 这个都有指定的命令的,不是说网上找的有用,
一年多之前 回复
qq_42027587
qq_42027587 这我知道啊,界面是我自己搞的,就是不知道对应的对不对,而且我设备地址,初始地址,长度应该填什么啊,我发送了一直没反应,想知道发送的对不对,比如读取D200,我初始地址填200?那设备地址和长度填啥
一年多之前 回复

图片说明 你点击那个控件然后看属性 最上面那行就是控件名,你把串口信息
写好点击打开就会监听串口,发送的数据一般是用16进制的字符串

qq_42027587
qq_42027587 这我知道啊,界面是我自己搞的,不知道对应的对不对,而且我设备地址,初始地址,长度应该填什么啊,发送了一直没反应
一年多之前 回复

选择控件界面右键属性就可以看见name属性了。就知道对应的是那个了

plc 都是 modbus协议 起始地址 00 00 长度 自定 去扫吧

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!