示例#1
0
        /// <summary>
        /// 【发送指令】
        /// 20170505
        /// </summary>
        /// <param name="address">地址码</param>
        /// <param name="cmd">功能码</param>
        /// <param name="regAddr">地址码</param>
        /// <param name="regNum"></param>
        private void SendData(string address, string cmd, string regAddr, string regNum)
        {
            try
            {
                if (!isOpen)
                {
                    SetPortProperty();                              //设置并打开串口
                }
                byte address1 = Convert.ToByte(address.Trim(), 16); //地址码
                byte cmd1     = Convert.ToByte(cmd.Trim(), 16);     //命令帧
                byte regAddr1 = Convert.ToByte(regAddr.Trim(), 16); //寄存器地址
                byte regNum1  = Convert.ToByte(regNum.Trim(), 16);  //寄存器数量

                //Modbus相关处理对象
                MyModbus modbus = new MyModbus();
                byte[]   text   = modbus.GetReadFrame(address1, cmd1, regAddr1, regNum1, 8);
                sp.Write(text, 0, 8);



                //tbxShowData.Text += "[ Send:" + BitConverter.ToString(text) + " ] [ Time:"+DateTime.Now +" ]\r\n";
                ShowDataByTBX(1, BitConverter.ToString(text));
            }
            catch (Exception e)
            {
                //ShowMessage(2, "系统错误!(可能原因:串口设置问题)");
                ShowMessage(2, "系统错误!(可能原因:" + e.Message + ")");
            }
        }
示例#2
0
        /// <summary>
        /// 【发送“全开”和“全关”的长数据帧数据】
        ///  20170518
        /// </summary>
        private void SendLongFrame()
        {
            if (!isOpen)
            {
                SetPortProperty();//设置并打开串口
            }
            string str = "";

            for (int i = 0; i < youtput; i++)
            {
                CheckBox ck = groupBox4.Controls.Find("Y" + i, false).First() as CheckBox;
                if (ck.Checked)
                {
                    str = "1" + str;
                }
                else
                {
                    str = "0" + str;
                }
            }

            byte[] data =
            {
                Convert.ToByte(macaddr,                               16),                           //从机地址
                Convert.ToByte("0F",                                  16),                           //功能码
                Convert.ToByte("00",                                  16),                           //线圈起始地址
                Convert.ToByte(youtput.ToString(),                    16),                           //线圈数量
                Convert.ToByte(Math.Ceiling(Convert.ToDouble(youtput * 1.0 / 8)).ToString(),16),//字节数
                Convert.ToByte(string.Format("{0:X}",                                        Convert.ToInt32(str,2)).PadLeft(2, '0'), 16),//线圈状态 0F
            };

            //str = str.PadLeft(8, '0');
            //string.Format("{0:}", Convert.ToInt32(str, 2));

            //MessageBox.Show("你点击了" + string.Format("{0:X}", Convert.ToInt32(str, 2)).PadLeft(2,'0'));

            MyModbus modbus = new MyModbus();

            byte[] text = modbus.GetLongReadFrame(data);
            sp.Write(text, 0, 10);

            ShowDataByTBX(1, BitConverter.ToString(text));
        }
示例#3
0
        /// <summary>
        /// 【发送设置串口的长数据帧数据】
        ///  20170523
        /// </summary>
        private void Send13KLongFrame()
        {
            string setaddr     = cbxSetAddress.Text.Trim();
            string setbaudrate = cbxSetBaudRate.Text.Trim();
            string setparity   = cbxSetParity.Text.Trim();

            if (string.IsNullOrEmpty(setaddr) || string.IsNullOrEmpty(setbaudrate) || string.IsNullOrEmpty(setparity))
            {
                ShowMessage(2, "请设置左边的参数");
                return;
            }
            else
            {
                //奇偶校验位转换
                if (setparity == "无")
                {
                    setparity = "00";
                }
                else if (setparity == "奇校验")
                {
                    setparity = "01";
                }
                else
                {
                    setparity = "10";
                }

                //波特率转换
                string[] ss = { "000", "001", "010", "011", "100", "101", "110", "111" };
                setbaudrate = ss[cbxSetBaudRate.SelectedIndex];
            }

            if (!isOpen)
            {
                SetPortProperty();//设置并打开串口
            }
            //01 10 00 08 00 02 04 xx xx xx  xx CRC
            //000+校验位2位+波特率3位
            byte[] data =
            {
                Convert.ToByte(setaddr,                                              16),//从机地址
                Convert.ToByte("10",                                                 16),
                Convert.ToByte("00",                                                 16),
                Convert.ToByte("08",                                                 16),
                Convert.ToByte("00",                                                 16),
                Convert.ToByte("02",                                                 16),
                Convert.ToByte("04",                                                 16),
                Convert.ToByte("00",                                                 16),
                Convert.ToByte("0" + setparity.Substring(0,                           1),16),//0 + 奇偶校验位第一位
                Convert.ToByte(setparity.Substring(1,       1) + setbaudrate.Substring(0,1), 16),//奇偶校验位第二位 + 波特率第一位
                Convert.ToByte(setbaudrate.Substring(1,                               2),16),//波特率第二三位
            };

            //str = str.PadLeft(8, '0');
            //string.Format("{0:}", Convert.ToInt32(str, 2));

            //MessageBox.Show("你点击了" + string.Format("{0:X}", Convert.ToInt32(str, 2)).PadLeft(2,'0'));

            MyModbus modbus = new MyModbus();

            byte[] text = modbus.Get13kReadFrame(data);
            sp.Write(text, 0, 13);

            ShowDataByTBX(1, BitConverter.ToString(text));
        }
示例#4
0
        /// <summary>
        /// 【显示接收返回的数据】
        /// </summary>
        /// <param name="resbuffer"></param>
        public void ShowRst(byte[] resbuffer)
        {
            try
            {
                MyModbus modbus = new MyModbus();
                //tbxRecvData.Text += "Recv:" + modbus.SetText(resbuffer) + "\r\n";
                //tbxRecvData.Text += "\r\n";
                if (resbuffer.Length <= 0)
                {
                    //tbxShowData.Text += "[ Recv:" + "无可读数据" + " ]\r\n\r\n";
                    ShowDataByTBX(2, "无可读数据");
                    return;
                }

                string str = modbus.SetText(resbuffer);
                if (str == "CRC校验错误")
                {
                    ShowMessage(2, "CRC校验错误");

                    return;
                }
                if (str == "程序出错")
                {
                    ShowMessage(2, "程序错误");
                    return;
                }

                string rst = "";
                for (int i = 0; i < str.Length; i++)
                {
                    if ((i + 1) % 2 == 0 && i < str.Length - 1)
                    {
                        rst += str[i] + "-";
                    }
                    else
                    {
                        rst += str[i];
                    }
                }

                //MessageBox.Show(rst);
                //tbxShowData.Text += "[ Recv:" + rst + " ] [ Time:" + DateTime.Now + " ]\r\n\r\n";
                ShowDataByTBX(2, rst);//展示数据
                ShowMessage(1, "读取成功");


                string[] data    = rst.Split('-');
                int      address = Convert.ToInt32(cbxMacAddress.Text.Trim());
                if (btnType == 1)//从机连接
                {
                    if (string.Format("{0:00}", address) == data[0])
                    {
                        // Form1.m_io = Convert.ToInt32( data[4]);
                        //Form1.ChangIO(64);
                        //Form pf = this.MdiParent;
                        if (PF.GetType() == typeof(Form1))
                        {
                            ((Form1)PF).ChangIO(cbxMacAddress.Text.Trim(), 64);
                        }
                        ShowMessage(1, "从机连接成功");
                        MessageBox.Show("连接成功!", "系统提示");
                        this.Dispose();
                    }
                    else
                    {
                        ShowMessage(2, "从机连接失败");
                    }
                }
                else if (btnType == 2)//读取串口
                {
                    if ("6D" == data[3])
                    {
                        this.isReadOK = true;
                        ShowMessage(1, "读取串口成功!");
                        //测试成功。
                    }
                }
            }
            catch
            {
                ShowMessage(2, "系统错误!");
            }
        }
示例#5
0
        /// <summary>
        /// 【显示接收返回的数据】
        /// </summary>
        /// <param name="resbuffer"></param>
        public void ShowRst(byte[] resbuffer)
        {
            try
            {
                MyModbus modbus = new MyModbus();
                //tbxRecvData.Text += "Recv:" + modbus.SetText(resbuffer) + "\r\n";
                //tbxRecvData.Text += "\r\n";
                if (resbuffer.Length <= 0)
                {
                    //tbxShowData.Text += "[ Recv:" + "无可读数据" + " ]\r\n\r\n";
                    ShowDataByTBX(2, "无可读数据");
                    return;
                }

                string str = modbus.SetText(resbuffer);
                if (str == "CRC校验错误")
                {
                    ShowMessage(2, "CRC校验错误");
                    return;
                }
                if (str == "程序出错")
                {
                    ShowMessage(2, "程序错误");
                    return;
                }

                string rst = "";
                for (int i = 0; i < str.Length; i++)
                {
                    if ((i + 1) % 2 == 0 && i < str.Length - 1)
                    {
                        rst += str[i] + "-";
                    }
                    else
                    {
                        rst += str[i];
                    }
                }

                //MessageBox.Show(rst);
                //tbxShowData.Text += "[ Recv:" + rst + " ] [ Time:" + DateTime.Now + " ]\r\n\r\n";
                ShowDataByTBX(2, rst);//展示数据
                ShowMessage(1, "读取成功");


                string[] data = rst.Split('-');                    //{ "01", "02","03" }
                if (btnType == 1)                                  //读取版本型号ye
                {
                    tbxSofeVersion.Text = data[5] + " " + data[6]; //软件版本
                    tbxMacVersion.Text  = data[3] + " " + data[4]; //从机型号
                    tbxHWVersion.Text   = data[7] + " " + data[8]; //硬件版本
                }
                else if (btnType == 2)                             //读取输入IO
                {
                    int address = Convert.ToInt32(macaddr);

                    if (string.Format("{0:00}", address) == data[0])
                    {
                        ShowMessage(1, "读取成功");
                    }
                    else
                    {
                        ShowMessage(2, "读取失败");
                    }

                    if (data[3] == strFormat(0))
                    {
                        ShowMessage(2, "当前没有输入");
                    }
                    else
                    {
                        ShowMessage(1, "当前有输入");
                    }
                }
                else if (btnType == 3)//自动读取IO
                {
                }
            }
            catch
            {
                ShowMessage(2, "系统错误!");
            }
        }