using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using LB_VisionProcesses.BarcodeReaders; namespace LB_VisionProcesses.Processes { public class BarcodeReaderProcess : IProcess { /// /// 读码器实例集合 (由主程序管理并传入) /// [JsonIgnore] public ConcurrentDictionary dicBarcodeReaders { get; set; } /// /// 当前关联的读码器 /// [JsonIgnore] public BarcodeReaderBase Reader { get; set; } public BarcodeReaderProcess() { strProcessName = "读码工具"; strProcessClass = "LB_VisionProcesses.Processes.BarcodeReaderProcess"; Params.Inputs.Add("设备品牌", "Huayray"); Params.Inputs.Add("设备SN", ""); Params.Inputs.Add("触发模式", "软触发"); Params.Inputs.Add("超时时间", 2000); Params.Outputs.Add("条码结果", ""); Params.Outputs.Add("码数量", 0); } public override void InitRunParams() { Result = true; Msg = "准备运行"; bCompleted = false; } public override bool Run() { DateTime StartTime = DateTime.Now; try { InitRunParams(); string sn = Params.Inputs["设备SN"]?.ToString(); if (string.IsNullOrEmpty(sn)) { Msg = "设备SN未配置"; Result = false; return false; } // 从全局变量或传入字典获取 if (dicBarcodeReaders == null) { // 尝试从全局 dicGlobalVars 获取 (假设主程序已放入) if (dicGlobalVars.ContainsKey("dicBarcodeReaders")) { dicBarcodeReaders = dicGlobalVars["dicBarcodeReaders"] as ConcurrentDictionary; } } if (dicBarcodeReaders != null && dicBarcodeReaders.ContainsKey(sn)) { Reader = dicBarcodeReaders[sn]; } if (Reader == null) { Msg = $"读码器[{sn}]未初始化"; Result = false; return false; } string triggerMode = Params.Inputs["触发模式"]?.ToString(); if (triggerMode == "软触发") { bool success = Reader.SoftTrigger(); Msg = success ? "触发成功" : "触发失败"; Result = success; } } catch (Exception ex) { Msg = "运行异常: " + ex.Message; Result = false; } finally { RunTime = (DateTime.Now - StartTime).TotalMilliseconds; bCompleted = true; } return Result; } public override bool Load(string fullPath) { try { if (string.IsNullOrEmpty(fullPath) || !File.Exists(fullPath)) return false; string json = File.ReadAllText(fullPath, Encoding.UTF8); Params = JsonConvert.DeserializeObject(json); Params?.FixDeserializedData(); return true; } catch { return false; } } public override bool Save(string filePath) { try { if (string.IsNullOrEmpty(filePath)) return false; if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath); string fullPath = Path.Combine(filePath, strProcessName + ".json"); string json = JsonConvert.SerializeObject(Params, Formatting.Indented); File.WriteAllText(fullPath, json, Encoding.UTF8); return true; } catch { return false; } } public override object Clone() { try { var obj = (BarcodeReaderProcess)MemberwiseClone(); string json = JsonConvert.SerializeObject(this.Params); obj.Params = JsonConvert.DeserializeObject(json); return obj; } catch { return (BarcodeReaderProcess)MemberwiseClone(); } } public override void Dispose() { } } }