From e25d344f8afb1a492232c11ca6050fa532844d29 Mon Sep 17 00:00:00 2001 From: Tyrone CT Date: Tue, 2 Dec 2025 17:27:09 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8D=95=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FATrace.Model/DownloadTask.cs | 30 +++++++---- FATrace.Model/OEMRawUse.cs | 9 +++- FATrace.Model/TaskStatus.cs | 10 ++-- FATrace.OEMApp/App.config | 4 +- FATrace.OEMApp/MainApp.cs | 29 +++++++++++ FATrace.OEMApp/Services/DownloadTaskWorker.cs | 10 ++-- FATrace.OEMApp/Services/PLCDataService.cs | 50 +++++++++++++++++-- 7 files changed, 116 insertions(+), 26 deletions(-) diff --git a/FATrace.Model/DownloadTask.cs b/FATrace.Model/DownloadTask.cs index b9938f0..b94e7c6 100644 --- a/FATrace.Model/DownloadTask.cs +++ b/FATrace.Model/DownloadTask.cs @@ -16,37 +16,44 @@ namespace FATrace.Model public long Id { get; set; } /// - /// 业务条码/编号(用于与 OEMRawUse/VideoAction 关联)。 + /// 业务条码/编号 + /// 内袋二维码 /// [Column(StringLength = 100, IsNullable = false)] public string? Code { get; set; } /// - /// 原料名称。 + /// 原料名称 /// [Column(StringLength = 100, IsNullable = false)] public string? RawName { get; set; } /// - /// 操作用户标识。 + /// 原料条码 + /// + [Column(StringLength = 100, IsNullable = false)] + public string? RawCode { get; set; } + + /// + /// 操作用户标识 /// [Column(StringLength = 100, IsNullable = false)] public string? User { get; set; } /// - /// 任务状态:Pending/Running/Completed/Failed/Canceled。 + /// 任务状态:Pending/Running/Completed/Failed/Canceled /// [Column(IsNullable = false)] public TaskStatus Status { get; set; } = TaskStatus.Pending; /// - /// 下载进度 0-100。 + /// 下载进度 0-100 /// [Column(IsNullable = false)] public short Progress { get; set; } = 0; /// - /// 目标视频保存路径(生成的本地文件全路径)。 + /// 目标视频保存路径(生成的本地文件全路径) /// [Column(StringLength = 200)] public string? VideoFilePath { get; set; } @@ -58,33 +65,34 @@ namespace FATrace.Model public string? Error { get; set; } /// - /// 已尝试次数(每次 Running 前加一)。 + /// 已尝试次数(每次 Running 前加一) /// [Column(IsNullable = false)] public int TryCount { get; set; } = 0; /// - /// NVR 下载的开始时间(默认当前时间 - 5 分钟)。 + /// NVR 下载的开始时间(默认当前时间 - 30秒) /// [Column(IsNullable = false)] public DateTime NvrStartTime { get; set; } /// - /// NVR 下载的结束时间(默认当前时间)。 + /// NVR 下载的结束时间(默认当前时间) /// [Column(IsNullable = false)] public DateTime NvrEndTime { get; set; } /// - /// 创建时间。 + /// 创建时间 /// [Column(ServerTime = DateTimeKind.Local, CanUpdate = true)] public DateTime CreateTime { get; set; } /// - /// 最近一次更新时间。 + /// 最近一次更新时间 /// [Column(ServerTime = DateTimeKind.Local, CanUpdate = true)] public DateTime UpdateTime { get; set; } + } } diff --git a/FATrace.Model/OEMRawUse.cs b/FATrace.Model/OEMRawUse.cs index 1661b66..f4ef48d 100644 --- a/FATrace.Model/OEMRawUse.cs +++ b/FATrace.Model/OEMRawUse.cs @@ -26,10 +26,16 @@ namespace FATrace.Model [Column(Name = "RawName", IsNullable = false, StringLength = 100)] public string? RawName{ get; set; } + /// + /// 原料条码 + /// + [Column(StringLength = 100, IsNullable = false)] + public string? RawCode { get; set; } + /// /// 视频链接 /// - [Column(Name = "VideoUrl", IsNullable = false, StringLength = 256)] + [Column(Name = "VideoUrl", IsNullable = false, StringLength = 500)] public string? VideoUrl{ get; set; } /// @@ -60,6 +66,7 @@ namespace FATrace.Model /// ///////////////////////////////////////////导航属性 LIN 一对一/////////////////////////////////////////////////////// /// public long VideoActionId { get; set; } // 外键字段,必要 + /// /// 视频信息 /// diff --git a/FATrace.Model/TaskStatus.cs b/FATrace.Model/TaskStatus.cs index 892f894..c7a43a1 100644 --- a/FATrace.Model/TaskStatus.cs +++ b/FATrace.Model/TaskStatus.cs @@ -8,27 +8,27 @@ namespace FATrace.Model public enum TaskStatus { /// - /// 待处理(已入队但尚未开始)。 + /// 待处理(已入队但尚未开始) /// Pending = 0, /// - /// 运行中(正在处理)。 + /// 运行中(正在处理) /// Running = 1, /// - /// 已完成(处理成功)。 + /// 已完成(处理成功) /// Completed = 2, /// - /// 失败(处理过程中出现错误)。 + /// 失败(处理过程中出现错误) /// Failed = 3, /// - /// 已取消(由用户或系统取消处理)。 + /// 已取消(由用户或系统取消处理) /// Canceled = 4 } diff --git a/FATrace.OEMApp/App.config b/FATrace.OEMApp/App.config index 76d75c6..be2ccbf 100644 --- a/FATrace.OEMApp/App.config +++ b/FATrace.OEMApp/App.config @@ -8,6 +8,8 @@ + + @@ -22,5 +24,5 @@ - + \ No newline at end of file diff --git a/FATrace.OEMApp/MainApp.cs b/FATrace.OEMApp/MainApp.cs index db7ba5f..04c2fec 100644 --- a/FATrace.OEMApp/MainApp.cs +++ b/FATrace.OEMApp/MainApp.cs @@ -42,6 +42,11 @@ namespace FATrace.OEMApp InitializeComponent(); } + /// + /// PLC数据服务 + /// + private PLCDataService PLCDataService { get; set; } + /// /// 主窗体加载: /// - 初始化海康客户端与基础配置(日志目录与保存路径) @@ -61,6 +66,10 @@ namespace FATrace.OEMApp //HkCameraClient.NVR_Port = ConfigHelper.GetValue("NVRPort"); //HkCameraClient.NVR_UserName = ConfigHelper.GetValue("NVRUserName"); + PLCDataService = new PLCDataService(); + PLCDataService.PlcConnectedEventHandler += PLCDataService_PlcConnectedEventHandler; + PLCDataService.ScanCodeEventHandler += PLCDataService_ScanCodeEventHandler; + HkCameraClient.NVRVideoSavePath = ConfigHelper.GetValue("NVRVideoSavePath"); //NVR登录 NVRLogin(); @@ -109,6 +118,26 @@ namespace FATrace.OEMApp } } + /// + /// PLC数据服务:扫描条码 + /// + /// + /// + private void PLCDataService_ScanCodeEventHandler(object? sender, string Code) + { + + } + + /// + /// PLC数据服务:PLC连接 + /// + /// + /// + private void PLCDataService_PlcConnectedEventHandler(object? sender, string e) + { + + } + private void NVRLogin() { HkCameraClient.NVR_IP = ConfigHelper.GetValue("NVRIP"); diff --git a/FATrace.OEMApp/Services/DownloadTaskWorker.cs b/FATrace.OEMApp/Services/DownloadTaskWorker.cs index da5b169..2256086 100644 --- a/FATrace.OEMApp/Services/DownloadTaskWorker.cs +++ b/FATrace.OEMApp/Services/DownloadTaskWorker.cs @@ -62,11 +62,12 @@ namespace FATrace.OEMApp.Services var maxRetry = ConfigHelper.GetIntOrDefault("DownloadTaskMaxRetry", 3); db.Update() .Set(a => a.Status, TaskStatus.Pending) - .Set(a => a.Error, null) + .Set(a => a.Error, "") .Set(a => a.Progress, 0) .Set(a => a.UpdateTime, DateTime.Now) .Where(a => a.Status == TaskStatus.Failed && a.TryCount < maxRetry) .ExecuteAffrows(); + } catch { } _cts = new CancellationTokenSource(); @@ -125,9 +126,9 @@ namespace FATrace.OEMApp.Services } /// - /// 后台主循环:定期拉取最早的 Pending 任务并顺序处理。 + /// 后台主循环:定期拉取最早的 Pending 任务并顺序处理 /// - /// 取消令牌。 + /// 取消令牌 private async Task RunAsync(CancellationToken token) { while (!token.IsCancellationRequested) @@ -211,8 +212,9 @@ namespace FATrace.OEMApp.Services .ExecuteAffrowsAsync(); // 事件 -> TCS - // 订阅两个事件:进度与完成。进度事件写回数据库;完成事件用于唤醒等待。 + // 订阅两个事件:进度与完成。进度事件写回数据库;完成事件用于唤醒等待 var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + void OnProgress(object? s, short p) { try diff --git a/FATrace.OEMApp/Services/PLCDataService.cs b/FATrace.OEMApp/Services/PLCDataService.cs index bf40bd8..a99c0d8 100644 --- a/FATrace.OEMApp/Services/PLCDataService.cs +++ b/FATrace.OEMApp/Services/PLCDataService.cs @@ -19,12 +19,17 @@ namespace FATrace.OEMApp.Services public PLCDataService() { - - PLCLinkInitial(); StartPlcScan(); + + PadCodeAddress= ConfigHelper.GetStringOrDefault("PDAScanCode", "D1050"); } + /// + /// PAD地址 + /// + private string PadCodeAddress { get; set; } + /// /// 扫码事件 /// @@ -53,11 +58,11 @@ namespace FATrace.OEMApp.Services { if (value) { - PlcConnectedEventHandler.Invoke(this, "OK"); + if (PlcConnectedEventHandler != null) PlcConnectedEventHandler.Invoke(this, "OK"); } else { - PlcConnectedEventHandler.Invoke(this, "NG"); + if (PlcConnectedEventHandler != null) PlcConnectedEventHandler.Invoke(this, "NG"); } _PlcConnected = value; } @@ -65,6 +70,37 @@ namespace FATrace.OEMApp.Services } + private string _ScanCode = string.Empty; + /// + /// 扫描结果 + /// + public string ScanCode + { + get { return _ScanCode; } + set + { + if (_ScanCode != value) + { + if (!string.IsNullOrEmpty(value)) + { + if (ScanCodeEventHandler != null) ScanCodeEventHandler.Invoke(this, value); + } + else + { + Logger.Error($"PLC条码数据为空: 数据改变但是数据为空"); + } + + _ScanCode = value; + } + + } + } + + /// + /// 扫描结果 + /// + private OperateResult OperateResultPDAScanCode { get; set; } + // 扫描控制 private CancellationTokenSource? _plcScanCts; private Task? _plcScanTask; @@ -175,6 +211,12 @@ namespace FATrace.OEMApp.Services PLCLinkInitial(); } + //内包扫码 + OperateResultPDAScanCode = KeyencePlcMcNet!.ReadString(PadCodeAddress, 40); + if (OperateResultPDAScanCode.IsSuccess) + { + ScanCode = RevData(OperateResultPDAScanCode.Content).Replace("\r", "").Replace("\n", "").Trim(); + } } catch (OperationCanceledException) {