Browse Source

优化 涂布出库分配AGV取货点

林豪 左 3 years ago
parent
commit
247dbaba9f

BIN
DLL/PLC.Siemens.dll


+ 80 - 0
Projects/永冠OPP/WCS.Service/Extensions/DeviceExtension.cs

@@ -148,6 +148,86 @@ namespace WCS.Service.Extensions
             return a.Count == 0 ? null : a;
         }
 
+        /// <summary>
+        /// 入库位置获取需要生产任务的设备及条码信息
+        /// </summary>
+        /// <returns></returns>
+        public List<FinishTaskList<string>> GetBcrValid()
+        {
+            var list = new List<FinishTaskList<string>>();
+
+            //获取需要执行的设备信息
+            foreach (var dev in Items)
+            {
+                if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
+                {
+                    InfoLog.INFO_INFO($"{dev.Entity.CODE}--没有光电");
+                    continue;
+                }
+                if (dev.Data2.Request != IstationRequest.扫码入库)
+                {
+                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电没有扫码入库请求--1", dev.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                    continue;
+                };
+                if (dev.Data2.Tasknum > 10000)
+                {
+                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电有请求,但已有任务号", dev.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                    continue;
+                }
+
+                var bcr = dev.Entity.BCR();
+                var barcode = bcr.Content.Trim('\r');
+                if (barcode == "")
+                {
+                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--扫码失败,内容为空", dev.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                    continue;
+                };
+
+                list.Add(new FinishTaskList<string>()
+                {
+                    FinishCode = barcode,
+                    Station = dev.Entity.Create<StationDevice>()
+                });
+            }
+            return list;
+        }
+
+        /// <summary>
+        /// 获取下一个地址的有效设备
+        /// </summary>
+        /// <returns></returns>
+        public List<FinishTaskList<string>> GetAddressValid()
+        {
+            var list = new List<FinishTaskList<string>>();
+
+            //获取需要执行的设备信息
+            foreach (var dev in Items)
+            {
+                if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
+                {
+                    InfoLog.INFO_INFO($"{dev.Entity.CODE}--没有光电");
+                    continue;
+                }
+                if (dev.Data2.Request != IstationRequest.请求分配目标地址)
+                {
+                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电没有分配目标地址请求--2", dev.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                    continue;
+                };
+                if (dev.Data2.Tasknum < 10000)
+                {
+                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电有请求没有任务号", dev.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                    continue;
+                }
+
+                list.Add(new FinishTaskList<string>()
+                {
+                    FinishCode = dev.Entity.CODE,
+                    Station = dev.Entity.Create<StationDevice>()
+                });
+            }
+            return list;
+        }
+
         /// <summary>
         ///
         /// </summary>

+ 56 - 0
Projects/永冠OPP/WCS.Service/Helpers/FinishTaskList.cs

@@ -0,0 +1,56 @@
+using System.Collections.Generic;
+using System.Linq;
+using WCS.Service.Entity;
+using WCS.Service.Extensions;
+
+namespace WCS.Service.Helpers
+{
+    /// <summary>
+    /// 处理完成任务记录集合
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    public class FinishTaskList<T>
+    {
+        /// <summary>
+        /// 完成
+        /// </summary>
+        public T FinishCode { get; set; }
+
+        /// <summary>
+        /// 对应设备信息
+        /// </summary>
+        public StationDevice Station { get; set; }
+    }
+
+    public static class FinishTaskListExtensions
+    {
+        /// <summary>
+        /// 入库可用任务数是否有效
+        /// </summary>
+        /// <param name="finishes"></param>
+        /// <exception cref="WarnException"></exception>
+        public static void Valid(this List<FinishTaskList<string>> finishes)
+        {
+            var maxGoodsnum = finishes.Select(v => v.Station.Data2.Goodsnum).OrderByDescending(v => v).FirstOrDefault();
+            if (finishes.Count != maxGoodsnum) throw new WarnException($"可用货物数{finishes.Count},实际货物数{maxGoodsnum}");
+            if (!finishes.Any()) throw new DoException("没有任务");
+        }
+
+        /// <summary>
+        /// 入库可用任务数是否有效
+        /// </summary>
+        /// <param name="finishes"></param>
+        /// <exception cref="WarnException"></exception>
+        public static List<I_WCS_GetInTaskResponseItem> GetWMSInTask(this List<FinishTaskList<string>> finishes)
+        {
+            if (!finishes.Any()) throw new DoException("没有任务");
+            var items = finishes.ToArray();
+            return items.Length switch
+            {
+                1 => WMS.I_WCS_GetInTask(items[0].FinishCode, items[0].Station.Entity.CODE),
+                2 => WMS.I_WCS_GetInTask(items[0].FinishCode, items[0].Station.Entity.CODE, items[1].FinishCode, items[1].Station.Entity.CODE),
+                _ => throw new WarnException($"一组任务数量最大为2,当前{items.Length}"),
+            };
+        }
+    }
+}

+ 13 - 1
Projects/永冠OPP/WCS.Service/Log/InfoLog.cs

@@ -1,6 +1,6 @@
 using Logs;
-using System;
 using System.Collections.Generic;
+using WCS.Entity;
 
 namespace WCS.Service.Log
 {
@@ -86,6 +86,18 @@ namespace WCS.Service.Log
             //Console.WriteLine(msg);
         }
 
+        /// <summary>
+        /// 系统执行警告 所有一直错误都归类为警告,存入数据库
+        /// </summary>
+        /// <param name="msg">错误内容</param>
+        /// <param name="code">设备</param>
+        /// <param name="type">错误类型</param>
+        public static void INFO_WarnDb(string msg, string code, WCS_EXCEPTIONTYPE type)
+        {
+            Log.Warn(msg, "INFO_WARN");
+            WCS.Service.Helpers.LogHelper.AddWCS_EXCEPTION(msg, code, type.ToString());
+        }
+
         /// <summary>
         /// 堆垛机写入记录
         /// </summary>

+ 19 - 37
Projects/永冠OPP/WCS.Service/Works/Station/一楼入库.cs

@@ -7,8 +7,8 @@ using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol;
 using WCS.Entity.Protocol.SRM;
-using WCS.Service.Entity;
 using WCS.Service.Extensions;
+using WCS.Service.Helpers;
 
 namespace WCS.Service.Works.Station
 {
@@ -29,42 +29,20 @@ namespace WCS.Service.Works.Station
                 if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
 
                 //成功创建的任务
-                var finishTaskList = new List<Tuple<int, StationDevice>>();
+                var finishTaskList = new List<FinishTaskList<int>>();
 
                 //创建对应的任务
                 DB.Do(db =>
                 {
-                    var devs = new List<Tuple<StationDevice, string>>();
-
-                    //获取需要执行的设备信息
-                    foreach (var dev in obj.Items)
-                    {
-                        if (dev.Data2.Request != IstationRequest.扫码入库) continue; //没有请求
-                        if (dev.Data2.Tasknum > 10000) continue; //没有任务号
-                        if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态)) continue; //没有光电
-
-                        var bcr = dev.Entity.BCR();
-                        var barcode = bcr.Content.Trim('\r');
-                        if (barcode == "") continue; //扫码失败
-                        devs.Add(new Tuple<StationDevice, string>(dev.Entity.Create<StationDevice>(), barcode));
-                    }
-
-                    if (!devs.Any()) return;
-                    var maxGoodsnum = devs.Select(v => v.Item1.Data2.Goodsnum).OrderByDescending(v => v).FirstOrDefault();
-                    if (devs.Count != maxGoodsnum) throw new WarnException($"可用货物数{devs.Count},实际货物数{maxGoodsnum}");
-                    var items = devs.ToArray();
-                    List<I_WCS_GetInTaskResponseItem> Infos = items.Length switch
-                    {
-                        1 => WMS.I_WCS_GetInTask(items[0].Item2, items[0].Item1.Entity.CODE),
-                        2 => WMS.I_WCS_GetInTask(items[0].Item2, items[0].Item1.Entity.CODE, items[1].Item2, items[1].Item1.Entity.CODE),
-                        _ => throw new WarnException($"一组任务数量最大为2,当前{items.Length}"),
-                    };
+                    var devs = obj.GetBcrValid();
+                    devs.Valid();
+                    var infos = devs.GetWMSInTask();
 
                     foreach (var item in devs)
                     {
-                        var dev = item.Item1;
+                        var dev = item.Station;
                         var next = dev.Entity.CODE == "1028" ? "1030" : "1031";
-                        var info = Infos.FirstOrDefault(v => item.Item2.Contains(v.ContainerCode));
+                        var info = infos.FirstOrDefault(v => item.FinishCode.Contains(v.ContainerCode));
                         if (db.Default.Set<WCS_TASK>().AsNoTracking().Any(v => v.BARCODE == info.ContainerCode && v.STATUS < TaskStatus.已完成 && v.TYPE == TaskType.入库))
                             throw new WarnException($"生产条码{info.ContainerCode}存在未完成任务,请检查是否为标签卡重复使用");
 
@@ -83,7 +61,11 @@ namespace WCS.Service.Works.Station
                         task.HEIGHT = dev.Data2.GoodsSize;
 
                         db.Default.Set<WCS_TASK>().Add(task);
-                        finishTaskList.Add(new Tuple<int, StationDevice>(task.WMSTASK, dev.Entity.Create<StationDevice>()));
+                        finishTaskList.Add(new FinishTaskList<int>()
+                        {
+                            FinishCode = task.WMSTASK,
+                            Station = item.Station
+                        });
 
                         var msg = $"下达从{dev.Entity.CODE}移动至{next}的PLC指令。";
                         msg += $"[{dev.Data.Tasknum}][{dev.Data.Goodsstart}][{dev.Data.Goodsend}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
@@ -98,15 +80,15 @@ namespace WCS.Service.Works.Station
                 {
                     foreach (var finishTask in finishTaskList)
                     {
-                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.WMSTASK == finishTask.Item1);
+                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.WMSTASK == finishTask.FinishCode);
                         if (task == null) continue;
 
-                        finishTask.Item2.Data.Tasknum = task.ID;
-                        finishTask.Item2.Data.Goodsstart = task.ADDRFROM.ToShort();
-                        finishTask.Item2.Data.Goodsend = task.ADDRNEXT.ToShort();
-                        finishTask.Item2.Data.Goodsnum = (short)finishTaskList.Count;
-                        finishTask.Item2.Data.CmdType = IstationCmdType.扫码入库;
-                        finishTask.Item2.Data.VoucherNo++;
+                        finishTask.Station.Data.Tasknum = task.ID;
+                        finishTask.Station.Data.Goodsstart = task.ADDRFROM.ToShort();
+                        finishTask.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
+                        finishTask.Station.Data.Goodsnum = (short)finishTaskList.Count;
+                        finishTask.Station.Data.CmdType = IstationCmdType.扫码入库;
+                        finishTask.Station.Data.VoucherNo++;
                     }
                 });
             });

+ 16 - 37
Projects/永冠OPP/WCS.Service/Works/Station/涂布入库.cs

@@ -7,9 +7,9 @@ using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol;
 using WCS.Entity.Protocol.SRM;
-using WCS.Service.Entity;
 using WCS.Service.Extensions;
 using WCS.Service.Handlers;
+using WCS.Service.Helpers;
 
 namespace WCS.Service.Works.Station
 {
@@ -160,37 +160,16 @@ namespace WCS.Service.Works.Station
                 if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.低位))) throw new DoException("不在低位");
 
                 //成功创建的任务
-                var finishTaskList = new List<Tuple<int, StationDevice>>();
+                var finishTaskList = new List<FinishTaskList<int>>();
 
                 //创建对应的任务
                 DB.Do(db =>
                 {
-                    var devs = new List<Tuple<StationDevice, string>>();
-
-                    //获取需要执行的设备信息
-                    foreach (var dev in obj.Items)
-                    {
-                        if (dev.Data2.Request != IstationRequest.扫码入库) continue; //没有请求
-                        if (dev.Data2.Tasknum > 10000) continue; //没有任务号
-                        if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态)) continue; //没有光电
-
-                        var bcr = dev.Entity.BCR();
-                        var barcode = bcr.Content.Trim('\r');
-                        if (barcode == "") continue; //扫码失败
-                        devs.Add(new Tuple<StationDevice, string>(dev.Entity.Create<StationDevice>(), barcode));
-                    }
+                    var devs = obj.GetBcrValid();
+                    devs.Valid();
+                    var infos = devs.GetWMSInTask();
 
-                    if (!devs.Any()) return;
-                    var items = devs.ToArray();
-                    var maxGoodsnum = devs.Select(v => v.Item1.Data2.Goodsnum).OrderByDescending(v => v).FirstOrDefault();
-                    if (devs.Count != maxGoodsnum) throw new WarnException($"可用货物数{devs.Count},实际货物数{maxGoodsnum}");
-                    List<I_WCS_GetInTaskResponseItem> Infos = items.Length switch
-                    {
-                        1 => WMS.I_WCS_GetInTask(items[0].Item2, items[0].Item1.Entity.CODE),
-                        2 => WMS.I_WCS_GetInTask(items[0].Item2, items[0].Item1.Entity.CODE, items[1].Item2, items[1].Item1.Entity.CODE),
-                        _ => throw new WarnException($"一组任务数量最大为2,当前{items.Length}"),
-                    };
-                    var agvTask = db.Default.Set<WCS_AGVTask>().Where(v => v.ID == items[0].Item1.Data.Goodscode).FirstOrDefault() ?? throw new WarnException("无完成AGV任务");
+                    var agvTask = db.Default.Set<WCS_AGVTask>().Where(v => v.ID == devs[0].Station.Data.Goodscode).FirstOrDefault() ?? throw new WarnException("无完成AGV任务");
 
                     if (agvTask.Status != AGVTaskStatus.完成扫码)
                     {
@@ -200,9 +179,9 @@ namespace WCS.Service.Works.Station
 
                     foreach (var item in devs)
                     {
-                        var dev = item.Item1;
+                        var dev = item.Station;
                         var next = dev.Entity.GetPath("SRM");
-                        var info = Infos.FirstOrDefault(v => item.Item2.Contains(v.ContainerCode));
+                        var info = infos.FirstOrDefault(v => item.FinishCode.Contains(v.ContainerCode));
                         if (db.Default.Set<WCS_TASK>().AsNoTracking().Any(v => v.BARCODE == info.ContainerCode && v.STATUS < TaskStatus.已完成 && v.TYPE == TaskType.入库))
                             throw new WarnException($"生产条码{info.ContainerCode}存在未完成任务,请检查是否为标签卡重复使用");
 
@@ -222,7 +201,7 @@ namespace WCS.Service.Works.Station
                         task.AgvTask = agvTask.ID;
 
                         db.Default.Set<WCS_TASK>().Add(task);
-                        finishTaskList.Add(new Tuple<int, StationDevice>(task.WMSTASK, dev.Entity.Create<StationDevice>()));
+                        finishTaskList.Add(new FinishTaskList<int> { FinishCode = task.WMSTASK, Station = item.Station });
 
                         var msg = $"下达从{dev.Entity.CODE}移动至{next}的PLC指令。";
                         msg += $"[{dev.Data.Tasknum}][{dev.Data.Goodsstart}][{dev.Data.Goodsend}][{dev.Data.VoucherNo}[{dev.Data2.VoucherNo}]";
@@ -237,15 +216,15 @@ namespace WCS.Service.Works.Station
                 {
                     foreach (var finishTask in finishTaskList)
                     {
-                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.WMSTASK == finishTask.Item1);
+                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.WMSTASK == finishTask.FinishCode);
                         if (task == null) continue;
 
-                        finishTask.Item2.Data.Tasknum = task.ID;
-                        finishTask.Item2.Data.Goodsstart = task.ADDRFROM.ToShort();
-                        finishTask.Item2.Data.Goodsend = task.ADDRNEXT.ToShort();
-                        finishTask.Item2.Data.Goodsnum = (short)finishTaskList.Count;
-                        finishTask.Item2.Data.CmdType = IstationCmdType.扫码入库;
-                        finishTask.Item2.Data.VoucherNo++;
+                        finishTask.Station.Data.Tasknum = task.ID;
+                        finishTask.Station.Data.Goodsstart = task.ADDRFROM.ToShort();
+                        finishTask.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
+                        finishTask.Station.Data.Goodsnum = (short)finishTaskList.Count;
+                        finishTask.Station.Data.CmdType = IstationCmdType.扫码入库;
+                        finishTask.Station.Data.VoucherNo++;
                     }
                 });
             });

+ 94 - 33
Projects/永冠OPP/WCS.Service/Works/Station/涂布出库.cs

@@ -8,6 +8,8 @@ using WCS.Entity;
 using WCS.Entity.Protocol;
 using WCS.Service.Extensions;
 using WCS.Service.Handlers;
+using WCS.Service.Helpers;
+using WCS.Service.Log;
 
 namespace WCS.Service.Works.Station
 {
@@ -105,57 +107,116 @@ namespace WCS.Service.Works.Station
     /// 涂布出库分配AGV取货点
     /// </summary>
     [WorkTitle(typeof(CoatingHandler), "涂布出库分配AGV取货点")]
-    public class 涂布出库分配AGV取货点 : DeviceWork<StationDevice>
+    public class 涂布出库分配AGV取货点 : Work<StationDeviceGroup>
     {
-        protected override void Do(StationDevice obj)
+        protected override void Do(StationDeviceGroup obj)
         {
             obj.EX(obj =>
             {
-                if (!obj.Data2.Status.HasFlag(IstationStatus.光电状态)) throw new DoException("无光电");
-                if (obj.Data3.Status.HasFlag(StationStatus.运行状态位)) throw new DoException("设备运行中");
-                if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
-                    throw new WarnException($"等待任务[{obj.Data2.Tasknum}]执行--凭证号不一致[{obj.Data.VoucherNo}][{obj.Data2.VoucherNo}]");
-                if (obj.Data2.Tasknum < 10000) throw new DoException("无任务");
-                if (obj.Data2.Request != IstationRequest.请求分配目标地址) throw new WarnException("有任务无请求");
+                //必须满足的条件
+                if (obj.Items.Any(v => v.Data2.VoucherNo != v.Data.VoucherNo)) throw new WarnException("凭证号不一致");
+                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位)))
+                {
+                    InfoLog.INFO_INFO("设备运行中");
+                    return;
+                }
+
+                //成功处理的任务
+                var finishTaskList = new List<FinishTaskList<int>>();
 
                 DB.Do(db =>
                 {
-                    var task = db.Default.Set<WCS_TASK>().Find(obj.Data2.Tasknum);
-                    if (task == null) throw new WarnException("WCS无该任务信息");
-                    var addNext = "";
-                    if (obj.Entity.CODE == "1340")
+                    var devs = new List<FinishTaskList<string>>();
+
+                    //获取需要执行的设备信息
+                    foreach (var dev in obj.Items)
                     {
-                        var Station1343 = Device.Find("1343").Create<StationDevice>();
-                        addNext = "1343";
-                        if (!Station1343.Data3.Status.HasFlag(StationStatus.自动) || Station1343.Data2.Tasknum > 10000)
-                            addNext = "1340";
+                        if (!dev.Data3.Status.HasFlag(StationStatus.低位))
+                        {
+                            InfoLog.INFO_INFO($"{dev.Entity.CODE}--不在低位");
+                            continue;
+                        }
+                        if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
+                        {
+                            InfoLog.INFO_INFO($"{dev.Entity.CODE}--没有光电");
+                            continue;
+                        }
+                        if (dev.Data2.Request != IstationRequest.请求分配目标地址)
+                        {
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电没有分配目标地址请求--2", dev.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            continue;
+                        };
+                        if (dev.Data2.Tasknum < 10000)
+                        {
+                            InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电有请求没有任务号", dev.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                            continue;
+                        }
+
+                        devs.Add(new FinishTaskList<string>()
+                        {
+                            FinishCode = dev.Entity.CODE,
+                            Station = dev.Entity.Create<StationDevice>()
+                        });
                     }
-                    else if (obj.Entity.CODE == "1341")
+
+                    if (!devs.Any()) return; //无可执行任务
+                    //验证可执行任务数与有效任务数是否一致
+                    var taskIds = devs.Select(dev => dev.Station.Data2.Tasknum).ToList();
+                    var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID)).ToList();
+
+                    taskList.ValidTaskCheck(devs.Count, db);
+
+                    //开始处理需要分配目标地址的设备
+                    foreach (var dev in devs)
                     {
-                        var Station1344 = Device.Find("1344").Create<StationDevice>();
-                        addNext = "1344";
-                        if (!Station1344.Data3.Status.HasFlag(StationStatus.自动) || Station1344.Data2.Tasknum > 10000)
-                            addNext = "1341";
+                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Station.Data2.Tasknum) ?? throw new WarnException($"WCS无[{dev.Station.Data2.Tasknum}]任务信息");
+                        var addNext = "";
+                        if (obj.Entity.CODE == "1340")
+                        {
+                            var Station1343 = Device.Find("1343").Create<StationDevice>();
+                            addNext = "1343";
+                            if (!Station1343.Data3.Status.HasFlag(StationStatus.自动) || Station1343.Data2.Tasknum > 10000)
+                                addNext = "1340";
+                        }
+                        else if (obj.Entity.CODE == "1341")
+                        {
+                            var Station1344 = Device.Find("1344").Create<StationDevice>();
+                            addNext = "1344";
+                            if (!Station1344.Data3.Status.HasFlag(StationStatus.自动) || Station1344.Data2.Tasknum > 10000)
+                                addNext = "1341";
+                        }
+
+                        task.ADDRNEXT = addNext;
+                        task.CreateStatusLog(db, $"状态由[{WCS.Entity.TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
+                        finishTaskList.Add(new FinishTaskList<int>()
+                        {
+                            FinishCode = task.ID,
+                            Station = dev.Station
+                        });
                     }
-
-                    //全部统一分配目标地址至
-                    task.ADDRNEXT = addNext;
                     db.Default.SaveChanges();
-                    task.CreateStatusLog(db, $"状态由[{WCS.Entity.TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
-                    //开始写入目标地址
-                    obj.Data.Tasknum = task.ID;
-                    obj.Data.Goodsstart = obj.Entity.CODE.ToShort();
-                    obj.Data.Goodsend = task.ADDRNEXT.ToShort();
-                    obj.Data.GoodsSize = (short)task.Length;
-                    obj.Data.CmdType = IstationCmdType.分配目标地址;
-                    obj.Data.VoucherNo++;
+                });
+
+                DB.Do(db =>
+                {
+                    foreach (var finish in finishTaskList)
+                    {
+                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == finish.FinishCode) ?? throw new WarnException($"已完成DB任务变更,但写入PLC信息是找不到任务{finish.FinishCode}");
+
+                        finish.Station.Data.Tasknum = task.ID;
+                        finish.Station.Data.Goodsstart = finish.Station.Entity.CODE.ToShort();
+                        finish.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
+                        finish.Station.Data.GoodsSize = (short)task.Length;
+                        finish.Station.Data.CmdType = IstationCmdType.分配目标地址;
+                        finish.Station.Data.VoucherNo++;
+                    }
                 });
             });
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return dev.CODE == "1340" || dev.CODE == "1341";
+            return dev.CODE == "G1340";
         }
     }