using HH.WCS.JingyuNongfu.device; using HH.WCS.JingyuNongfu.dispatch; using HH.WCS.JingyuNongfu.util; using HH.WCS.JingyuNongfu.wms; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using SqlSugar; using System.Security.Policy; using Newtonsoft.Json; namespace HH.WCS.JingyuNongfu.process { /// /// 设备信号处理 /// internal class DeviceProcess { private static Dictionary times = new Dictionary(); private static Dictionary LineState = new Dictionary(); public class statemodel { public int status { get; set; } public int Zf { get; set; } public DateTime modify { get; set; } } internal static void Analysis(string data, string ip) { if (data.Length >= 6) { //去掉消息头3F 00 string xh = data; data = data.Substring(4); //Console.WriteLine($"{ip}-{data}"); var plc = Settings.deviceInfos.Where(a => a.address == ip && a.enable == 1).ToList(); foreach (var item in plc) { if (plc != null) { if (item.enable == 1) { if (item.deviceType == 1) { AnalysisDoor(xh, data, item); } else if (item.deviceType == 2) { AnalysisPgFdj(xh, data, item); } else if (item.deviceType == 3)//一期二期瓶坯翻斗机 { AnalysisPpFdj(data, item); } else if (item.deviceType == 4) { AnalysisPpZsj(data, item); } else if (item.deviceType == 5) { AnalysisCp(data, item); } else if (item.deviceType == 6) { DingShengji(data, item); } else if (item.deviceType == 8) { AnalysisPgZsj(data, item); } LogHelper.Info($"接收信号:{xh},地址:{item.address}", "信号"); } } else { Console.WriteLine($"TCP信号处理:未查询到IP为{ip}的数据,请检查deviceInfo配置中心是否存在该IP的数据!"); } } } } #region 复位信号 internal static void QuLiao(WMSTask mst, bool v) { try { LogHelper.Info("取料任务信息 Request:" + JsonConvert.SerializeObject(mst), "HosttoagvTask"); var info = Settings.deviceInfos.Where(a => a.location.Contains(mst.S_START_LOC)).FirstOrDefault(); if (info != null) { LogHelper.Info($"安全交互开始 任务号={mst.S_TASK_NO}", "安全请求"); LogHelper.Info($"安全交互开始 设备名={info.deviceName},设备编码={info.deviceType}", "安全请求"); if (v) { if (LineState.Keys.Contains(mst.S_START_LOC.Trim())) { LogHelper.Info($"查询输送线允许取满信号 允许取满信号={LineState[mst.S_START_LOC.Trim()].status} 时间间隔={DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds}", "安全交互"); // var xh = LineState[mst.S_START_LOC.Trim()].status.ToString().Substring(0, 4); // Console.WriteLine($"xh:{xh}"); if (info.deviceName.Contains("翻斗机")) { LogHelper.Info($"翻斗机1101安全流程判断:", "安全请求"); //翻斗机 if (info.deviceName.Contains("瓶盖")) { if (LineState[mst.S_START_LOC.Trim()].status.ToString().Substring(0, 6) == "112100" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10) { NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1101, 18); //PlcHelper.SendHex(info.address, "3F0012210D0A"); LogHelper.Info($"瓶盖翻斗机安全交互1101成功", "安全请求"); } else { Console.WriteLine("1101发送信号为flase"); } } else { if (LineState[mst.S_START_LOC.Trim()].status.ToString().Substring(0, 6) == "112200" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10) { NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1101, 18); PlcHelper.SendHex(info.address, "3F0012210D0A"); LogHelper.Info($"瓶胚翻斗机安全交互1101成功", "安全请求"); } else { Console.WriteLine("1101发送信号为flase"); } } } //顶升机 else if (info.deviceType == 6) { LogHelper.Info($"顶升机1101安全流程判断:", "安全请求"); LogHelper.Info($"顶升机1101信号:{LineState[mst.S_START_LOC.Trim()].status.ToString()}", "安全请求"); if (mst.S_TYPE == "顶升机废料下线") { if (LineState[mst.S_START_LOC.Trim()].status.ToString().Substring(0, 6) == "112030" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10) { NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1101, 18); PlcHelper.SendHex(info.address, "3F00110D0A"); LogHelper.Info($"成功安全交互1101成功", "安全请求"); } } else if (mst.S_TYPE == "顶升机空托下线") { if (LineState[mst.S_START_LOC.Trim()].status.ToString().Substring(0, 6) == "102130" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10) { NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1101, 18); PlcHelper.SendHex(info.address, "3F00110D0A"); LogHelper.Info($"成功安全交互1101成功", "安全请求"); } } else if (mst.S_TYPE == "顶升机留样品下线") { if (LineState[mst.S_START_LOC.Trim()].status.ToString().Substring(0, 6) == "102031" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10) { NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1101, 18); PlcHelper.SendHex(info.address, "3F00110D0A"); LogHelper.Info($"成功安全交互1101成功", "安全请求"); } } else { LogHelper.Info($"顶升机信号 {LineState[mst.S_END_LOC.Trim()].status.ToString().Substring(0, 6)}", "安全请求"); } } else if (info.deviceType == 5) { LogHelper.Info($"成品1101安全流程判断:", "安全请求"); if (info.deviceName.Trim() == "靖宇成品仓E11输送线") { //E11成品 if (LineState[mst.S_START_LOC.Trim()].status.ToString().Substring(0, 2) == "11" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10) { NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1101, 18); PlcHelper.SendHex(info.address, "3F00110D0A"); // LogHelper.Info($"取料发送3F00110D0A"); LogHelper.Info($"成品安全交互1101成功", "安全请求"); } } else if (info.deviceName.Trim() == "靖宇成品仓E12输送线") { //E12成品 if (LineState[mst.S_START_LOC.Trim()].status.ToString().Substring(2, 2) == "21" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10) { NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1101, 18); PlcHelper.SendHex(info.address, "3F00210D0A"); LogHelper.Info($"成品安全交互1101成功", "安全请求"); } } else { if (LineState[mst.S_START_LOC.Trim()].status.ToString().Substring(0, 4) == "1220" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10) { NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1101, 18); PlcHelper.SendHex(info.address, "3F00110D0A"); LogHelper.Info($"成品安全交互1101成功", "安全请求"); } } } //注塑机 else if (info.deviceType == 4) { LogHelper.Info($"注塑1101安全流程判断:信号{LineState[mst.S_START_LOC.Trim()].status}", "安全请求"); if (LineState[mst.S_START_LOC.Trim()].status.ToString().Substring(0, 2) == "11" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10) { if (LineState[mst.S_START_LOC.Trim()].status.ToString().Substring(4, 2) == "01") { NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1101, 18); // PlcHelper.SendHex(info.address, "3F00110D0A"); // LogHelper.Info($"取料发送3F00110D0A"); LogHelper.Info($"注塑机安全交互1101成功", "安全请求"); } } else if ((LineState[mst.S_START_LOC.Trim()].status.ToString().Substring(2, 2) == "21" && DateTime.Now.Subtract(LineState[mst.S_START_LOC.Trim()].modify).TotalSeconds < 10)) { if (LineState[mst.S_START_LOC.Trim()].status.ToString().Substring(6, 2) == "02") { NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1101, 18); // PlcHelper.SendHex(info.address, "3F00110D0A"); // LogHelper.Info($"取料发送3F00110D0A"); LogHelper.Info($"注塑机安全交互1101成功", "安全请求"); } } } else { Console.WriteLine("1101发送信号为flase"); } } else { LogHelper.Info("LineState.Keys.Contains(mst.S_START_LOC.Trim())flase", "安全请求"); } } else { if (info.deviceName.Trim() == "靖宇成品仓E12输送线") { PlcHelper.SendHex(info.address, "3F00200D0A"); LogHelper.Info($"成品安全交互1102成功", "安全请求"); } else if (info.deviceName.Contains("翻斗机")) { if (info.deviceName.Contains("瓶盖")) { } else { PlcHelper.SendHex(info.address, "3F0010200D0A"); LogHelper.Info($"瓶胚翻斗机安全交互1102成功", "安全请求"); } } else if (info.deviceType == 6) { PlcHelper.SendHex(info.address, "3F00100D0A"); LogHelper.Info($"顶升机安全交互1102成功", "安全请求"); } else if (info.deviceType == 5) { PlcHelper.SendHex(info.address, "3F00100D0A"); LogHelper.Info($"成品安全交互1102成功", "安全请求"); } } } else { LogHelper.Info($"任务号 {mst.S_TASK_NO} 找不到起点{mst.S_START_LOC} 对应的IP配置文件", "安全请求"); } } catch (Exception ex) { Console.WriteLine(ex.Message); LogHelper.Info($"取料异常{ex.Message}", "安全请求"); } } internal static void Xieliao(WMSTask mst, bool v = false) { try { LogHelper.Info("卸料任务信息 Request:" + JsonConvert.SerializeObject(mst), "HosttoagvTask"); var info = Settings.deviceInfos.Where(a => a.location.Contains(mst.S_END_LOC)).FirstOrDefault(); if (info != null) { LogHelper.Info($"安全交互开始 任务号={mst.S_TASK_NO}", "安全交互"); if (v) { if (LineState.Keys.Contains(mst.S_END_LOC.Trim())) { LogHelper.Info($"查询输送线允许补空信号 允许补空信号={LineState[mst.S_END_LOC.Trim()].status} 时间间隔={DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds}", "安全交互"); if (info.deviceName.Contains("翻斗机")) { //瓶坯翻斗机 if (info.deviceName.Contains("瓶盖")) { if (LineState[mst.S_END_LOC.Trim()].status.ToString().Substring(0, 6) == "112100" && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10) { NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1103, 18); //PlcHelper.SendHex(info.address, "3F0012210D0A"); LogHelper.Info($"瓶盖翻斗机安全交互1103成功", "安全请求"); } else { Console.WriteLine("1103发送信号为flase"); } } else { if (LineState[mst.S_END_LOC.Trim()].status.ToString().Substring(0, 6) == "112200" && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10) { NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1103, 18); PlcHelper.SendHex(info.address, "3F0012210D0A"); LogHelper.Info($"瓶胚翻斗机安全交互1103成功", "安全请求"); } else { Console.WriteLine("1103发送信号为flase"); } } } else if (info.deviceType == 5) { //成品 if (LineState[mst.S_END_LOC.Trim()].status.ToString().Substring(0, 4) == "1021" && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10) { NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1103, 18); PlcHelper.SendHex(info.address, "3F00210D0A"); LogHelper.Info($"成功安全交互1103成功", "安全请求"); } else { Console.WriteLine("1103发送信号为flase"); } } //注塑机 else if (info.deviceType == 4) { LogHelper.Info($"注塑1103安全流程判断:信号{LineState[mst.S_END_LOC.Trim()].status}", "安全请求"); LogHelper.Info($"注塑1103安全流程判断:截取信号{LineState[mst.S_END_LOC.Trim()].status.ToString().Substring(0, 2)}", "安全请求"); if (LineState[mst.S_END_LOC.Trim()].status.ToString().Substring(0, 2) == "11" && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10) { LogHelper.Info($"注塑1103安全流程判断:截取信号{LineState[mst.S_END_LOC.Trim()].status.ToString().Substring(4, 2)}", "安全请求"); if (LineState[mst.S_END_LOC.Trim()].status.ToString().Substring(4, 2) == "01") { NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1103, 18); // PlcHelper.SendHex(info.address, "3F00110D0A"); // LogHelper.Info($"取料发送3F00110D0A"); LogHelper.Info($"注塑机安全交互1103成功", "安全请求"); } } else if ((LineState[mst.S_END_LOC.Trim()].status.ToString().Substring(2, 2) == "21" && DateTime.Now.Subtract(LineState[mst.S_END_LOC.Trim()].modify).TotalSeconds < 10)) { if (LineState[mst.S_END_LOC.Trim()].status.ToString().Substring(6, 2) == "02") { NDCHelper.ChangeParam(mst.S_TASK_NO.Trim(), 1103, 18); // PlcHelper.SendHex(info.address, "3F00110D0A"); // LogHelper.Info($"取料发送3F00110D0A"); LogHelper.Info($"注塑机安全交互1103成功", "安全请求"); } } else { LogHelper.Info($"注塑1103安全流程判断:信号判断问题", "安全请求"); } } } } else { if (info.deviceName.Contains("翻斗机")) { if (info.deviceName.Contains("瓶盖")) { } else { PlcHelper.SendHex(info.address, "3F0010200D0A"); LogHelper.Info($"瓶胚翻斗机安全交互1104成功", "安全请求"); } } else if (info.deviceType == 5) { PlcHelper.SendHex(info.address, "3F00200D0A"); LogHelper.Info($"成品安全交互1104成功", "安全请求"); } } } else { LogHelper.Info($"任务号 {mst.S_TASK_NO} 找不到终点{mst.S_END_LOC} 对应的IP配置文件"); } } catch (Exception ex) { Console.WriteLine(ex.Message); LogHelper.Info($"卸料异常{ex.Message}"); } } #region 成品信号安全交互(未启用) ///// ///// 成品取料复位信号 ///// ///// //internal static void QuLiaoCp(WMSTask mst) //{ // try // { // LogHelper.Info("取料任务信息 Request:" + JsonConvert.SerializeObject(mst), "HosttoagvTask"); // var info = Settings.deviceInfos.Where(a => a.location.Contains(mst.S_START_LOC)).FirstOrDefault(); // if (info != null) // { // if (LineState.Keys.Contains(mst.S_START_LOC.Trim())) // { // var key = LineState.First(a => a.Key == mst.S_START_LOC); // if (mst.S_B_STATE == "开始取货") // { // if (key.Value.Zf == 1) // { // PlcHelper.SendHex(info.address, "3F00110D0A"); // } // else if (key.Value.Zf == 2) // { // PlcHelper.SendHex(info.address, "3F00210D0A"); // } // } // else if (mst.S_B_STATE == "取货完成") // { // if (key.Value.Zf == 1) // { // PlcHelper.SendHex(info.address, "3F00100D0A"); // } // else if (key.Value.Zf == 2) // { // PlcHelper.SendHex(info.address, "3F00200D0A"); // } // } // } // } // } // catch (Exception ex) // { // Console.WriteLine(ex.Message); // LogHelper.Info($"取料异常{ex.Message}"); // } //} ///// ///// 成品卸料复位信号 ///// ///// //internal static void XieliaoCp(WMSTask mst) //{ // try // { // LogHelper.Info("取料任务信息 Request:" + JsonConvert.SerializeObject(mst), "HosttoagvTask"); // var info = Settings.deviceInfos.Where(a => a.location.Contains(mst.S_START_LOC)).FirstOrDefault(); // if (info != null) // { // if (LineState.Keys.Contains(mst.S_START_LOC.Trim())) // { // var key = LineState.First(a => a.Key == mst.S_START_LOC); // if (mst.S_B_STATE == "开始卸货") // { // PlcHelper.SendHex(info.address, "3F00110D0A"); // } // else if (mst.S_B_STATE == "卸货完成") // { // PlcHelper.SendHex(info.address, "3F00100D0A"); // } // } // } // } // catch (Exception ex) // { // Console.WriteLine(ex.Message); // LogHelper.Info($"卸料料异常{ex.Message}"); // } //} #endregion /// /// 翻斗机复位信号 /// /// internal static void XieliaoFdj1(WMSTask mst) { try { LogHelper.Info("取料任务信息 Request:" + JsonConvert.SerializeObject(mst), "HosttoagvTask"); var info = Settings.deviceInfos.Where(a => a.location.Contains(mst.S_END_LOC)).FirstOrDefault(); if (info != null) { LogHelper.Info($"翻斗机发送复位信号", "发送信号"); PlcHelper.SendHex(info.address, "3F00100D0A"); } } catch (Exception ex) { Console.WriteLine(ex.Message); LogHelper.Info($"取料异常{ex.Message}"); } } internal static void XieliaoFdj(WMSTask mst) { try { LogHelper.Info("取料任务信息 Request:" + JsonConvert.SerializeObject(mst), "HosttoagvTask"); var info = Settings.deviceInfos.Where(a => a.location.Contains(mst.S_END_LOC)).FirstOrDefault(); //if (info == null) //{ // info = Settings.deviceInfos.Where(a => a.location.Contains(mst.S_START_LOC)).FirstOrDefault(); //} if (info != null) { LogHelper.Info($"瓶坯翻斗机发送复位信号", "发送信号"); PlcHelper.SendHex(info.address, "3F0010200D0A"); } } catch (Exception ex) { Console.WriteLine(ex.Message); LogHelper.Info($"取料异常{ex.Message}"); } } /// /// 注塑机复位信号 /// /// internal static void XieliaoPpzsj(WMSTask mst) { try { LogHelper.Info("取料任务信息 Request:" + JsonConvert.SerializeObject(mst), "HosttoagvTask"); var info = Settings.deviceInfos.Where(a => a.location.Contains(mst.S_END_LOC)).FirstOrDefault(); if (info != null) { if (info.location[0] == mst.S_END_LOC) { LogHelper.Info($"瓶坯注塑机发送复位信号", "发送信号"); PlcHelper.SendHex(info.address, "3F00100D0A"); } else if (info.location[1] == mst.S_END_LOC) { LogHelper.Info($"瓶坯注塑机发送复位信号", "发送信号"); PlcHelper.SendHex(info.address, "3F00200D0A"); } } } catch (Exception ex) { Console.WriteLine(ex.Message); LogHelper.Info($"卸料料异常{ex.Message}"); } } #endregion #region 自动门 private static Dictionary doorStatus = new Dictionary(); /// /// 自动门 /// /// /// internal static void AnalysisDoor(string xh, string data, Settings.deviceInfo plc) { LogHelper.Info($"自动门状态:{xh},地址为:{plc.address},门号:{plc.deviceName}", "自动门"); if (data.Length / 2 == plc.deviceNo.Length)//2 2 { for (int i = 0; i < plc.deviceNo.Length; i++) { var state = data.Substring(i * 2 + 1, 1); //Console.WriteLine($"门{plc.deviceNo[i]}的状态{state}"); if (doorStatus.Keys.Contains(plc.deviceNo[i])) { doorStatus[plc.deviceNo[i]].info = state; doorStatus[plc.deviceNo[i]].modify = DateTime.Now; } else { doorStatus.Add(plc.deviceNo[i], new signalInfo { info = state, modify = DateTime.Now }); } } } } public class signalInfo { public string info { get; set; } public DateTime modify { get; set; } } private static Dictionary doorRecord = new Dictionary(); /// /// 交管请求 /// /// /// /// internal static void Traffic(string agv, string zone, bool occupy) { Console.WriteLine("交管请求"); var plc = Settings.deviceInfos.Where(a => a.deviceNo.Contains(zone)).FirstOrDefault(); if (plc != null) { if (plc.deviceType == 7) { LogHelper.Info($"声光报警请求:门号:{zone}"); if (occupy) { PlcHelper.SendHex(plc.address, "01 06 04 0E 00 03 A9 38"); } else { PlcHelper.SendHex(plc.address, "01 06 04 0E 00 00 E9 39"); } } else { var index = 1; for (int i = 0; i < plc.deviceNo.Length; i++) { if (plc.deviceNo[i] == zone) { index = i + 1; break; } } LogHelper.Info($"安全门开门请求,门号:{zone},index:{index}"); if (occupy) { //开门请求 3F 00 11 20 0d 0a( 3F 00 10 21 0d 0a) var req = $"3f 00 {index}1 0d 0a"; PlcHelper.SendHex(plc.address, req); var msg = $"安全门开门请求,门号:{zone},index:{index},ip={plc.address}, data={req}"; LogHelper.Info(msg, "发送信号"); //车子请求一次就发一次开门请求 if (doorStatus.Keys.Contains(zone) && DateTime.Now.Subtract(doorStatus[zone].modify).TotalSeconds < 5) { if (doorStatus[zone].info == "1") { LogHelper.Info($"安全门已经打开:门号:{zone},index:{index}", "自动门"); NDCHelper.Traffic(zone, agv); } } } else { //关门信号 3F 00 10 20 0d 0a var req = $"3f 00 {index}0 0d 0a"; PlcHelper.SendHex(plc.address, req); var msg = $"安全门关门请求,门号:{zone},index:{index},ip={plc.address}, data={req}"; LogHelper.Info(msg, "发送信号"); } } } } /* IO模块1 只用02功能码读取 1x0000 一楼开门到位信号 1x0001 二楼开门到位信号 IO模块2 只用05功能码写入 0x0000 一楼楼层按钮信号 0x0001 二楼楼层按钮信号 */ private static Dictionary elevatorRecord = new Dictionary(); #endregion #region 瓶盖翻斗机 /// /// 判断plc下哪台设备 /// /// /// internal static void AnalysisPgFdj(string xh, string data, Settings.deviceInfo plc) { //3F 00 11 22 32 42 0d 0a //一个plc对应1个瓶盖机,一个门 try { #region 信号记录 if (LineState.Keys.Contains(plc.location[0])) { LineState[plc.location[0]].modify = DateTime.Now; LineState[plc.location[0]].status = int.Parse(data); } else { LineState.Add(plc.location[0], new statemodel { modify = DateTime.Now, status = int.Parse(data) }); } #endregion if (data.Substring(1, 1) == "1") { if (BottleCapBody(plc.deviceName, plc.location[0], plc.address, 0 * 2 + 1)) { PlcHelper.SendHex(plc.address, $"3F00{0 * 2 + 1}10d0a"); } } if (data.Length >= 4) { var state = data.Substring(3, 1); LogHelper.Info($"信号:{xh},地址为:{plc.address},门号:{plc.deviceName},状态{state}", "自动门"); //Console.WriteLine($"门{plc.deviceNo[i]}的状态{state}"); if (doorStatus.Keys.Contains(plc.deviceNo[1])) { doorStatus[plc.deviceNo[1]].info = state; doorStatus[plc.deviceNo[1]].modify = DateTime.Now; } else { doorStatus.Add(plc.deviceNo[1], new signalInfo { info = state, modify = DateTime.Now }); } } } catch (Exception) { throw; } } /// /// 瓶盖机信号处理,取满送空 /// /// /// /// private static bool BottleCapBody(string deviceName, string bit, string ip, int index) { var result = false; if (bit != "") { if (LocationHelper.CheckLocFree(bit)) { //查询工单 var workOrder = MESHelper.GetWorkOrder(deviceName); // string start = null; string end = null;//用来查询任务表,作任务创建限制 #region 计算起点终点判断有无执行中的任务 弃用 //if (deviceName == "瓶盖翻斗机E9") //{ // start = "PGFDJ_E9"; // end = "PGFDJ_E9"; //} //else if (deviceName == "瓶盖翻斗机E8") //{ // start = "PGFDJ_E8"; // end = "PGFDJ_E8"; //} //if (start == null) //{ // Console.WriteLine("工单号错误"); //} #endregion if (workOrder != null && workOrder.S_WorkState.Trim() == "执行中") { //查询货位表 var locList = LocationHelper.GetLocListAny(new List { bit }); if (locList.Count > 0) { var location = locList[0]; //要判断当前位置是空托盘,还是满托盘 if (location.N_CURRENT_NUM == 0 && location.S_LOCK_STATE.Trim() == "无") { //判断上空任务终点有无未完成的任务,如果无 则生产任务 // var e = TaskHelper.GetTaskByEndLOC(end); //if (e.Count <= 0) //{ ProcessHelperPP.PgEmpty1(workOrder, location); //} //else // { // Console.WriteLine($"终点{end}有未完成任务,请检查任务表"); // } } else if (location.N_CURRENT_NUM == 1 && location.S_LOCK_STATE.Trim() == "无") { //查货位容器表 var last = LocationHelper.GetLocCntrRel(location.S_LOC_CODE).OrderByDescending(x => x.T_CREATE).FirstOrDefault(); if (last != null) { if (workOrder.S_PLineNo.Contains("二期")) { // 判断时间(卸货完成60s内的请求判定为重复请求) if (DateTime.Now.Subtract(last.T_CREATE).TotalSeconds < 60) { LogHelper.Info($"一分钟判定发送信号", "发送信号"); PlcHelper.SendHex(ip, $"3f00{index}00d0a"); } else { //超过1分钟,可能是新的满托取货请求,再生成取满任务 var startCntr = LocationHelper.GetLocCntr(location.S_LOC_CODE).FirstOrDefault(); if (startCntr != null) { //空托盘请求 ProcessHelperPP.PgFdFull(workOrder, location, startCntr); } else { LogHelper.Info($"瓶盖机{location.S_LOC_CODE}未找到绑定的托盘信息,请检查【货位容器表】"); } } } else { //一期瓶盖翻斗机目前不生成下空任务 //瓶盖翻斗机货位上有货,直接删除托盘 var startCntr = LocationHelper.GetLocCntr(location.S_LOC_CODE).FirstOrDefault(); if (startCntr != null) { //删除货位容器绑定 LocationHelper.UnBindingLoc(location.S_LOC_CODE, startCntr.S_CNTR_CODE.Split(',').ToList()); //删除容器表 if (ContainerHelper.delCntr(startCntr.S_CNTR_CODE)) { LogHelper.Info($"瓶盖机{location.S_LOC_CODE}设备有托盘{startCntr.S_CNTR_CODE},删除托盘", "瓶盖"); } } else { LogHelper.Info($"瓶盖机{location.S_LOC_CODE}未找到绑定的托盘信息,请检查【货位容器表】"); } } } else { LogHelper.Info($"瓶盖机{location.S_LOC_CODE}未找到绑定的托盘信息,请检查【货位容器表】"); } } } else { Console.WriteLine($"获取瓶盖机货位信息{bit}失败"); } } else { Console.WriteLine($"瓶盖机:{deviceName} 未找到工单"); } } else { Console.WriteLine("货位已上锁"); } } return result; } #endregion #region 瓶盖注塑机 /// /// 判断plc下哪台设备 /// /// /// internal static void AnalysisPgZsj(string data, Settings.deviceInfo plc) { //3F 00 11 22 32 42 0d 0a //一个plc对应1个注塑机 try { for (int i = 0; i < 1; i++) { LogHelper.Info($"信号:{data},地址为:{plc.address}", "瓶坯"); if (data.Substring(i * 4 + 1, 1) == "1") { //Console.WriteLine("信号正常"); if (BottlePreformBodyPgZsj(plc.deviceName, plc.location[i * 2], plc.address, i * 2 + 1, int.Parse(plc.deviceNo[i * 0]))) { PlcHelper.SendHex(plc.address, $"3F00{i * 2 + 1}10d0a"); } if (LineState.Keys.Contains(plc.location[i * 2])) { LineState[plc.location[i * 2]].modify = DateTime.Now; LineState[plc.location[i * 2]].status = int.Parse(data); } else { LineState.Add(plc.location[i * 2], new statemodel { modify = DateTime.Now, status = int.Parse(data) }); } } if (data.Substring(i * 4 + 3, 1) == "1") { //Console.WriteLine("信号正常"); if (BottlePreformBodyPgZsj(plc.deviceName, plc.location[i * 2 + 1], plc.address, i * 2 + 2, int.Parse(plc.deviceNo[i * 0]))) { PlcHelper.SendHex(plc.address, $"3F00{i * 2 + 2}10d0a"); } if (LineState.Keys.Contains(plc.location[i * 2 + 1])) { LineState[plc.location[i * 2 + 1]].modify = DateTime.Now; LineState[plc.location[i * 2 + 1]].status = int.Parse(data); } else { LineState.Add(plc.location[i * 2 + 1], new statemodel { modify = DateTime.Now, status = int.Parse(data) }); } } } } catch (Exception ex) { throw; } } /// /// 瓶坯注塑机信号处理,取空下满 /// /// /// /// private static bool BottlePreformBodyPgZsj(string deviceName, string bit, string ip, int index, int deviceNo) { var result = false; if (bit != "") { if (LocationHelper.CheckLocFree(bit)) { var workOrder = MESHelper.GetWorkOrder(deviceName); if (workOrder != null && workOrder.S_WorkState.Trim() == "执行中") { var locList = LocationHelper.GetLocListAny(new List { bit }); if (locList.Count > 0) { var location = locList[0]; // LogHelper.Info($"数量:{location.N_CURRENT_NUM},锁:{location.S_LOCK_STATE}", "任务"); if (location.N_CURRENT_NUM == 0 && location.S_LOCK_STATE.Trim() == "无") { if (workOrder.S_PLineNo.Contains("无菌")) { ProcessHelperPP.WjEmpty(workOrder, location); } else { ProcessHelperPP.PgZsjEmpty(workOrder, location); } } else if (location.N_CURRENT_NUM == 1 && location.S_LOCK_STATE.Trim() == "无") { var last = LocationHelper.GetLocCntrRel(location.S_LOC_CODE).OrderByDescending(x => x.T_CREATE).FirstOrDefault(); if (last != null) { if (DateTime.Now.Subtract(last.T_CREATE).TotalSeconds < 60) { LogHelper.Info($"一分钟判定发送信号", "发送信号"); PlcHelper.SendHex(ip, $"3f00100d0a"); } else { //超过1分钟,可能是新的满托取货请求,再生成取满任务 //Console.WriteLine("超过1分钟,可能是新的满托取货请求,生成取满任务"); var startCntr = LocationHelper.GetLocCntr(location.S_LOC_CODE).FirstOrDefault(); if (startCntr != null) { if (workOrder.S_PLineNo.Contains("无菌")) { ProcessHelperPP.WjpFull(workOrder, location, startCntr); } else { ProcessHelperPP.PgZsjFull(workOrder, location, startCntr); } //ProcessHelper.SetTrayInfoFull(workOrder, startCntr.Container); } else { // Console.WriteLine($"瓶坯机{bit}未找到绑定的托盘信息,请检查【货位容器表】"); LogHelper.Info($"瓶坯机{bit}未找到绑定的托盘信息,请检查【货位容器表】"); } } } else { //Console.WriteLine($"瓶坯机{bit}未找到绑定的托盘信息,请检查【货位容器表】"); LogHelper.Info($"瓶坯机{bit}未找到绑定的托盘信息,请检查【货位容器表】"); } } } else { Console.WriteLine($"获取瓶坯机货位信息{bit}失败"); } } else { Console.WriteLine($"瓶坯机:{deviceName} 未找到工单"); } } else { LogHelper.Info($"{bit}货位有锁", "任务"); } } return result; } #endregion #region 瓶坯翻斗机 /// /// 判断plc下哪台设备 /// /// /// internal static void AnalysisPpFdj(string data, Settings.deviceInfo plc) { //3F 00 11 22 32 42 0d 0a //一个plc对应1个瓶盖机 try { #region 信号记录 if (LineState.Keys.Contains(plc.location[0])) { LineState[plc.location[0]].modify = DateTime.Now; LineState[plc.location[0]].status = int.Parse(data); } else { LineState.Add(plc.location[0], new statemodel { modify = DateTime.Now, status = int.Parse(data) }); } #endregion for (int i = 0; i < 1; i++) { LogHelper.Info($"信号:{data},地址为:{plc.address}", "瓶坯"); if (i < plc.deviceNo.Length) { if (data.Substring(i * 4 + 1, 1) == "1") { if (BottlePreformBody(plc.deviceName, plc.location[i * 2], plc.address, i * 2 + 1)) { PlcHelper.SendHex(plc.address, $"3F00{i * 2 + 1}10d0a"); if (LineState.Keys.Contains(plc.location[i * 2])) { LineState[plc.location[i * 2]].modify = DateTime.Now; LineState[plc.location[i * 2]].status = int.Parse(data); } else { LineState.Add(plc.location[i * 2], new statemodel { modify = DateTime.Now, status = int.Parse(data) }); } } } if (data.Substring(i * 4 + 3, 1) == "1") { if (BottlePreformBody(plc.deviceName, plc.location[i * 2 + 1], plc.address, i * 2 + 2)) { PlcHelper.SendHex(plc.address, $"3F00{i * 2 + 2}10d0a"); } } } } } catch (Exception) { throw; } } /// /// 瓶坯翻斗机信号处理,取满送空 /// /// /// /// private static bool BottlePreformBody(string deviceName, string bit, string ip, int index) { var result = false; if (bit != "") { if (LocationHelper.CheckLocFree(bit)) { var workOrder = MESHelper.GetWorkOrder(deviceName.Trim()); if (workOrder != null && workOrder.S_WorkState.Trim() == "执行中") { var locList = LocationHelper.GetLocListAny(new List { bit }); if (locList.Count > 0) { var location = locList[0]; if (location.N_CURRENT_NUM == 0 && location.S_LOCK_STATE.Trim() == "无") { ProcessHelperPP.PpFdjEmpty(workOrder, location); } else if (location.N_CURRENT_NUM == 1 && location.S_LOCK_STATE.Trim() == "无") { var last = LocationHelper.GetLocCntrRel(location.S_LOC_CODE).OrderByDescending(x => x.T_CREATE).FirstOrDefault(); if (last != null) { if (DateTime.Now.Subtract(last.T_CREATE).TotalSeconds < 60) { LogHelper.Info($"一分钟判定发送信号", "发送信号"); PlcHelper.SendHex(ip, $"3f00{index}00d0a"); } else { //超过1分钟,可能是新的满托取货请求,再生成取满任务 //Console.WriteLine("超过1分钟,可能是新的满托取货请求,生成取满任务"); var startCntr = LocationHelper.GetLocCntr(location.S_LOC_CODE).FirstOrDefault(); if (startCntr != null) { //ProcessHelper.SetTrayInfoFull(workOrder, startCntr.Container); ProcessHelperPP.PpFdFull(workOrder, location, startCntr); } else { // Console.WriteLine($"瓶坯机{bit}未找到绑定的托盘信息,请检查【货位容器表】"); LogHelper.Info($"瓶坯机{bit}未找到绑定的托盘信息,请检查【货位容器表】"); } } } else { //Console.WriteLine($"瓶坯机{bit}未找到绑定的托盘信息,请检查【货位容器表】"); LogHelper.Info($"瓶坯机{bit}未找到绑定的托盘信息,请检查【货位容器表】"); } } } else { // Console.WriteLine($"获取瓶坯机货位信息{bit}失败"); LogHelper.Info($"获取瓶坯机货位信息{bit}失败"); } } else { // Console.WriteLine($"瓶坯机:{deviceName} 未找到工单"); LogHelper.Info($"瓶坯机:{deviceName} 未找到工单"); } } } return result; } #endregion #region 瓶坯注塑机 /// /// 判断plc下哪台设备 /// /// /// internal static void AnalysisPpZsj(string data, Settings.deviceInfo plc) { //3F 00 11 22 32 42 0d 0a //一个plc对应1个注塑机 try { for (int i = 0; i < 1; i++) { LogHelper.Info($"信号:{data},地址为:{plc.address}", "瓶坯"); if (data.Substring(i * 4 + 1, 1) == "1") { //Console.WriteLine("信号正常"); if (BottlePreformBodyZsj(plc.deviceName, plc.location[i * 2], plc.address, i * 2 + 1, int.Parse(plc.deviceNo[i * 0]))) { PlcHelper.SendHex(plc.address, $"3F00{i * 2 + 1}10d0a"); } if (LineState.Keys.Contains(plc.location[i * 2])) { LineState[plc.location[i * 2]].modify = DateTime.Now; LineState[plc.location[i * 2]].status = int.Parse(data); } else { LineState.Add(plc.location[i * 2], new statemodel { modify = DateTime.Now, status = int.Parse(data) }); } } if (data.Substring(i * 4 + 3, 1) == "1") { //Console.WriteLine("信号正常"); if (BottlePreformBodyZsj(plc.deviceName, plc.location[i * 2 + 1], plc.address, i * 2 + 2, int.Parse(plc.deviceNo[i * 2 + 1]))) { PlcHelper.SendHex(plc.address, $"3F00{i * 2 + 2}10d0a"); } if (LineState.Keys.Contains(plc.location[i * 2 + 1])) { LineState[plc.location[i * 2 + 1]].modify = DateTime.Now; LineState[plc.location[i * 2 + 1]].status = int.Parse(data); } else { LineState.Add(plc.location[i * 2 + 1], new statemodel { modify = DateTime.Now, status = int.Parse(data) }); } } } } catch (Exception) { throw; } } /// /// 瓶坯注塑机信号处理,取空下满 /// /// /// /// private static bool BottlePreformBodyZsj(string deviceName, string bit, string ip, int index, int deviceNo) { var result = false; if (bit != "") { if (LocationHelper.CheckLocFree(bit)) { Console.WriteLine("货位正常"); var workOrder = MESHelper.GetWorkOrder(deviceName); if (workOrder != null && workOrder.S_WorkState.Trim() == "执行中") { Console.WriteLine("工单正常"); var locList = LocationHelper.GetLocListAny(new List { bit }); if (locList.Count > 0) { var location = locList[0]; // LogHelper.Info($"数量:{location.N_CURRENT_NUM},锁:{location.S_LOCK_STATE}", "任务"); if (location.N_CURRENT_NUM == 0 && location.S_LOCK_STATE.Trim() == "无") { ProcessHelperPP.PpZsjEmpty(workOrder, location); } else if (location.N_CURRENT_NUM == 1 && location.S_LOCK_STATE.Trim() == "无") { var last = LocationHelper.GetLocCntrRel(location.S_LOC_CODE).OrderByDescending(x => x.T_CREATE).FirstOrDefault(); if (last != null) { if (DateTime.Now.Subtract(last.T_CREATE).TotalSeconds < 60) { LogHelper.Info($"一分钟判定发送信号", "发送信号"); PlcHelper.SendHex(ip, $"3f00100d0a"); } else { //超过1分钟,可能是新的满托取货请求,再生成取满任务 //Console.WriteLine("超过1分钟,可能是新的满托取货请求,生成取满任务"); var startCntr = LocationHelper.GetLocCntr(location.S_LOC_CODE).FirstOrDefault(); if (startCntr != null) { //ProcessHelper.SetTrayInfoFull(workOrder, startCntr.Container); ProcessHelperPP.PpZsFull(workOrder, location, startCntr, deviceNo); } else { // Console.WriteLine($"瓶坯机{bit}未找到绑定的托盘信息,请检查【货位容器表】"); LogHelper.Info($"瓶坯机{bit}未找到绑定的托盘信息,请检查【货位容器表】"); } } } else { //Console.WriteLine($"瓶坯机{bit}未找到绑定的托盘信息,请检查【货位容器表】"); LogHelper.Info($"瓶坯机{bit}未找到绑定的托盘信息,请检查【货位容器表】"); } } } else { Console.WriteLine($"获取瓶坯机货位信息{bit}失败"); } } else { Console.WriteLine($"瓶坯机:{deviceName} 未找到工单"); } } else { LogHelper.Info($"{bit}货位有锁", "任务"); } } //} return result; } #endregion private static Dictionary upLimitRecord = new Dictionary(); #region 成品 private static Dictionary emptyCall = new Dictionary(); /// /// 成品下线信号处理 /// /// /// /// internal static void AnalysisCp(string data, Settings.deviceInfo plc) { try { if (data.Length == 4) { if (plc.deviceNo[0] == "1") { AnalysisFinishedProductXx(data, plc); } else if (plc.deviceNo[0] == "2") { AnalysisFinishedProductSx(data, plc); } } } catch (Exception ex) { throw ex; } } /// /// 成品下线 /// /// /// private static void AnalysisFinishedProductXx(string data, Settings.deviceInfo plc) { #region 信号记录 if (data.Length == 4) { int a = 1; if (plc.deviceName == "E12成品") { a = 2; } if (LineState.Keys.Contains(plc.location[0])) { LineState[plc.location[0]].modify = DateTime.Now; LineState[plc.location[0]].status = int.Parse(data); LineState[plc.location[0]].Zf = a; } else { LineState.Add(plc.location[0], new statemodel { modify = DateTime.Now, status = int.Parse(data), Zf = a }); } } #endregion try { if (plc.deviceName == "靖宇成品仓E11输送线") { if (data.Substring(0, 2) == "11") { var start = LocationHelper.GetLoc(plc.location[0]); //Console.WriteLine($"成品满托位{plc.location[0]}下线"); LogHelper.Info($"成品满托位{plc.location[0]}下线,deviceName:{plc.deviceName},address:{plc.address}", "成品"); if (start != null && start.S_LOCK_STATE == "无" && DateTime.Now.Subtract(start.T_MODIFY).TotalSeconds > 20) { var workOrder = MESHelper.GetWorkOrder1(plc.deviceName.Trim()); if (workOrder != null) { // int height = 0; // height = ProcessHelperCP.GetTrayHeight(workOrder.S_ItemCode, workOrder.S_ItemLayer, workOrder.S_TrayType); ProcessHelperCP.InStock(workOrder, plc.location[0]); } else { //Console.WriteLine($"未获取到成品设备执行中工单 {plc.deviceName}"); } } else { Console.WriteLine($"未获取到货位信息或起点终点有锁"); } } } else if (plc.deviceName == "靖宇成品仓E12输送线") { if (data.Substring(2, 2) == "21") { var start = LocationHelper.GetLoc(plc.location[0]); //Console.WriteLine($"成品满托位{plc.location[0]}下线"); LogHelper.Info($"成品满托位{plc.location[0]}下线,deviceName:{plc.deviceName},address:{plc.address}", "成品"); if (start != null && start.S_LOCK_STATE == "无" && DateTime.Now.Subtract(start.T_MODIFY).TotalSeconds > 20) { var workOrder = MESHelper.GetWorkOrder1(plc.deviceName.Trim()); if (workOrder != null) { //int height = 0; //height = ProcessHelperCP.GetTrayHeight(workOrder.S_ItemCode, workOrder.S_ItemLayer, workOrder.S_TrayType); ProcessHelperCP.InStock(workOrder, plc.location[0]); } else { //Console.WriteLine($"未获取到成品设备执行中工单 {plc.deviceName}"); } } else { Console.WriteLine($"未获取到货位信息或起点终点有锁"); } } } else { if (data == "1220") { var start = LocationHelper.GetLoc(plc.location[0]); //Console.WriteLine($"成品满托位{plc.location[0]}下线"); LogHelper.Info($"成品满托位{plc.location[0]}下线,deviceName:{plc.deviceName},address:{plc.address}", "成品"); if (start != null && start.S_LOCK_STATE == "无" && DateTime.Now.Subtract(start.T_MODIFY).TotalSeconds > 20) { var workOrder = MESHelper.GetWorkOrder1(plc.deviceName.Trim()); if (workOrder != null) { //int height = 0; //height = ProcessHelperCP.GetTrayHeight(workOrder.S_ItemCode, workOrder.S_ItemLayer, workOrder.S_TrayType); ProcessHelperCP.InStock(workOrder, plc.location[0]); } else { LogHelper.Info($"未获取到成品设备执行中工单 {plc.deviceName}", "成品"); } } else { LogHelper.Info($"未获取到货位信息或起点终点有锁", "成品"); } } } } catch (Exception ex) { throw ex; } } /// /// 成品上线 /// /// /// private static void AnalysisFinishedProductSx(string data, Settings.deviceInfo plc) { #region 信号记录 if (data.Length == 4) { if (LineState.Keys.Contains(plc.location[0])) { LineState[plc.location[0]].modify = DateTime.Now; LineState[plc.location[0]].status = int.Parse(data); } else { LineState.Add(plc.location[0], new statemodel { modify = DateTime.Now, status = int.Parse(data) }); } } #endregion var emptyCallOk = false; if (data == "1021") { if (emptyCall.Keys.Contains(plc.address)) { if (DateTime.Now.Subtract(emptyCall[plc.address]).TotalSeconds > 10) { emptyCallOk = true; //Console.WriteLine($"{plc.deviceName}连续10s收到成功空托请求,可以呼叫空托"); } } else { emptyCall.Add(plc.address, DateTime.Now); } } //空托上线 if (data.Substring(5, 1) == "1" && (plc.deviceType == 12 || data.Substring(3, 1) == "1")) { if (emptyCallOk) { //从空托线边出库一个托盘 var end = LocationHelper.GetLoc(plc.location[0]); if (end != null && end.S_LOCK_STATE == "无" && DateTime.Now.Subtract(end.T_MODIFY).TotalSeconds > 20) { var workOrder = MESHelper.GetWorkOrder1(plc.deviceName); bool outStock = false; if (workOrder != null && workOrder.S_WorkState.Trim() == "执行中") { //var size = workOrder.S_TrayType == "超托板" ? "集化板" : workOrder.S_TrayType; //Console.WriteLine($"{plc.deviceName}成品空托双托呼叫"); var area = Settings.cpZones.Where(a => a.zoneType == 3).FirstOrDefault(); if (area != null) { //Console.WriteLine($"空托起点区域{area.zone[0]}"); var trayType = ""; if (plc.deviceType == 5) { trayType = workOrder.S_TrayType; } if (trayType == "集化板前后超托" || trayType == "集化板四面超托") { trayType = "集化板"; } else if (trayType == "大板前后超托") { trayType = "大板"; } else if (trayType == "小板前后超托") { trayType = "小板"; } var start = LocationHelper.GetLocation4OutEmptyNotStack(area.zone[0], trayType); //if (start == null) //{ // //从仓库叫空托 // start = ProcessHelperCP.GetLocation4EmptyCntrOut(size); // if (start != null) // { // outStock = true; // } //} if (start != null) { LogHelper.Info($"空托上线{plc.location[0]},address:{plc.address}", "成品"); //创建出库库搬运任务 var cntrList = LocationHelper.GetLocCntr(start.S_LOC_CODE); var bussType = outStock ? "栈板上线" : "栈板上线"; TaskProcess.CreateTransport(start.S_LOC_CODE, plc.location[0], bussType, new List { cntrList[0].S_CNTR_CODE.Trim() }, cntrList.Count, 1, 1, 80); } } } } else { //Console.WriteLine($"成品空托位{plc.location[1]}有任务,或者状态更新不超过20s,不可生成任务"); } } } #endregion #region 顶升机 internal static void DingShengji(string data, Settings.deviceInfo plc) { try { var workOrder = MESHelper.GetWorkOrderdsj(plc.deviceName); if (workOrder != null && workOrder.S_WorkState.Trim() == "执行中") { string[] DsjLocarea = new string[] { "FLZD", "ZXZD", "LYPZD" };//顶升级下线对应库区编码 string startloc = ""; string endloc = ""; // string cntrtype = ""; // string bussType = ""; if (data == "112030") { #region 信号记录 if (LineState.Keys.Contains(plc.location[0])) { LineState[plc.location[0]].modify = DateTime.Now; LineState[plc.location[0]].status = int.Parse(data); } else { LineState.Add(plc.location[0], new statemodel { modify = DateTime.Now, status = int.Parse(data) }); } #endregion startloc = plc.location[0]; endloc = LocationHelper.GetLocListAny(DsjLocarea[0]).FindAll(a => a.N_CURRENT_NUM == 0).OrderBy(a => a.N_COL).First().S_LOC_CODE; if (!string.IsNullOrEmpty(startloc) && !string.IsNullOrEmpty(endloc)) { var locList = LocationHelper.GetLocListAny(new List { startloc }); if (locList.Count > 0) { if (locList[0].S_LOCK_STATE.Trim() == "无") { ProcessHelperCP.DsjStock(startloc, endloc); } else { LogHelper.Info($"起点货位:{startloc}存在锁", "顶升机"); } } } else { LogHelper.Info($"起点货位:{startloc},终点货位:{endloc}存在空值", "顶升机"); } } else if (data == "102130") { #region 信号记录 if (LineState.Keys.Contains(plc.location[1])) { LineState[plc.location[1]].modify = DateTime.Now; LineState[plc.location[1]].status = int.Parse(data); } else { LineState.Add(plc.location[1], new statemodel { modify = DateTime.Now, status = int.Parse(data) }); } #endregion startloc = plc.location[1]; var endlocList = LocationHelper.GetLocListAny(DsjLocarea[1]).OrderBy(a => a.N_ROW).ToList(); // endloc = LocationHelper.GetLocListAny(DsjLocarea[1]).OrderBy(a => a.N_ROW).First().S_LOC_CODE; if (endlocList.Count > 0) { var end = ProcessHelperPP.FindEndcolByLocList(endlocList); if (end != null) { endloc = end.S_LOC_CODE; } if (!string.IsNullOrEmpty(startloc) && !string.IsNullOrEmpty(endloc)) { var locList = LocationHelper.GetLocListAny(new List { startloc }); if (locList.Count > 0) { if (locList[0].S_LOCK_STATE.Trim() == "无") { ProcessHelperCP.DsjStock(startloc, endloc); } else { LogHelper.Info($"起点货位:{startloc}存在锁", "顶升机"); } } } else { LogHelper.Info($"起点货位:{startloc},终点货位:{endloc}存在空值", "顶升机"); } } else { LogHelper.Info($"根据库区:{DsjLocarea[1]},未找到货位", "顶升机"); } } else if (data == "102031") { #region 信号记录 if (LineState.Keys.Contains(plc.location[2])) { LineState[plc.location[2]].modify = DateTime.Now; LineState[plc.location[2]].status = int.Parse(data); } else { LineState.Add(plc.location[2], new statemodel { modify = DateTime.Now, status = int.Parse(data) }); } #endregion startloc = plc.location[2]; // var endlocList = LocationHelper.GetLocListAny(DsjLocarea[2]).OrderBy(a => a.N_ROW).ToList(); endloc = LocationHelper.GetLocListAny(DsjLocarea[2]).FindAll(a => a.N_CURRENT_NUM == 0).OrderBy(a => a.N_COL).First().S_LOC_CODE; if (endloc != null) { var locList = LocationHelper.GetLocListAny(new List { startloc }); if (locList.Count > 0) { if (locList[0].S_LOCK_STATE.Trim() == "无") { ProcessHelperCP.DsjStock(startloc, endloc); } else { LogHelper.Info($"起点货位:{startloc}存在锁", "顶升机"); } } } else { LogHelper.Info($"起点货位:{startloc},终点货位:{endloc}存在空值", "顶升机"); } } } else { LogHelper.Info($"未获取到顶升机执行中工单 {plc.deviceName}", "顶升机"); } } catch (Exception ex) { LogHelper.Info($"DsjStock-Error:{ex.ToString()}", "顶升机"); } } #endregion } }