IPC-610
2025-01-07 7d9d48cf1e9d5b28e59ea52a0ee1acdfd15f88e7
问题修改
6个文件已修改
807 ■■■■■ 已修改文件
Admin.NET/WCS.Application/Model/TaskRequest.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/OpenApi/DemoOpenApi.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCService.cs 622 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCTaskAction.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCUtil.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Util/HttpService.cs 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Model/TaskRequest.cs
@@ -464,4 +464,60 @@
    /// </summary>
    public string Message { get; set; }
}
public class IsBaleModel2
{
    /// <summary>
    /// 状态码 0成功  -1:失败
    /// </summary>
    public int Success { get; set; }
    /// <summary>
    /// 提示信息
    /// </summary>
    public string Message { get; set; }
}
public class RequestBoxInfoCheckAll
{
    public string Success { get; set; }
    public string Message { get; set; }
    public List<RequestBoxInfoCheck> list { get; set; }
}
public class RequestBoxInfoCheck
{
    /// <summary>
    /// 托盘号
    /// </summary>
    public string PalletNo { get; set; }
    /// <summary>
    /// 任务号
    /// </summary>
    public string TaskNo { get; set; }
    /// <summary>
    /// 订单号
    /// </summary>
    public string OrderNo { get; set; }
    /// <summary>
    /// 物料编码
    /// </summary>
    public string SkuNo { get; set; }
    /// <summary>
    /// 物料名称
    /// </summary>
    public string SkuName { get; set; }
    /// <summary>
    /// 批次
    /// </summary>
    public string LotNo { get; set; }
    /// <summary>
    /// 规格
    /// </summary>
    public string Standard { get; set; }
    /// <summary>
    /// 拆箱数量
    /// </summary>
    public int? Qty { get; set; }
    /// <summary>
    /// 托盘上总箱数
    /// </summary>
    public int? QtyCount { get; set; }
}
Admin.NET/WCS.Application/OpenApi/DemoOpenApi.cs
@@ -145,7 +145,7 @@
    }
    /// <summary>
    /// WCS接收WMS下发的入库单任务
    /// WCS接收WMS下发的出入库单任务
    /// </summary>
    /// <param name="models"></param>
    /// <returns></returns>
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -47,7 +47,7 @@
                    BoxConveyorLine(mod);                             // 码垛机器人
                    break;
                case PLCTypeEnum.StackingRobot:
                    PalletMachine(mod);
                    StackingRobot(mod);                           //拆垛机器人
                    break;
                default:
                    break;
@@ -1049,14 +1049,14 @@
                            //判断是否裹包
                            var gbPos = modDevice.listStation.FirstOrDefault(s => s.Text == "Element_1");
                            strMsg = new HttpService().RequestPackWcs(palletVal);
                            if (IsBale == "1")
                            if (strMsg == "1")
                            {
                                //写入裹包指令
                                ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, gbPos.PlcPos, "2");
                                ret = plcConn.SetPlcDBValue(gbPos.PosType, modDevice.DbNumber, gbPos.PlcPos, "2");
                            }
                            else
                            {
                                ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, gbPos.PlcPos, "1");
                                ret = plcConn.SetPlcDBValue(gbPos.PosType, modDevice.DbNumber, gbPos.PlcPos, "1");
                            }
                            // 通知任务界面任务已存在更新 请更新界面
@@ -1648,17 +1648,18 @@
            #endregion
            case "10":
                {
                    #region 缠膜完成 11
                    #region 缠膜完成
                    // 获取工位托盘码信息
                    var strMsg = "";
                    var http = new HttpService();
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                    //向WMS反馈托盘缠膜完成
                    strMsg = http.RequestPackedWcs(palletVal);
                    if (!strMsg.Contains("-1"))
                    {
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "11");
                        var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "11");//收到缠膜完成11
                        if (ret.IsSucceed)
                        {
                            // 插入任务明细 
@@ -1684,12 +1685,25 @@
                break;
            case "20":
                {
                    #region 是否拆膜    21:否 22:是 //23:人工拆
                    #region 是否拆膜    21:否 22:是
                    // 获取工位托盘码信息
                    var strMsg = "";
                    var http = new HttpService();
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                    // 获取托盘任务号
                    var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号");
                    var (res1, val) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos);
                    // 根据任务号获取任务信息,目的工位是009的再向WMS发出拆膜申请
                    if (res1.IsSucceed)
                    {
                        string tasknoVal = val.ToString();
                        var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.EndLocate == "009" && m.IsDelete == false);
                        if (modTask == null)
                        {
                            break;
                        }
                    }
                    strMsg = http.RequestUnPackWcs(palletVal);
                    if (!strMsg.Contains("-1"))
@@ -1786,7 +1800,7 @@
    {
        var plcConn = modDevice.PLCUtil;
        if (modDevice.DbNumber == "DB101")
        if (modDevice.DbNumber == "DB101" && modDevice.DbNumber == "DB102")
        {
            // 主扫交互流程
            switch (modDevice.Value.ToString())
@@ -1883,6 +1897,16 @@
                                        var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                        if (retVal.IsSucceed)
                                        {
                                            if (modDevice.DbNumber == "DB102")//1L拆跺分拣后需要回传箱码
                                            {
                                                var http = new HttpService();
                                                IsBaleModel2 ret1 = http.RequestBoxno(boxNoVal);
                                                if (ret1.Success == -1)
                                                {
                                                    Log.Error("箱码分拣回传失败,需要手动拣货。失败箱码:"+boxNoVal);
                                                    break;
                                                }
                                            }
                                            break;
                                        }
                                    }
@@ -1893,7 +1917,7 @@
                    break;
                default: break;
            }
        }
        }
        else  
        {
            // 插码交互
@@ -2226,461 +2250,66 @@
                    var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "20");
                    if (ret.IsSucceed)
                    {
                        //获取托盘码
                        var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                        var (res, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos);
                        //根据托盘号判断当前任务表中是否有此任务,任务由WMS出库时下发
                        string palletno = Convert.ToString(palletVal);
                        var taskInfo = _db.Queryable<WcsTask>().First(w => w.PalletNo == palletno && w.Status == TaskStatusEnum.Doing);
                        if (taskInfo == null)
                        // 获取托盘任务号
                        var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号");
                        var (res1, val) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos);
                        string tasknoVal = val.ToString();
                        // 根据任务号获取任务信息
                        if (res1.IsSucceed)
                        {
                            Log.Error(string.Format($"出库任务未下发,请人工处理,无法拆垛!"));
                            break;
                            var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.EndLocate == "009" && m.IsDelete == false);
                            if (modTask == null)
                            {
                                Log.Error(string.Format($"出库任务未下发,请人工处理,无法拆垛!"));
                                break;
                            }
                            //通过任务号和托盘号向WMS申请此托盘的拆垛信息
                            var http = new HttpService();
                            RequestBoxInfoCheckAll tasklist = http.RequestBoxCheckinfo(palletVal, tasknoVal);
                            if (!tasklist.Success.Contains("-1"))
                            {
                                //获取拆垛物料品种(需要增加物料判断,同一个物料号可能会出现不同的码垛规则)
                                var pz = _db.Queryable<WcsMateialPzInfo>().First(m => m.SkuNo == tasklist.list[0].SkuNo);
                                //下发拆托规格,拆箱数和托盘上总箱数(不绑定机器人,拆垛任务信息只下发一次)
                                // 给PLC写入任务数据
                                var listResult = new List<Result>();
                                // 获取托盘规则
                                var Standard = modDevice.listStation.FirstOrDefault(m => m.Text == "规格");
                                listResult.Add(plcConn.SetPlcDBValue(Standard.PosType, modDevice.DbNumber, Standard.PlcPos, tasklist.list[0].Standard));
                                //抓箱数
                                var qty = modDevice.listStation.FirstOrDefault(m => m.Text == "拆箱数量");
                                listResult.Add(plcConn.SetPlcDBValue(qty.PosType, modDevice.DbNumber, qty.PlcPos, tasklist.list[0].Qty.ToString()));
                                //总箱数
                                var qtycount = modDevice.listStation.FirstOrDefault(m => m.Text == "总箱数");
                                listResult.Add(plcConn.SetPlcDBValue(qtycount.PosType, modDevice.DbNumber, qtycount.PlcPos, tasklist.list[0].QtyCount.ToString()));
                                // 是否写入成功
                                if (listResult.All(s => s.IsSucceed))
                                {
                                    var ret1 = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "20");
                                }
                                else
                                {
                                    Log.Error(string.Format($"码垛信息未写入!托盘号:"+palletVal+",码垛位:"+modDevice.StationNum));
                                    break;
                                }
                            }
                        }
                        //绑定机器人拆垛位任务
                        //下发拆托规格,拆箱数和托盘上总箱数
                    }
                    break;
                default:
                    break;
            }
        }
    }
    /// <summary>
    /// 件箱拆垛分拣
    /// </summary>
    /// <param name="modDevice"></param>
    private static async void BoxCheckConveyorLine(WcsDeviceDto modDevice)
    {
        var plcConn = modDevice.PLCUtil;
        if (modDevice.DbNumber == "DB101")
        {
            // 主扫交互流程
            switch (modDevice.Value.ToString())
            {
                case "1":
                    // 主扫申请分道 wcs写入2
                    {
                        // 判断是否演示模式 true:演示模式   false:生产模式
                        if (PLCTaskAction.boDemo)
                        {
                            // 通道号
                            var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "通道号");
                            // 演示模式直接写入1分道
                            var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "1");
                            if (ret.IsSucceed)
                            {
                                // 写入流程控制字 2
                                var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                if (!retVal.IsSucceed)
                                {
                                    Log.Error("演示模式写入分道号失败!");
                                    break;
                                }
                            }
                        }
                        else
                        {
                            // 通道号
                            var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "通道号");
                            // 读取plc箱码
                            var modBoxNo = modDevice.listStation.FirstOrDefault(m => m.Text == "箱码");
                            var (res, boxNo) = plcConn.GetPlcDBValue(modBoxNo.PosType, modDevice.DbNumber, modBoxNo.PlcPos);
                            if (string.IsNullOrWhiteSpace(boxNo.ToString()))
                            {
                                // 箱码为null写入剔除通道号
                                var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0");
                                if (ret.IsSucceed)
                                {
                                    // 写入流程控制字 2
                                    var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                    if (retVal.IsSucceed)
                                    {
                                        Log.Error("箱码为null进行剔除");
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                // 根据箱码获取箱内信息
                                string boxNoVal = boxNo.ToString();
                                var boxInfo = _db.Queryable<WcsBoxInfo>().First(w => w.IsDelete == false && w.BoxNo == boxNoVal && string.IsNullOrEmpty(w.PalletNo));
                                if (boxInfo == null)
                                {
                                    // 箱信息为null写入剔除通道号
                                    var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0");
                                    if (ret.IsSucceed)
                                    {
                                        // 写入流程控制字 2
                                        var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                        if (retVal.IsSucceed)
                                        {
                                            Log.Error("箱码为null或已绑定托盘,进行剔除。");
                                            break;
                                        }
                                    }
                                }
                                // 根据箱内品种号获取码躲绑定工位及对应的分道号
                                var checkTaskInfo = _db.Queryable<WcsCheckTask>().First(w => w.SkuNo == boxInfo.SkuNo && w.SkuName == boxInfo.SkuName && w.LotNo == boxInfo.LotNo && w.Status == "1");
                                if (checkTaskInfo == null)
                                {
                                    // 绑定信息为null写入剔除通道号
                                    var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0");
                                    if (ret.IsSucceed)
                                    {
                                        // 写入流程控制字 2
                                        var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                        if (retVal.IsSucceed)
                                        {
                                            Log.Error("箱码未绑定分拣任务,进行剔除。");
                                            break;
                                        }
                                    }
                                }
                                else
                                {
                                    // 与plc交互写入分道号和流程控制字
                                    var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, checkTaskInfo.LineNo);
                                    if (ret.IsSucceed)
                                    {
                                        // 写入流程控制字 2
                                        var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                        if (retVal.IsSucceed)
                                        {
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;
                default: break;
            }
        }
        else
        {
            // 插码交互
            switch (modDevice.Value.ToString())
            {
                case "1":
                    // 托盘条码可读
                    {
                        // 获取托盘条码配置
                        var modPalletNo = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码");
                        // 读取PLC托盘条码号
                        var (res, palletVal) = plcConn.GetPlcDBValue(modPalletNo.PosType, modDevice.DbNumber, modPalletNo.PlcPos);
                        string palletNo = palletVal.ToString();
                        if (string.IsNullOrEmpty(palletNo))
                        {
                            Log.Error(string.Format("{0},读取的托盘号为null", modDevice.Text));
                            break;
                        }
                        // 根据工位号将托盘号保存在分道表
                        var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false);
                        if (checkTaskMedel == null)
                        {
                            Log.Error(string.Format("根据码垛工位{0},获取分道失败!", modDevice.StationNum));
                            break;
                        }
                        checkTaskMedel.PalletNo = palletNo;
                        var rowCount = _db.Updateable(checkTaskMedel).ExecuteCommand();
                        if (rowCount > 0)
                        {
                            // plc写入读取成功表示 2
                            var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                            if (retVal.IsSucceed)
                            {
                                // liudl  此处需添加
                                // 通知分拣码垛页更新
                            }
                        }
                    }
                    break;
                case "20":
                    // 申请插码
                    {
                        // 获取托盘条码配置
                        var modAddCode = modDevice.listStation.FirstOrDefault(m => m.Text == "插码结果");
                        // 判断是否演示模式 true:演示模式   false:生产模式
                        if (PLCTaskAction.boDemo)
                        {
                            // 演示模式直接写入插码结果 1:成功
                            var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "1");
                            break;
                        }
                        else
                        {
                            // 获取箱条码
                            // 获取箱条码配置
                            var modBoxNo = modDevice.listStation.FirstOrDefault(m => m.Text == "箱条码");
                            var (res, boxVal) = plcConn.GetPlcDBValue(modBoxNo.PosType, modDevice.DbNumber, modBoxNo.PlcPos);
                            string boxNo = boxVal.ToString();
                            if (string.IsNullOrEmpty(boxNo))
                            {
                                Log.Error($"码垛工位{modDevice.StationNum},箱码为null插码失败!请人工强制结批。");
                                // 写入插入结果 2:插码失败
                                var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2");
                                break;
                            }
                            // 验证箱码表是否存在此箱码
                            var boxInfo = _db.Queryable<WcsBoxInfo>().Where(w => w.IsDelete == false && w.BoxNo == boxNo).ToList();
                            if (boxInfo.Count == 0)
                            {
                                Log.Error($"码垛工位{modDevice.StationNum},箱码{boxNo}不存在!请人工强制结批。");
                                // 写入插入结果 2:插码失败
                                var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2");
                                break;
                            }
                            // 获取当前分道托盘号
                            var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false);
                            if (checkTaskMedel == null)
                            {
                                Log.Error(string.Format("根据码垛工位{0},获取分道失败!", modDevice.StationNum));
                                break;
                            }
                            string palletNo = checkTaskMedel.PalletNo;
                            if (string.IsNullOrEmpty(palletNo))
                            {
                                Log.Error(string.Format("获取码垛工位{0}上的托盘号失败!", modDevice.StationNum));
                                break;
                            }
                            // 修改插码表
                            foreach (WcsBoxInfo item in boxInfo)
                            {
                                item.PalletNo = palletNo;
                                item.UpdateTime = DateTime.Now;
                            }
                            var rowCount = _db.Updateable(boxInfo).ExecuteCommand();
                            if (rowCount > 0)
                            {
                                // 插码成功
                                var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "1");
                                //是否结批箱
                                if (boxInfo[0].EndLotFlag == "1" && retVal.IsSucceed)
                                {
                                    // 触发结批 解绑分道
                                    AutoEndLot(boxInfo[0].LotNo, plcConn, "0");
                                }
                            }
                            else
                            {
                                // 插码失败
                                Log.Error($"箱码{boxNo};码垛工位{modDevice.StationNum},插码失败,请强制结批");
                                var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2");
                                if (retVal.IsSucceed)
                                {
                                    // 触发结批 不解绑分道
                                    AutoEndLot(boxInfo[0].LotNo, plcConn, "1");
                                }
                            }
                        }
                    }
                    break;
                case "40":
                    // 请求组托,申请入库
                    {
                        lock (OLock)
                        {
                            // 根据工位号,获取托盘号
                            var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false);
                            // 根据工位号获取 托盘线该工位号的配置信息
                            var numModel = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business && m.PlcId != modDevice.PlcId);
                            var posModel = PLCTaskAction.plcPositions.First(m => m.DeviceId == numModel.Id && m.Text == "目的工位" && m.IsDelete == false);
                            if (checkTaskMedel == null)
                            {
                                Log.Error(string.Format("组托失败根据码垛工位{0},获取托盘号失败!", modDevice.StationNum));
                                // 写入交互工位目标地址
                                var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, "234");
                                if (retVal.IsSucceed)
                                {
                                    // 写入组托回复流程字
                                    retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50");
                                }
                                break;
                            }
                            // 码垛工位托盘号
                            string palletNo = checkTaskMedel.PalletNo;
                            // 是否演示模式
                            if (PLCTaskAction.boDemo)
                            {
                                // 直接箱wms申请巷道
                                var http = new HttpService();
                                string TaskNo = "", EndLocate = "";
                                string strMsg = http.RequestRoadWay(palletNo, modDevice.StationNum, "1", "2", ref EndLocate, ref TaskNo);
                                if (strMsg.Contains("-1"))
                                {
                                    Log.Error(string.Format("申请巷道失败,码垛工位{0};原因{1}", modDevice.StationNum, strMsg));
                                    break;
                                }
                                else
                                {
                                    // 获取入库任务信息
                                    var taskModel = _db.Queryable<WcsTask>().First(m => m.TaskNo == TaskNo && m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing));
                                    if (taskModel != null)
                                    {
                                        // 获取入库取货工位
                                        string endLocatVlue = PLCCommon.RoadwayToStationNum(taskModel.EndRoadway, "2");
                                        var listResult = new List<Result>();
                                        // 写入托盘输送线码垛工位 目的工位、任务号,写入交互流程组托成功 执行入库{若需要可以写入任务号等等其他信息}
                                        listResult.Add(plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, endLocatVlue));    // 目标工位
                                        var modPosTask = PLCTaskAction.plcPositions.First(s => s.DeviceId == numModel.Id && s.Text == "任务号" && s.IsDelete == false);
                                        listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, numModel.DbNumber, modPosTask.PlcPos, TaskNo));
                                        var modPosTaskType = PLCTaskAction.plcPositions.First(s => s.DeviceId == numModel.Id && s.Text == "任务类型" && s.IsDelete == false);
                                        var taskTypeStr = (int)taskModel.TaskType;
                                        listResult.Add(plcConn.SetPlcDBValue(modPosTaskType.PosType, numModel.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString()));
                                        if (listResult.All(s => s.IsSucceed))
                                        {
                                            // 写入组托回复流程字
                                            var retVal1 = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50");
                                            if (retVal1.IsSucceed)
                                            {
                                                // 将入库任务由正在执行改为正在执行
                                                taskModel.Status = TaskStatusEnum.Doing;
                                                _db.Updateable(taskModel).ExecuteCommand();
                                                // 插入任务明细
                                                var modInsertTaskMonitor = new WcsTaskMonitor()
                                                {
                                                    TaskNo = TaskNo,
                                                    PlcId = modDevice.Id,
                                                    PlcName = modDevice.Text,
                                                    InteractiveMsg = $"写入指令50:申请巷道成功",
                                                    PalletNo = palletNo,
                                                    Status = TaskStatusEnum.Complete,
                                                    StartLocat = modDevice.StationNum,
                                                    EndLocat = strMsg,
                                                };
                                                // 插入交互日志
                                                _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                                // 通知任务界面任务已存在更新 请更新界面
                                                HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                            }
                                        }
                                        //// 写入托盘输送线码垛工位 目的工位,写入交互流程组托成功 执行入库{若需要可以写入任务号等等其他信息}
                                        //var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, endLocatVlue);
                                        //if (retVal.IsSucceed)
                                        //{
                                        //    // 写入码垛交互-组托回复流程字
                                        //    retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50");
                                        //    // 将入库任务由正在执行改为正在执行
                                        //    taskModel.Status = TaskStatusEnum.Doing;
                                        //    _db.Updateable(taskModel).ExecuteCommand();
                                        //}
                                    }
                                }
                            }
                            else
                            {
                                // 根据托盘号,将组托信息插入boxinfolog表 并删除boxinfo表数据
                                var boxInfoList = _db.Queryable<WcsBoxInfo>().Where(w => w.IsDelete == false && w.PalletNo == palletNo).ToList();
                                if (boxInfoList.Count <= 0)
                                {
                                    Log.Error(string.Format("申请巷道失败,码垛工位{0},箱码信息不存在", modDevice.StationNum));
                                    // 写入交互工位目标地址
                                    var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, "234");
                                    if (retVal.IsSucceed)
                                    {
                                        // 写入组托回复流程字
                                        retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50");
                                    }
                                    break;
                                }
                                string sqlStr = $"insert into WCSBoxInfoLog select * from WCSBoxInfo where IsDelete=0 and PalletNo='{palletNo}'";
                                int insertCount = _db.Ado.ExecuteCommand(sqlStr);
                                if (insertCount > 0)
                                {
                                    // 组托成功后将信息存到log表
                                    string sqlStr2 = $"delete from WCSBoxInfoLog where  IsDelete=0 and PalletNo='{palletNo}'";
                                    _db.Ado.ExecuteCommand(sqlStr2);
                                }
                                // 向WMS申请巷道
                                var http = new HttpService();
                                string TaskNo = "", EndLocate = "";
                                string strMsg = http.BindRequestRoadWay(checkTaskMedel.OrderNo, palletNo, checkTaskMedel.BoxCount.ToDecimal(), "0", checkTaskMedel.SkuNo, checkTaskMedel.LotNo, "", "", boxInfoList,
                                    modDevice.StationNum, "1", "2", ref EndLocate, ref TaskNo);
                                if (strMsg.Contains("-1"))
                                {
                                    Log.Error(string.Format("申请巷道失败,码垛工位{0};原因{1}", modDevice.StationNum, strMsg));
                                    break;
                                }
                                else
                                {
                                    // 获取入库任务信息
                                    var taskModel = _db.Queryable<WcsTask>().First(m => m.TaskNo == TaskNo && m.IsDelete == false && m.Status == TaskStatusEnum.Wait);
                                    if (taskModel != null)
                                    {
                                        // 获取入库取货工位
                                        string endLocatVlue = PLCCommon.RoadwayToStationNum(taskModel.EndRoadway, "2");
                                        var listResult = new List<Result>();
                                        // 写入托盘输送线码垛工位 目的工位、任务号,写入交互流程组托成功 执行入库{若需要可以写入任务号等等其他信息}
                                        listResult.Add(plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, endLocatVlue));    // 目标工位
                                        var modPosTask = PLCTaskAction.plcPositions.First(s => s.DeviceId == numModel.Id && s.Text == "任务号" && s.IsDelete == false);
                                        listResult.Add(plcConn.SetPlcDBValue(modPosTask.PosType, numModel.DbNumber, modPosTask.PlcPos, TaskNo));
                                        var modPosTaskType = PLCTaskAction.plcPositions.First(s => s.DeviceId == numModel.Id && s.Text == "任务类型" && s.IsDelete == false);
                                        var taskTypeStr = (int)taskModel.TaskType;
                                        listResult.Add(plcConn.SetPlcDBValue(modPosTaskType.PosType, numModel.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString()));
                                        if (listResult.All(s => s.IsSucceed))
                                        {
                                            // 写入组托回复流程字
                                            var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50");
                                            if (retVal.IsSucceed)
                                            {
                                                // 将入库任务由正在执行改为正在执行
                                                taskModel.Status = TaskStatusEnum.Doing;
                                                _db.Updateable(taskModel).ExecuteCommand();
                                                // 插入任务明细
                                                var modInsertTaskMonitor = new WcsTaskMonitor()
                                                {
                                                    TaskNo = TaskNo,
                                                    PlcId = modDevice.Id,
                                                    PlcName = modDevice.Text,
                                                    InteractiveMsg = $"写入指令50:申请巷道成功",
                                                    PalletNo = palletNo,
                                                    Status = TaskStatusEnum.Complete,
                                                    StartLocat = modDevice.StationNum,
                                                    EndLocat = strMsg,
                                                };
                                                // 插入交互日志
                                                _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                                // 通知任务界面任务已存在更新 请更新界面
                                                HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;
                default: break;
            }
        }
    }
    /// <summary>
@@ -2776,52 +2405,53 @@
    private static void Test(WcsDeviceDto modDevice)
    {
        //写死测试读string
        var (res, val) = modDevice.PLCUtil.GetPlcDBValue(PLCDataTypeEnum.String, "DB100", "64");
        Console.WriteLine("DB100.64----" + val);
        //测试批量读取
        Dictionary<string, PLCDataTypeEnum> listaddress = new Dictionary<string, PLCDataTypeEnum>();
        foreach (var modStation in modDevice.listStation)
        {
            listaddress.Add(modStation.PlcPos, modStation.PosType);
        }
        var result = modDevice.PLCUtil.GetPlcBatchDBValue(listaddress);
        if (result.Value.Count > 0)
        {
            foreach (var value in result.Value)
            {
                Console.WriteLine("地址" + value.Key + "----值" + value, value);
            }
        }
        if (!result.IsSucceed)
        {
            foreach (var err in result.ErrList)
            {
                Console.WriteLine(err);
            }
            if (result.Value.Count > 0)//有错误的也有成功的
            {
        //var strMsg = new HttpService().RequestPackWcs("LN000001");
        ////写死测试读string
        //var (res, val) = modDevice.PLCUtil.GetPlcDBValue(PLCDataTypeEnum.String, "DB100", "64");
        //Console.WriteLine("DB100.64----" + val);
        ////测试批量读取
        //Dictionary<string, PLCDataTypeEnum> listaddress = new Dictionary<string, PLCDataTypeEnum>();
        //foreach (var modStation in modDevice.listStation)
        //{
        //    listaddress.Add(modStation.PlcPos, modStation.PosType);
        //}
        //var result = modDevice.PLCUtil.GetPlcBatchDBValue(listaddress);
        //if (result.Value.Count > 0)
        //{
        //    foreach (var value in result.Value)
        //    {
        //        Console.WriteLine("地址" + value.Key + "----值" + value, value);
        //    }
        //}
        //if (!result.IsSucceed)
        //{
        //    foreach (var err in result.ErrList)
        //    {
        //        Console.WriteLine(err);
        //    }
        //    if (result.Value.Count > 0)//有错误的也有成功的
        //    {
            }
        }
        if (modDevice.Value == 820)
        {
            //测试写入830
            //var result = mod.PLCUtil.SetPlcDBValue(mod.PosType.Value, mod.DbNumber, mod.PlcPos, "830");
            ////写入是否成功
            //if (result.IsSucceed)
            //{
        //    }
        //}
        //if (modDevice.Value == 820)
        //{
        //    //测试写入830
        //    //var result = mod.PLCUtil.SetPlcDBValue(mod.PosType.Value, mod.DbNumber, mod.PlcPos, "830");
        //    ////写入是否成功
        //    //if (result.IsSucceed)
        //    //{
            //}
        }
        else if (modDevice.Value == 840)
        {
        //    //}
        //}
        //else if (modDevice.Value == 840)
        //{
        }
        else if (modDevice.Value == 860)
        {
        //}
        //else if (modDevice.Value == 860)
        //{
        }
        //}
    }
Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
@@ -69,6 +69,7 @@
    /// </summary>
    public static void Init()
    {
       // var strMsg = new HttpService().RequestPackWcs("LN000001");
        cts.Cancel();
        listPlc = _db.Queryable<WcsPlc>()
            .Where(s => s.Type == PLCTypeEnum.StackingMachine || s.Type == PLCTypeEnum.ConveyorLine || s.Type == PLCTypeEnum.BoxConveyorLine)
Admin.NET/WCS.Application/PLC/PLCUtil.cs
@@ -225,6 +225,19 @@
            address = DbNumber + Pos;
        return this.SetPlcDBValue(PosType, address, Value);
    }
    /// <summary>
    /// 写入PLC值
    /// </summary>
    //public IoTClient.Result SetPlcDBValue(PLCDataTypeEnum PosType, string DbNumber, string Pos, byte Value)
    //{
    //    string address;
    //    if (DbNumber.StartsWith("DB"))
    //        address = DbNumber + "." + Pos;
    //    else
    //        address = DbNumber + Pos;
    //    return this.SetPlcDBValue(PosType, address, Value);
    //}
    /// <summary>
    /// 写入PLC值
    /// </summary>
Admin.NET/WCS.Application/Util/HttpService.cs
@@ -35,7 +35,7 @@
    public string RequestRoadWay(string palletNo, string startLocat, string taskModel, string ceng, ref string endLocat, ref string taskNo)
    {
        string returnStr = "";
        var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) && m.TaskType == TaskTypeEnum.In && m.PalletNo == palletNo);
@@ -49,11 +49,11 @@
            };
            string url = Urls.WMSAddress + ":" + Urls.WMSPort;
            var result =  (url + "/api/DownAPi/RequestRoadWay").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result;
            var result = (url + "/api/DownAPi/RequestRoadWay").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result;
            Log.Information("调用WMS接口反馈任务接口" + result.ToJson());
            if (result.Success == 0)
            {
                var taskAdd = new WcsTask()
                {
                    TaskType = TaskTypeEnum.In,
@@ -66,12 +66,12 @@
                    EndLocate = result.TaskList.EndLocate,
                    EndRoadway = result.TaskList.EndRoadway
                };
                _db.Insertable(taskAdd).ExecuteCommand();
                endLocat = result.TaskList.EndRoadway;
                taskNo = result.TaskList.TaskNo;
                returnStr = result.TaskList.EndLocate;
            }
            else
            {
@@ -95,7 +95,7 @@
    /// 调用WMS接口自动码垛绑定信息返回巷道口
    /// </summary>
    /// <returns></returns>
    public string BindRequestRoadWay(string orderNo, string palletNo,decimal qty ,string type,string skuNo, string lotNo, string lotText, string supplierLot, List<WcsBoxInfo> detail,
    public string BindRequestRoadWay(string orderNo, string palletNo, decimal qty, string type, string skuNo, string lotNo, string lotText, string supplierLot, List<WcsBoxInfo> detail,
        string startLocat, string taskModel, string ceng, ref string endLocat, ref string taskNo)
    {
        string returnStr = "";
@@ -105,17 +105,17 @@
        {
            var model = new BoxPalletBindVm()
            {
                OrderCode= "",//暂无上游系统编号
                AsnNo= orderNo,
                AsnDetailNo=0,//暂无入库单明细编号,WMS根据物料批次查找
                PalletNo=palletNo,
                Qty= qty,
                Type=type,
                SkuNo=skuNo,
                LotNo= lotNo,
                LotText= lotText,
                SupplierLot= supplierLot,
                Detail=detail
                OrderCode = "",//暂无上游系统编号
                AsnNo = orderNo,
                AsnDetailNo = 0,//暂无入库单明细编号,WMS根据物料批次查找
                PalletNo = palletNo,
                Qty = qty,
                Type = type,
                SkuNo = skuNo,
                LotNo = lotNo,
                LotText = lotText,
                SupplierLot = supplierLot,
                Detail = detail
            };
            string url = Urls.WMSAddress + ":" + Urls.WMSPort;
            var result = (url + "/api/DownAPi/BindRequestRoadWay").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result;
@@ -169,8 +169,8 @@
        string returnStr = "";
        var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false
        && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing)
        var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false
        && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing)
        && m.TaskType == TaskTypeEnum.In && m.PalletNo == palletNo && !string.IsNullOrWhiteSpace(m.EndLocate));
        if (task == null)
@@ -214,7 +214,7 @@
                    HubUtil.PublicTask(taskUp.Adapt<WcsTaskOutput>());
                }
                returnStr = result.TaskList.EndLocate;
                taskNo = result.TaskList.TaskNo;
            }
@@ -259,9 +259,10 @@
        //string TaskStatus = "";
        //var PalletNo = "";
        //var TaskNo = "";
        var str = new {
        var str = new
        {
            PalletNo = model.PalletNo,
            TaskNo=model.TaskNo,
            TaskNo = model.TaskNo,
            TaskType = model.TaskType.ToString(),
            TaskStatus = model.TaskStatus.ToString(),
        };
@@ -296,7 +297,7 @@
    /// <param name="Num"></param>
    /// <param name="OutMode"></param>
    /// <returns></returns>
    public string IssuePlnOutHouseWcs(string Num,string OutMode)
    public string IssuePlnOutHouseWcs(string Num, string OutMode)
    {
        string returnStr = "";
@@ -324,7 +325,7 @@
                        //IsSuccess =TaskSuccessEnum.Success,
                        Origin = "WMS",
                        StartLocate = item.StartLocate,
                        StartRoadway=item.StartRoadway,
                        StartRoadway = item.StartRoadway,
                        PalletNo = item.PalletNo,
                        EndLocate = item.EndLocate,
                        EndRoadway = item.EndRoadway
@@ -382,21 +383,22 @@
    }
    /// <summary>
    /// 调用WMS接口反馈缠膜异常接口
    /// 调用WMS接口反馈申请缠膜接口
    /// </summary>
    /// <param name="PalletNo">托盘号</param>
    /// <returns></returns>
    public string RequestPackWcs(string PalletNo)
    {
        string url = Urls.WMSAddress + ":" + Urls.WMSPort;
        //var str = new
        //{
        //    PalletNo = palletno
        //};
        var result = (url + "/api/DownAPi/RequestPackWcs").SetBody(PalletNo, "application/json", Encoding.UTF8).PostAsAsync<IsBaleModel>().Result;
        Log.Information("调用WMS接口反馈缠膜异常接口" + result.ToJson());
        return result.Success;
        var str = new PackModel()
        {
            PalletNo = PalletNo
        };
        var result = (url + "/api/DownAPi/RequestPackWcs").SetBody(str, "application/json", Encoding.UTF8).PostAsAsync<IsBaleModel2>().Result;
        Log.Information("调用WMS接口反馈申请缠膜异常接口" + result.ToJson());
        return result.Success.ToString();
    }
    /// <summary>
@@ -411,9 +413,9 @@
        {
            PalletNo = palletno
        };
        var result =  (url + "/api/DownAPi/RequestUnPackWcs").SetBody(str, "application/json", Encoding.UTF8).PostAsAsync<IsBaleModel>().Result;
        var result = (url + "/api/DownAPi/RequestUnPackWcs").SetBody(str, "application/json", Encoding.UTF8).PostAsAsync<IsBaleModel2>().Result;
        Log.Information("调用WMS接口反馈拆膜异常接口" + result.ToJson());
        return result.Success;
        return result.Success.ToString();
    }
    /// <summary>
@@ -428,9 +430,46 @@
        {
            PalletNo = palletno
        };
        var result =  (url + "/api/DownAPi/RequestPackedWcs").SetBody(str, "application/json", Encoding.UTF8).PostAsAsync<IsBaleModel>().Result;
        var result = (url + "/api/DownAPi/RequestPackedWcs").SetBody(str, "application/json", Encoding.UTF8).PostAsAsync<IsBaleModel2>().Result;
        Log.Information("调用WMS接口反馈缠膜完成异常接口" + result.ToJson());
        return result.Success;
        return result.Success.ToString();
    }
    /// <summary>
    /// 调用WMS接口反馈拆垛托盘信息
    /// </summary>
    /// <param name="palletno">托盘号</param>
    /// <param name="taskno">任务号</param>
    /// <returns></returns>
    public RequestBoxInfoCheckAll RequestBoxCheckinfo(string palletno,string taskno)
    {
        string url = Urls.WMSAddress + ":" + Urls.WMSPort;
        var str = new
        {
            PalletNo = palletno,
            TaskNo = taskno
        };
        var result = (url + "/api/DownAPi/ResultBoxInfoCheckWcs").SetBody(str, "application/json", Encoding.UTF8).PostAsAsync<RequestBoxInfoCheckAll>().Result;
        Log.Information("调用WMS接口反馈拆托托盘信息异常接口" + result.ToJson());
        return result;
    }
    /// <summary>
    /// 调用WMS接口反馈分拣出库箱信息
    /// </summary>
    /// <param name="palletno">托盘号</param>
    /// <param name="taskno">任务号</param>
    /// <returns></returns>
    public IsBaleModel2 RequestBoxno(string palletno)
    {
        string url = Urls.WMSAddress + ":" + Urls.WMSPort;
        var str = new
        {
            PalletNo = palletno,
        };
        var result = (url + "/api/DownAPi/RequestBoxno").SetBody(str, "application/json", Encoding.UTF8).PostAsAsync<IsBaleModel2>().Result;
        Log.Information("调用WMS接口反馈缠膜完成异常接口" + result.ToJson());
        return result;
    }
}