上位机开发:基于视觉检测的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>
        /// <returns></returns>
        public string byteToHexStr(byte[] bytes)
        {
            string returnStr = "";
            if (bytes != null)
            {
                for (int i = 0; i < bytes.Length; i++)
                {
                    returnStr += bytes[i].ToString("X").PadLeft(2, '0');
                }
            }
            return returnStr;
        }

三、最后将收到的数据处理成需要的样子,存入数据库即可,结尾附上完整demo代码。

 public partial class Frm外机底盘机脚检测 : Form
    {
        /// <summary>
        /// 数据源
        /// </summary>
        DataTable dataSource;
        const string COL_PO_BARCODE = "poBarcode";
        const string COL_PART_BARCODE = "partBarcode";
        const string COL_TIME = "time";
        DataTable dataSource2;
        const string COL_PO_BARCODE2 = "poBarcode2";
        const string COL_PART_BARCODE2 = "partBarcode2";
        const string COL_TIME2 = "time2";
        MESScanToolSetWebService.MESScanToolSetWebService service = new MESScanToolSet.MESScanToolSetWebService.MESScanToolSetWebService();
        ScanStrategy003 scan = new ScanStrategy003();
        TerminalBll Terbll = new TerminalBll();
        private bool ResetFlag = true;//复位标志
        private string OrderTeam = "";//复位班组
        private string OldMesBarcode = "";//上一个MES条码
        private string MesBarcode = "";//当前MES条码
        private string ModelType = "";//机型
        private string Team = "";//班组
        private string ProductNumber = "";//产量
        private string UnQualified = "";//不合格
        private string QualifiedRate = "";//合格率
        private string ErrLog = string.Empty;
        public Frm外机底盘机脚检测()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;//避免线程冲突
            lbScanMessage.Text = "";
            lbMessage1.Text = "";
            lbMessage2.Text = "";
            string[] ArryPort = SerialPort.GetPortNames();// 获取所有可用串口的名字
            this.cmbCodeCOM.Items.AddRange(ArryPort);
            this.cmbCodeCOM.SelectedIndex = 0;
            this.cmbPLCCOM.Items.AddRange(ArryPort);
            this.cmbPLCCOM.SelectedIndex = 0;
            this.dgvScanData.AutoGenerateColumns = false;
            dataSource = new DataTable();
            dataSource.Columns.Add(COL_PO_BARCODE);
            dataSource.Columns.Add(COL_PART_BARCODE);
            dataSource.Columns.Add(COL_TIME);
            this.dgvScanData.DataSource = this.dataSource.DefaultView;
            this.dgvScanData2.AutoGenerateColumns = false;
            dataSource2 = new DataTable();
            dataSource2.Columns.Add(COL_PO_BARCODE2);
            dataSource2.Columns.Add(COL_PART_BARCODE2);
            dataSource2.Columns.Add(COL_TIME2);
            this.dgvScanData2.DataSource = this.dataSource2.DefaultView;
        }
        #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;
            }
        }

        private void ShowDetail()
        {
            if (!string.IsNullOrEmpty(MesBarcode))//判断订单是否为空
            {
                int total = 0;
                int number = 0;
                if (string.IsNullOrEmpty(OldMesBarcode)||!MesBarcode.Substring(0, 9).Equals(OldMesBarcode.Substring(0, 9)))//判断订单是否发生变化
                {
                    DataTable dt = new DataTable();
                    try
                    {
                        dt = service.QueryOrderInfo(MesBarcode.Substring(0, 9));
                    }
                    catch (Exception err)
                    {
                        string msg = "防错校验QueryOrderInfo:" + err.Message;
                        lbScanMessage.Text = msg;
                        if (msg.Length > 50)
                            msg = msg.Substring(0, 50);
                        this.ShowErrorMsg(msg, "底盘机脚");
                    }
                    if (dt.Rows.Count > 0)
                    {
                        ModelType = dt.Rows[0]["PartName"].ToString();
                        txtModelType.Text = ModelType;
                        Team = dt.Rows[0]["WorkTeam"].ToString();
                        txtTeam.Text = Team;
                        ProductNumber = dt.Rows[0]["Amount"].ToString();
                        txtProductNumber.Text = ProductNumber;
                        UnQualified = scan.GetUnQualifiedCount(Utils.SysSettingsUtil.CurrentTerminal.TerminalId, MesBarcode.Substring(0, 9));
                        txtUnQualified.Text = UnQualified;
                        total = Int32.Parse(ProductNumber);
                        number = Int32.Parse(scan.GetQualifiedCount(Utils.SysSettingsUtil.CurrentTerminal.TerminalId, MesBarcode.Substring(0, 9)));
                        QualifiedRate = (Math.Round((Decimal)number / (Decimal)total, 2) * 100).ToString() + "%";
                        txtQualifiedRate.Text = QualifiedRate;
                    }
                }
                else
                {
                    UnQualified = scan.GetUnQualifiedCount(Utils.SysSettingsUtil.CurrentTerminal.TerminalId, MesBarcode.Substring(0, 9));
                    txtUnQualified.Text = UnQualified;
                    total = Int32.Parse(ProductNumber);
                    number = Int32.Parse(scan.GetQualifiedCount(Utils.SysSettingsUtil.CurrentTerminal.TerminalId, MesBarcode.Substring(0, 9)));
                    QualifiedRate = (Math.Round((Decimal)number / (Decimal)total, 2) * 100).ToString() + "%";
                    txtQualifiedRate.Text = QualifiedRate;
                }
            }
        }
        #endregion
        //聚焦条码框
        private void Frm外机底盘机脚检测_Activated(object sender, EventArgs e)
        {
            txtScanData.Focus();
        }

        //打开串口
        private void btnOpen_Click(object sender, EventArgs e)
        {
            if (cmbCodeCOM.Text.ToUpper().Equals(cmbPLCCOM.Text.ToUpper()))//PLC选择的串口和条码的串口一样
            {
                MessageBox.Show("PLC串口不能与条码串口" + cmbCodeCOM.Text.ToUpper() + "相同!");
                cmbPLCCOM.Text = string.Empty;//清空
                return;
            }
            if (!string.IsNullOrEmpty(this.cmbCodeCOM.SelectedItem.ToString()))
            {
                string com = this.cmbCodeCOM.SelectedItem.ToString();
                StartCom1(com);
            }
            if (!string.IsNullOrEmpty(this.cmbPLCCOM.SelectedItem.ToString()))
            {
                string com = this.cmbPLCCOM.SelectedItem.ToString();
                StartCom2(com);
            }
        }

        //关闭串口
        private void btnClose_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(this.cmbCodeCOM.SelectedItem.ToString()))
            {
                string com = this.cmbCodeCOM.SelectedItem.ToString();
                CloseCom1(com);
            }
            if (!string.IsNullOrEmpty(this.cmbPLCCOM.SelectedItem.ToString()))
            {
                string com = this.cmbPLCCOM.SelectedItem.ToString();
                CloseCom2(com);
            }
        }
        
        //处理PLC返回的数据
        private void ReciveData(string reciveData)
        {
            try
            {
                if (!string.IsNullOrEmpty(reciveData))
                {
                    List<PartScanDataInfo> scanDataList = new List<PartScanDataInfo>();
                    string code = "SUC000";
                    if (!string.IsNullOrEmpty(MesBarcode))
                    {
                        if (reciveData.Equals("01"))
                        {
                            #region 验证正确,存放将验证的数据
                            //创建扫描的物料数据对象
                            PartScanDataInfo psdi = new PartScanDataInfo();
                            string Terminalid = Utils.SysSettingsUtil.CurrentTerminal.TerminalId;
                            psdi.TerminalId = Terminalid;
                            psdi.LoginId = Utils.SysSettingsUtil.LoginId;
                            psdi.Barcode = MesBarcode;
                            psdi.BarcodeType = MESScanModel.BarcodeType.Lot;
                            psdi.PartBarcode = MesBarcode + "," + reciveData + ",合格";
                            psdi.PartBarcodeType = MESScanModel.BarcodeType.ModelDj;
                            psdi.PartCategory = "底盘机脚";
                            psdi.Partname = "外机底盘机脚";
                            psdi.orderno = MesBarcode.Substring(0, 9);
                            scanDataList.Add(psdi);
                            #endregion
                            #region 校验数据库是否已经有相同记录
                            int result1 = 0;
                            result1 = scan.GetScanData(scanDataList, 0);//查询是否写入1、2期BarcodeParts
                            #region  报错
                            if ((result1 >= 0) == false)
                            {
                                if ((-result1) > 0 && (-result1) <= 3)
                                {
                                    code = "SCAN005"; //物料条码与订单条码的组合已存在
                                    this.ShowError(this.txtScanData, this.lbScanMessage, code, "底盘机脚");
                                    return;
                                }
                                else if ((-result1) >= 4 && (-result1) <= 12)
                                {
                                    code = "SCAN008"; //针对该物料组已存在相同生产订单条码的扫描纪录
                                    this.ShowError(this.txtScanData, this.lbScanMessage, code, "底盘机脚");
                                    return;
                                }
                                else if ((-result1) >= 13 && (-result1) <= 39)
                                {
                                    code = "SCAN007"; //该物料条码已被使用
                                    this.ShowError(this.txtScanData, this.lbScanMessage, code, "底盘机脚");
                                    return;
                                }
                                else
                                {
                                    this.ShowErrorMsg("保存错误!错误代码为:" + result1.ToString(), "底盘机脚");
                                    return;
                                }
                            }
                            if (!code.Equals("SUC000"))
                            {
                                if (code.Equals("SCAN002"))//生产订单条码已存在
                                {
                                    ShowError(this.txtScanData, this.lbScanMessage, code, "");
                                }
                                else if (code.Equals("SCAN003"))//控制器订单条码已存在
                                {
                                    ShowError(this.txtScanData, this.lbScanMessage, code, "");
                                }
                                return;
                            }
                            #endregion
                            #endregion
                            #region 保存到BarcodeParts
                            int result = 0;// scan.SaveScanData(scanDataList);//写入BarcodeParts
                            result = scan.SaveScanData(scanDataList, 0);
                            #region
                            if (result < 1)
                            {
                                if ((-result) > 0 && (-result) <= 3)
                                {
                                    code = "SCAN005"; //物料条码与订单条码的组合已存在
                                    this.ShowError(this.txtScanData, this.lbScanMessage, code, "底盘机脚");
                                    return;
                                }
                                else if ((-result) >= 4 && (-result) <= 12)
                                {
                                    code = "SCAN008"; //针对该物料组已存在相同生产订单条码的扫描纪录
                                    this.ShowError(this.txtScanData, this.lbScanMessage, code, "底盘机脚");
                                    return;
                                }
                                else if ((-result) >= 13 && (-result) <= 39)
                                {
                                    code = "SCAN007"; //该物料条码已被使用
                                    this.ShowError(this.txtScanData, this.lbScanMessage, code, "底盘机脚");
                                    return;
                                }
                                else
                                {
                                    this.ShowErrorMsg("保存错误!错误代码为:" + result.ToString(), "底盘机脚");
                                    return;
                                }
                            }
                            if (!code.Equals("SUC000"))
                            {
                                if (code.Equals("SCAN002"))//生产订单条码已存在
                                    ShowError(this.txtScanData, this.lbScanMessage, code, "");
                                else if (code.Equals("SCAN003"))//控制器订单条码已存在
                                    ShowError(this.txtScanData, this.lbScanMessage, code, "");

                                return;
                            }
                            #endregion

                            #endregion
                            //显示
                            foreach (PartScanDataInfo psdi0 in scanDataList)
                            {
                                DataRow dr = this.dataSource.NewRow();
                                dr[COL_PO_BARCODE] = psdi0.Barcode;
                                dr[COL_PART_BARCODE] = psdi0.PartBarcode;
                                dr[COL_TIME] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                                this.dataSource.Rows.InsertAt(dr, 0); //单个物料与订单、机型条码保存到BarcodeParts
                            }
                            this.dgvScanData.CurrentCell = this.dgvScanData.Rows[0].Cells[0];
                            this.dgvScanData.ClearSelection();
                            ShowDetail();
                            if (!string.IsNullOrEmpty(MesBarcode))
                            {
                                //记录当前扫描成功的订单
                                this.OldMesBarcode = MesBarcode;
                            }
                            ShowSuccess("防错条码已保存");
                        }
                        if (reciveData.Equals("06"))
                        {
                            //显示
                            DataRow dr = this.dataSource2.NewRow();
                            dr[COL_PO_BARCODE2] = MesBarcode;
                            dr[COL_PART_BARCODE2] = MesBarcode + "," + reciveData + ",不合格";
                            dr[COL_TIME2] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                            this.dataSource2.Rows.InsertAt(dr, 0);
                            this.dgvScanData2.CurrentCell = this.dgvScanData2.Rows[0].Cells[0];
                            this.dgvScanData2.ClearSelection();
                            ShowDetail();
                            ShowError(this.txtScanData, this.lbScanMessage, "DpJ001", "底盘机脚");
                        }
                    }
                    if (reciveData.Equals("07"))
                    {
                        this.ResetShowSuccess("复位成功,复位日志保存成功!");
                    }
                }
                else
                {
                    this.ShowErrorMsg("PLC的数据不能为空!", "底盘机脚");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void btnFW_Click(object sender, EventArgs e)
        {
            try
            {
                if (ResetFlag == true)
                {
                    this.ShowErrorMsg("没有待复位报警型号,无需操作!", "底盘机脚");
                    return;
                }
                else
                {
                    string UserID = txtUserID.Text.ToString().Trim();
                    if (UserID.Length != 6)
                    {
                        this.ShowErrorMsg("厂牌号长度不正确!", "底盘机脚");
                        return;
                    }
                    if (!Common.IsNumeric(UserID))
                    {
                        this.ShowErrorMsg("帐号必须是数字!", "底盘机脚");
                        return;
                    }

                    bool flag = false;
                    DataTable dt = Terbll.GetResetUser(UserID, "", OrderTeam, "", Utils.SysSettingsUtil.CurrentTerminal.TerminalId, 0);
                    if (dt.Rows.Count < 1)
                    {
                        DataTable dt1 = Terbll.GetResetUser(UserID, "", "", "", Utils.SysSettingsUtil.CurrentTerminal.TerminalId, 0);
                        if (dt1.Rows.Count > 0)
                        {
                            if (string.IsNullOrEmpty(dt1.Rows[0]["Team"].ToString()) && dt1.Rows[0]["WorkerType"].ToString().Equals("组长")) { flag = true; }
                        }
                        else
                        {
                            DataTable dt2 = Terbll.GetResetUser(UserID, "", "", Utils.SysSettingsUtil.CurrentTerminal.TerminalId, Utils.SysSettingsUtil.CurrentTerminal.TerminalId, 1);
                            if (dt2.Rows.Count > 0)
                            {
                                string WorkerType = dt2.Rows[0]["WorkerType"].ToString();
                                if (WorkerType.Equals("组长")) { flag = true; }
                                else
                                {
                                    if (WorkerType.Contains("底盘机脚")) { flag = true; }
                                }
                            }
                        }
                    }
                    else
                    {
                        string WorkerType = dt.Rows[0]["WorkerType"].ToString();
                        if (WorkerType.Equals("组长")) { flag = true; }
                        else
                        {
                            if (WorkerType.Contains("底盘机脚")) { flag = true; }
                        }
                    }
                    if (flag)
                    {
                        //发送复位信号给PLC
                        SendDataToCom(strToToHexByte("08"));
                    }
                    else
                    {
                        this.ShowErrorMsg("该工号没有" + OrderTeam + "的复位权限!", "底盘机脚");
                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                string msg = "复位抛异常:" + ex.Message;
                lbScanMessage.Text = msg;
                if (msg.Length > 50)
                    msg = msg.Substring(0, 50);
                this.ShowErrorMsg(msg, "底盘机脚");
                Common.PlaySoundError(); return;
            }
        }

        private void ResetShowSuccess(string msg)
        {
            lbScanMessage.Visible = true;
            lbScanMessage.Text = msg;
            lbScanMessage.ForeColor = Color.LightGreen;
            Common.PlaySoundSuccess();
            ErrLog = "";
            ResetFlag = true;
            SetTxtEnable(true);
            txtScanData.Text = "";
            MesBarcode = "";
            txtPLC.Text = "";
        }

        private void SetTxtEnable(bool flag)
        {
            if (flag == true)
            {
                txtScanData.Enabled = true;
            }
            else
            {
                txtScanData.Enabled = false;
            }
        }

        private void ShowSuccess(string msg)
        {
            lbScanMessage.Visible = true;
            lbScanMessage.Text = msg;
            lbScanMessage.ForeColor = Color.Blue;
            Common.PlaySoundSuccess();
            ErrLog = "";
            ResetFlag = true;
            SetTxtEnable(true);
            txtScanData.Text = "";
            MesBarcode = "";
            txtPLC.Text = "";
        }

        /// <summary>
        /// 显示扫描错误
        /// </summary>
        /// <param name="textBox"></param>
        /// <param name="label"></param>
        /// <param name="code"></param>
        /// <param name="PartCategory"></param>
        private void ShowError(Control textBox, Control label, string code, string PartCategory)
        {
            lbScanMessage.Visible = true;
            lbScanMessage.Text = ErrorCodeUtil.GetInstance().GetErrorCodeDescription(code);
            lbScanMessage.ForeColor = Color.Red;
            textBox.Focus();
            ((TextBox)textBox).SelectAll();
            textBox.BackColor = Color.Pink;
            Common.PlaySoundError();
            if (SysSettingsUtil.ScanType.Equals("ZZ"))
            {
                ErrLog = ErrorCodeUtil.GetInstance().GetErrorCodeDescription(code);
                //保存错误日志
                try
                {
                    if(code.Equals("DpJ001"))
                    {
                        int n = service.InsertPartsResetLogNew(Utils.SysSettingsUtil.CurrentTerminal.TerminalId, MesBarcode, "",
                    MesBarcode+",06,不合格", "", "", ErrLog, PartCategory);
                    }
                    else
                    {
                        int n = service.InsertPartsResetLogNew(Utils.SysSettingsUtil.CurrentTerminal.TerminalId, MesBarcode, "",
                   "", "", "", ErrLog, PartCategory);
                    }
                }
                catch (Exception err)
                {
                    string msg = "防错校验InsertPartsResetLogNew:" + err.Message;
                    lbScanMessage.Text = msg;
                    if (msg.Length > 50)
                        msg = msg.Substring(0, 50);
                    this.ShowErrorMsg(msg, "底盘机脚");
                }
                ResetFlag = false;
                SetTxtEnable(false);
            }
            WinFormHelper.PlaySoundError();
            txtScanData.Text = "";
            MesBarcode = "";
            txtPLC.Text = "";
        }


        /// <summary>
        /// 显示扫描错误ShowErrorMsg
        /// </summary>
        /// <param name="Msg"></param>
        /// <param name="PartCategory"></param>
        private void ShowErrorMsg(string Msg, string PartCategory)
        {
            lbScanMessage.Visible = true;
            lbScanMessage.Text = Msg;
            lbScanMessage.ForeColor = Color.Red;
            Common.PlaySoundError();
            if (SysSettingsUtil.ScanType.Equals("ZZ"))
            {
                ResetFlag = false;
                SetTxtEnable(false);
            }
            txtScanData.Text = "";
            MesBarcode = "";
            txtPLC.Text = "";
            WinFormHelper.PlaySoundError();
        }

        private void Frm外机底盘机脚检测_FormClosing(object sender, FormClosingEventArgs e)
        {
            CloseCom1(this.cmbCodeCOM.SelectedItem.ToString());
            CloseCom2(this.cmbPLCCOM.SelectedItem.ToString());
        }

        private void dgvScanData_SizeChanged(object sender, EventArgs e)
        {
            AjustColumnWith();
        }

        private void dgvScanData2_SizeChanged(object sender, EventArgs e)
        {
            this.ColPOBarcode2.Width = this.dgvScanData2.Width / 10 * 2;
            this.ColPartBarcode2.Width = this.dgvScanData2.Width / 10 * 3;
            this.ColScanTime2.Width = this.dgvScanData2.Width / 10 * 3;
        }

        private void AjustColumnWith()
        {
            this.ColPOBarcode.Width = this.dgvScanData.Width / 10 * 2;
            this.ColPartBarcode.Width = this.dgvScanData.Width / 10 * 3;
            this.ColScanTime.Width = this.dgvScanData.Width / 10 * 3;
        }

        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>
        /// <returns></returns>
        public string byteToHexStr(byte[] bytes)
        {
            string returnStr = "";
            if (bytes != null)
            {
                for (int i = 0; i < bytes.Length; i++)
                {
                    returnStr += bytes[i].ToString("X").PadLeft(2, '0');
                }
            }
            return returnStr;
        }
        //调试代码
        private void txtScanData_KeyUp(object sender, KeyEventArgs e)
        {
            //MesBarcode = txtScanData.Text;
        }
    }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值