初次接触上位机开发,接收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;
}
}