| | |
| | | public static PLCUtil GetPlcIp(string startStation) |
| | | { |
| | | string strIp = ""; |
| | | var conveyList1 = new List<string>() { "147", "145", "139", "137", "129", "127", "121", "119", "111", "109", "103", "101", "093", "091", "085", "083", "075", "073", "067", "065","033" }; |
| | | var conveyList1 = new List<string>() { "147", "145", "139", "137", "129", "127", "121", "119", "111", "109", "103", "101", "093", "091", "085", "083", "075", "073", "067", "065","033","039","044" ,"051","059"}; |
| | | var conveyList2 = new List<string>() { "205", "234", "252", "254", "260", "262", "270", "272", "278", "280", "288", "290", "294", "301", "307", "309", "315", "317", "325", "327", "331", "337" }; |
| | | var conveyList3 = new List<string>() { "401", "402", "405", "406", "409", "410", "413", "414", "417", "418", "421", "422", "425", "426", "429", "430", "433", "434", "437", "438" }; |
| | | if (conveyList1.Contains(startStation)) |
| | |
| | | // 跺机空闲,获取出库任务、移库任务 |
| | | { |
| | | // 获取任务信息 |
| | | var modTask = _db.Queryable<WcsTask>().OrderBy(m => m.CreateTime).OrderBy(m => m.Levels, OrderByType.Asc) |
| | | var modTask = _db.Queryable<WcsTask>().OrderBy(m => m.Levels, OrderByType.Asc).OrderBy(m => m.CreateTime) |
| | | .First(s => s.Status == TaskStatusEnum.Wait && (s.TaskType == TaskTypeEnum.Out || s.TaskType == TaskTypeEnum.Move) |
| | | && s.StartRoadway == modDevice.StationNum); |
| | | if (modTask == null) |
| | |
| | | } |
| | | else |
| | | { |
| | | Log.Error(string.Format("任务反馈失败:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg)); |
| | | Log.Error(string.Format("c:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg)); |
| | | } |
| | | } |
| | | // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。 |
| | |
| | | // 申请巷道 |
| | | string strMsg = ""; |
| | | string taskModel = ""; |
| | | // 判断是否演示模式 |
| | | //if (PLCTaskAction.boDemo) |
| | | //{ |
| | | // taskModel = "1";// 演示模式 |
| | | //} |
| | | |
| | | // 获取工位托盘码信息 |
| | | var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码"); |
| | | var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | |
| | | { |
| | | break; |
| | | } |
| | | var modPosEndLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "目的工位"); |
| | | |
| | | |
| | | //判断入库锁定是否打开 |
| | | if (PLCTaskAction.boEnterLock) |
| | | { |
| | | var (res350, palletVal350) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (res350.IsSucceed && palletVal350 != "350") |
| | | { |
| | | LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "申请入库 " + $"入库任务已锁定,请解锁后重试", "托盘号:" + palletVal); |
| | | } |
| | | |
| | | // 写入输送线退回指令 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum); |
| | | if (ret.IsSucceed) |
| | | { |
| | | plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350"); |
| | | } |
| | | |
| | | break; |
| | | } |
| | | |
| | | if (palletVal == null) |
| | | { |
| | | var (res350, palletVal350) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (res350.IsSucceed && palletVal350 != "350") |
| | | { |
| | | LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "申请入库 " + $"扫描托盘号失败!", "托盘号:" + palletVal); |
| | | } |
| | | |
| | | // 写入输送线退回指令 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum); |
| | | if (ret.IsSucceed) |
| | | { |
| | | plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350"); |
| | | } |
| | | |
| | | break; |
| | | } |
| | | |
| | | var http = new HttpService(); |
| | | string TaskNo = "", EndLocate = ""; |
| | | strMsg = http.RequestRoadWay(palletVal, modDevice.StationNum, taskModel, louCeng, ref EndLocate, ref TaskNo); |
| | |
| | | // 通知任务界面任务已存在更新 请更新界面 |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | // led显示内容 |
| | | LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "申请入库 " + $"目标巷道:{EndLocate}", "托盘号:" + palletVal); |
| | | try |
| | | { |
| | | LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "申请入库 " + $"目标巷道:{taskInfo.EndRoadway}取货工位:{EndLocate}", "托盘号:" + palletVal); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Log.Error(ex.Message); |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | | // 申请巷道失败!LED显示 |
| | | var (res350, palletVal350) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos); |
| | | if (res350.IsSucceed && palletVal350 != "350") |
| | | { |
| | | LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "申请入库 " + $"申请巷道失败:{strMsg}", "托盘号:" + palletVal); |
| | | } |
| | | |
| | | // 写入输送线退回指令 |
| | | var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modPosEndLocat.PlcPos, modDevice.StationNum); |
| | | if (ret.IsSucceed) |
| | | { |
| | | plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "350"); |
| | | } |
| | | |
| | | // 申请巷道失败! |
| | | Log.Error(string.Format($"申请巷道失败:{strMsg},读写plc错误")); |
| | | } |
| | | } |
| | |
| | | HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>()); |
| | | |
| | | // led显示内容 |
| | | LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "入库中 " + $"目标巷道:{endLocatVlue}", "托盘号:" + palletVal); |
| | | LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "申请入库 " + $"目标巷道:{modTask.EndRoadway}取货工位:{endLocatVlue}", "托盘号:" + palletVal); |
| | | } |
| | | } |
| | | |
| | |
| | | var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false); |
| | | if (modTask == null) |
| | | { |
| | | Log.Error(string.Format($"工位号:{modDevice.StationNum}空托盘到达,未找到对应的任务!任务号{tasknoVal};")); |
| | | //Log.Error(string.Format($"工位号:{modDevice.StationNum}空托盘到达,未找到对应的任务!任务号{tasknoVal};")); |
| | | break; |
| | | } |
| | | // 写入plc流程字90 |
| | |
| | | LedDll Led = new LedDll(); |
| | | Led.LEDstr(ip, top, content, foot); |
| | | } |
| | | catch { } |
| | | catch (Exception ex) |
| | | { |
| | | Log.Error(ex.Message); |
| | | } |
| | | } |
| | | |
| | | private static void Test(WcsDeviceDto modDevice) |
| | |
| | | { |
| | | bl = true; |
| | | } |
| | | |
| | | if (bl != modDevice.BoHaveItem) |
| | | { |
| | | modDevice.BoHaveItem = bl; |
| | | var modInfo = new PlcPositionInfo() { Type = modPlc.Type, StationNum = modDevice.StationNum.PadLeft(3, '0'), BoHaveItem = bl }; |
| | | HubUtil.PublicPosition(modInfo); |
| | | UpdatePosition(modInfo); |
| | |
| | | } |
| | | } |
| | | } |
| | | Thread.Sleep(300); |
| | | Thread.Sleep(3000); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// LED显示 |
| | | /// </summary> |
| | | /// <param name="m_Ip">LED屏幕IP地址</param> |
| | | /// <param name="m_text">显示内容</param> |
| | | public void ConsoleLeds(string m_Ip, string m_text) |
| | | { |
| | | m_ledWidth = 256; |
| | | m_ledHeight = 160; |
| | | m_ledColor = 1; |
| | | m_ledGrayLevel = 0; |
| | | |
| | | try |
| | | { |
| | | Logger logger = LogManager.GetCurrentClassLogger(); |
| | | int nResult; |
| | | |
| | | LedDll.COMMUNICATIONINFO CommunicationInfo = new LedDll.COMMUNICATIONINFO(); |
| | | CommunicationInfo.LEDType = 0; |
| | | //TCP通讯******************************************************************************** |
| | | CommunicationInfo.SendType = 0; // 设为固定IP通讯模式,即TCP通讯 |
| | | CommunicationInfo.IpStr = m_Ip; // 给IpStr赋值LED控制卡的IP |
| | | CommunicationInfo.LedNumber = 1; // LED屏号为1,注意socket通讯和232通讯不识别屏号,默认赋1就行了,485必需根据屏的实际屏号进行赋值 |
| | | #region 创建一个节目 |
| | | IntPtr hProgram; // 节目句柄 |
| | | //注意此处屏宽高及颜色参数必需与设置屏参的屏宽高及颜色一致,否则发送时会提示错误 |
| | | hProgram = LedDll.LV_CreateProgramEx(m_ledWidth, m_ledHeight, m_ledColor, m_ledGrayLevel, 0); |
| | | nResult = LedDll.LV_AddProgram(hProgram, 0, 0, 1); // 添加一个节目,参数说明见函数声明注示 |
| | | |
| | | if (nResult != 0) |
| | | { |
| | | string ErrStr = LedDll.LS_GetError(nResult); // liudl 此处需记录Log |
| | | throw new Exception(ErrStr); |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | #region 创建区域 |
| | | // 区域范围变量 参数设定 |
| | | LedDll.AREARECT AreaRect = new LedDll.AREARECT();//区域坐标属性结构体变量 |
| | | AreaRect.left = 0; |
| | | AreaRect.top = 0; |
| | | AreaRect.width = m_ledWidth; |
| | | AreaRect.height = 106; |
| | | LedDll.LV_AddImageTextArea(hProgram, 0, 2, ref AreaRect, 1); |
| | | |
| | | // 区域字体变量 参数设定 |
| | | LedDll.FONTPROP FontProp = new LedDll.FONTPROP();//文字属性 |
| | | FontProp.FontName = "宋体"; |
| | | FontProp.FontSize = 20; |
| | | FontProp.FontColor = LedDll.COLOR_RED; |
| | | FontProp.FontBold = 1; |
| | | |
| | | // 区域字体运行速度 带入方式 |
| | | LedDll.PLAYPROP PlayProp = new LedDll.PLAYPROP(); |
| | | PlayProp.InStyle = 0; |
| | | PlayProp.DelayTime = 3; |
| | | PlayProp.Speed = 2; |
| | | |
| | | |
| | | // 多文本区域 用于显示托盘信息 |
| | | nResult = LedDll.LV_AddMultiLineTextToImageTextArea(hProgram, 0, 2, LedDll.ADDTYPE_STRING, m_text, ref FontProp, ref PlayProp, 0, 0); |
| | | |
| | | // 发送到LED屏幕 |
| | | nResult = LedDll.LV_Send(ref CommunicationInfo, hProgram); |
| | | LedDll.LV_DeleteProgram(hProgram); |
| | | #endregion |
| | | |
| | | |
| | | if (nResult != 0) |
| | | { |
| | | string ErrStr; |
| | | ErrStr = LedDll.LS_GetError(nResult); // liudl 此处需要添加log |
| | | logger.Error("返回错误信息A04:", ErrStr); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | // 不抛出异常,防止阻碍主程序运行; Liudl:此处需添加log |
| | | //throw ex; |
| | | Logger logger = LogManager.GetCurrentClassLogger(); |
| | | logger.Error("测试trycatch捕捉的信息:", ex.Message); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 发送给LED 单独更新字幕区域 |
| | | /// </summary> |
| | | /// <param name="m_ip">LED屏幕IP地址</param> |