一、总体架构
基于C# 代码构建了一个基于 Windows 窗体的应用程序,主要用于MES系统与 RFID 设备进行交互,实现对设备信息的读取、展示和保存。
二、主要功能模块
- 初始化:
- 在窗体的构造函数中,进行了一系列初始化操作,包括组件初始化、设置键盘捕获、启动读取器、暂停一段时间后调用其他初始化方法。如果读取服务成功启动,会在特定标签中显示相应提示信息。
- 表单创建:
CreateFrom
方法根据一个变量FormRows
的值动态创建标签、复选框和面板,并添加到窗体的特定面板中,用于展示检查项和状态选择。
- 读取 RFID 信息:
ReaderTag
方法是读取 RFID 卡信息的核心方法。它首先清空特定面板上的控件,然后尝试获取 RFID 卡的标签 ID 和内存数据。- 如果成功获取到标签 ID,会根据标签 ID 查询相关信息,如用户信息、时间、设备信息等,并填充到窗体的相应控件中。
- 根据设备信息确定检查项的数量,创建表单展示检查项名称,并根据内存数据设置检查项的初始状态。
- 复选框状态改变处理:
MainForm_CheckStateChanged
方法在复选框状态改变时被触发。它根据触发的复选框名称判断是 “良好” 还是 “故障” 复选框被选中,然后相应地设置另一个复选框的状态,确保同一检查项的两个状态复选框不能同时被选中。
- 读取按钮点击处理:
Bt_read_Click
方法在用户点击 “读取” 按钮时被调用,它会触发重新读取 RFID 卡信息并更新窗体显示的操作。
- 保存数据:
SaveTag
方法用于保存 RFID 卡相关数据。它根据用户选择的信息和当前时间等数据,更新一个字节数组中的数据。然后将这些数据插入到数据库表中。如果没有检测到 RFID 卡,则弹出提示消息。
三、改进方向
- 错误处理方面,可以增加更详细的错误日志记录,以便更好地进行调试和故障排查。
- 性能优化上,可以考虑使用异步操作来读取 RFID 卡和处理数据,避免阻塞用户界面。
- 提高代码可读性,可通过更清晰的变量命名和添加注释来实现。
- 对于数据库操作,可以考虑使用数据库连接池等技术提高性能。
部分代码:
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;
}
}