using HslCommunication;
using LLAirtightApi;
using Microsoft.Office.Interop.Excel;
using System;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SLZ_4
{
public partial class FormMain : AutoResizeForm
{
public int devNum = 1;
public int channelNum = 4; //通道数量
//警告
public WarningInfo wa = new WarningInfo();
public static FormMain form;
public bool bExit; //程序退出
public string user; //当前用户
public ConfigINI configIni; //配置文件
public string[] strStatus = {"空闲","测试","充气","平衡","检测", "排气"};
public string[] strResult = { "", "OK", "NG"};
public string[] strListPressureUnit = { "Pa", "KPa", "MPa", "bar", "Psi", "kg/cm²", "atm" }; //压力单位
public string[] strListLeakageUnit = { "Pa", "KPa", "mbar", "atm", "SCCM", "CCM/S", "Pa/s" }; //泄漏量单位
public DEVICE_PARAM[] arrDevParam; //设备数组
public DeviceObject[] arrDevObj; //设备对象数组
public SCAN_PARAM[] arrScanParam; //扫码配置参数
public SCANNER_PARAM[] arrScannerObj; //扫码枪配置参数
public ScanNetwork[] arrScanNetwork; //网络扫码枪对象数组
public int scanType; //扫码枪类型
public PLC_PARAM plcParam; //PLC参数
public PlcObject plcObj; //PLC对象
public PRINTER_PARAM printParam; //打印条码
public MES_PARAM mesParam; //MES参数
public MesObj mesObj; //MES对象
public STATISTICS_INFO statisticInfo; //统计信息
public STORAGE_PARAM storageParam;
public string strOperator; //操作员
//设置窗口
public ConfigDevicePort cfgDevForm; //仪器窗口
public LogOn logonForm; //登录窗口
public Electricity devParamForm; //仪器参数窗口
public ConfigStorage storageForm; //存储配置窗口
public ConfigScanner scannerForm; //扫码枪配置窗口
public ConfigPLC plcForm; //PLC配置窗口
public ConfigPassword passwordForm; //配置密码窗口
public ConfigMes mesForm; //MES设置窗口
public Microsoft.Office.Interop.Excel.Application xapp;
public Workbook xbook;
public SqlConnection sqlConnection;
SynchronizationContext syncContext;
object lockObject = new object(); //统计加锁
object lockSN = new object(); //序列号自增加锁
public FormMain()
{
InitializeComponent();
form = this;
bExit = false;
user = "操作员";
labelUser.Text = user;
labelOperator.Text = "";
InStatus1.Text = "";
OutStatus1.Text = "";
InStatus2.Text = "";
OutStatus2.Text = "";
arrDevParam = new DEVICE_PARAM[devNum];
arrDevObj = new DeviceObject[devNum];
arrScanParam = new SCAN_PARAM[2];
arrScannerObj = new SCANNER_PARAM[2];
arrScanNetwork = new ScanNetwork[2];
storageParam = new STORAGE_PARAM();
plcParam = new PLC_PARAM();
mesParam = new MES_PARAM();
statisticInfo = new STATISTICS_INFO();
statisticInfo.ch = new STATISTICS_CHANNEL[channelNum];
for (int i = 0; i < devNum; i++)
{
arrDevParam[i].iDevType = (int)DEVICE_TYPE.DEVICE_SLZ_4; //LL-28
arrDevParam[i].iProtocol = 0; //网络
arrDevParam[i].sDevAddr = "";
arrDevParam[i].iSlaveId = i + 1;
}
for (int i = 0; i < channelNum; i++)
{
statisticInfo.ch[i] = new STATISTICS_CHANNEL();
}
configIni = new ConfigINI("Model", "Config");
//创建窗口
cfgDevForm = new ConfigDevicePort();
logonForm = new LogOn();
devParamForm = new Electricity();
storageForm = new ConfigStorage();
scannerForm = new ConfigScanner();
plcForm = new ConfigPLC();
passwordForm = new ConfigPassword();
mesForm = new ConfigMes();
//加载配置信息
Config.loadConfig(); //加载仪器配置信息
Config.loadStorage(ref storageParam); //加载存储信息
Config.loadScanParam(); //加载扫码参数
Config.loadScanner(); //加载扫码枪配置信息
Config.loadPLC(ref plcParam); //加载PLC配置信息
Config.loadPrint(ref printParam); //加载打印机信息
Config.loadMes(ref mesParam); //加载MES配置信息
Config.loadCount(ref statisticInfo); //加载统计信息
labelOperator.Text = strOperator;
scanType = scannerForm.scanType;
//添加仪器
for (int i = 0; i < devNum; i++)
{
addDevObj(i);
}
//添加PLC
//if (plcParam.sPort != "" && plcParam.iBaudrate != 0)
//{
// plcObj = new PlcObject();
//}
//添加扫码枪
if (scannerForm.scanType == (int)SCANNER_TYPE.INDUSTRY_NETWORK)
{
for (int i = 0; i < scannerForm.scanNum; i++)
{
addScanNetwork(i);
}
}
mesObj = new MesObj();
syncContext = SynchronizationContext.Current;
//扫码枪 PLC
Task.Run(() =>
{
processScanner();
});
//工业扫码枪,发送开始扫码命令
if (scanType == (int)SCANNER_TYPE.INDUSTRY_COM || scanType == (int)SCANNER_TYPE.INDUSTRY_NETWORK)
{
startScanCode(scanType);
}
Task.Run(() =>
{
refreshUI_CH(0);
});
}
private void MainForm_Load(object sender, EventArgs e)
{
//if (arrDevParam[0].sDevAddr == "" || arrDevParam[1].sDevAddr == "")
//{
// cfgDevForm.UDPBroadcast();
//}
this.WindowState = FormWindowState.Maximized;
timerUpdate.Start();
uiLabelPassNumber.ForeColor = Color.Green;
uiLabelFailNumber.ForeColor = Color.Red;
ShowStatistics();
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
bExit = true;
Thread.Sleep(500);
}
public void clearUI(int i)
{
if (i == 0)//通道1
{
InStatus1.Text = "";
OutStatus1.Text = "";
uiTextCode1.Text = "";
commStatus1.Text = "未配置";
commStatus1.BackColor = Color.Red;
pressure1.Text = "";
leakage1.Text = "";
uiProcessBar1.Value = 0;
result1.Text = "";
workState1.Text = "";
}
else if (i == 1)//通道2
{
InStatus2.Text = "";
OutStatus2.Text = "";
uiTextCode2.Text = "";
commStatus2.Text = "未配置";
commStatus2.BackColor = Color.Red;
pressure2.Text = "";
leakage2.Text = "";
uiProcessBar2.Value = 0;
result2.Text = "";
workState2.Text = "";
}
}
public void processScanner()
{
Thread.Sleep(500);
while (!bExit)
{
if (scannerForm.Visible == false)
{
//连接扫码枪
if (scanType == (int)SCANNER_TYPE.COMMON || scanType == (int)SCANNER_TYPE.INDUSTRY_COM)
{
if (arrScannerObj[0].sPort.Length > 0 && arrScannerObj[0].iBaudrate != 0)
{
openScanner1();
}
if (arrScannerObj[1].sPort.Length > 0 && arrScannerObj[1].iBaudrate != 0)
{
openScanner2();
}
}
else if (scannerForm.scanType == (int)SCANNER_TYPE.INDUSTRY_NETWORK) //网口
{
for (int i = 0; i < scannerForm.scanNum; i++)
{
openScannerNetwork(i);
}
}
}
//连接PLC
//if (plcObj != null && !plcObj.PLC.IsOpen())
//{
// plcObj.openPLC(plcParam);
//}
syncContext.Post(new SendOrPostCallback(obj =>
{
//更新PLC状态
if (plcObj != null)
{
updatePLCStatus(plcObj.PLC.IsOpen());
}
//更新MES状态
if (mesObj != null)
{
updateMESStatus(mesParam.bCheckOut);
}
}), null);
Thread.Sleep(2000);
}
}
public void refreshUI_CH(int iCH)
{
while (!bExit)
{
//更新UI
syncContext.Post(new SendOrPostCallback(obj =>
{
if (arrDevObj[iCH] != null && bExit == false)
{
refreshUI(iCH, ref arrDevObj[iCH].testInfo, arrDevObj[iCH].bStatus);
}
else
{
clearUI(iCH);
}
}), null);
if (arrDevObj[iCH] != null && bExit == false)
{
for (int i = 0; i < channelNum; i++)
{
if (arrDevObj[iCH].testInfo.chTest[i].iRecordFlag == 1)
{
WriteRecord(ref arrDevObj[iCH].testInfo, storageParam.sPath, i);
arrDevObj[iCH].testInfo.chTest[i].iRecordFlag = 0;
}
}
}
Thread.Sleep(100);
}
}
public void refreshUI(int iCH, ref TEST_PARAM testInfo, bool bSatus)
{
int ichannel = 0;
//CH1
commStatus1.Text = bSatus ? "在线" : "离线";
commStatus1.BackColor = bSatus ? Color.Green : Color.Red;
pressure1.Text = testInfo.chTest[ichannel].fTestPressure.ToString("F3") + " " + strListPressureUnit[testInfo.iPressureUnit];
leakage1.Text = testInfo.chTest[ichannel].fLeakAmount.ToString("F3") + " " + strListLeakageUnit[testInfo.iLeakUnit];
uiProcessBar1.Value = (int)testInfo.fProgressValue;
result1.Text = strResult[testInfo.chTest[ichannel].ResultFlag];
workState1.Text = strStatus[testInfo.iWorkStatus];
//CH2
ichannel += 1;
commStatus2.Text = bSatus ? "在线" : "离线";
commStatus2.BackColor = bSatus ? Color.Green : Color.Red;
pressure2.Text = testInfo.chTest[ichannel].fTestPressure.ToString("F3") + " " + strListPressureUnit[testInfo.iPressureUnit];
leakage2.Text = testInfo.chTest[ichannel].fLeakAmount.ToString("F3") + " " + strListLeakageUnit[testInfo.iLeakUnit];
uiProcessBar2.Value = (int)testInfo.fProgressValue;
result2.Text = strResult[testInfo.chTest[ichannel].ResultFlag];
workState2.Text = strStatus[testInfo.iWorkStatus];
//CH3
ichannel += 1;
pressure3.Text = testInfo.chTest[ichannel].fTestPressure.ToString("F3") + " " + strListPressureUnit[testInfo.iPressureUnit];
leakage3.Text = testInfo.chTest[ichannel].fLeakAmount.ToString("F3") + " " + strListLeakageUnit[testInfo.iLeakUnit];
result3.Text = strResult[testInfo.chTest[ichannel].ResultFlag];
//CH4
ichannel += 1;
pressure4.Text = testInfo.chTest[ichannel].fTestPressure.ToString("F3") + " " + strListPressureUnit[testInfo.iPressureUnit];
leakage4.Text = testInfo.chTest[ichannel].fLeakAmount.ToString("F3") + " " + strListLeakageUnit[testInfo.iLeakUnit];
result4.Text = strResult[testInfo.chTest[ichannel].ResultFlag];
for (int i = 0; i < channelNum; i++)
{
showResult(testInfo.chTest[i].ResultFlag, i);
string code1 = "";
string code2 = "";
if (testInfo.chTest[i].iRecordFlag == 1)
{
switch (i)
{
case 0:
code1 = uiTextCode1.Text;
code2 = uiTextCode11.Text;
break;
case 1:
code1 = uiTextCode2.Text;
code2 = uiTextCode22.Text;
break;
case 2:
code1 = uiTextCode3.Text;
code2 = uiTextCode33.Text;
break;
case 3:
code1 = uiTextCode4.Text;
code2 = uiTextCode44.Text;
break;
default:
break;
}
ShowRecord(ref testInfo, i, code1);
ShowStatistics(testInfo.chTest[i].ResultFlag, i);
if (code2 != "")
{
ShowRecord(ref testInfo, i, code2);
ShowStatistics(testInfo.chTest[i].ResultFlag, i);
}
}
}
}
private void showResult(int iResult, int iCH)
{
Color color = Color.Transparent;
switch (iResult)
{
case 0:
color = Color.Transparent;
if (iCH == 0)
{
OutStatus1.Text = "";
OutStatus1.BackColor = color;
}
else if (iCH == 1)
{
OutStatus2.Text = "";
OutStatus2.BackColor = color;
}
else if (iCH == 2)
{
OutStatus3.Text = "";
OutStatus3.BackColor = color;
}
else if (iCH == 3)
{
OutStatus4.Text = "";
OutStatus4.BackColor = color;
}
break;
case 1:
color = Color.Green;
break;
case 2:
color = Color.Red;
break;
default:
break;
}
if (iCH == 0)
{
result1.ForeColor = color;
}
else if (iCH == 1)
{
result2.ForeColor = color;
}
else if (iCH == 2)
{
result3.ForeColor = color;
}
else if (iCH == 3)
{
result4.ForeColor = color;
}
}
private void uiNavBar_MenuItemClick(string itemText, int menuIndex, int pageIndex)
{
//以下操作不需要判断用户
if (itemText == "登录")
{
logonForm.setOperator(labelOperator.Text);
logonForm.StartPosition = FormStartPosition.CenterParent;
logonForm.ShowDialog();
if (labelUser.Text != "操作员")
{
timerUser.Start();
}
if (labelOperator.Text != "")
{
uiTextMsg.Text = "";
uiTextMsg.ForeColor = Color.Black;
uiTextCH2.Text = "";
uiTextCH2.ForeColor = Color.Black;
}
}
else if (itemText == "注销")
{
labelUser.Text = "操作员";
}
if (labelUser.Text == "管理员")
{
if (itemText == "修改密码")
{
passwordForm.clear();
passwordForm.StartPosition = FormStartPosition.CenterParent;
passwordForm.ShowDialog();
}
}
//需要用户权限
if (labelUser.Text == "厂商" || labelUser.Text == "管理员" || labelUser.Text == "工程师")
{
if (itemText == "MES设置")
{
mesForm.SetConfig(ref mesParam);
mesForm.StartPosition = FormStartPosition.CenterParent;
mesForm.ShowDialog();
}
else if (itemText == "测试参数")
{
devParamForm.SetConfig();
devParamForm.StartPosition = FormStartPosition.CenterParent;
devParamForm.ShowDialog();
//OpenForm(devParamForm);
}
else if (itemText == "存储设置")
{
storageForm.SetConfig(ref storageParam);
storageForm.StartPosition = FormStartPosition.CenterParent;
storageForm.ShowDialog();
//OpenForm(storageForm);
}
else if (itemText == "产量清零")
{
if (MessageBox.Show("你确定要清空产量吗?", "确认删除", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
for (int i = 0; i < devNum; i++)
{
statisticInfo.ch[i].iCount = 0;
statisticInfo.ch[i].iPass = 0;
statisticInfo.ch[i].iFailed = 0;
}
statisticInfo.iCount = 0;
statisticInfo.iPass = 0;
statisticInfo.iFailed = 0;
Config.setCount(ref statisticInfo);
ShowStatistics();
}
}
else if (itemText == "仪器启动")
{
if (arrDevObj[0] != null && arrDevObj[0].bStatus)
{
arrDevObj[0].Start(true);
}
}
else if (itemText == "仪器复位")
{
if (arrDevObj[0] != null && arrDevObj[0].bStatus)
{
arrDevObj[0].Start(false);
}
}
else if (itemText == "仪器设置")
{
cfgDevForm.showDevInfo();
cfgDevForm.StartPosition = FormStartPosition.CenterParent;
cfgDevForm.ShowDialog();
}
else if (itemText == "扫码枪设置")
{
scannerForm.setConfig();
scannerForm.refreshPort();
scannerForm.StartPosition = FormStartPosition.CenterParent;
scannerForm.ShowDialog();
if (scanType != scannerForm.scanType)
{
scanType = scannerForm.scanType;
if (scanType == (int)SCANNER_TYPE.INDUSTRY_COM || scanType == (int)SCANNER_TYPE.INDUSTRY_NETWORK)
{
startScanCode(scanType);
}
}
}
else if (itemText == "PLC设置")
{
plcForm.setConfig(ref plcParam);
plcForm.StartPosition = FormStartPosition.CenterParent;
plcForm.ShowDialog();
}
}
}
private void ShowRecord(ref TEST_PARAM testInfo, int iCH, string code)
{
//添加测试记录
int iCount = 0;
if (iCH == 0 || iCH == 2)
{
if (uiDataGridView1.Rows.Count >= 1000)
{
uiDataGridView1.Rows.Clear();
}
iCount = uiDataGridView1.Rows.Count + 1;
uiDataGridView1.Rows.Insert(0, iCount.ToString(),labelOperator.Text, DateTime.Now.ToString(), code,
testInfo.chTest[iCH].fTestPressure.ToString("F3"),
testInfo.chTest[iCH].fLeakAmount.ToString("F3"), strResult[testInfo.chTest[iCH].ResultFlag]);
if (testInfo.chTest[iCH].ResultFlag == 2)
{
uiDataGridView1.Rows[0].DefaultCellStyle.ForeColor = Color.Red;
}
else
{
uiDataGridView1.Rows[0].DefaultCellStyle.ForeColor = Color.Green;
}
}
else if (iCH == 1 || iCH == 3)
{
if (uiDataGridView2.Rows.Count >= 1000)
{
uiDataGridView2.Rows.Clear();
}
iCount = uiDataGridView2.Rows.Count + 1;
uiDataGridView2.Rows.Insert(0, iCount.ToString(), labelOperator.Text, DateTime.Now.ToString(), code,
testInfo.chTest[iCH].fTestPressure.ToString("F3"),
testInfo.chTest[iCH].fLeakAmount.ToString("F3"), strResult[testInfo.chTest[iCH].ResultFlag]);
if (testInfo.chTest[iCH].ResultFlag == 2)
{
uiDataGridView2.Rows[0].DefaultCellStyle.ForeColor = Color.Red;
}
else
{
uiDataGridView2.Rows[0].DefaultCellStyle.ForeColor = Color.Green;
}
}
}
private void ShowStatistics(int result, int iCH)
{
lock(lockObject)
{
statisticInfo.ch[iCH].iCount += 1;
statisticInfo.iCount += 1;
if (result == 1) //OK
{
statisticInfo.ch[iCH].iPass += 1;
statisticInfo.iPass += 1;
}
else
{
statisticInfo.ch[iCH].iFailed += 1;
statisticInfo.iFailed += 1;
}
Config.setCount(ref statisticInfo);
ShowStatistics();
}
}
private void ShowStatistics()
{
uiLabelSumNumber.Text = statisticInfo.iCount.ToString();
uiLabelPassNumber.Text = statisticInfo.iPass.ToString();
uiLabelFailNumber.Text = statisticInfo.iFailed.ToString();
if (statisticInfo.iCount > 0)
{
uiProcessPass.Value = 100 * statisticInfo.iPass / statisticInfo.iCount;
}
else
{
uiProcessPass.Value = 0;
}
}
private void WriteRecord(ref TEST_PARAM testInfo, string strPath, int iCH)
{
string code1 = "";
string code2 = "";
switch (iCH)
{
case 0:
code1 = uiTextCode1.Text;
code2 = uiTextCode11.Text;
break;
case 1:
code1 = uiTextCode2.Text;
code2 = uiTextCode22.Text;
break;
case 2:
code1 = uiTextCode3.Text;
code2 = uiTextCode33.Text;
break;
case 3:
code1 = uiTextCode4.Text;
code2 = uiTextCode44.Text;
break;
default:
break;
}
if (storageParam.sPath.Length <= 0) //存储路径为空
{
storageParam.sPath = AppDomain.CurrentDomain.BaseDirectory + "\\Storage";
}
if (!Directory.Exists(storageParam.sPath))
{
Directory.CreateDirectory(storageParam.sPath);
}
if (storageParam.bTxt)
{
SaveRecord.WriteTXT(ref testInfo, code1, strPath, iCH);
if (code2 != "")
{
SaveRecord.WriteTXT(ref testInfo, code2, strPath, iCH);
}
}
if (storageParam.bCSV)
{
SaveRecord.WriteCSV(ref testInfo, code1, strPath, iCH);
if (code2 != "")
{
SaveRecord.WriteCSV(ref testInfo, code2, strPath, iCH);
}
}
if (storageParam.bSQL)
{
SaveRecord.WriteSQL(ref testInfo, code1, strPath, iCH);
if (code2 != "")
{
SaveRecord.WriteSQL(ref testInfo, code2, strPath, iCH);
}
}
if (storageParam.bExcel)
{
SaveRecord.WriteExcel(testInfo, code1, strPath, iCH);
if (code2 != "")
{
SaveRecord.WriteExcel(testInfo, code2, strPath, iCH);
}
}
if (mesParam.bCheckOut)
{
MesCheckout(ref testInfo, code1, iCH);
if (code2 != "")
{
MesCheckout(ref testInfo, code2, iCH);
}
}
syncContext.Post(new SendOrPostCallback(obj =>
{
switch (iCH)
{
case 0:
uiTextCode1.Text = "";
uiTextCode11.Text = "";
break;
case 1:
uiTextCode2.Text = "";
uiTextCode22.Text = "";
break;
case 2:
uiTextCode3.Text = "";
uiTextCode33.Text = "";
break;
case 3:
uiTextCode4.Text = "";
uiTextCode44.Text = "";
break;
default:
break;
}
}), null);
}
public void addDevObj(int i)
{
if (arrDevParam[i].sDevAddr != "" && arrDevParam[i].iPort != 0 && arrDevParam[i].iSlaveId != 0)
{
if (arrDevObj[i] == null)
{
arrDevObj[i] = new DeviceObject(ref arrDevParam[i]);
}
}
}
public void deleteDevObj(int i)
{
if (arrDevObj[i] != null)
{
arrDevObj[i].bExit = true;
arrDevObj[i] = null;
}
}
public void addScanNetwork(int i)
{
if (arrScannerObj[i].sIpaddr != "" && arrScannerObj[i].iPort != 0
|| ConfigScanner.IsValidIp(arrScannerObj[i].sIpaddr))
{
if (arrScanNetwork[i] != null)
{
arrScanNetwork[i].Disconnect();
}
arrScanNetwork[i] = new ScanNetwork(
arrScannerObj[i].sIpaddr,
arrScannerObj[i].iPort,
arrScanParam[i].iCodeLength,
code => { ProcessCode(i, code); },
error => { ProcessStatus(i, error); },
status => { ProcessStatus(i, status); }
);
}
}
///
/// 打开扫码枪 网络连接
///
///
public void openScannerNetwork(int i)
{
if (arrScanNetwork[i] != null && arrScanNetwork[i].IsConnected)
{
return;
}
if (arrScanNetwork[i] != null)
{
arrScanNetwork[i].Connect();
}
}
public void closeScannerNetwork(int i)
{
if (arrScanNetwork[i] != null && arrScanNetwork[i].IsConnected)
{
arrScanNetwork[i].Disconnect();
arrScanNetwork[i] = null;
}
}
//防止打开多个相同的窗口
public void OpenForm(System.Windows.Forms.Form frm)
{
if (frm == null) return;
foreach (System.Windows.Forms.Form f in System.Windows.Forms.Application.OpenForms)
{
if (f.Name == frm.Name)
{
f.Activate();
f.Show();
frm.Dispose();
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
return;
}
}
frm.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
frm.Show();
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
private void btnClearCode1_Click(object sender, EventArgs e)
{
uiTextMsg.Text = "";
uiTextCode1.Text = "";
InStatus1.Text = "";
OutStatus1.Text = "";
InStatus1.BackColor = Color.Transparent;
OutStatus1.BackColor = Color.Transparent;
}
private void btnClearCode2_Click(object sender, EventArgs e)
{
uiTextCH2.Text = "";
uiTextCode2.Text = "";
InStatus2.Text = "";
OutStatus2.Text = "";
InStatus2.BackColor = Color.Transparent;
OutStatus2.BackColor = Color.Transparent;
}
public void openScanner1()
{
if (serialPortCode1.IsOpen)
{
return;
}
try
{
//设置端口的参数,包括波特率等
serialPortCode1.BaudRate = arrScannerObj[0].iBaudrate;
serialPortCode1.PortName = arrScannerObj[0].sPort;
serialPortCode1.DataBits = 8;
serialPortCode1.StopBits = System.IO.Ports.StopBits.One;
serialPortCode1.Parity = System.IO.Ports.Parity.None;
serialPortCode1.Open();
}
catch (Exception ex)
{
string str = "打开扫码枪串口1失败:" + ex.Message;
FileLogger.Log(str, LogLevel.ERROR);
syncContext.Post(new SendOrPostCallback(obj =>
{
uiTextMsg.Text = str;
uiTextMsg.ForeColor = Color.Red;
}), null);
}
}
public void openScanner2()
{
if (serialPortCode2.IsOpen)
{
return;
}
try
{
//设置端口的参数,包括波特率等
serialPortCode2.BaudRate = arrScannerObj[1].iBaudrate;
serialPortCode2.PortName = arrScannerObj[1].sPort;
serialPortCode2.DataBits = 8;
serialPortCode2.StopBits = System.IO.Ports.StopBits.One;
serialPortCode2.Parity = System.IO.Ports.Parity.None;
serialPortCode2.Open();
}
catch (Exception ex)
{
string str = "打开扫码枪串口2失败:" + ex.Message;
FileLogger.Log(str, LogLevel.ERROR);
syncContext.Post(new SendOrPostCallback(obj =>
{
uiTextCH2.Text = str;
uiTextCH2.ForeColor = Color.Red;
}), null);
}
}
private void startScanCode(int iType)
{
Task.Run(() =>
{
while (!bExit)
{
if (scanType == (int)SCANNER_TYPE.COMMON)
{
break;
}
if (scannerForm.Visible == true)
{
Thread.Sleep(100);
continue;
}
if (workState1.Text == "空闲" && workState2.Text == "空闲")
{
if (iType == 1)//串口
{
string data = "73 74 61 72 74"; // "start"
byte[] byt = ScanNetwork.StrtoHexbyte(data);
if (serialPortCode1.IsOpen)
{
serialPortCode1.Write(byt, 0, byt.Length);
}
if (serialPortCode2.IsOpen)
{
serialPortCode2.Write(byt, 0, byt.Length);
}
}
else if (iType == 2) //网络
{
for (int i = 0; i < devNum; i++)
{
if (arrScanNetwork[i] != null)
{
arrScanNetwork[i].SendStartCommand();
}
}
}
}
Thread.Sleep(100);
}
Console.WriteLine($"startScanCode Exit : {iType} \n");
});
}
private void serialPortCode1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
System.Threading.Thread.Sleep(50);
int len = serialPortCode1.BytesToRead;//获取可以读取的字节数
if (len > 1)
{
byte[] buff = new byte[len];//创建缓存数据数组
serialPortCode1.Read(buff, 0, len);//把数据读取到buff数组
Invoke((new System.Action(() => //接收计数
{
string code = Encoding.Default.GetString(buff);
code = code.Replace("\r", "");
code = code.Replace("\n", "");
if (uiTextCode1.Text.Length == 0)
{
uiTextCode1.Text = code;
}
else if (scannerForm.scanNum == 1 && uiTextCode2.Text.Length == 0)
{
uiTextCode2.Text = code;
}
serialPortCode1.DiscardInBuffer();
})));
}
}
catch (Exception ex)
{
MessageBox.Show("扫码枪1:" + ex.Message);
}
}
private void serialPortCode2_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
System.Threading.Thread.Sleep(50);
int len = serialPortCode2.BytesToRead;//获取可以读取的字节数
if (len > 1)
{
byte[] buff = new byte[len];//创建缓存数据数组
serialPortCode2.Read(buff, 0, len);//把数据读取到buff数组
Invoke((new System.Action(() => //接收计数
{
string code = Encoding.Default.GetString(buff);
code = code.Replace("\r", "");
code = code.Replace("\n", "");
uiTextCode2.Text = code;
serialPortCode2.DiscardInBuffer();
})));
}
}
catch (Exception ex)
{
MessageBox.Show("扫码枪2:" + ex.Message);
}
}
private void Code1_TextChanged(object sender, EventArgs e)
{
checkStart(0, uiTextCode1.Text.Length, uiTextCode1.Text);
}
private void Code2_TextChanged(object sender, EventArgs e)
{
checkStart(1, uiTextCode2.Text.Length, uiTextCode2.Text);
}
///
/// 处理扫码枪接收到网络数据
///
///
///
private void ProcessCode(int iCH, string code)
{
syncContext.Post(new SendOrPostCallback(obj =>
{
if (iCH == 0)
{
if (uiTextCode1.Text == "")
{
uiTextCode1.Text = code;
}
else if (uiTextCode11.Text == "")
{
uiTextCode11.Text = code;
}
else if (uiTextCode2.Text == "")
{
uiTextCode2.Text = code;
}
else if (uiTextCode22.Text == "")
{
uiTextCode22.Text = code;
}
else if (uiTextCode3.Text == "")
{
uiTextCode3.Text = code;
}
else if (uiTextCode33.Text == "")
{
uiTextCode33.Text = code;
}
else if (uiTextCode4.Text == "")
{
uiTextCode4.Text = code;
}
else if (uiTextCode44.Text == "")
{
uiTextCode44.Text = code;
}
//else if (scannerForm.scanNum == 1 && uiTextCode2.Text == "")
//{
// uiTextCode2.Text = code;
//}
}
else
{
if (code != uiTextCode2.Text)
{
uiTextCode2.Text = code;
}
}
}), null);
}
private void ProcessStatus(int iCH, string code)
{
syncContext.Post(new SendOrPostCallback(obj =>
{
if (iCH == 0)
{
uiTextMsg.Text = code;
}
else
{
uiTextCH2.Text = code;
}
}), null);
}
///
/// 检查是否收到合法条码
///
///
///
///
private void checkStart(int iCH, int iCodeLen, string code)
{
//条码检测
if (arrScanParam[iCH].bCheckLen && iCodeLen != arrScanParam[iCH].iCodeLength)
{
return;
}
//扫码启动
if (/*arrScanParam[iCH].bStart && */iCodeLen == arrScanParam[iCH].iCodeLength)
{
Task.Run(() =>
{
if (mesParam.bCheckOut)
{
string str = mesObj.MesCheckIn(code, iCH, mesParam.sUrl);
if (str != "")
{
bool bOK = mesObj.mesReply.code == 200;
//更新UI
syncContext.Post(new SendOrPostCallback(obj =>
{
if (iCH == 0)
{
uiTextMsg.Text = str;
InStatus1.Text = bOK ? "OK" : "NG";
InStatus1.BackColor = bOK ? Color.Green : Color.Red;
uiTextMsg.ForeColor = bOK ? Color.Green : Color.Red;
}
else if (iCH == 1)
{
uiTextCH2.Text = str;
InStatus2.Text = bOK ? "OK" : "NG";
InStatus2.BackColor = bOK ? Color.Green : Color.Red;
uiTextCH2.ForeColor = bOK ? Color.Green : Color.Red;
}
}), null);
if (!bOK)
{
return;
}
}
}
//PLC发送扫码启动命令
if (plcObj != null)
{
if (!plcObj.ScanFinish(iCH))
{
FileLogger.Log(iCH + "PLC扫码完成命令发送失败:",LogLevel.ERROR);
}
}
});
//if (arrDevObj[iCH] != null && arrDevObj[iCH].bStatus) 自动启动
//{
// arrDevObj[iCH].Start(true);
//}
}
}
public void updateStorage(STORAGE_PARAM pStorage)
{
storageParam = pStorage;
}
public void updatePLCStatus(bool status)
{
picturePLC.BackColor = status ? Color.Green : Color.Red;
}
public void updateMESStatus(bool status)
{
pictureMES.BackColor = status ? Color.Green : Color.Red;
}
///
/// 更新PLC配置
///
///
///
public void updatePLC(string port, int baudrate)
{
plcParam.sPort = port;
plcParam.iBaudrate = baudrate;
if (plcObj == null)
{
plcObj = new PlcObject();
}
plcObj.closePLC();
plcObj.openPLC(plcParam);
Config.savePLC(ref plcParam);
}
///
/// 更新仪器配置
///
///
///
public void updateDevice(string port, int baudrate)
{
arrDevParam[0].sDevAddr = port;
arrDevParam[0].iPort = baudrate;
}
///
/// 设置是否扫码启动
///
///
///
public void updataScanStart(int iCH, bool bStart)
{
if (plcObj != null)
{
plcObj.SetScan(iCH, bStart);
if (!plcObj.SetScan(iCH, bStart))
{
FileLogger.Log(iCH.ToString() + ": PLC配置扫码启动失败 " + bStart.ToString(), LogLevel.ERROR);
MessageBox.Show(iCH.ToString() + ": PLC配置扫码启动失败 " + bStart.ToString());
}
}
}
public void UpdateMesConfig(ref MES_PARAM pParam)
{
mesParam = pParam;
Config.saveMes(ref mesParam);
}
private void MesCheckout(ref TEST_PARAM testInfo, string code, int iCH)
{
string str = mesObj.MesCheckOut(ref testInfo.chTest[iCH], ref arrDevObj[iCH].configParam, code, iCH, mesParam.sUrl);
syncContext.Post(new SendOrPostCallback(obj =>
{
bool bOK = mesObj.mesReply.code == 200;
if (iCH == 0)
{
uiTextMsg.Text = str;
OutStatus1.Text = bOK ? "OK" : "NG";
OutStatus1.BackColor = bOK ? Color.Green : Color.Red;
uiTextMsg.ForeColor = bOK ? Color.Green : Color.Red;
InStatus1.BackColor = Color.Transparent;
InStatus1.Text = "";
}
else if (iCH == 1)
{
uiTextCH2.Text = str;
OutStatus2.Text = bOK ? "OK" : "NG";
OutStatus2.BackColor = bOK ? Color.Green : Color.Red;
uiTextCH2.ForeColor = bOK ? Color.Green : Color.Red;
InStatus2.BackColor = Color.Transparent;
InStatus2.Text = "";
}
}), null);
}
private void timerUser_Tick(object sender, EventArgs e)
{
timerUser.Stop();
labelUser.Text = "操作员";
}
private void timerUpdate_Tick(object sender, EventArgs e)
{
uiLabelTime.Text = DateTime.Now.ToString("HH:mm:ss");
}
public void ShowPrintError(string strTips)
{
FormMain.form.Invoke((MethodInvoker)delegate
{
MessageBox.Show(strTips);
uiTextMsg.Text = strTips;
});
}
private bool StartDevice(bool bStart)
{
if (arrDevObj[0] != null && arrDevObj[0].bStatus)
{
return arrDevObj[0].Start(bStart);
}
return false;
}
private void uiButtonStart_Click(object sender, EventArgs e)
{
if (StartDevice(true))
{
uiTextMsg.Text = "启动仪器成功";
}
else
{
uiTextMsg.Text = "启动仪器失败";
}
}
private void uiButtonStop_Click(object sender, EventArgs e)
{
if (StartDevice(false))
{
uiTextMsg.Text = "复位仪器成功";
}
else
{
uiTextMsg.Text = "复位仪器失败";
}
}
}
}