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)
{