上位机开发:基于视觉检测的winform系统

初次接触上位机开发,接收PLC传来的视觉检测结果,然后和数据库交互,给下位机的PLC发送指令,主要采用的是R32的串口通信,下面是详细步骤。

一、首先要将串口连接,进行通信。

#region  串口识别
        SerialPort ComDevice1 = new SerialPort();
        SerialPort ComDevice2 = new SerialPort();
        #region StartCom1
        private void StartCom1(string com)
        {
            ComDevice1.DataReceived += new SerialDataReceivedEventHandler(ComDevice1_DataReceived);
            ComDevice1.PortName = com;
            int BaudRate = 9600;
            ComDevice1.BaudRate = BaudRate;// 波特率
            ComDevice1.Parity = System.IO.Ports.Parity.None; //0;// 奇偶校验
            ComDevice1.DataBits = 8;// 数据位
            ComDevice1.StopBits = System.IO.Ports.StopBits.One; //(StopBits)1;// 停止位
            ComDevice1.Encoding = System.Text.Encoding.Default;
            try
            {
                if (ComDevice1.IsOpen)
                    ComDevice1.Close();
                ComDevice1.Open();
                lbMessage1.Text = com + "串口连接成功";
                lbMessage1.ForeColor = Color.Green;
            }
            catch (Exception ex)
            {
                lbMessage1.Text += ex.Message;
                lbMessage1.ForeColor = Color.Red;
                WinFormHelper.PlaySoundError();
                return;
            }
        }
        private void CloseCom1(string com)
        {
            try
            {
                if (!ComDevice1.IsOpen)
                    ComDevice1.Open();
                if (ComDevice1.IsOpen)
                    ComDevice1.Close();
                lbMessage1.Text = com + "串口断开成功";
                lbMessage1.ForeColor = Color.Red;
            }
            catch (Exception ex)
            {
                lbMessage1.Text += ex.Message;
                lbMessage1.ForeColor = Color.Red;
                WinFormHelper.PlaySoundError();
                return;
            }
        }
        /****************硬件设备自动扫描操作********************/
        private void ComDevice1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                System.Threading.Thread.Sleep(500);
                byte[] ReDatas = new byte[ComDevice1.BytesToRead];//返回命令包
                ComDevice1.Read(ReDatas, 0, ReDatas.Length);//读取数据
                ComDevice1.DiscardInBuffer();//清除接收缓冲区
                ComDevice1.DiscardOutBuffer();                         
                txtScanData.Text = System.Text.Encoding.Default.GetString(ReDatas);//获取扫描数据
                //检查条码格式
                CheckCode(txtScanData.Text.Trim());
                MesBarcode = txtScanData.Text;
                txtScanData.Focus();
            }
            catch
            {
                ComDevice1.DiscardInBuffer();//清除接收缓冲区
                ComDevice1.DiscardOutBuffer();
            }
        }
        #endregion
        #region StartCom2
        private void StartCom2(string com)
        {
            ComDevice2.DataReceived += new SerialDataReceivedEventHandler(ComDevice2_DataReceived);
            ComDevice2.PortName = com;
            int BaudRate = 9600;
            ComDevice2.BaudRate = BaudRate;// 波特率
            ComDevice2.Parity = System.IO.Ports.Parity.None; //0;// 奇偶校验
            ComDevice2.DataBits = 8;// 数据位
            ComDevice2.StopBits = System.IO.Ports.StopBits.One; //(StopBits)1;// 停止位
            ComDevice2.Encoding = System.Text.Encoding.Default;
            try
            {
                if (ComDevice2.IsOpen)
                    ComDevice2.Close();
                ComDevice2.Open();
                lbMessage2.Text = com + "串口连接成功";
                lbMessage2.ForeColor = Color.Green;
            }
            catch (Exception ex)
            {
                lbMessage2.Text += ex.Message;
                lbMessage2.ForeColor = Color.Red;
                WinFormHelper.PlaySoundError();
                return;
            }
        }
        private void CloseCom2(string com)
        {
            try
            {
                if (!ComDevice2.IsOpen)
                    ComDevice2.Open();
                if (ComDevice2.IsOpen)
                    ComDevice2.Close();
                lbMessage2.Text = com + "串口断开成功";
                lbMessage2.ForeColor = Color.Red;
            }
            catch (Exception ex)
            {
                lbMessage2.Text += ex.Message;
                lbMessage2.ForeColor = Color.Red;
                WinFormHelper.PlaySoundError();
                return;
            }
        }
        /****************硬件设备自动扫描操作********************/
        private void ComDevice2_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                System.Threading.Thread.Sleep(500);
                int len = ComDevice2.BytesToRead;
                string receivedata = string.Empty;
                int buffersize = 8;   //十六进制数的大小(假设为6byte)
                byte[] buffer = new byte[buffersize];   //创建缓冲区
                if (len != 0)
                {
                    ComDevice2.Read(buffer, 0, buffersize);
                    receivedata = Encoding.Default.GetString(buffer);
                }
                if (receivedata.Trim() != "")
                {
                    string str = byteToHexStr(buffer);
                    ComDevice2.DiscardInBuffer();//清除接收缓冲区
                    ComDevice2.DiscardOutBuffer();
                    //获取PLC数据
                    txtPLC.Text = str.Substring(0, 2);
                    ReciveData(txtPLC.Text);
                }
                else
                {
                    string error = receivedata + ":未接收到数据。";
                    lbScanMessage.Text = error;
                    return;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        #endregion
        /// <summary>
        /// 检查扫描格式是否正确
        /// </summary>
        /// <param name="text"></param>
        private void CheckCode(string text)
        {
            if (string.IsNullOrEmpty(text))
            {
                string error = text + ":未获取到数据。";
                lbScanMessage.Text = error;
                return;
            }
            if (text.Length != 13)
            {
                string error = text + ":扫描数据异常,位数不等于13。";
                lbScanMessage.Text = error;
                return;
            }
            if (!text.StartsWith("ZZC"))
            {
                string error = text + ":扫描数据异常,未扫描MES条码。";
                lbScanMessage.Text = error;
                return;
            }
            if (text.Substring(0, 6).ToUpper() == "NOREAD")
            {
                string error = text + ":扫描数据异常。";
                lbScanMessage.Text = error;
                return;
            }
        }
        #endregion

二、接收和发送需要的PLC值,PLC的值在通过串口通信接收时需要转换字节。

   private void SendDataToCom(byte[] color)
        {
            try
            {
                if (this.ComDevice2.IsOpen)
                    this.ComDevice2.Write(color, 0, color.Length);
            }
            catch (Exception e)
            {
            }
            finally
            {
            }
        }
        /// <summary>
        /// string  转byte
        /// </summary>
        /// <param name="hexString"></param>
        /// <returns></returns>
        private static byte[] strToToHexByte(string hexString)
        {
            hexString = hexString.Replace(" ", "");
            if ((hexString.Length % 2) != 0)
                hexString += " ";
            byte[] returnBytes = new byte[hexString.Length / 2];
            for (int i = 0; i < returnBytes.Length; i++)
                returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
            return returnBytes;
        }

        /// <summary>
        /// byte[] 转string
        /// </summary>
        /// <param name="bytes"></param>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值