using HH.WCS.Hexafluo.device; using HH.WCS.Hexafluo.dispatch; using HH.WCS.Hexafluo.util; using HH.WCS.Hexafluo.wms; using HH.WCS.SJML.Bll; using HH.WCS.SJML.dispatch; using HH.WCS.SJML.Dto; using HH.WCS.SJML.Entitys; using HH.WCS.SJML.util; using HH.WCS.ZCQTJ.Dto; using HH.WCS.ZCQTJ.Entitys; using HH.WCS.ZCQTJ.Entitys.MES中间表; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using static HH.WCS.Hexafluo.device.OITcpHelper; using static HH.WCS.SJML.api.ApiModel; namespace HH.WCS.Hexafluo.process { internal class TaskProcess { #region 任务相关 //--------------------------------------------------任务相关-------------------------------------------------- /// /// 取货卸货完成,缓存位状态更新 /// /// /// internal static void CacheBitUpdate(WMSTask mst, bool load) { var trayCarryCount = mst.N_CNTR_COUNT > 0 ? mst.N_CNTR_COUNT : 1; if (load) { //Console.WriteLine($"任务{mst.S_TASK_NO} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTRS}"); LogHelper.CompInfo($"任务{mst.S_TASK_NO} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTRS}"); LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTRS.Split(',').ToList()); } else { // Console.WriteLine($"任务{mst.S_TASK_NO} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTRS}"); LogHelper.CompInfo($"任务{mst.S_TASK_NO} 货位{mst.S_END_LOC}卸货完成,起点解绑容器{mst.S_CNTRS}"); LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTRS.Split(',').ToList()); } } /// /// 任务取消,缓存位状态更新 /// /// internal static void CacheBitCancelUpdate(WMSTask mst) { //任务取消,取货完成前的,起点的loadingCount和终点unLoadingCount都清除,取货完成的只处理终点 if (TaskHelper.CheckActionRecordExist(mst.S_TASK_NO, "4")) { //根据客户现场要求,如果取货完成任务失败人工拉到终点,我们就当卸货完成处理;如果是人工拉走到其它区域,我们就解锁终点,删除托盘。 //终点绑定 CacheBitUpdate(mst, false); LocationHelper.UnLockLoc(mst.S_END_LOC); } else { //起点终点解锁 LocationHelper.UnLockLoc(mst.S_START_LOC); LocationHelper.UnLockLoc(mst.S_END_LOC); } } /// /// 安全请求 /// /// /// /// /// internal static void OperateReq(string no, int state, string forkliftNo, string extData, WMSTask task = null) { var logPara = LogType.LogPara("完工回报"); var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { if (state == 1101)//取货申请,允许进入取货,修改参数18为1101 入库是机台 出库是立库 { //是否允许安全进入 if (task != null) { if (task.S_TYPE == "出库") { var tac = newDb.Queryable().Where(a => a.LocationCode == task.S_START_LOC)?.First(); if (tac != null) { if (tac.CtiaMode == "MODBUS") { if (tac.C_IS_RFID == "Y") { NDCHelper.ChangeParam(no, 1101, 18); } else { if (string.IsNullOrEmpty(tac.host) || tac.port == 0) { LogHelper.Info("完工回报", $"报错:通讯模式配置表货中 货位{task.S_START_LOC} ip地址 写入目标设备的IP端口 有空值或者默认值"); } else { RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr + 1; Register.data = tac.dataNum; LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}"); var ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}"); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr + 5; Register.data = tac.dataNum; LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}"); ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}"); RegisterReadOutPutModel Regis = new RegisterReadOutPutModel(); Regis.host = tac.host; Regis.port = tac.port; Regis.addr = tac.Seleaddr; Regis.dataNum = 4; LogHelper.Info("完工回报", $"MODBUS 读取输出寄存器数据 输入参数{JsonConvert.SerializeObject(Regis)}"); var tra = OITcpHelper.RegisterReadOutPut(Regis); LogHelper.Info("完工回报", $"MODBUS 读取输出寄存器数据 返回参数{JsonConvert.SerializeObject(tra)}"); if (tra != null) { if (tra.result.ToList().Count() > 0) { if (tra.result[0] == 1 && tra.result[3] == 1) { NDCHelper.ChangeParam(no, 1101, 18); } } } } } } } else { var tac1 = newDb.Queryable().Where(a => a.S_TASK_NO == task.S_TASK_NO && a.S_ACTION_CODE == "1002")?.First(); if (tac1 != null) { NDCHelper.ChangeParam(no, 1101, 18); } else { var tno = ""; if (task.S_TASK_NO.IndexOf('_') > 0) { tno = task.S_TASK_NO.Substring(0, task.S_TASK_NO.LastIndexOf("_")); } if (!string.IsNullOrEmpty(tno)) { var transportTask = newDb.Queryable().Where(e => e.S_TASK_NO == tno + "_1")?.First(); if (transportTask.S_B_STATE == "完成") { BLLCreator.Create().WcsCallback(task, state, forkliftNo); } } if (!task.S_TASK_NO.Contains("_")) { BLLCreator.Create().WcsCallback(task, state, forkliftNo); } } } } else if (task.S_TYPE == "入库") { if (!string.IsNullOrEmpty(task.mark)) { BLLCreator.Create().WcsCallback(task, state, forkliftNo); } else { var tac = newDb.Queryable().Where(a => a.LocationCode == task.S_START_LOC)?.First(); if (tac != null) { if (tac.CtiaMode == "MODBUS") { if (tac.C_IS_RFID == "Y") { NDCHelper.ChangeParam(no, 1101, 18); } else { if (string.IsNullOrEmpty(tac.host) || tac.port == 0) { LogHelper.Info("完工回报", $"报错:通讯模式配置表货中 货位{task.S_START_LOC} ip地址 写入目标设备的IP端口 有空值或者默认值"); } else { RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr + 1; Register.data = tac.dataNum; LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}"); var ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}"); // RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr + 5; Register.data = tac.dataNum; LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}"); ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}"); RegisterReadOutPutModel Regis = new RegisterReadOutPutModel(); Regis.host = tac.host; Regis.port = tac.port; Regis.addr = tac.Seleaddr; Regis.dataNum = 4; LogHelper.Info("完工回报", $"MODBUS 读取输出寄存器数据 输入参数{JsonConvert.SerializeObject(Regis)}"); var tra = OITcpHelper.RegisterReadOutPut(Regis); LogHelper.Info("完工回报", $"MODBUS 读取输出寄存器数据 返回参数{JsonConvert.SerializeObject(tra)}"); if (tra != null) { if (tra.result.ToList().Count() > 0) { if (tra.result[0] == 1 && tra.result[3] == 1) { NDCHelper.ChangeParam(no, 1101, 18); } } } //RegisterReadOutPutModel Regis2 = new RegisterReadOutPutModel(); //Regis2.host = tac.host; //Regis2.port = tac.port; //Regis2.addr = tac.Seleaddr + 3; //Regis2.dataNum = 1; //LogHelper.Info("完工回报", $"MODBUS 读取输出寄存器数据 输入参数{JsonConvert.SerializeObject(Regis2)}"); //tra = OITcpHelper.RegisterReadOutPut(Regis2); //LogHelper.Info("完工回报", $"MODBUS 读取输出寄存器数据 返回参数{JsonConvert.SerializeObject(tra)}"); //if (tra?.result.ToList().FirstOrDefault() == 1) //{ // NDCHelper.ChangeParam(no, 1101, 18); //} } } } if (tac.CtiaMode == "VMI")//Exitpos4Full { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); // var childA = newDb.GetConnection(tac.host); var GGF = childA.Queryable().OrderBy(st => st.VMI_TO_AGV_DATA, OrderByType.Desc)?.First(); var GGF2 = childA.Queryable()?.First(); LogHelper.Info("完工回报", $"读安全信号交互表 {JsonConvert.SerializeObject(GGF)}"); if (GGF != null) { if (GGF.AutoMode && !GGF.FatalFault && !GGF.AgvBypass && GGF.ExitPos4Full && !GGF.ExitTrackBusy && GGF.ExitRemovePallet)//123 789 为true { var I = childA.Updateable().SetColumns(it => new BDST_TO_AGV_STATUS() { Handshake = "-" }).Where(e => e.VMI_TO_AGV_DATA == GGF.VMI_TO_AGV_DATA).ExecuteCommand(); if (I == 0) { throw new Exception("读安全信号交互表 更新Handshake字段为 - 失败"); } LogHelper.Info("完工回报", $"读安全信号交互表 更新Handshake字段为 - 成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_FAULT").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_EXIT_REMOVE_ACTIVE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_EXIT_REMOVE_ACTIVE 字段为 1成功"); NDCHelper.ChangeParam(no, 1101, 18); } else if (!GGF.ExitPos4Full) { var ta = BLLCreator.CreateSingleton().ExecuteState(task.S_TASK_NO, "取消", logPara, task); if (ta.Success) { var bbt = NDCHelper.Cancel(task.S_TASK_NO);//取消agv任务 } } } else { LogHelper.Info("完工回报", "读安全信号交互表 未获取到数据"); } } if (tac.CtiaMode == "VMI2") { var transportTask = newDb.Queryable().Where(e => e.Autoindex == "VMI2入库交互取消相关点位")?.First(); var TaryJb = JsonConvert.DeserializeObject(transportTask?.TypeJson); var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var GGF = childA.Queryable().OrderBy(st => st.Id, OrderByType.Desc)?.First(); LogHelper.Info("完工回报", $"读安全信号交互表 {JsonConvert.SerializeObject(GGF)}"); if (GGF != null) { if (TaryJb != null && TaryJb.Bit.Contains(task?.S_START_LOC)) { if (GGF.ExitPos8Full) { if (!GGF.ExitTrackBusy) { NDCHelper.ChangeParam(no, 1101, 18); } } else { LogHelper.Info("完工回报", $"VMI2 ExitPos8Full=0 取消任务 任务号为: {task.S_TASK_NO}"); deadlockRollEntitys Deck = new deadlockRollEntitys(); Deck.S_INTER_STATE = "7"; Deck.S_VALUE_JSON = task.S_TASK_NO; try { newDb.BeginTran(); var I = newDb.Insertable(Deck).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); NDCHelper.Cancel(task.S_TASK_NO);//取消agv任务 } catch (Exception ex) { newDb.RollbackTran(); } } } else { if (!GGF.ExitTrackBusy && GGF.ExitPos8Full) { NDCHelper.ChangeParam(no, 1101, 18); } } } } } } } } else { LogHelper.Info("完工回报", "未查询到对应的任务信息"); } } else if (state == 1102)//取货退出完成(车辆完全脱离机台) 或者完全脱离接驳位 { if (task != null)//出库是立库 入库是机台 { if (task.S_TYPE == "出库") { var tac1 = newDb.Queryable().Where(a => a.S_TASK_NO == task.S_TASK_NO && a.S_ACTION_CODE == "1002")?.First(); if (tac1 != null) { var tac2 = newDb.Queryable().Where(a => a.LocationCode == task.S_START_LOC)?.First(); if (tac2 != null) { if (tac2.CtiaMode == "VMI2") { NDCHelper.ChangeParam(no, 1102, 18); var Alone = newDb.Queryable().Where(e => e.ConfigId == tac2.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac2.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0成功"); } else if (tac2.CtiaMode == "MODBUS" && tac2.C_IS_RFID == "Y") { RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac2.host; Register.port = tac2.port; Register.addr = tac2.addr + 2; Register.data = tac2.dataNum; LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}"); var ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}"); } } } else { var tac = BLLCreator.Create().WcsCallback(task, state, forkliftNo); if (tac.Success) { // NDCHelper.ChangeParam(no, 1102, 18); } } } else if (task.S_TYPE == "入库") { if (!string.IsNullOrEmpty(task.mark)) { BLLCreator.Create().WcsCallback(task, state, forkliftNo); } else { var tac = newDb.Queryable().Where(a => a.LocationCode == task.S_START_LOC)?.First(); if (tac != null) { if (tac.CtiaMode == "MODBUS") { if (string.IsNullOrEmpty(tac.host) || tac.port == 0) { LogHelper.Info("完工回报", $"报错:通讯模式配置表货中 货位{task.S_START_LOC} ip地址 写入目标设备的IP端口 有空值或者默认值"); } else { RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr + 3; Register.data = tac.dataNum; var ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}"); LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}"); } } if (tac.CtiaMode == "VMI") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var GGF = childA.Queryable().OrderBy(st => st.VMI_TO_AGV_DATA, OrderByType.Desc)?.First(); var GGF2 = childA.Queryable()?.First(); LogHelper.Info("完工回报", $"读安全信号交互表 {JsonConvert.SerializeObject(GGF)}"); if (GGF != null) { var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_EXIT_REMOVE_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_EXIT_REMOVE_ACTIVE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_EXIT_REMOVE_ACTIVE 字段为 0成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_EXIT_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_EXIT_TRANSF_DONE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_EXIT_TRANSF_DONE 字段为 1成功"); } else { LogHelper.Info("完工回报", "读安全信号交互表 未获取到数据"); } } if (tac != null && tac.CtiaMode == "VMI2") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_EXIT_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_EXIT_TRANSF_DONE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_EXIT_TRANSF_DONE 字段为 1成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_EXIT_RETR_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_EXIT_RETR_ACTIVE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_EXIT_RETR_ACTIVE 字段为 0成功"); } } } } } else { LogHelper.Info("完工回报", "未查询到对应的任务信息"); } //查询表 看看是否是需要安全交互 } else if (state == 1103)//安全请求 卸货申请,允许进入卸货,修改参数18为1103 { if (task.S_TYPE == "入库") { //var tno = no.Substring(0, no.LastIndexOf("_")); //var ta = newDb.Queryable().Where(e => e.S_TASK_NO == tno)?.First(); //List Subsidiary = new List(); //var locationBit = LocationHelper.LocationCode(ta.S_END_LOC); //if (task != null) //{ // var Subs = Expressionable.Create(); // Subs.And(it => it.S_AREA_CODE == ta.S_END_LAREA); // Subs.And(it => it.S_IS_IN_OUT == "入库"); // Subs.And(it => it.S_FlowNo == ta.S_FlowNo); // Subsidiary = newDb.Queryable().Where(Subs.ToExpression()).ToList(); //} //var RoaSub = Subsidiary.Find(e => e.N_ROADWAY == locationBit.N_ROADWAY); //2024年6月20日13:59:32 禁用改道功能 原因是 经肖世民与现场设备人员沟通,小车无法实时响应改道后点位信息,所以代码暂时注释 //if (RoaSub?.N_Y_ROADWAY != "Y") if (false) { //计算货位 //var logicAreaCode = string.Empty; //logicAreaCode = ta.S_TOOLS_TPYE; //List classes = new List(); //areaPriorClass area = new areaPriorClass //{ // areaCode = ta.S_END_LAREA, // Prior = 0 //}; //classes.Add(area); //var aEntity = new InAssignEntity() //{ // objectType = InAssignEntity.ObjectType.托盘, // objectCode = task.S_CNTRS, // itemCode = "", // lstAreaPrior = classes, // projectCode = "", // logicAreaCode = logicAreaCode, // stockCode = "ZCQTJ", // S_Roadway = new List(), // needCalLock = true //}; ////根据库区获取货位 //InAssignResultEntity resultEntity = BLLCreator.Create().InAssign(aEntity); //if (resultEntity.Success) //{ // //查询改道后计算的终点货位属于哪个巷道的 然后取这个巷道的接驳位 // //改道--任务 // var SubLocation = newDb.Queryable().Where(e => e.S_LOC_CODE == resultEntity.locationCode)?.First(); // if (SubLocation != null) // { // var ggt = Subsidiary.Find(e => e.N_ROADWAY == SubLocation.N_ROADWAY); // if (ggt != null) // { // var JbLocation = ""; // var result = ggt.S_CONNECTION.Split(',').ToList(); // if (result.Count > 1) // { // List TaskState = new List() { "取消", "完成" }; // var transportTask = newDb.Queryable().Where(e => !TaskState.Contains(e.S_B_STATE) && result.Contains(e.S_Jb_Bit) && e.S_NOTE == "agv任务" && e.S_TYPE == "入库").ToList(); // //分组 把任务量最少的 // bool df = true; // foreach (var item in result) // { // //查询是否有没任务的接驳位,如果有就下任务到这个接驳位 // var gg = transportTask.FindAll(e => e.S_Jb_Bit == item).ToList(); // if (gg.Count() > 0) // { // continue; // } // else // { // df = false; // JbLocation = item; // break; // } // } // if (df) // { // //初步筛选没有空任务的入库接驳位 需要从中取任务量最少的 // var fft = transportTask.GroupBy(e => e.S_Jb_Bit).Select(g => new { Jb_Bit = g.Key, Count = g.Count() }).ToList(); // var MinJb_Bit = fft.OrderBy(e => e.Count)?.First(); // JbLocation = MinJb_Bit.Jb_Bit; // } // } // else // { // JbLocation = ggt.S_CONNECTION; // } // var Jb = newDb.Queryable().Where(e => e.S_LOC_CODE == JbLocation)?.First(); // var tra = BLLCreator.Create().UpdateTaskEndLocation(ta, resultEntity.locationCode, Jb); // if (!tra.Success) // { // newDb.BeginTran(); // var I = newDb.Updateable().SetColumns(it => it.S_LOCK_STATE == "无").Where(x => x.S_LOC_CODE == resultEntity.locationCode).ExecuteCommand(); // if (I == 0) // { // newDb.RollbackTran(); // } // newDb.CommitTran(); // } // //改道--通知小车 // var loca = LocationHelper.GetAgvSiteZc(Jb.S_LOC_CODE); // NDCHelper.ChangeParam(no, loca, 2); // NDCHelper.ChangeParam(no, 1003, 18); // } // } //} } else { if (task.S_SRC_SYS == "点对点改道") { var tac = newDb.Queryable().Where(a => a.LocationCode == task.S_END_LOC)?.First(); if (tac != null) { if (tac.CtiaMode == "MODBUS") { if (string.IsNullOrEmpty(tac.host) || tac.port == 0) { LogHelper.Info("完工回报", $"报错:通讯模式配置表货中 货位{task.S_END_LOC} ip地址 写入目标设备的IP端口 有空值或者默认值"); } else { RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr; Register.data = tac.dataNum; LogHelper.Info("完工回报", $"MODBUS 写--发送参数{JsonConvert.SerializeObject(Register)}"); var ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 写--返回参数{JsonConvert.SerializeObject(ta)}"); // RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr + 4; Register.data = tac.dataNum; LogHelper.Info("完工回报", $"MODBUS 写--发送参数{JsonConvert.SerializeObject(Register)}"); var gg = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 写--返回参数{JsonConvert.SerializeObject(gg)}"); RegisterReadOutPutModel Regis = new RegisterReadOutPutModel(); Regis.host = tac.host; Regis.port = tac.port; Regis.addr = tac.Seleaddr; Regis.dataNum = 5; LogHelper.Info("完工回报", $"MODBUS 读取输出寄存器数据 发送参数{JsonConvert.SerializeObject(Regis)}"); var tra = OITcpHelper.RegisterReadOutPut(Regis); LogHelper.Info("完工回报", $"MODBUS 读取输出寄存器数据 返回参数{JsonConvert.SerializeObject(tra)}"); if (tra != null) { if (tra.result.ToList().Count() > 0) { if (tra.result[0] == 1 && tra.result[4] == 1) { NDCHelper.ChangeParam(no, 1103, 18); } } } } } if (tac.CtiaMode == "VMI") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var GGF = childA.Queryable().OrderBy(st => st.VMI_TO_AGV_DATA, OrderByType.Desc)?.First(); var GGF2 = childA.Queryable()?.First(); if (GGF != null) { LogHelper.Info("完工回报", $"读安全信号交互表 {JsonConvert.SerializeObject(GGF)}"); if (GGF.AutoMode && !GGF.FatalFault && !GGF.AgvBypass && !GGF.EntryTrackBusy && GGF.EntryPos1Empty && GGF.EntrySupplyPallet)//123 456 为true { var I = childA.Updateable().SetColumns(it => new BDST_TO_AGV_STATUS() { Handshake = "-" }).Where(e => e.VMI_TO_AGV_DATA == GGF.VMI_TO_AGV_DATA).ExecuteCommand(); if (I == 0) { throw new Exception("读安全信号交互表 更新Handshake字段为 - 失败"); } LogHelper.Info("完工回报", $"读安全信号交互表 更新Handshake字段为 - 成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_ENTRY_SUPP_ACTIVE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_ENTRY_SUPP_ACTIVE 字段为 1成功"); //I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); //if (I == 0) //{ // throw new Exception("写安全信号交互表 IMES_AGV_BDST_ENTRY_SUPP_ACTIVE 字段为 0失败"); //} //LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_ENTRY_SUPP_ACTIVE 字段为 0成功"); NDCHelper.ChangeParam(no, 1103, 18); } } else { LogHelper.Info("完工回报", "读安全信号交互表 未获取到数据"); } } else if (tac.CtiaMode == "VMI2") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var GGF = childA.Queryable().OrderBy(st => st.Id, OrderByType.Desc)?.First(); LogHelper.Info("完工回报", $"读安全信号交互表 {JsonConvert.SerializeObject(GGF)}"); if (GGF != null) { if (!GGF.EntryTrackBusy && !GGF.EntryPos1Empty) { NDCHelper.ChangeParam(no, 1103, 18); } } } } } else { BLLCreator.CreateSingleton().WcsCallback(task, state, forkliftNo); } } } else if (task.S_TYPE == "出库") { var tac = newDb.Queryable().Where(a => a.LocationCode == task.S_END_LOC)?.First(); if (tac != null) { if (tac.CtiaMode == "MODBUS") { if (string.IsNullOrEmpty(tac.host) || tac.port == 0) { LogHelper.Info("完工回报", $"报错:通讯模式配置表货中 货位{task.S_END_LOC} ip地址 写入目标设备的IP端口 有空值或者默认值"); } else { RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr; Register.data = tac.dataNum; LogHelper.Info("完工回报", $"MODBUS 写--发送参数{JsonConvert.SerializeObject(Register)}"); var ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 写--返回参数{JsonConvert.SerializeObject(ta)}"); // RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr + 4; Register.data = tac.dataNum; LogHelper.Info("完工回报", $"MODBUS 写--发送参数{JsonConvert.SerializeObject(Register)}"); var gg = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 写--返回参数{JsonConvert.SerializeObject(gg)}"); RegisterReadOutPutModel Regis = new RegisterReadOutPutModel(); Regis.host = tac.host; Regis.port = tac.port; Regis.addr = tac.Seleaddr; Regis.dataNum = 5; LogHelper.Info("完工回报", $"MODBUS 读取输出寄存器数据 发送参数{JsonConvert.SerializeObject(Regis)}"); var tra = OITcpHelper.RegisterReadOutPut(Regis); LogHelper.Info("完工回报", $"MODBUS 读取输出寄存器数据 返回参数{JsonConvert.SerializeObject(tra)}"); if (tra != null) { if (tra.result.ToList().Count() > 0) { if (tra.result[0] == 1 && tra.result[4] == 1) { NDCHelper.ChangeParam(no, 1103, 18); } } } //if (tra?.result.ToList().FirstOrDefault() == 1) //{ // RegisterReadOutPutModel Regis2 = new RegisterReadOutPutModel(); // Regis2.host = tac.host; // Regis2.port = tac.port; // Regis2.addr = tac.Seleaddr + 4; // Regis2.dataNum = 1; // LogHelper.Info("完工回报", $"MODBUS 读取输入寄存器数据 发送参数{JsonConvert.SerializeObject(Regis2)}"); // tra = OITcpHelper.RegisterReadOutPut(Regis2); // LogHelper.Info("完工回报", $"MODBUS 读取输入寄存器数据 返回参数{JsonConvert.SerializeObject(tra)}"); // if (tra?.result.ToList().FirstOrDefault() == 1) // { // NDCHelper.ChangeParam(no, 1103, 18); // } //} } } if (tac.CtiaMode == "VMI") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var GGF = childA.Queryable().OrderBy(st => st.VMI_TO_AGV_DATA, OrderByType.Desc)?.First(); var GGF2 = childA.Queryable()?.First(); if (GGF != null) { LogHelper.Info("完工回报", $"读安全信号交互表 {JsonConvert.SerializeObject(GGF)}"); if (GGF.AutoMode && !GGF.FatalFault && !GGF.AgvBypass && !GGF.EntryTrackBusy && GGF.EntryPos1Empty && GGF.EntrySupplyPallet)//123 456 为true { var I = childA.Updateable().SetColumns(it => new BDST_TO_AGV_STATUS() { Handshake = "-" }).Where(e => e.VMI_TO_AGV_DATA == GGF.VMI_TO_AGV_DATA).ExecuteCommand(); if (I == 0) { throw new Exception("读安全信号交互表 更新Handshake字段为 - 失败"); } LogHelper.Info("完工回报", $"读安全信号交互表 更新Handshake字段为 - 成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_ENTRY_SUPP_ACTIVE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_ENTRY_SUPP_ACTIVE 字段为 1成功"); //I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); //if (I == 0) //{ // throw new Exception("写安全信号交互表 IMES_AGV_BDST_ENTRY_SUPP_ACTIVE 字段为 0失败"); //} //LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_ENTRY_SUPP_ACTIVE 字段为 0成功"); NDCHelper.ChangeParam(no, 1103, 18); } } else { LogHelper.Info("完工回报", "读安全信号交互表 未获取到数据"); } } else if (tac.CtiaMode == "VMI2") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var GGF = childA.Queryable().OrderBy(st => st.Id, OrderByType.Desc)?.First(); LogHelper.Info("完工回报", $"读安全信号交互表 {JsonConvert.SerializeObject(GGF)}"); if (GGF != null) { if (!GGF.EntryTrackBusy && !GGF.EntryPos1Empty) { NDCHelper.ChangeParam(no, 1103, 18); } } } else if (tac.CtiaMode == "立库") { task.S_TYPE = "入库"; BLLCreator.CreateSingleton().WcsCallback(task, state, forkliftNo); } } } } else if (state == 1104)//卸货退出完成(车辆完全脱离机台) { if (task.S_TYPE == "入库") { if (task.S_SRC_SYS == "点对点改道") { var tac = newDb.Queryable().Where(a => a.LocationCode == task.S_END_LOC)?.First(); if (tac != null) { if (tac.CtiaMode == "MODBUS") { if (string.IsNullOrEmpty(tac.host) || tac.port == 0) { LogHelper.Info("完工回报", $"报错:通讯模式配置表货中 货位{task.S_END_LOC} ip地址 写入目标设备的IP端口 有空值或者默认值"); } else { RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr + 2; Register.data = tac.dataNum; if (tac.C_IS_RFID == "Y") { } else { var ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}"); LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}"); } } } else if (tac.CtiaMode == "VMI") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var GGF = childA.Queryable().OrderBy(st => st.VMI_TO_AGV_DATA, OrderByType.Desc)?.First(); var GGF2 = childA.Queryable()?.First(); LogHelper.Info("完工回报", $"读安全信号交互表 {JsonConvert.SerializeObject(GGF)}"); if (GGF != null) { var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_ENTRY_SUPP_ACTIVE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_ENTRY_SUPP_ACTIVE 字段为 0成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_ENTRY_TRANSF_DONE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_ENTRY_TRANSF_DONE 字段为 1成功"); } else { LogHelper.Info("完工回报", "读安全信号交互表 未获取到数据"); } } else if (tac.CtiaMode == "VMI2")//VMI2有需要RFID验证的也有不需要的 不需要则直接复位发00 需要的发01 2024年7月25日16:35:44 { if (tac.C_IS_RFID == "Y") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 1成功"); } else { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0成功"); } } } } else { var tra = BLLCreator.Create().WcsCallback(task, state, forkliftNo); if (tra.Success) { // NDCHelper.ChangeParam(no, 1104, 18); } } } else if (task.S_TYPE == "出库") { var tac = newDb.Queryable().Where(a => a.LocationCode == task.S_END_LOC)?.First(); if (tac != null) { if (tac.CtiaMode == "MODBUS") { if (string.IsNullOrEmpty(tac.host) || tac.port == 0) { LogHelper.Info("完工回报", $"报错:通讯模式配置表货中 货位{task.S_END_LOC} ip地址 写入目标设备的IP端口 有空值或者默认值"); } else { RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr + 2; Register.data = tac.dataNum; if (tac.C_IS_RFID == "Y") { } else { var ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}"); LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}"); } } } else if (tac.CtiaMode == "VMI") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var GGF = childA.Queryable().OrderBy(st => st.VMI_TO_AGV_DATA, OrderByType.Desc)?.First(); var GGF2 = childA.Queryable()?.First(); LogHelper.Info("完工回报", $"读安全信号交互表 {JsonConvert.SerializeObject(GGF)}"); if (GGF != null) { var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_ENTRY_SUPP_ACTIVE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_ENTRY_SUPP_ACTIVE 字段为 0成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_ENTRY_TRANSF_DONE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_ENTRY_TRANSF_DONE 字段为 1成功"); } else { LogHelper.Info("完工回报", "读安全信号交互表 未获取到数据"); } } else if (tac.CtiaMode == "VMI2")//VMI2有需要RFID验证的也有不需要的 不需要则直接复位发00 需要的发01 2024年7月25日16:35:44 { if (tac.C_IS_RFID == "Y") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 1成功"); } else { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0成功"); } } else if (tac.CtiaMode == "立库") { task.S_TYPE = "入库"; var tra = BLLCreator.Create().WcsCallback(task, state, forkliftNo); } } } } else if (state == 1105) { if (task.S_TYPE == "入库") { var tac = newDb.Queryable().Where(a => a.LocationCode == task.S_START_LOC)?.First(); if (tac != null) { if (tac.CtiaMode == "VMI")//Exitpos4Full { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); // var childA = newDb.GetConnection(tac.host); var GGF = childA.Queryable().OrderBy(st => st.VMI_TO_AGV_DATA, OrderByType.Desc)?.First(); LogHelper.Info("完工回报", $"读安全信号交互表 {JsonConvert.SerializeObject(GGF)}"); if (GGF != null) { if (GGF.AutoMode && !GGF.FatalFault && !GGF.AgvBypass && GGF.ExitPos4Full && !GGF.ExitTrackBusy && GGF.ExitRemovePallet)//123 789 为true { var I = childA.Updateable().SetColumns(it => new BDST_TO_AGV_STATUS() { Handshake = "-" }).Where(e => e.VMI_TO_AGV_DATA == GGF.VMI_TO_AGV_DATA).ExecuteCommand(); if (I == 0) { throw new Exception("读安全信号交互表 更新Handshake字段为 - 失败"); } LogHelper.Info("完工回报", $"读安全信号交互表 更新Handshake字段为 - 成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_FAULT").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_FAULT 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_FAULT 字段为 0成功"); NDCHelper.ChangeParam(no, 1105, 18); } else if (!GGF.ExitPos4Full) { var ta = BLLCreator.CreateSingleton().ExecuteState(task.S_TASK_NO, "取消", logPara, task); if (ta.Success) { var bbt = NDCHelper.Cancel(task.S_TASK_NO);//取消agv任务 } } } else { LogHelper.Info("完工回报", "读安全信号交互表 未获取到数据"); } } } } } else if (state == 1107) { if (task.S_TYPE == "出库") { var tac = newDb.Queryable().Where(a => a.LocationCode == task.S_END_LOC)?.First(); if (tac != null) { if (tac.CtiaMode == "VMI") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var GGF = childA.Queryable().OrderBy(st => st.VMI_TO_AGV_DATA, OrderByType.Desc)?.First(); if (GGF != null) { LogHelper.Info("完工回报", $"读安全信号交互表 {JsonConvert.SerializeObject(GGF)}"); if (GGF.AutoMode && !GGF.FatalFault && !GGF.AgvBypass && !GGF.EntryTrackBusy && GGF.EntryPos1Empty && GGF.EntrySupplyPallet)//123 456 为true { var I = childA.Updateable().SetColumns(it => new BDST_TO_AGV_STATUS() { Handshake = "-" }).Where(e => e.VMI_TO_AGV_DATA == GGF.VMI_TO_AGV_DATA).ExecuteCommand(); if (I == 0) { throw new Exception("读安全信号交互表 更新Handshake字段为 - 失败"); } LogHelper.Info("完工回报", $"读安全信号交互表 更新Handshake字段为 - 成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_FAULT").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_FAULT 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_FAULT 字段为 0成功"); NDCHelper.ChangeParam(no, 1107, 18); } } } } } } else if (state == 1002) { if (task != null)//出库是立库 入库是机台 { if (task.S_TYPE == "入库") { if (task.S_SRC_SYS == "点对点改道") { var tac = newDb.Queryable().Where(a => a.LocationCode == task.S_END_LOC)?.First(); if (tac != null) { if (tac.CtiaMode == "VMI2" && tac.C_IS_RFID == "Y") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var VMI2 = childA.Queryable().OrderBy(st => st.Id, OrderByType.Desc)?.First(); LogHelper.Info("完工回报", $"读安全信号交互表 查 RFIDCheck 字段为 读取到的数据为{JsonConvert.SerializeObject(VMI2)}"); if (VMI2 != null) { if (VMI2.RFIDCheck == 2) { NDCHelper.ChangeParam(task.S_TASK_NO, 60000, 18); var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0成功"); } else if (VMI2.RFIDCheck == 1) { TN_Loc_AbnormalEntitys ent = null; if (task.S_TOOLS_TPYE == "KJZ") { ent = newDb.Queryable().Where(e => e.S_CNTR_CODE == task.S_END_LOC + "-" + task.S_TOOLS_TPYE)?.First(); } else { ent = newDb.Queryable().Where(e => e.S_CNTR_CODE == task.S_TOOLS_TPYE)?.First(); } if (ent == null) { throw new Exception("未维护该工装类型的异常缓存位,请联系管理员"); } if (string.IsNullOrEmpty(ent.S_S_LOC_CODE)) { throw new Exception("维护的异常缓存位数据中缓存位货位码是空值"); } //查询主任务 var Z_Task = newDb.Queryable().Where(e => e.S_TASK_NO == task.S_SRC_NO)?.First(); if (Z_Task == null) { throw new Exception($"未查询到主任务 任务号为{Z_Task}"); } Location Bf = new Location(); int TT = LocationHelper.GetAgvSiteZc(Z_Task.S_END_LOC); if (!string.IsNullOrEmpty(task.S_END_LOC_AGO)) { Bf = LocationHelper.LocationCodeJbw(task.S_END_LOC_AGO); TT = LocationHelper.GetAgvSiteZc(Z_Task.S_END_LOC_AGO); } int[] parms = { TT, LocationHelper.GetAgvSiteZc(ent.S_S_LOC_CODE) }; var endloca = LocationHelper.LocationCodeJbw(ent.S_S_LOC_CODE); try { newDb.BeginTran(); var A = newDb.Updateable().SetColumns(it => new WMSTask() { mark = "Y" }).Where(x => x.S_TASK_NO == task.S_SRC_NO).ExecuteCommand();//主任务 if (string.IsNullOrEmpty(task.S_END_LOC_AGO)) { A = newDb.Updateable().SetColumns(it => new WMSTask() { mark = "Y", S_END_LOC_AGO = task.S_END_LOC, S_START_LOC = Z_Task.S_END_LOC, S_START_LAREA = Z_Task.S_END_LAREA, S_END_LOC = ent.S_S_LOC_CODE, S_END_LAREA = endloca.S_AREA_CODE, S_Subtask = "N" }).Where(x => x.S_TASK_NO == task.S_TASK_NO).ExecuteCommand();//agv任务 RFID异常改道 if (A == 0) { LogHelper.TaskDetail(logPara, "RFID验证:更新任务状态失败"); } } else { A = newDb.Updateable().SetColumns(it => new WMSTask() { mark = "Y", S_START_LOC = task.S_END_LOC_AGO, S_START_LAREA = Bf.S_AREA_CODE, S_END_LOC = ent.S_S_LOC_CODE, S_END_LAREA = endloca.S_AREA_CODE, S_Subtask = "N" }).Where(x => x.S_TASK_NO == task.S_TASK_NO).ExecuteCommand();//agv任务 RFID异常改道 if (A == 0) { LogHelper.TaskDetail(logPara, "RFID验证:更新任务状态失败"); } } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex)); newDb.RollbackTran(); } var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 1成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 1成功"); NDCHelper.ChangeParam(task.S_TASK_NO, parms[0], 1); NDCHelper.ChangeParam(task.S_TASK_NO, parms[1], 2); NDCHelper.ChangeParam(task.S_TASK_NO, 1002, 18); } } else { LogHelper.Info("完工回报", "读安全信号交互表 查 RFIDCheck 字段为空"); } } else if (tac.CtiaMode == "MODBUS" && tac.C_IS_RFID == "Y") { RegisterReadOutPutModel Regis = new RegisterReadOutPutModel(); Regis.host = tac.host; Regis.port = tac.port; Regis.addr = tac.Seleaddr; Regis.dataNum = 6; LogHelper.Info("完工回报", $"MODBUS 读取输出寄存器数据 输入参数{JsonConvert.SerializeObject(Regis)}"); var tra = OITcpHelper.RegisterReadOutPut(Regis); LogHelper.Info("完工回报", $"MODBUS 读取输出寄存器数据 返回参数{JsonConvert.SerializeObject(tra)}"); if (tra != null) { if (tra.result.ToList().Count() > 0) { if (tra.result[5] == 2) { RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr + 2; Register.data = tac.dataNum; LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}"); var ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}"); NDCHelper.ChangeParam(task.S_TASK_NO, 60000, 18); } else if (tra.result[5] == 1) { TN_Loc_AbnormalEntitys ent = null; if (task.S_TOOLS_TPYE == "KJZ") { ent = newDb.Queryable().Where(e => e.S_CNTR_CODE == task.S_END_LOC + "-" + task.S_TOOLS_TPYE)?.First(); } else { ent = newDb.Queryable().Where(e => e.S_CNTR_CODE == task.S_TOOLS_TPYE)?.First(); } if (ent == null) { throw new Exception("未维护该工装类型的异常缓存位,请联系管理员"); } if (string.IsNullOrEmpty(ent.S_S_LOC_CODE)) { throw new Exception("维护的异常缓存位数据中缓存位货位码是空值"); } //查询主任务 var Z_Task = newDb.Queryable().Where(e => e.S_TASK_NO == task.S_SRC_NO)?.First(); if (Z_Task == null) { throw new Exception($"未查询到主任务 任务号为{Z_Task}"); } Location Bf = new Location(); int TT = LocationHelper.GetAgvSiteZc(Z_Task.S_END_LOC); if (!string.IsNullOrEmpty(task.S_END_LOC_AGO)) { Bf = LocationHelper.LocationCodeJbw(task.S_END_LOC_AGO); TT = LocationHelper.GetAgvSiteZc(Z_Task.S_END_LOC_AGO); } int[] parms = { TT, LocationHelper.GetAgvSiteZc(ent.S_S_LOC_CODE) }; var endloca = LocationHelper.LocationCodeJbw(ent.S_S_LOC_CODE); try { newDb.BeginTran(); var A = newDb.Updateable().SetColumns(it => new WMSTask() { mark = "Y" }).Where(x => x.S_TASK_NO == task.S_SRC_NO).ExecuteCommand();//主任务 if (string.IsNullOrEmpty(task.S_END_LOC_AGO)) { A = newDb.Updateable().SetColumns(it => new WMSTask() { mark = "Y", S_END_LOC_AGO = task.S_END_LOC, S_START_LOC = Z_Task.S_END_LOC, S_START_LAREA = Z_Task.S_END_LAREA, S_END_LOC = ent.S_S_LOC_CODE, S_END_LAREA = endloca.S_AREA_CODE, S_Subtask = "N" }).Where(x => x.S_TASK_NO == task.S_TASK_NO).ExecuteCommand();//agv任务 RFID异常改道 if (A == 0) { LogHelper.TaskDetail(logPara, "RFID验证:更新任务状态失败"); } } else { A = newDb.Updateable().SetColumns(it => new WMSTask() { mark = "Y", S_START_LOC = task.S_END_LOC_AGO, S_START_LAREA = Bf.S_AREA_CODE, S_END_LOC = ent.S_S_LOC_CODE, S_END_LAREA = endloca.S_AREA_CODE, S_Subtask = "N" }).Where(x => x.S_TASK_NO == task.S_TASK_NO).ExecuteCommand();//agv任务 RFID异常改道 if (A == 0) { LogHelper.TaskDetail(logPara, "RFID验证:更新任务状态失败"); } } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex)); newDb.RollbackTran(); } NDCHelper.ChangeParam(task.S_TASK_NO, parms[0], 1); NDCHelper.ChangeParam(task.S_TASK_NO, parms[1], 2); NDCHelper.ChangeParam(task.S_TASK_NO, 1002, 18); } } } } } } else { var tac = newDb.Queryable().Where(a => a.S_TASK_NO == task.S_TASK_NO && a.S_ACTION_CODE == "6")?.First(); if (tac != null) { List statetask = new List() { "完成", "取消", "卸货完成" }; if (!statetask.Contains(task.S_B_STATE)) { var ta = BLLCreator.Create().ExecuteState(tac.S_TASK_NO, "卸货完成", logPara, task); } } var taskNo = task.S_TASK_NO; if (taskNo.IndexOf("_") > 0) { var topNo = taskNo.Substring(0, taskNo.IndexOf("_")); var WmsTaskAct = newDb.Queryable().Where(e => e.S_TASK_NO == topNo + "_2" && e.S_EQ_NO == "WCS" && e.S_ACTION_CODE == "4")?.First(); if (WmsTaskAct != null) { WcsTaskState Supplier = JsonConvert.DeserializeObject(WmsTaskAct.S_DATA); if (Supplier.noticeType == "4") { var transportTask = newDb.Queryable().Where(e => e.S_TASK_NO == taskNo)?.First(); var transportTask2 = newDb.Queryable().Where(e => e.S_TASK_NO == topNo + "_2")?.First(); if (transportTask != null) { if (taskNo.IndexOf('_') > 0) { string topNo2 = taskNo.Substring(0, taskNo.IndexOf("_")); var transportTask3 = newDb.Queryable().Where(e => e.S_TASK_NO == topNo)?.First(); if (transportTask.S_TYPE == "入库") { if (Supplier.code == "0") { NDCHelper.ChangeParam(task.S_TASK_NO, 60000, 18); } else if (Supplier.code == "1") { TN_Loc_AbnormalEntitys ent = null; if (task.S_TOOLS_TPYE == "KJZ") { ent = newDb.Queryable().Where(e => e.S_CNTR_CODE == task.S_END_LOC + "-" + transportTask.S_TOOLS_TPYE)?.First(); } else { ent = newDb.Queryable().Where(e => e.S_CNTR_CODE == transportTask.S_TOOLS_TPYE)?.First(); } if (ent == null) { throw new Exception("未维护该工装类型的异常缓存位,请联系管理员"); } if (string.IsNullOrEmpty(ent.S_S_LOC_CODE)) { throw new Exception("维护的异常缓存位数据中缓存位货位码是空值"); } int[] parms = { LocationHelper.GetAgvSiteZc(task.S_Jb_Bit), LocationHelper.GetAgvSiteZc(ent.S_S_LOC_CODE) }; var endloca = LocationHelper.LocationCodeJbw(ent.S_S_LOC_CODE); var ta = BLLCreator.Create().ExecuteState(topNo2 + "_2", "取消", logPara); try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => new WMSTask() { mark = "Y" }).Where(x => x.S_ID == transportTask3.S_ID).ExecuteCommand();//主任务 I = newDb.Updateable().SetColumns(it => new WMSTask() { mark = "Y" }).Where(x => x.S_ID == transportTask2.S_ID).ExecuteCommand();//第二个子任务 I = newDb.Updateable().SetColumns(it => new WMSTask() { mark = "Y", S_START_LOC = task.S_Jb_Bit, S_START_LAREA = task.S_END_LAREA, S_END_LOC = ent.S_S_LOC_CODE, S_END_LAREA = endloca.S_AREA_CODE, S_Subtask = "N" }).Where(x => x.S_ID == transportTask.S_ID).ExecuteCommand();//第一个子任务 if (I == 0) { LogHelper.TaskDetail(logPara, "RFID验证:更新任务状态失败"); } newDb.CommitTran(); NDCHelper.ChangeParam(task.S_TASK_NO, parms[0], 1); NDCHelper.ChangeParam(task.S_TASK_NO, parms[1], 2); NDCHelper.ChangeParam(task.S_TASK_NO, 1002, 18); } catch (Exception ex) { LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex)); newDb.RollbackTran(); } } else { LogHelper.TaskDetail(logPara, "RFID验证:该信号与任务类型不符合"); } } else { LogHelper.TaskDetail(logPara, "RFID验证:该任务不是两段式任务"); } } else { LogHelper.TaskDetail(logPara, "RFID验证:该任务不是两段式任务"); } } } } } else { NDCHelper.ChangeParam(task.S_TASK_NO, 1002, 18); } } } else if (task.S_TYPE == "出库") { var tac = newDb.Queryable().Where(a => a.LocationCode == task.S_END_LOC)?.First(); if (tac != null) { if (tac.CtiaMode == "VMI2" && tac.C_IS_RFID == "Y") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var VMI2 = childA.Queryable().OrderBy(st => st.Id, OrderByType.Desc)?.First(); LogHelper.Info("完工回报", $"读安全信号交互表 查 RFIDCheck 字段为 读取到的数据为{JsonConvert.SerializeObject(VMI2)}"); if (VMI2 != null) { if (VMI2.RFIDCheck == 2) { NDCHelper.ChangeParam(task.S_TASK_NO, 60000, 18); var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0成功"); } else if (VMI2.RFIDCheck == 1) { TN_Loc_AbnormalEntitys ent = null; if (task.S_TOOLS_TPYE == "KJZ") { ent = newDb.Queryable().Where(e => e.S_CNTR_CODE == task.S_END_LOC + "-" + task.S_TOOLS_TPYE)?.First(); } else { ent = newDb.Queryable().Where(e => e.S_CNTR_CODE == task.S_TOOLS_TPYE)?.First(); } if (ent == null) { throw new Exception("未维护该工装类型的异常缓存位,请联系管理员"); } if (string.IsNullOrEmpty(ent.S_S_LOC_CODE)) { throw new Exception("维护的异常缓存位数据中缓存位货位码是空值"); } //查询主任务 var Z_Task = newDb.Queryable().Where(e => e.S_TASK_NO == task.S_SRC_NO)?.First(); if (Z_Task == null) { throw new Exception($"未查询到主任务 任务号为{Z_Task}"); } Location Bf = new Location(); int TT = LocationHelper.GetAgvSiteZc(Z_Task.S_END_LOC); if (!string.IsNullOrEmpty(task.S_END_LOC_AGO)) { Bf = LocationHelper.LocationCodeJbw(task.S_END_LOC_AGO); TT = LocationHelper.GetAgvSiteZc(Z_Task.S_END_LOC_AGO); } int[] parms = { TT, LocationHelper.GetAgvSiteZc(ent.S_S_LOC_CODE) }; var endloca = LocationHelper.LocationCodeJbw(ent.S_S_LOC_CODE); try { newDb.BeginTran(); var A = newDb.Updateable().SetColumns(it => new WMSTask() { mark = "Y" }).Where(x => x.S_TASK_NO == task.S_SRC_NO).ExecuteCommand();//主任务 if (string.IsNullOrEmpty(task.S_END_LOC_AGO)) { A = newDb.Updateable().SetColumns(it => new WMSTask() { mark = "Y", S_END_LOC_AGO = task.S_END_LOC, S_START_LOC = Z_Task.S_END_LOC, S_START_LAREA = Z_Task.S_END_LAREA, S_END_LOC = ent.S_S_LOC_CODE, S_END_LAREA = endloca.S_AREA_CODE, S_Subtask = "N" }).Where(x => x.S_TASK_NO == task.S_TASK_NO).ExecuteCommand();//agv任务 RFID异常改道 if (A == 0) { LogHelper.TaskDetail(logPara, "RFID验证:更新任务状态失败"); } } else { A = newDb.Updateable().SetColumns(it => new WMSTask() { mark = "Y", S_START_LOC = task.S_END_LOC_AGO, S_START_LAREA = Bf.S_AREA_CODE, S_END_LOC = ent.S_S_LOC_CODE, S_END_LAREA = endloca.S_AREA_CODE, S_Subtask = "N" }).Where(x => x.S_TASK_NO == task.S_TASK_NO).ExecuteCommand();//agv任务 RFID异常改道 if (A == 0) { LogHelper.TaskDetail(logPara, "RFID验证:更新任务状态失败"); } } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex)); newDb.RollbackTran(); } var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 1成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 1成功"); NDCHelper.ChangeParam(task.S_TASK_NO, parms[0], 1); NDCHelper.ChangeParam(task.S_TASK_NO, parms[1], 2); NDCHelper.ChangeParam(task.S_TASK_NO, 1002, 18); } } else { LogHelper.Info("完工回报", "读安全信号交互表 查 RFIDCheck 字段为空"); } } else if (tac.CtiaMode == "MODBUS" && tac.C_IS_RFID == "Y") { RegisterReadOutPutModel Regis = new RegisterReadOutPutModel(); Regis.host = tac.host; Regis.port = tac.port; Regis.addr = tac.Seleaddr; Regis.dataNum = 6; LogHelper.Info("完工回报", $"MODBUS 读取输出寄存器数据 输入参数{JsonConvert.SerializeObject(Regis)}"); var tra = OITcpHelper.RegisterReadOutPut(Regis); LogHelper.Info("完工回报", $"MODBUS 读取输出寄存器数据 返回参数{JsonConvert.SerializeObject(tra)}"); if (tra != null) { if (tra.result.ToList().Count() > 0) { if (tra.result[5] == 2) { RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr + 2; Register.data = tac.dataNum; LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}"); var ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}"); NDCHelper.ChangeParam(task.S_TASK_NO, 60000, 18); } else if (tra.result[5] == 1) { TN_Loc_AbnormalEntitys ent = null; if (task.S_TOOLS_TPYE == "KJZ") { ent = newDb.Queryable().Where(e => e.S_CNTR_CODE == task.S_END_LOC + "-" + task.S_TOOLS_TPYE)?.First(); } else { ent = newDb.Queryable().Where(e => e.S_CNTR_CODE == task.S_TOOLS_TPYE)?.First(); } if (ent == null) { throw new Exception("未维护该工装类型的异常缓存位,请联系管理员"); } if (string.IsNullOrEmpty(ent.S_S_LOC_CODE)) { throw new Exception("维护的异常缓存位数据中缓存位货位码是空值"); } //查询主任务 var Z_Task = newDb.Queryable().Where(e => e.S_TASK_NO == task.S_SRC_NO)?.First(); if (Z_Task == null) { throw new Exception($"未查询到主任务 任务号为{Z_Task}"); } Location Bf = new Location(); int TT = LocationHelper.GetAgvSiteZc(Z_Task.S_END_LOC); if (!string.IsNullOrEmpty(task.S_END_LOC_AGO)) { Bf = LocationHelper.LocationCodeJbw(task.S_END_LOC_AGO); TT = LocationHelper.GetAgvSiteZc(Z_Task.S_END_LOC_AGO); } int[] parms = { TT, LocationHelper.GetAgvSiteZc(ent.S_S_LOC_CODE) }; var endloca = LocationHelper.LocationCodeJbw(ent.S_S_LOC_CODE); try { newDb.BeginTran(); var A = newDb.Updateable().SetColumns(it => new WMSTask() { mark = "Y" }).Where(x => x.S_TASK_NO == task.S_SRC_NO).ExecuteCommand();//主任务 if (string.IsNullOrEmpty(task.S_END_LOC_AGO)) { A = newDb.Updateable().SetColumns(it => new WMSTask() { mark = "Y", S_END_LOC_AGO = task.S_END_LOC, S_START_LOC = Z_Task.S_END_LOC, S_START_LAREA = Z_Task.S_END_LAREA, S_END_LOC = ent.S_S_LOC_CODE, S_END_LAREA = endloca.S_AREA_CODE, S_Subtask = "N" }).Where(x => x.S_TASK_NO == task.S_TASK_NO).ExecuteCommand();//agv任务 RFID异常改道 if (A == 0) { LogHelper.TaskDetail(logPara, "RFID验证:更新任务状态失败"); } } else { A = newDb.Updateable().SetColumns(it => new WMSTask() { mark = "Y", S_START_LOC = task.S_END_LOC_AGO, S_START_LAREA = Bf.S_AREA_CODE, S_END_LOC = ent.S_S_LOC_CODE, S_END_LAREA = endloca.S_AREA_CODE, S_Subtask = "N" }).Where(x => x.S_TASK_NO == task.S_TASK_NO).ExecuteCommand();//agv任务 RFID异常改道 if (A == 0) { LogHelper.TaskDetail(logPara, "RFID验证:更新任务状态失败"); } } newDb.CommitTran(); } catch (Exception ex) { LogHelper.TaskDetail(logPara, JsonConvert.SerializeObject(ex)); newDb.RollbackTran(); } NDCHelper.ChangeParam(task.S_TASK_NO, parms[0], 1); NDCHelper.ChangeParam(task.S_TASK_NO, parms[1], 2); NDCHelper.ChangeParam(task.S_TASK_NO, 1002, 18); } } } } } } } } else if (state == 1003) { if (task.S_END_LAREA != "TQRKJBW") { var IsGd = true; var transportTask = newDb.Queryable().Where(e => e.Autoindex == "成型机台")?.First(); List ListString = new List(); if (transportTask != null) { ListString = JsonConvert.DeserializeObject>(transportTask.TypeJson); } if (ListString.Contains(task.S_START_LOC)) { //判断空托满托 var Km = newDb.Queryable().Where(e => e.S_CNTR_CODE == task.S_CNTRS).ToList(); LogHelper.Info("完工回报", $"查询是否有物料 {JsonConvert.SerializeObject(Km)}"); if (Km.Count() == 0) { //到达等待点后查询空托任务缓存表是否有数据 有则改道到线边 否则入库 var transportTask2 = newDb.Queryable().Where(e => e.NeedTrig == "Y" && e.Task_State == "接驳位至线边点对点").ToList(); if (transportTask2.Any()) { //查询第一个 然后再没有生成任务的时候改道 var orTask = transportTask2.OrderBy(e => e.T_CREATE).First(); //查询这个终点所在库区 var EndLocation = newDb.Queryable().Where(e => e.S_LOC_CODE == orTask.Location_To)?.First(); WMSTask ZrwTask = null; if (no.IndexOf('_') > 0) { var tno = no.Substring(0, no.LastIndexOf("_")); ZrwTask = newDb.Queryable().Where(e => e.S_TASK_NO == tno)?.First(); } LogHelper.Info("完工回报", $"查询是否有主任务 {JsonConvert.SerializeObject(ZrwTask)}"); var tac = newDb.Queryable().Where(a => a.LocationCode == EndLocation.S_LOC_CODE)?.First(); try { // 先将原来的货位释放了 newDb.BeginTran(); //更新任务的终点货位 var I = newDb.Updateable().SetColumns(it => new WMSTask { S_END_LOC_AGO = task.S_END_LOC, S_END_LAREA = EndLocation.S_AREA_CODE, S_SRC_SYS = "点对点改道", S_END_LOC = EndLocation.S_LOC_CODE }).Where(x => x.S_ID == task.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("改任务终点失败"); } //改主任务的 if (ZrwTask != null) { I = newDb.Updateable().SetColumns(it => new WMSTask { S_END_LOC_AGO = ZrwTask.S_END_LOC, S_END_LAREA = EndLocation.S_AREA_CODE, S_Subtask = "N", S_END_LOC = EndLocation.S_LOC_CODE }).Where(x => x.S_ID == ZrwTask.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("改主任务终点失败"); } I = newDb.Updateable().SetColumns(it => it.S_LOCK_STATE == "无").Where(x => x.S_LOC_CODE == ZrwTask.S_END_LOC).ExecuteCommand(); if (I == 0) { throw new Exception("终点货位释放失败"); } } //给任务标记为已经生成任务 I = newDb.Updateable().SetColumns(it => new MesKtTaskDto() { NeedTrig = "N" }).Where(x => x.S_ID == orTask.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("改mes任务缓存表失败"); } //然后通知小车改道 if (tac?.CtiaMode == "MODBUS") { if (string.IsNullOrEmpty(tac.host) || tac.port == 0) { LogHelper.Info("完工回报", $"报错:通讯模式配置表货中 货位{EndLocation.S_LOC_CODE} ip地址 写入目标设备的IP端口 有空值或者默认值"); } else { RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr; Register.data = tac.dataNum; var ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}"); LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}"); } } var loca = EndLocation.N_AGV_CODE; NDCHelper.ChangeParam(no, loca, 2); NDCHelper.ChangeParam(no, 0, 4); NDCHelper.ChangeParam(no, 1003, 18); newDb.CommitTran(); IsGd = false; } catch (Exception ex) { newDb.RollbackTran(); LogHelper.DanInfo("完工回报", ex.Message); } } } } if (IsGd) { //需要判断中间的接驳位状态 然后里面的接驳位坏了还能入外侧的接驳位 var SoList = new List() { "TMRKJBW-01", "TMRKJBW-02", "TMRKJBW-03", "TMRKJBW-04", "TMRKJBW-05", "TMRKJBW-06", "TMRKHCW-01", "TMRKHCW-02" }; var ggf = BLLCreator.Create().WcsPositionAvailable(task.S_TASK_NO, SoList); if (ggf.code == "0" && ggf.available?.Count() > 0) { var tno = no.Substring(0, no.LastIndexOf("_")); var ta = newDb.Queryable().Where(e => e.S_TASK_NO == tno)?.First(); var location = newDb.Queryable().Where(a => a.S_LOC_CODE == ta.S_END_LOC).First(); if (ggf.available.Contains(task.S_END_LOC)) { //1 2巷道 if (task.S_END_LOC == "TMRKJBW-03" || task.S_END_LOC == "TMRKJBW-02") { if (ggf.available.Contains("TMRKHCW-01")) { var loca = LocationHelper.GetAgvSiteZc(task.S_END_LOC); NDCHelper.ChangeParam(task.S_TASK_NO, loca, 2); NDCHelper.ChangeParam(no, 1003, 18); } else { //判断主任务的终点货位在那个巷道 如果在1巷道则需要改货位 在2巷道则不用更改 if (location.N_ROADWAY == 1) { AgvUpLo(task, ta, ggf, ggf.available); } else if (location.N_ROADWAY == 2) { //直接入 var loca = LocationHelper.GetAgvSiteZc(task.S_END_LOC); NDCHelper.ChangeParam(task.S_TASK_NO, loca, 2); NDCHelper.ChangeParam(no, 1003, 18); } } } else if (task.S_END_LOC == "TMRKJBW-05" || task.S_END_LOC == "TMRKJBW-06") { //34 巷道 if (ggf.available.Contains("TMRKHCW-02")) { var loca = LocationHelper.GetAgvSiteZc(task.S_END_LOC); NDCHelper.ChangeParam(task.S_TASK_NO, loca, 2); NDCHelper.ChangeParam(no, 1003, 18); } else { //判断主任务的终点货位在那个巷道 如果在1巷道则需要改货位 在2巷道则不用更改 if (location.N_ROADWAY == 4) { AgvUpLo(task, ta, ggf, ggf.available); } else if (location.N_ROADWAY == 3) { //直接入 var loca = LocationHelper.GetAgvSiteZc(task.S_END_LOC); NDCHelper.ChangeParam(task.S_TASK_NO, loca, 2); NDCHelper.ChangeParam(no, 1003, 18); } } } else if (task.S_END_LOC == "TMRKJBW-01" || task.S_END_LOC == "TMRKJBW-04") { var loca = LocationHelper.GetAgvSiteZc(task.S_END_LOC); NDCHelper.ChangeParam(task.S_TASK_NO, loca, 2); NDCHelper.ChangeParam(no, 1003, 18); } } else { //更换货位 AgvUpLo(task, ta, ggf, ggf.available); } } } } else { var IsGd = true; var transportTask = newDb.Queryable().Where(e => e.Autoindex == "胎圈线边_成型机")?.First(); List ListString = new List(); if (transportTask != null) { ListString = JsonConvert.DeserializeObject>(transportTask.TypeJson); } if (ListString.Contains(task.S_START_LOC)) { //判断空托满托 var Km = newDb.Queryable().Where(e => e.S_CNTR_CODE == task.S_CNTRS).ToList(); LogHelper.Info("完工回报", $"查询是否有物料 {JsonConvert.SerializeObject(Km)}"); if (Km.Count() == 0) { //到达等待点后查询空托任务缓存表是否有数据 有则改道到线边 否则入库 var transportTask2 = newDb.Queryable().Where(e => e.NeedTrig == "Y" && e.Task_State == "胎圈空托出库缓存").ToList(); if (transportTask2.Any()) { //查询第一个 然后再没有生成任务的时候改道 var orTask = transportTask2.OrderBy(e => e.T_CREATE).First(); //查询这个终点所在库区 var EndLocation = newDb.Queryable().Where(e => e.S_LOC_CODE == orTask.Location_To)?.First(); WMSTask ZrwTask = null; if (no.IndexOf('_') > 0) { var tno = no.Substring(0, no.LastIndexOf("_")); ZrwTask = newDb.Queryable().Where(e => e.S_TASK_NO == tno)?.First(); } LogHelper.Info("完工回报", $"查询是否有主任务 {JsonConvert.SerializeObject(ZrwTask)}"); var tac = newDb.Queryable().Where(a => a.LocationCode == EndLocation.S_LOC_CODE)?.First(); try { // 先将原来的货位释放了 newDb.BeginTran(); //更新任务的终点货位 var I = newDb.Updateable().SetColumns(it => new WMSTask { S_END_LOC_AGO = task.S_END_LOC, S_END_LAREA = EndLocation.S_AREA_CODE, S_SRC_SYS = "点对点改道", S_END_LOC = EndLocation.S_LOC_CODE }).Where(x => x.S_ID == task.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("改任务终点失败"); } //改主任务的 if (ZrwTask != null) { I = newDb.Updateable().SetColumns(it => new WMSTask { S_END_LOC_AGO = ZrwTask.S_END_LOC, S_END_LAREA = EndLocation.S_AREA_CODE, S_Subtask = "N", S_END_LOC = EndLocation.S_LOC_CODE }).Where(x => x.S_ID == ZrwTask.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("改主任务终点失败"); } I = newDb.Updateable().SetColumns(it => it.S_LOCK_STATE == "无").Where(x => x.S_LOC_CODE == ZrwTask.S_END_LOC).ExecuteCommand(); if (I == 0) { throw new Exception("终点货位释放失败"); } } //给任务标记为已经生成任务 I = newDb.Updateable().SetColumns(it => new MesKtTaskDto() { NeedTrig = "N" }).Where(x => x.S_ID == orTask.S_ID).ExecuteCommand(); if (I == 0) { throw new Exception("改mes任务缓存表失败"); } //然后通知小车改道 if (tac?.CtiaMode == "MODBUS") { if (string.IsNullOrEmpty(tac.host) || tac.port == 0) { LogHelper.Info("完工回报", $"报错:通讯模式配置表货中 货位{EndLocation.S_LOC_CODE} ip地址 写入目标设备的IP端口 有空值或者默认值"); } else { RegisterWriteOutPutModel Register = new RegisterWriteOutPutModel(); Register.host = tac.host; Register.port = tac.port; Register.addr = tac.addr; Register.data = tac.dataNum; var ta = OITcpHelper.RegisterWriteOutPut(Register); LogHelper.Info("完工回报", $"MODBUS 发送参数{JsonConvert.SerializeObject(Register)}"); LogHelper.Info("完工回报", $"MODBUS 返回参数{JsonConvert.SerializeObject(ta)}"); } } var loca = EndLocation.N_AGV_CODE; NDCHelper.ChangeParam(no, loca, 2); // NDCHelper.ChangeParam(no, 0, 4); NDCHelper.ChangeParam(no, 1003, 18); newDb.CommitTran(); IsGd = false; } catch (Exception ex) { newDb.RollbackTran(); LogHelper.DanInfo("完工回报", ex.Message); } } } } if (IsGd) { //需要判断中间的接驳位状态 然后里面的接驳位坏了还能入外侧的接驳位 var SoList = new List { "TQRKJBW-01", "TQRKJBW-02", "TQRKJBW-03", "TQRKJBW-04", "TQRKJBW-05", "TQRKJBW-06" }; var ggf = BLLCreator.Create().WcsPositionAvailable(task.S_TASK_NO, SoList); if (ggf.code == "0" && ggf.available?.Count() > 0) { var tno = no.Substring(0, no.LastIndexOf("_")); var ta = newDb.Queryable().Where(e => e.S_TASK_NO == tno)?.First(); var location = newDb.Queryable().Where(a => a.S_LOC_CODE == ta.S_END_LOC).First(); if (ggf.available.Contains(task.S_END_LOC)) { var loca = LocationHelper.GetAgvSiteZc(task.S_END_LOC); NDCHelper.ChangeParam(task.S_TASK_NO, loca, 2); NDCHelper.ChangeParam(no, 1003, 18); } else { //更换货位 AgvUpLo(task, ta, ggf, ggf.available); } } } } } else if (state == 5)//开始卸货 { var tac = newDb.Queryable().Where(a => a.LocationCode == task.S_END_LOC)?.First(); //12 1 13 0 if (tac != null && tac.CtiaMode == "VMI") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_ENTRY_SUPP_ACTIVE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_ENTRY_SUPP_ACTIVE 字段为 1成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_ENTRY_TRANSF_DONE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_ENTRY_TRANSF_DONE 字段为 0成功"); } else if (tac != null && tac.CtiaMode == "VMI2") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 1成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0成功"); } } else if (state == 3)//开始取货 { //14 1 15 0 var tac = newDb.Queryable().Where(a => a.LocationCode == task.S_START_LOC)?.First(); if (tac != null && tac.CtiaMode == "VMI") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_EXIT_REMOVE_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_EXIT_REMOVE_ACTIVE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_EXIT_REMOVE_ACTIVE 字段为 1成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_EXIT_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_EXIT_TRANSF_DONE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_EXIT_TRANSF_DONE 字段为 0成功"); } if (tac != null && tac.CtiaMode == "VMI2") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); if (task.S_TYPE == "出库") { var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 1成功"); } else { var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_EXIT_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_EXIT_TRANSF_DONE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_EXIT_TRANSF_DONE 字段为 0成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_EXIT_RETR_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_EXIT_RETR_ACTIVE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_EXIT_RETR_ACTIVE 字段为 1成功"); } } } else if (state == 4) { if (task.S_TYPE == "入库") { var tac = newDb.Queryable().Where(a => a.LocationCode == task.S_START_LOC)?.First(); if (tac != null && tac.CtiaMode == "VMI") { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_EXIT_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_EXIT_TRANSF_DONE 字段为 1失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BDST_EXIT_TRANSF_DONE 字段为 1成功"); } } } else if (state == 7) { var tac = newDb.Queryable().Where(a => a.LocationCode == task.S_END_LOC)?.First(); if (tac != null && tac.CtiaMode == "VMI2") { var tacList = newDb.Queryable().Where(a => a.S_TASK_NO == task.S_TASK_NO).ToList(); var ActList = tacList.OrderBy(e => e.T_CREATE).ToList(); if (ActList.Find(e => e.S_ACTION_CODE == "5") != null && ActList.Find(e => e.S_ACTION_CODE == "2") == null) { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_TRANSF_DONE 字段为 0成功"); I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BAST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0失败"); } LogHelper.Info("完工回报", "写安全信号交互表 IMES_AGV_BAST_ENTRY_SUPP_ACTIVE 字段为 0成功"); } } else if (tac != null && tac.CtiaMode == "VMI") { if (task.S_NOTE == "agv任务") { if (task.S_TYPE == "入库") { var tacList = newDb.Queryable().Where(a => a.S_TASK_NO == task.S_TASK_NO).ToList(); var ActList = tacList.OrderBy(e => e.T_CREATE).ToList(); var ggfbool = false; if (ActList.Find(e => e.S_ACTION_CODE == "5") != null && ActList.Find(e => e.S_ACTION_CODE == "1104") == null) { ggfbool = true; } if (ActList.Find(e => e.S_ACTION_CODE == "3") != null && ActList.Find(e => e.S_ACTION_CODE == "1102") == null) { ggfbool = true; } if (ggfbool) { var Alone = newDb.Queryable().Where(e => e.ConfigId == tac.host)?.First(); if (Alone == null) { throw new Exception($"未查询到对应的VMI ConfigId为 {tac.host} 的数据库连接字符串"); } var childA = new SqlHelper().GetInstance(Alone.ConnectionString); var GGF = childA.Queryable().OrderBy(st => st.VMI_TO_AGV_DATA, OrderByType.Desc)?.First(); var GGF2 = childA.Queryable()?.First(); LogHelper.Info("完工回报", $"读安全信号交互表 {JsonConvert.SerializeObject(GGF)}"); if (GGF != null) { var I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "0", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_ENTRY_SUPP_ACTIVE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_ENTRY_SUPP_ACTIVE 字段为 0失败"); } I = childA.Updateable().SetColumns(it => new DATA_TO_HMI() { Value = "1", Handshake = "U" }).Where(e => e.TagName == "IMES_AGV_BDST_ENTRY_TRANSF_DONE").ExecuteCommand(); if (I == 0) { throw new Exception("写安全信号交互表 IMES_AGV_BDST_ENTRY_TRANSF_DONE 字段为 0失败"); } } } } } } } } catch (Exception ex) { LogHelper.DanInfo("完工回报", "安全交互 报错:" + ex.Message); } } public static OperateResult AgvUpLo(WMSTask task, WMSTask Ztask, WcsReturnEntityTwo ggf, List Jbw, bool Isfo = true) { var chi = new SqlHelper().GetInstance(); var RowLocation = new List(); List Roadway2 = new List(); OperateResult result1 = OperateResult.Error(); var newDb = chi.CopyNew(); var Jbwd = ""; try { var result = OperateResult.Succeed(); var endIsCurrentTask = newDb.Queryable().Where(e => e.S_LOC_CODE == task.S_END_LOC)?.First(); //获取辅助表中的数据 var Subs = Expressionable.Create(); Subs.And(it => it.S_WH_CODE == endIsCurrentTask.S_WH_CODE); Subs.And(it => it.S_AREA_CODE == Ztask.S_END_LAREA); Subs.And(it => it.S_FlowNo == Ztask.S_FlowNo); Subs.And(it => it.S_IS_IN_OUT == "入库"); var Subsidiary = newDb.Queryable().Where(Subs.ToExpression()).ToList(); LogHelper.DanInfo("入库改道", "改道开始"); LogHelper.DanInfo("入库改道", $"立库允许进入的接驳位为{JsonConvert.SerializeObject(ggf.available)}"); if (!ggf.available.Contains("TMRKHCW-02") && !ggf.available.Contains("TMRKJBW-04")) { Subsidiary.RemoveAll(e => e.N_ROADWAY == 4); LogHelper.DanInfo("入库改道", $"排除巷道4"); } if (!ggf.available.Contains("TMRKHCW-01") && !ggf.available.Contains("TMRKJBW-01")) { Subsidiary.RemoveAll(e => e.N_ROADWAY == 1); LogHelper.DanInfo("入库改道", $"排除巷道1"); } var jjk = Subsidiary.GroupBy(e => e.N_ROADWAY).Select(f => f.First()).ToList(); foreach (var item in ggf.available) { var hhh = jjk.Find(e => e.S_CONNECTION == item); LogHelper.DanInfo("入库改道", $"查询是否有立库允许且辅助表中存在的接驳位对应的巷道"); if (hhh != null) { Roadway2.Add(hhh.N_ROADWAY.ToString()); } } //foreach (var item in jjk) //{ // Roadway2.Add(item.N_ROADWAY.ToString()); //} List clas = new List() { new areaPriorClass { areaCode=Ztask.S_END_LAREA, Prior=0, S_FlowNo=Ztask.S_FlowNo } }; var aEntity = new InAssignEntity() { objectType = InAssignEntity.ObjectType.托盘, objectCode = task.S_CNTRS, lstAreaPrior = clas, projectCode = "", logicAreaCode = task.S_TOOLS_TPYE, stockCode = endIsCurrentTask.S_WH_CODE, S_Roadway = Roadway2, IsChangeBit = 1, needCalLock = true }; //根据库区获取货位 InAssignResultEntity resultEntity = BLLCreator.Create().InAssign(aEntity); if (resultEntity.Success) { RowLocation.Add(resultEntity.locationCode); //查接驳位的所在的巷道 var location = newDb.Queryable().Where(a => a.S_LOC_CODE == resultEntity.locationCode).First(); LogHelper.DanInfo("入库改道", $"查接驳位的所在的巷道"); //从辅助表里拿接驳位 var jbwl = Subsidiary.Find(e => e.N_ROADWAY == location.N_ROADWAY); var gjj = jbwl.S_CONNECTION.Split(',').ToList(); LogHelper.DanInfo("入库改道", $"查接驳位的所在的巷道接驳位为:{JsonConvert.SerializeObject(gjj)}"); foreach (var item in gjj) { if (ggf.available.Contains(item)) { Jbwd = item; LogHelper.DanInfo("入库改道", $"从辅助表里拿接驳位{Jbwd}"); } } if (string.IsNullOrEmpty(Jbwd)) { LogHelper.DanInfo("入库改道", $"没有找到合适的入库接驳位"); return OperateResult.Error("没有找到合适的入库接驳位"); } newDb.BeginTran(); try { var B = 0; if (task.S_END_LOC != Jbwd) { B = newDb.Updateable().SetColumns(it => new WMSTask { S_END_LOC_AGO = task.S_END_LOC, S_END_LOC = Jbwd, S_Jb_Bit = Jbwd }).Where(x => x.S_TASK_NO == task.S_TASK_NO).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("子任务--任务表更新失败"); } } if (task.S_TASK_NO.IndexOf('_') > 0)//更改主任务终点货位 { B = newDb.Updateable().SetColumns(it => new WMSTask { S_END_LOC_AGO = Ztask.S_END_LOC, S_END_LOC = resultEntity.locationCode, S_Jb_Bit = Jbwd }).Where(x => x.S_TASK_NO == Ztask.S_TASK_NO).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("主任务--任务表更新失败"); } } B = newDb.Updateable().SetColumns(it => new Location { S_LOCK_STATE = "无" }).Where(x => x.S_LOC_CODE == Ztask.S_END_LOC).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("原先的货位解锁失败"); } newDb.CommitTran(); result1 = OperateResult.Succeed(); var loca = LocationHelper.GetAgvSiteZc(Jbwd); NDCHelper.ChangeParam(task.S_TASK_NO, loca, 2); NDCHelper.ChangeParam(task.S_TASK_NO, 1003, 18); } catch (Exception ex) { newDb.RollbackTran(); LogHelper.Info("更换终点", "报错--" + ex.Message); } } if (!result1.Success) { if (RowLocation.Count() > 0) { newDb.BeginTran(); try { var B = newDb.Updateable().SetColumns(it => new Location { S_LOCK_STATE = "无" }).Where(x => x.S_LOC_CODE == resultEntity.locationCode).ExecuteCommand(); if (B == 0) { newDb.RollbackTran(); throw new Exception("原先的货位解锁失败"); } newDb.CommitTran(); } catch (Exception ex) { newDb.RollbackTran(); LogHelper.DanInfo("入库改道", $"回滚锁定的货位失败 货位码为{resultEntity.locationCode}--" + ex.Message); } } } return result; } catch (Exception ex) { LogHelper.DanInfo("入库改道", $"抛出异常:{ex.Message}"); return OperateResult.Error(ex.Message); } } public static int[] ConvertStringToIntArray(string input) { string[] stringArray = input.Split(','); int[] intArray = Array.ConvertAll(stringArray, int.Parse); return intArray; } /// /// 任务拦截 /// /// /// internal static bool Intercept(WMSTask mst) { var result = false; //出库任务是批量生成的,初始终点我们先给一个虚拟点,不推送。有单独的现场去判断出库缓存区光电,空了再给出库任务分配终点 //string state = mst.S_B_STATE.Trim(); //var list = TaskHelper.GetTaskListByState("y"); if (mst.S_END_LOC.Trim() == "出库虚拟点") { result = true; } return result; } /// /// 任务状态更新处理 /// /// /// internal static void OperateStatus(WMSTask mst, int state) { if (state == 4) { CacheBitUpdate(mst, true); } if (state == 6)//卸货完成 { CacheBitUpdate(mst, false); } if (state == 7) { //List loc = new List { mst.S_START_LOC }; //var loction = LocationHelper.GetLocListAny(loc).FirstOrDefault(); //var locList = LocationHelper.GetLocListCol(loction.N_COL); //var minLocList = locList.FindAll(e => e.N_COL < loction.N_COL && e.S_LOCK_STATE != "无").ToList(); //foreach (var item in minLocList) //{ // List list1 = new List { "未执行", "待推送" }; // var wmsTask = TaskHelper.GetTaskLocation(loction.S_LOC_CODE, list1); // if (wmsTask != null) // CacheBitCancelUpdate(wmsTask); // LogHelper.CompInfo("完工回报--取消 当前排任务取消时同时取消后排任务:" + wmsTask.S_TASK_NO); //} CacheBitCancelUpdate(mst); } } private static object locLocker = new object(); /// /// 堆叠库区出入库任务申请 /// /// /// /// /// /// /// /// /// internal static bool ApplyWMSTask(Location ls, ref List cntrs, string area, string itemCode, string itemBatch, string taskType, bool insStock = true) { var result = false; lock (locLocker) { try { if (insStock) { Console.WriteLine($"MoboxHelperCreateTask: {area}-{itemCode}-{itemBatch}-{taskType}"); var endLocation = IntensiveArea.GetLocation4In(area, itemCode, itemBatch, 3); if (endLocation != null) { var endLayer = endLocation.N_CURRENT_NUM == 0 ? 1 : 2; var taskNo = DateTime.Now.Ticks.ToString(); result = TaskProcess.CreateTransport(ls.S_LOC_CODE, endLocation.S_LOC_CODE, taskType, cntrs, 1, endLayer, 3, 70); } else { Console.WriteLine($"MoboxHelperCreateTask: 未找到终点货位"); } } else { var startLocation = IntensiveArea.GetLocation4Out(area, itemCode, itemBatch, 3); if (startLocation != null) { var startLayer = startLocation.N_CURRENT_NUM <= 3 ? 1 : 2; var taskNo = DateTime.Now.Ticks.ToString(); var carryCount = startLocation.N_CURRENT_NUM > 3 ? startLocation.N_CURRENT_NUM - 3 : startLocation.N_CURRENT_NUM; //出库要从起点获取托盘 var cntrList = LocationHelper.GetLocCntr(startLocation.S_LOC_CODE); if (cntrList.Count == startLocation.N_CURRENT_NUM) { cntrs = cntrList.OrderByDescending(a => a.T_CREATE).Take(carryCount).Select(a => a.S_CNTR_CODE.Trim()).ToList(); result = TaskProcess.CreateTransport(startLocation.S_LOC_CODE, ls.S_LOC_CODE, taskType, cntrs, startLayer, 1, carryCount, 65); } else { Console.WriteLine($"起点托盘数量和货位容器表不符合,请检查【货位表】和【货位容器表】"); } } } } catch (Exception ex) { Console.WriteLine("MoboxHelperCreateTask:" + ex.Message); LogHelper.Error("MoboxHelperCreateTask:" + ex.Message, ex); } } return result; } /// /// 普通货架区的出入库申请 /// /// /// /// /// /// /// /// internal static bool ApplyNormalWMSTask(Location ls, ref List cntrs, string area, string taskType, string itemCode, bool insStock = true) { var result = false; lock (locLocker) { try { if (insStock) { Console.WriteLine($"MoboxHelperCreateTask: {area}-{taskType}"); var endLocation = NormalArea.GetLocation4In(area); if (endLocation != null) { var taskNo = DateTime.Now.Ticks.ToString(); result = TaskProcess.CreateTransport(ls.S_LOC_CODE, endLocation.S_LOC_CODE, taskType, cntrs, 70); } else { Console.WriteLine($"MoboxHelperCreateTask: 未找到终点货位"); } } else { var startLocation = NormalArea.GetLocation4Out(area, itemCode); if (startLocation != null) { //出库要从起点获取托盘 var cntrList = LocationHelper.GetLocCntr(startLocation.S_LOC_CODE); if (cntrList.Count == startLocation.N_CURRENT_NUM) { result = TaskProcess.CreateTransport(startLocation.S_LOC_CODE, ls.S_LOC_CODE, taskType, new List { cntrList[0].S_CNTR_CODE }, 65); } else { Console.WriteLine($"起点托盘数量和货位容器表不符合,请检查【货位表】和【货位容器表】"); } } } } catch (Exception ex) { Console.WriteLine("MoboxHelperCreateTask:" + ex.Message); LogHelper.Error("MoboxHelperCreateTask:" + ex.Message, ex); } } return result; } /// /// 推送任务 /// /// internal static bool SendTask(WMSTask mst) { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { var result = false; var start = 0; var end = 0; var taskType = mst.S_TYPE.Trim(); var taskState = mst.S_B_STATE.Trim(); if (taskState == "未执行" || taskState == "待推送") { var dic = new Dictionary(); var dic1 = new Dictionary(); LogHelper.Info("NDC", $"agv任务号:{mst.S_TASK_NO}"); LogHelper.Info("NDC", $"agv任务起点:{mst.S_START_LOC}"); start = LocationHelper.GetAgvSiteZc(mst.S_START_LOC); var transportTask = newDb.Queryable().Where(e => e.Autoindex == "特殊流程站点")?.First(); if (transportTask != null) { var ListString = JsonConvert.DeserializeObject(transportTask.TypeJson); if (ListString != null && ListString.LocationCode != null && ListString.EndAreaCode != null && ListString.LocationCode.Contains(mst.S_START_LOC) && ListString.EndAreaCode.Contains(mst.S_END_LAREA)) { start = LocationHelper.GetAgvSiteZc2(mst.S_START_LOC); } } LogHelper.Info("NDC", $"agv 查询的站点(起点):{start}"); LogHelper.Info("NDC", $"agv任务终点:{mst.S_END_LOC}"); end = LocationHelper.GetAgvSiteZc(mst.S_END_LOC); LogHelper.Info("NDC", $"agv 查询的站点(终点):{end}"); Console.WriteLine($"SendTask {mst.S_TASK_NO}"); Console.WriteLine("start=" + start); Console.WriteLine("end= " + end); dic.Add("Pri", mst.N_PRIORITY.ToString());//优先级 dic.Add("No", mst.S_TASK_NO.Trim()); dic1.Add("From", start.ToString());//起点 dic1.Add("To", end.ToString());//终点 dic1.Add("Func", "0"); if (mst.S_TYPE == "入库") { dic1.Add("Data", "768"); //特殊货位不需要安全请求 } else { var tac = newDb.Queryable().Where(a => a.LocationCode == mst.S_END_LOC)?.First(); if (tac != null && tac.C_IS_RFID == "Y") { dic1.Add("Data", "768"); } else { dic1.Add("Data", "0"); } } var res = NDC.OrderAdd(1, dic, dic1); if (res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009)) { //推送成功,修改任务优先级 TaskHelper.UpdateStatus(mst, "已推送"); result = true; } } else { result = true; } return result; } catch (Exception ex) { LogHelper.Info("NDC", $"异常:{ex.Message}"); return false; } } /// /// 天目系统 推送任务 /// /// /// internal static bool TMSendTask(WMSTask mst) { var result = false; var start = 0; var end = 0; var taskType = mst.S_TYPE.Trim(); var taskState = mst.S_B_STATE.Trim(); if (taskState == "未执行" || taskState == "待推送") { start = LocationHelper.GetAgvSite(mst.S_START_LOC); end = LocationHelper.GetAgvSite(mst.S_END_LOC); LogHelper.Info($"SendTask {mst.S_TASK_NO}"); LogHelper.Info("start=" + start); LogHelper.Info("end= " + end); var res = TmToAGV.GetIO(mst, start, end); if (res != null && (res.success)) { //推送成功,修改任务优先级 TaskHelper.UpdateStatusHg(mst, "已推送", res.data); result = true; } } else { result = true; } return result; } /// /// 查询任务当前状态--天目 /// /// /// internal static TmreturnData SeTaskTm(string TaskNo) { return TmToAGV.SeleState(TaskNo); } /// /// 创建搬运任务 /// /// /// /// /// /// /// /// /// /// public static bool CreateTransport(string start, string end, string taskType, List cntrs, int startLayer, int endLayer, int trayCarryCount = 1, int priority = 1) { var result = false; //批次号存托盘号,1~3个托盘 var trayCodes = string.Join(",", cntrs); //var trayCodes = ""; var taskNo = DateTime.Now.Ticks.ToString(); var res = TaskHelper.CreateTask(taskNo, start.Trim(), end.Trim(), taskType, priority, trayCodes, trayCarryCount, startLayer, endLayer); if (res) { result = true; //任务创建成功,起点货位出库锁定,终点货位入库锁定 LocationHelper.LockLoc(start, "出库锁"); LocationHelper.LockLoc(end, "入库锁"); if (taskType.Contains("-电梯")) { var elevatorTaskInfo = new ElevatorTaskInfo() { actionType = taskType == "满托-电梯" ? 1 : 2, elevatorCacheBit = "", start = start, end = end, sourceNo = taskNo, count = trayCarryCount, trayCode = trayCodes }; WCSHelper.AddElevatorTaskInfo(elevatorTaskInfo); } } return result; } public static bool CreateTransport(string start, string end, string taskType, List cntrs, int priority = 1) { var result = false; //批次号存托盘号,1~3个托盘 var trayCodes = string.Join(",", cntrs); var taskNo = DateTime.Now.Ticks.ToString(); var res = TaskHelper.CreateTask(taskNo, start.Trim(), end.Trim(), taskType, priority, trayCodes, 1, 1, 1); if (res) { result = true; LocationHelper.LockLoc(start, "出库锁"); LocationHelper.LockLoc(end, "入库锁"); } return result; } #endregion } public class TmreturnData { public bool success { get; set; } public string error_code { get; set; } public string msg { get; set; } public Tmr data { get; set; } public bool finished { get; set; } } public class Tmr { /// /// Ts定单 /// public string tsOrderIndex { get; set; } /// /// 任务号 /// public string tsOrderNo { get; set; } public int priority { get; set; } /// /// Ts定单状态 /// public string tsOrderState { get; set; } public string processingVehicle { get; set; } public DateTime? credtedTime { get; set; } public DateTime? finishedTime { get; set; } public List destinations { get; set; } } }