MES与西门子RFID读写设备实现数据交互

一、总体架构

 基于C# 代码构建了一个基于 Windows 窗体的应用程序,主要用于MES系统与 RFID 设备进行交互,实现对设备信息的读取、展示和保存。

二、主要功能模块

  1. 初始化
    • 在窗体的构造函数中,进行了一系列初始化操作,包括组件初始化、设置键盘捕获、启动读取器、暂停一段时间后调用其他初始化方法。如果读取服务成功启动,会在特定标签中显示相应提示信息。
  2. 表单创建
    • CreateFrom方法根据一个变量FormRows的值动态创建标签、复选框和面板,并添加到窗体的特定面板中,用于展示检查项和状态选择。
  3. 读取 RFID 信息
    • ReaderTag方法是读取 RFID 卡信息的核心方法。它首先清空特定面板上的控件,然后尝试获取 RFID 卡的标签 ID 和内存数据。
    • 如果成功获取到标签 ID,会根据标签 ID 查询相关信息,如用户信息、时间、设备信息等,并填充到窗体的相应控件中。
    • 根据设备信息确定检查项的数量,创建表单展示检查项名称,并根据内存数据设置检查项的初始状态。
  4. 复选框状态改变处理
    • MainForm_CheckStateChanged方法在复选框状态改变时被触发。它根据触发的复选框名称判断是 “良好” 还是 “故障” 复选框被选中,然后相应地设置另一个复选框的状态,确保同一检查项的两个状态复选框不能同时被选中。
  5. 读取按钮点击处理
    • Bt_read_Click方法在用户点击 “读取” 按钮时被调用,它会触发重新读取 RFID 卡信息并更新窗体显示的操作。
  6. 保存数据
    • SaveTag方法用于保存 RFID 卡相关数据。它根据用户选择的信息和当前时间等数据,更新一个字节数组中的数据。然后将这些数据插入到数据库表中。如果没有检测到 RFID 卡,则弹出提示消息。

三、改进方向

  1. 错误处理方面,可以增加更详细的错误日志记录,以便更好地进行调试和故障排查。
  2. 性能优化上,可以考虑使用异步操作来读取 RFID 卡和处理数据,避免阻塞用户界面。
  3. 提高代码可读性,可通过更清晰的变量命名和添加注释来实现。
  4. 对于数据库操作,可以考虑使用数据库连接池等技术提高性能。

部分代码:

public partial class MainForm : Form
    {
        public const string deviceType = "RF310M";
        public int Service_Ok = 0;
        public int FormRows = 5;
        public string TagId = "000000";
        //记录需要写入的rfid内容
        byte[] BufNo = new byte[112];

        public MainForm()
        {
            InitializeComponent();
            CaptureKeys(this);
            this.ReaderStart();
            Thread.Sleep(1000);
            this.menuReader();
            if (Service_Ok == 2)
            {
                lb_service.Text = "读取服务已启动!";
                //lb_service.Text = "Reader successfully started";
            }
        }

        Label[] lab = new Label[16];
        CheckBox[] Ch1 = new CheckBox[16];
        CheckBox[] Ch2 = new CheckBox[16];
        Panel []  Pa=new Panel[16];
        private void CreateFrom()
        {
            if (FormRows == 0)
            {
                FormRows = 5;
                MessageBox.Show("没有检测到RFID卡!");            
            }
            for (int i = 1; i < FormRows + 1; i++)
            {

                lab[i] = new Label();
                lab[i].Name = "Lb_checkno" + i.ToString();
                lab[i].Text = "检查项";
                lab[i].Size = new Size(220, 20);
                lab[i].Location = new Point(2,  50 * (i-1));
                this.panel1.Controls.Add(lab[i]);

                Ch1[i] = new CheckBox();
                Ch1[i].Name = "Ch_stategood" + i.ToString();
                Ch1[i].Text = "良好";
                Ch1[i].Size = new Size(60, 20);
                Ch1[i].Location = new Point(100, 50 * (i - 1)+25);
                this.panel1.Controls.Add(Ch1[i]);

                Ch2[i] = new CheckBox();
                Ch2[i].Name = "Ch_statebug" + i.ToString();
                Ch2[i].Text = "故障";
                Ch2[i].Size = new Size(57, 20);
                Ch2[i].Location = new Point(160, 50 * (i - 1)+25);
                this.panel1.Controls.Add(Ch2[i]);

                Pa[i] = new Panel();
                Pa[i].Size = new Size(220, 1);
                Pa[i].Location = new Point(2, 50 * (i - 1) + 47);
                Pa[i].BackColor = new Color();       
                this.panel1.Controls.Add(Pa[i]);
            }
        }
       
        private void ReaderTag()
        {
            this.panel1.Controls.Clear();
            
            string[] tagIDs = null;
            byte[] tagIDmes = null;
            try
            {             
                tagIDs = RfReaderApi.Current.GetTagIDs();
              
                if (tagIDs != null)
                {
                    WriteInformationLine("TagID:" + tagIDs[0].ToString());
                    TagId = tagIDs[0];
                    tagIDmes = RfReaderApi.Current.GetTagMemory(tagIDs[0], 0, 0, 112, "AccessPassword");

                    //string sql = "SELECT UserName FROM UserTb where UserId=" + tagIDmes[0] + "";
                    //Lb_usertext.Text = QueryName(sql);
                    //20121227
                    
                    string sql1 = "SELECT UserID,UserName FROM UserTb";
                    DataTable dt = new DataTable();
                    dt = ExeceuteDataTable(sql1);
                    if (dt.Rows.Count != 0)
                    {
                        cb_usertext.DisplayMember = "UserName";
                        cb_usertext.ValueMember = "UserID";
                        cb_usertext.DataSource = dt;
                    }
                    cb_usertext.SelectedValue = tagIDmes[0];

                    Lb_timetext.Text = tagIDmes[4].ToString() + tagIDmes[5].ToString() + "-" + tagIDmes[6].ToString() + "-" + tagIDmes[7].ToString() + " " + tagIDmes[8].ToString() + ":" + tagIDmes[9].ToString() + ":" + tagIDmes[10].ToString();
                    string sqlequip = "SELECT distinct EquipName FROM EquipMes where EquipId like '" + tagIDs[0] + "'";
                    Lb_equiptext.Text = QueryName(sqlequip);

                    string sqiequipname = "SELECT EquipChNo,EquipChName FROM EquipMes where EquipId like '" + tagIDs[0] + "'";
                    DataTable equipname = ExeceuteDataTable(sqiequipname);
                    FormRows = equipname.Rows.Count;
                    CreateFrom();
                    if (equipname.Rows.Count == 0)
                    {
                        for (int num = 1; num < FormRows + 1; num++)
                        {
                            //lab[num].Text = "Check Item";
                            lab[num].Text = "检查项";
                            //BufNo[num] = (byte)((num - 39) / 2);
                        }
                    }

                    for (int i = 0; i < equipname.Rows.Count; i++)
                    {
                        for (int j = 41; j < 72; j = j + 2)
                        {
                            if (equipname.Rows[i][0].ToString() == tagIDmes[j].ToString())
                            {
                                BufNo[j] = tagIDmes[j];
                                BufNo[j + 1] = (byte)(i + 1);

                                lab[i + 1].Text = equipname.Rows[i][1].ToString();
                                if (tagIDmes[j + 1].ToString() == "1")
                                {
                                    Ch1[i + 1].Checked = true;
                                    
                                    Ch2[i + 1].Checked = false;
                                }
                                else
                                {
                                    Ch1[i + 1].Checked = false;
                                    Ch2[i + 1].Checked = true;
                                }
                                Pa[i + 1].BackColor = System.Drawing.Color.Black;
                                Ch1[i + 1].CheckStateChanged += new EventHandler(MainForm_CheckStateChanged);
                                Ch2[i + 1].CheckStateChanged += new EventHandler(MainForm_CheckStateChanged);
                       
                            }
                        }
                    }
                }
                else
                {
                    //Lb_usertext.Text = "";
                    cb_usertext.Text = "";
                    Lb_timetext.Text = "";
                    Lb_equiptext.Text = "";
                    lb_service.Text = "";
                    MessageBox.Show("没有检测到RFID卡!");
                }
            }
            catch
            {
                MessageBox.Show("出现异常错误请重新读取!");
            }
        }


        private  void MainForm_CheckStateChanged(object sender, EventArgs e)
        {
            if (((CheckBox)sender).Checked==true)
            {
               string Oldname=((CheckBox)sender).Name;
              
             
               if( Oldname.IndexOf("Ch_stategood")>=0)
               {
                   int num = Convert.ToInt32(Oldname.Remove(0, 12));
                   Ch2[num].Checked = false;
               }
               else if (Oldname.IndexOf("Ch_statebug") >= 0)
               {
                   int num = Convert.ToInt32(Oldname.Remove(0, 11));
                   Ch1[num].Checked = false;
               }
               else
               {
 
               }      
            }
            else
            {

            }
        }

      
        private void Bt_read_Click(object sender, EventArgs e)
        {
            ReaderTag();
        }


        private void SaveTag()
        {
            string id=cb_usertext.SelectedValue.ToString();
            BufNo[0] =Convert.ToByte(id);//登陆人员
            BufNo[4] = 20;
            BufNo[5] = Convert.ToByte(System.DateTime.Now.ToString("yy"));
            BufNo[6] = (byte)System.DateTime.Now.Month;
            BufNo[7] = (byte)System.DateTime.Now.Day;
            BufNo[8] = (byte)System.DateTime.Now.Hour;
            BufNo[9] = (byte)System.DateTime.Now.Minute;
            BufNo[10] = (byte)System.DateTime.Now.Second;

            for (int i = 41; i < 71; i = i + 2)
            {
                try
                {

                    if (BufNo[i] != 0)
                    {
                        if (Ch1[BufNo[i + 1]].Checked == true)
                        {
                            BufNo[i + 1] = 1;
                        }
                        else if (Ch2[BufNo[i + 1]].Checked == true)
                        {
                            BufNo[i + 1] = 2;
                        }
                        else
                        {
                            BufNo[i + 1] = 0;
                        }
                    }
                    if ((i - 40) % 2 != 0)
                    {
                        BufNo[i] = (byte)(((i - 40) + 1) / 2);
                    }
                }
                catch
                {

                }
            }

            string sqlinsert = "INSERT INTO EquipHis(UserID,Time,EquipId,EquipName,EquipChNo,EquipChName,EquipState,UserName,EquipStateName)";
            if (TagId == "000000")
            {
                MessageBox.Show("没有发现RFID卡!");
            }
            else
            {
                int num = 1;
                for (int j = 41; j < 110; j = j + 2)
                {
                    string equipname = "";
                    string sqlequipname = "SELECT EquipChName FROM EquipMes where EquipId like '" + TagId + "' and EquipChNo=" + BufNo[j] + "";
                    equipname = QueryName(sqlequipname);
                    string ESname = "";
                    if (BufNo[j + 1] == 1)
                    {
                        ESname = "良好";
                    }
                    else if (BufNo[j + 1] == 2)
                    {
                        ESname = "故障";
                    }
                    else
                    {
                        ESname = "无";
                    }
                    if (equipname != "" && equipname != null && num == 1)
                    {
                       
                        sqlinsert = sqlinsert + " SELECT " + BufNo[0] + ",'" + System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "','" + TagId + "','" + Lb_equiptext.Text + "'," + BufNo[j] + ",'" + equipname + "'," + BufNo[j + 1] + ",'" + cb_usertext.Text + "','" + ESname + "'";
                        num = 2;
                    }
                    else if (equipname != "" && equipname != null && num != 1)
                    {
                        sqlinsert = sqlinsert + " UNION ALL ";
                        sqlinsert = sqlinsert + " SELECT " + BufNo[0] + ",'" + System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "','" + TagId + "','" + Lb_equiptext.Text + "'," + BufNo[j] + ",'" + equipname + "'," + BufNo[j + 1] + ",'" + cb_usertext.Text + "','" + ESname + "'";
                    }
                }
                try
                {
                    RfReaderApi.Current.SetTagMemory(TagId, 0, 0, 112, "AccessPassword", BufNo);//写入rfid
                    //插入数据库
                    if (num == 1)
                    {
                        MessageBox.Show("保存数据出现错误!");
                    }
                    else
                    {
                        if (InsertSql(sqlinsert) == true)
                        {
                            MessageBox.Show("保存数据成功!");
                        }
                        else
                        {
                            MessageBox.Show("保存数据出现错误!");
                        }
                    }
                }
                catch
                {
                    MessageBox.Show("保存数据出现错误!");
                }
                
            }
        }

        private void Bt_save_Click(object sender, EventArgs e)
        {
            SaveTag();
        }


        //服务开始    
        private void ReaderStart()
        {
            
            RfReaderInitData initData = new RfReaderInitData();
            //连接错误
            initData.Type = "RF310M";
            //选择模式
            initData.Mode = RfReaderInitData.ReaderMode.Standalone;
            try
            {
                RfReaderApi.Current.StartReader(initData);
                Service_Ok = 1;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);  
            }
        }

        //选择模式不确定
        private void menuReader()
        {
            uint initialQ = 0;
            try
            {
                RfReaderApi.Current.SetAirProtocol("ISO15693", initialQ);
                if (Service_Ok == 1)
                {
                    Service_Ok = 2;
                    lb_service.Text = "读取服务已启动!";
                }
            }
            catch 
            {
           
            }
        }

       
        //停止读取服务服务
        private void menuReaderStop_Click(object sender, EventArgs e)
        {
            try
            {
                WriteInformationLine("StopReader()");
                RfReaderApi.Current.StopReader();
                WriteInformationLine("服务已停止!");
            }
            catch
            {    
            }
        }

        //手动开启服务
        private void menuReaderStartRfm_Click(object sender, EventArgs e)
        {
            this.ReaderStart();
            Thread.Sleep(1000);
            this.menuReader();
        }

        //监视按下键
        protected void CaptureKeys(Control control)
        {
            for (int i = control.Controls.Count - 1; i >= 0; i--)
            {
                Control c = control.Controls[i] as Control;
                if (c != null)
                {
                    
                    c.KeyDown += new System.Windows.Forms.KeyEventHandler(this.DownHandler);
                    CaptureKeys(c);
                }
            }
        }

        protected void DownHandler(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 239)
            {
                ReaderTag();
            }
            else
            { 
            }
        }

        //查询数据库返回string
        public string QueryName(string strSql)
        {
            SqlCeConnection conn = null;
            try
            {
                conn = new SqlCeConnection(@"Data Source = \Data\RFID.sdf");
                conn.Open();
                SqlCeCommand cmd = conn.CreateCommand();
                cmd.CommandText = strSql;
                cmd.ExecuteNonQuery();
                SqlCeDataReader rdr = cmd.ExecuteReader();
                rdr.Read();
                string strName = rdr.GetString(0);
                conn.Close();
                return strName;
            }
            catch
            {
                conn.Close();
                return "";
            }
        }
        public bool InsertSql(string strSql)
        {
            SqlCeConnection connin = null;
            try
            {
                connin = new SqlCeConnection(@"Data Source = \Data\RFID.sdf");
                connin.Open();
                SqlCeCommand cmd = connin.CreateCommand();
                cmd.CommandText = strSql;
                if (cmd.ExecuteNonQuery() > 0)
                {
                    connin.Close();
                    return true;
                }
                else
                {
                    connin.Close();
                    return false;
                }

            }
            catch
            {
                connin.Close();
                return false;
            }

        }

        public DataTable ExeceuteDataTable(string strSQL)
        {
            DataTable dt = new DataTable();
            try
            {
                SqlCeDataAdapter da = new SqlCeDataAdapter(strSQL, @"Data Source = \Data\RFID.sdf");
                da.Fill(dt);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return dt;
        }

        public void WriteInformationLine(string message)
        {
            lb_service.Text = message;
        }
    }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值