qq_42027587 2018-06-14 07:47 采纳率: 0%
浏览 5141
已结题

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

网上下的 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条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2018-06-14 08:15
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 CSS实现渐隐虚线边框
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题