From d1b72117058f1131046b6aa3add8e3ccfae033d8 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 09 十一月 2026 10:36:07 +0800
Subject: [PATCH] docs: CAN 模拟器独立 TCP 服务进程设计规格(统一 CanDeviceDriver + 双工推送协议)
---
Plugin.TestResult/Scanner.xaml.cs | 366 +++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 319 insertions(+), 47 deletions(-)
diff --git a/Plugin.TestResult/Scanner.xaml.cs b/Plugin.TestResult/Scanner.xaml.cs
index 929b47a..aeba0b8 100644
--- a/Plugin.TestResult/Scanner.xaml.cs
+++ b/Plugin.TestResult/Scanner.xaml.cs
@@ -1,9 +1,19 @@
-锘縰sing HMI.UI.Util;
+锘縰sing HMI.Core.Manager;
+using HMI.Core.Setting;
+using HMI.Core.Util;
+using HMI.UI.Util;
+using HMI.Util;
using Panuon.WPF.UI;
+using Plugin.TestResult.Lixun;
+using Plugin.TestResult.Model;
+using Plugin.TestResult.Util;
+using Plugin.TestResult_WPF.Model;
using System;
+using System.Collections.Generic;
using System.ComponentModel;
using System.IO.Ports;
using System.Windows;
+using System.Windows.Input;
namespace Plugin.TestResult_WPF
{
@@ -12,12 +22,14 @@
public string name { get; private set; }
public string positionCode { get; private set; }
public string snrCode { get; private set; }
+ public CellInfo lastInfo { get; private set; }
- public BarcodeEventArg(string name, string positionCode, string snrCode)
+ public BarcodeEventArg(string name, string positionCode, string snrCode, CellInfo lastInfo)
{
this.name = name;
this.positionCode = positionCode;
this.snrCode = snrCode;
+ this.lastInfo = lastInfo;
}
}
@@ -35,12 +47,23 @@
}
public event EventHandler<BarcodeEventArg> FinishBarcode;
+ public event EventHandler<RoutedEventArgs> ComplateClick;
- private DataTable dataTable;
+ private static Dictionary<string, CellInfo> snrCache = new Dictionary<string, CellInfo>();
SerialPort serialPort;
- public Scanner(string title)
+
+ private string model;
+ private int columns;
+ private int rows;
+ private int ovenIndex;
+ private CellInfo targetCellInfo;
+ public Scanner(int index, string title, string model, int columns, int rows)
{
+ this.ovenIndex = index;
this.title = title;
+ this.model = model;
+ this.columns = columns;
+ this.rows = rows;
this.DataContext = this;
InitializeComponent();
Loaded += Scanner_Loaded;
@@ -48,8 +71,16 @@
private void Scanner_Loaded(object sender, RoutedEventArgs e)
{
- InitScanner();
- Loaded -= Scanner_Loaded;
+ try
+ {
+ InitScanner();
+ Loaded -= Scanner_Loaded;
+ }
+ catch (Exception ex)
+ {
+ ViewControl.Logger.Error("Open Scanner Window Error.", ex);
+ MsgBoxHelper.Error(this, $"{ex.Message}");
+ }
}
/// <summary>
@@ -59,26 +90,36 @@
{
string comStr = "";
if (serialPort != null) return;
- if (this.title == "涓�鍖烘壂鐮�")
+
+ string section = this.Tag.ToString();
+ ScannerConfig common = ScannerConfig.ReadFromIni(ViewControl.SannerIniFile, "Config");
+
+ string portName = IniFileHelper.ReadIniData(section, "PortName", "", ViewControl.SannerIniFile);
+ if (string.IsNullOrEmpty(portName))
{
- comStr = "COM1";
+ if (section.StartsWith("A"))
+ {
+ portName = "COM1";
+ }
+ else
+ {
+ portName = "COM2";
+ }
}
- else
- {
- comStr = "COM2";
- }
+ common.PortName = portName;
+
// 閰嶇疆涓插彛
serialPort = new SerialPort
{
- PortName = comStr,
- BaudRate = 115200,
+ PortName = common.PortName,
+ BaudRate = common.BaudRate,
Parity = Parity.None,
- DataBits = 8,
- StopBits = StopBits.One,
+ DataBits = common.DataBits,
+ StopBits = common.StopBits,
Handshake = Handshake.None,
- DtrEnable = true,
- RtsEnable = true
+ DtrEnable = common.DtrEnable,
+ RtsEnable = common.RtsEnable
//ReadTimeout = 500,
//WriteTimeout = 500,
//ReciveBufferSize=4096
@@ -93,7 +134,8 @@
}
catch (Exception ex)
{
- MsgBoxHelper.Error(this, $"鍒濆鍖栨壂鐮佹灙澶辫触锛亄ex.StackTrace}");
+ ViewControl.Logger.Error("Init Scan Gun Failed.", ex);
+ MsgBoxHelper.Error(this, $"{this.lang("Tr.InitGunFailed")}: {ex.StackTrace}");
}
}
@@ -102,7 +144,7 @@
try
{
SerialPort sp = (SerialPort)sender;
- string barcode = ReadDataFrom(sp);
+ string barcode = ReadDataFrom(sp).Trim();
//string barcode =
Dispatcher.Invoke(() =>
@@ -114,16 +156,81 @@
}
else
{
- positionText.Text = barcode;
- //positionText.Focus();
- //snrText.Text = "";
- snrText.Focus();
+ try
+ {
+ var targetCellInfo = ScannerParser.GetCellInfoByCode(this.model, this.columns, this.rows, barcode);
+ if (!TestResultView.nameTables.ContainsKey(targetCellInfo.OvenName))
+ {
+ MsgBoxHelper2.Error($"鑰佸寲鐐� [{targetCellInfo.OvenName}] 涓嶅瓨鍦紝璇锋鏌ラ厤缃�");
+ return;
+ }
+ var sourceTable = TestResultView.tables[this.ovenIndex];
+ if (sourceTable.title != targetCellInfo.OvenName)
+ {
+ MsgBoxHelper2.Error($"璇峰垏鎹㈣嚦 [{targetCellInfo.OvenName}] 鍖烘壂鐮侊紝褰撳墠涓� [{sourceTable.title}] 鍖猴紒");
+ return;
+ }
+
+ var oven = TestResultView.nameTables[targetCellInfo.OvenName];
+ if (oven.cells.Length < targetCellInfo.Index + 1)
+ {
+ MsgBoxHelper2.Error($"绌翠綅鍙� [{barcode}] 瓒呭嚭绱㈠紩 {targetCellInfo.Index}");
+ return;
+ }
+
+ this.targetCellInfo = targetCellInfo;
+ positionText.Text = barcode;
+ //positionText.Focus();
+ //snrText.Text = "";
+ snrText.Focus();
+ }
+ catch (Exception ex)
+ {
+ ViewControl.Logger.Error("Parse Position Code Error.", ex);
+ MsgBoxHelper2.Error($"绌翠綅鍙� [{barcode}] 瑙f瀽澶辫触: {ex.Message}");
+ }
}
});
}
catch (Exception ex)
{
- MessageBox.Show($"鑾峰彇鎵爜鏋暟鎹け璐ワ紒{ex.StackTrace}");
+ ViewControl.Logger.Error("Get Scan Gun Data Failed.", ex);
+ MessageBox.Show($"{this.lang("Tr.GetGunData")}: {ex.StackTrace}");
+ }
+ }
+
+ public static void InsertNewCode(string snr, CellInfo info)
+ {
+ snrCache[snr] = info;
+ }
+
+ public static void RemoveSNR(string snr)
+ {
+ snrCache.Remove(snr);
+ }
+
+ private void SendCode(string tag, string position, string snr)
+ {
+ if (snrCache.ContainsKey(snr))
+ {
+ string oldPosition = snrCache[snr].OriginCode;
+ if (MsgBoxHelper2.WarnChoose($"鏉$爜[{snr}]宸叉斁缃簬[{oldPosition}]涓紝鏄惁娓呴櫎锛�") == MessageBoxResult.OK)
+ {
+ try
+ {
+ FinishBarcode.Invoke(this, new BarcodeEventArg(tag, position, null, snrCache[snr]));
+ snrCache.Remove(snr);
+ FinishBarcode.Invoke(this, new BarcodeEventArg(tag, position, snr, null));
+ }
+ catch (Exception ex)
+ {
+ ToastHelper.Error(ex.Message);
+ }
+ }
+ }
+ else
+ {
+ FinishBarcode.Invoke(this, new BarcodeEventArg(tag, position, snr, null));
}
}
@@ -132,42 +239,141 @@
Dispatcher.Invoke(() =>
{
string position = positionText.Text, snr = snrText.Text;
+ try
+ {
+ var EnableMes = ParameterManager.GetCommonParameterByName<bool>("EnableMes", false);
+ if (ParamSetting.CustomerCode == "LIXUN" && EnableMes)
+ {
+ var table = TestResultView.nameTables[targetCellInfo.OvenName];
+ // TestResultView.tables[this.ovenIndex]
+ string currentPn = table.CbProduct.Text;
+
+ /// 妫�鏌ユ牸寮�
+ if (!SNValidator.ValidateSN(currentPn, snr, out string msg))
+ {
+ table.GetSingleCell(targetCellInfo.Index).LightRed(true, out _);
+ MsgBoxHelper2.Error($"妫�鏌ヤ骇鍝佹潯鐮佸紓甯革細{msg}");
+ snrText.Text = string.Empty;
+ snrText.Focus();
+ return;
+ }
+
+ /// 鑾峰彇绔欏悕
+ string stationName = ProductManager.GetParameterByProductAndName(currentPn, "MES绔欎綅")?.Value;
+ if (string.IsNullOrEmpty(stationName))
+ {
+ table.GetSingleCell(targetCellInfo.Index).LightRed(true, out _);
+ MsgBoxHelper2.Error($"妫�鏌ヤ骇鍝佹潯鐮佸紓甯革紝褰撳墠浜у搧[{currentPn}]鏈缃弬鏁癕ES绔欎綅");
+ snrText.Text = string.Empty;
+ snrText.Focus();
+ return;
+ }
+
+ /// 妫�鏌N
+ if (PNUtil.GetPN(ParamSetting.MesAddress, stationName, snr, out string pn, out msg))
+ {
+
+ if (pn != currentPn)
+ {
+ table.GetSingleCell(targetCellInfo.Index).LightRed(true, out _);
+ MsgBoxHelper2.Error($"褰撳墠娴嬭瘯鏂欏彿涓� [{currentPn}]锛屾壂鐮佷骇鍝佹枡鍙蜂负 [{pn}] 涓嶅厑璁告祴璇�");
+ snrText.Text = string.Empty;
+ snrText.Focus();
+ return;
+ }
+ }
+ else
+ {
+ table.GetSingleCell(targetCellInfo.Index).LightRed(true, out _);
+ MsgBoxHelper2.Error($"妫�鏌ヤ骇鍝佹潯鐮佸紓甯革細{msg}");
+ snrText.Text = string.Empty;
+ snrText.Focus();
+ return;
+ }
+
+ /// 妫�鏌ュ伐搴�
+ if (PNUtil.CheckIn(ViewControl.Logger, ParamSetting.MesAddress, stationName, snr, out bool needCheckIn, out msg))
+ {
+ if (needCheckIn != true)
+ {
+ table.GetSingleCell(targetCellInfo.Index).LightRed(true, out _);
+ MsgBoxHelper2.Error($"鏉$爜[{snr}]宸ュ簭涓嶅湪鏈珯锛歿msg}");
+ snrText.Text = string.Empty;
+ snrText.Focus();
+ return;
+ }
+ }
+ else
+ {
+ table.GetSingleCell(targetCellInfo.Index).LightRed(true, out _);
+ MsgBoxHelper2.Error($"鏉$爜[{snr}]CheckIn澶辫触锛歿msg}");
+ snrText.Text = string.Empty;
+ snrText.Focus();
+ return;
+ }
+ }
+ //var _ = ScannerParser.GetCellInfoByCode(this.model, this.columns, this.rows, snr);
+ //ToastHelper.Warning(this, "浜у搧鐮佹牸寮忓紓甯�");
+ //snrText.Text = string.Empty;
+ //snrText.Focus();
+ //return;
+ }
+ catch (Exception ex)
+ {
+ ViewControl.Logger.Error("Scanner Check Error.", ex);
+ MsgBoxHelper2.Error($"鎵爜妫�鏌ュ紓甯革細{ex.Message}");
+ return;
+ }
+
if (string.IsNullOrEmpty(position) || string.IsNullOrEmpty(snr))
{
- MessageBox.Show("璇疯緭鍏ュ偍浣嶆潯鐮佸拰浜у搧鏉$爜");
+ ToastHelper.Warning(this, this.lang("Tr.PleaseInputSnrs"));
return;
}
try
{
- FinishBarcode.Invoke(this, new BarcodeEventArg(title, position, snr));
- //positionText.Text = "";
- //snrText.Text = "";
+ SendCode(Tag.ToString(), position, snr);
+ positionText.Text = "";
+ snrText.Text = "";
positionText.Focus();
}
catch (Exception ex)
{
- MessageBox.Show(ex.Message);
+ ViewControl.Logger.Error("Con_Click Failed.", ex);
+ ToastHelper.Warning(this, ex.Message);
}
});
}
+ /// <summary>
+ /// 鍘熸潵鐨勫畬鎴愭壂鎻忛�昏緫
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
+ //private void Ok_Click(object sender, RoutedEventArgs e)
+ //{
+ // string position = positionText.Text, snr = snrText.Text;
+ // if (string.IsNullOrEmpty(position) || string.IsNullOrEmpty(snr))
+ // {
+ // ToastHelper.Warning(this, this.lang("Tr.PleaseInputSnrs"));
+ // return;
+ // }
+ // try
+ // {
+ // SendCode(Tag.ToString(), position, snr);
+ // this.Close();
+ // }
+ // catch (Exception ex)
+ // {
+ // ViewControl.Logger.Error("Con_Click Failed.", ex);
+ // ToastHelper.Warning(this, ex.Message);
+ // }
+ //}
+
private void Ok_Click(object sender, RoutedEventArgs e)
{
- string position = positionText.Text, snr = snrText.Text;
- if (string.IsNullOrEmpty(position) || string.IsNullOrEmpty(snr))
- {
- MessageBox.Show("璇疯緭鍏ュ偍浣嶆潯鐮佸拰浜у搧鏉$爜");
- return;
- }
- try
- {
- FinishBarcode.Invoke(this, new BarcodeEventArg(title, position, snr));
- this.Close();
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
+ ComplateClick?.Invoke(this, e);
+ this.Close();
}
private string ReadDataFrom(SerialPort sp)
@@ -177,7 +383,7 @@
{
byte[] buffer = new byte[sp.BytesToRead];
sp.Read(buffer, 0, buffer.Length);
- barcode += System.Text.Encoding.UTF8.GetString(buffer);
+ barcode += System.Text.Encoding.ASCII.GetString(buffer);
System.Threading.Thread.Sleep(50);
}
return barcode;
@@ -187,11 +393,77 @@
{
try
{
- serialPort.Close();
+ targetCellInfo = null;
+ serialPort.Dispose();
+ serialPort = null;
}
catch (Exception ex)
{
}
}
+
+ private void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
+ {
+ if (e.Key == Key.Enter)
+ {
+ //string barcode =
+ Dispatcher.Invoke(() =>
+ {
+ if (snrText.IsFocused)
+ {
+ Con_Click(null, null);
+ }
+ else
+ {
+ //if (ParamSetting.CustomerCode != "LIXUN")
+ //{
+ // snrText.Focus();
+ // return;
+ //}
+ string barcode = positionText.Text;
+ try
+ {
+ targetCellInfo = ScannerParser.GetCellInfoByCode(this.model, this.columns, this.rows, barcode);
+ if (!TestResultView.nameTables.ContainsKey(targetCellInfo.OvenName))
+ {
+ MsgBoxHelper2.Error($"鑰佸寲鐐� [{targetCellInfo.OvenName}] 涓嶅瓨鍦紝璇锋鏌ラ厤缃�");
+ positionText.Text = string.Empty;
+ positionText.Focus();
+ targetCellInfo = null;
+ return;
+ }
+
+ var sourceTable = TestResultView.tables[this.ovenIndex];
+ if (sourceTable.title != targetCellInfo.OvenName)
+ {
+ MsgBoxHelper2.Error($"璇峰垏鎹㈣嚦 [{targetCellInfo.OvenName}] 鍖烘壂鐮侊紝褰撳墠涓� [{sourceTable.title}] 鍖猴紒");
+ positionText.Text = string.Empty;
+ positionText.Focus();
+ targetCellInfo = null;
+ return;
+ }
+
+ var oven = TestResultView.nameTables[targetCellInfo.OvenName];
+ if (oven.cells.Length < targetCellInfo.Index + 1)
+ {
+ MsgBoxHelper2.Error($"绌翠綅鍙� [{barcode}] 瓒呭嚭绱㈠紩 {targetCellInfo.Index}");
+ positionText.Text = string.Empty;
+ positionText.Focus();
+ targetCellInfo = null;
+ return;
+ }
+ snrText.Focus();
+ }
+ catch (Exception ex)
+ {
+ positionText.Text = string.Empty;
+ positionText.Focus();
+ ViewControl.Logger.Error("Parse Position Code Error.", ex);
+ MsgBoxHelper2.Error($"绌翠綅鍙� [{barcode}] 瑙f瀽澶辫触: {ex.Message}");
+ }
+ }
+ });
+ }
+ }
}
}
--
Gitblit v1.9.1