一、总体架构
基于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 Rea