using System; using System.Threading; using iWareCommon.Utils; using System.Linq; using Newtonsoft.Json; using System.Collections.Generic; using iWareCommon; using System.Text; using iWareModel; namespace iWareSda { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“SrmService”。 public class SrmService : ISrmService { private static string _namespace = "iWareSda.SrmService.SrmService"; private static string nofoundStackerMsg = SysHelper.Language(WareSdaStruct.LanguageFlg, "没有找到堆垛机设备", "No found the Stacker"); /// /// 获取SrmEntity实体集合 /// /// public List GetSrm_CacheEntity() { return Srm_CacheEntity.DeviceObjs; } /// /// 堆垛机任务完成确认信号发送 /// /// 设备号 /// 任务号 /// public SdaResEntity ConfirmTaskFinish(int srmId, int taskId) { SdaResEntity sdaResult = new SdaResEntity(); try { Log4NetHelper.WriteInfoLog(LogType.SrmSdaService, srmId + "号堆垛机:接收到确认任务:" + taskId + " 已完成的指令"); var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId); if (srm == null) { sdaResult.resMsg = "没有找到SRM设备"; return sdaResult; } /* if (srm.RTaskNo != taskId) { return false; } //*/ bool flag = false; string msg = ""; ////判断是否IsReady // //SdaResEntity isReady_SdaResEntity = IsReady(srmId, out msg); //if (!isReady_SdaResEntity.result) //{ // msg = "判断堆垛机不是空闲并可用状态-" + msg; // sdaResult.result = false; // sdaResult.resMsg = msg; // return sdaResult; //} var result = srm.ConfirmTaskFinish(out msg); Log4NetHelper.WriteInfoLog(LogType.SrmSdaService, srmId + "号堆垛机:下发确认任务:" + taskId + " 已完成的指令" + (flag ? "成功" : "失败")); sdaResult.result = result; sdaResult.resMsg = msg; return sdaResult; } catch (Exception ex) { Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, "堆垛机任务完成确认信号发送出现异常:" + JsonConvert.SerializeObject(ex), ex); sdaResult.result = false; sdaResult.resMsg = JsonConvert.SerializeObject(ex); return sdaResult; } } public SrmView GetSrmInfo(int srmId) { var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId); if (srm == null) { return null; } return srm.View; } /// /// 判断堆垛机是否可用 /// /// /// /// public SdaResEntity IsReady(int srmId, out string msg) { SdaResEntity sdaResult = new SdaResEntity(); try { msg = ""; var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId); if (srm == null) { msg = string.Format("未找到srmId={0}的堆垛机信息", srmId); sdaResult.resMsg = msg; return sdaResult; } if (!srm.CanDoTask(srmId, out msg)) { sdaResult.resMsg = msg; sdaResult.result = false; return sdaResult; } //var result = (srm.RAuto && !srm.RAlarm && !srm.RLoaded && srm.RForkIni && srm.RState == (int)ESrmState.空闲); //sdaResult.result = result; //sdaResult.resMsg = msg; //if (string.IsNullOrEmpty(msg)) //{ // sdaResult.resMsg = srm.AlarmCode; //} sdaResult.result = true; return sdaResult; } catch (Exception ex) { msg = ex.Message; sdaResult.result = false; sdaResult.resMsg = "出现异常:" + JsonConvert.SerializeObject(ex); return sdaResult; } } /// /// 判断堆垛机是否可用,是否可以发送新任务给堆垛机 /// /// /// /// public SdaResEntity IsAllowSendTask(int srmId, out string msg) { SdaResEntity sdaResult = new SdaResEntity(); try { msg = ""; sdaResult = IsReady(srmId, out msg); if (!sdaResult.result) {//如果校验堆垛机是否可用失败,返回错误 return sdaResult; } var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId); if (srm.View.R_TaskNo != 0) {//说明目前堆垛机上有任务号,不允许下发新任务 msg = string.Format("{0}号堆垛机目前有任务未确认,任务号{1},不允许下发新任务", srmId, srm.View.R_TaskNo); sdaResult.resMsg = msg; sdaResult.result = false; return sdaResult; } sdaResult.result = true; return sdaResult; } catch (Exception ex) { msg = ex.Message; sdaResult.result = false; sdaResult.resMsg = "出现异常:" + JsonConvert.SerializeObject(ex); return sdaResult; } } /// /// 验证堆垛机任务是否已经完成 /// /// /// 0表示没有任务完成,其他表示任务完成,并返回任务号 public SdaResEntity IsTaskFinish(int srmId, int taskId) { SdaResEntity sdaResult = new SdaResEntity(); try { var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId); if (srm == null) { sdaResult.resMsg = nofoundStackerMsg; return sdaResult; } var result = srm.View.R_TaskFinish == 1 && (srm.View.R_TaskNo == taskId); sdaResult.result = result; sdaResult.resMsg = ""; return sdaResult; } catch (Exception ex) { Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, "出现异常:" + JsonConvert.SerializeObject(ex), ex); sdaResult.result = false; sdaResult.resMsg = JsonConvert.SerializeObject(ex); return sdaResult; } } /// /// 是否允许给堆垛机发送新任务 /// /// /// /// true:允许,false:不允许 public SdaResEntity IsAllowSendNewTaskToSrm(int srmId) { SdaResEntity sdaResult = new SdaResEntity(); try { var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId); if (srm == null) { sdaResult.resMsg = nofoundStackerMsg; return sdaResult; } var result = srm.IsAllowSendNewTaskToSrm(); sdaResult.result = result; sdaResult.resMsg = ""; return sdaResult; } catch (Exception ex) { Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, "出现异常:" + JsonConvert.SerializeObject(ex), ex); sdaResult.result = false; sdaResult.resMsg = JsonConvert.SerializeObject(ex); return sdaResult; } } /// /// 删除任务 /// /// /// public SdaResEntity SendSrmDelete(int srmId) { SdaResEntity sdaResult = new SdaResEntity(); string msg = ""; try { var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId); if (srm == null) { sdaResult.resMsg = nofoundStackerMsg; return sdaResult; } var result = srm.SendDelTask(srm.View.DeviceId, out msg); sdaResult.result = result; sdaResult.resMsg = msg; return sdaResult; } catch (Exception ex) { msg = "堆垛机删除任务出现异常:" + ex.Message; Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex); sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } } /// /// 堆垛机急停 /// /// /// public SdaResEntity SendEStop(int srmId) { SdaResEntity sdaResult = new SdaResEntity(); string msg = ""; try { var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId); if (srm == null) { sdaResult.resMsg = nofoundStackerMsg; return sdaResult; } var result = srm.SendEStop(out msg); sdaResult.result = result; sdaResult.resMsg = msg; return sdaResult; } catch (Exception ex) { msg = "堆垛机急停出现异常:" + ex.Message; Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex); sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } } /// /// 给堆垛机发送任务 /// /// /// /// /// /// public SdaResEntity SendSrmTask(int srmId, int taskId, string sourcePlace, string toPlace, short command,short pallettype) { SdaResEntity sdaResult = new SdaResEntity(); string msg = ""; try { ESrmCmd srmCmd; bool parseResult = Enum.TryParse(command.ToString(), out srmCmd); if (parseResult == false) { msg = SysHelper.Language(WareSdaStruct.LanguageFlg, "任务类型'" + command + "'转换错误", "Task command '" + command + "' convert failed"); sdaResult.resMsg = msg; return sdaResult; } var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId); if (srm == null) { sdaResult.resMsg = nofoundStackerMsg; return sdaResult; } if (srmCmd == ESrmCmd.库内搬运 || srmCmd == ESrmCmd.入库 || srmCmd == ESrmCmd.出库) {//1-01-01-01 if (sourcePlace.Length != 10 && sourcePlace.Length != 11) { sdaResult.resMsg = "来源库位不对"; return sdaResult; } } if (toPlace.Length != 10 && toPlace.Length != 11) { sdaResult.resMsg = "目标库位不对"; return sdaResult; } //重新处理 sourcePlace、toPlace [EditBy shaocx,2022-04-02] srm.ReSubStringPlace(ref sourcePlace, ref toPlace); var result = srm.SendTask(srmCmd, srmId, taskId, sourcePlace, toPlace,pallettype, out msg); StringBuilder sb = new StringBuilder(); sb.Append("下发"); sb.Append(srmId + "号堆垛机"); sb.Append(", 任务号=" + taskId); sb.Append(", 起始点=" + sourcePlace); sb.Append(", 目标点=" + toPlace); sb.Append(", 的指令=" + (result ? "成功" : "失败")); sb.Append(", 原因=" + msg); Log4NetHelper.WriteInfoLog(LogType.SrmSdaService, sb.ToString()); sdaResult.result = result; sdaResult.resMsg = msg; return sdaResult; } catch (Exception ex) { msg = "给堆垛机发送任务出现异常:" + ex.Message; Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex); sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } } /// /// 堆垛机解警 /// /// /// public SdaResEntity ReleaseAlert(int srmId) { SdaResEntity sdaResult = new SdaResEntity(); string msg; try { var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId); if (srm == null) { sdaResult.resMsg = nofoundStackerMsg; return sdaResult; } var result = srm.ReleaseAlert(out msg); sdaResult.result = result; sdaResult.resMsg = msg; return sdaResult; } catch (Exception ex) { msg = "堆垛机解警出现异常:" + ex.Message; Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex); sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } } /// /// 堆垛机继续任务 /// /// /// public SdaResEntity ContinueTask(int srmId) { SdaResEntity sdaResult = new SdaResEntity(); string msg; try { var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == srmId); if (srm == null) { sdaResult.resMsg = nofoundStackerMsg; return sdaResult; } var result = srm.ContinueTask(out msg); sdaResult.result = result; sdaResult.resMsg = msg; return sdaResult; } catch (Exception ex) { msg = "堆垛机继续任务出现异常:" + ex.Message; Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex); sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } } /// /// 判断是否有心跳 /// /// /// public SdaResEntity IsHaveHeatBeat(int deviceId) { SdaResEntity sdaResult = new SdaResEntity(); string msg; try { var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == deviceId); if (srm == null) { sdaResult.resMsg = nofoundStackerMsg; return sdaResult; } var result = srm.IsHaveHeatBeat(); sdaResult.result = true; sdaResult.resData = result; return sdaResult; } catch (Exception ex) { msg = "验证是否有心跳出现异常:" + ex.Message; Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex); sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } } /// /// 堆垛机是否满足下发任务的要求 /// /// public SdaResEntity IsAllowIssueTask(int deviceId) { SdaResEntity sdaResult = new SdaResEntity(); string msg; try { var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == deviceId); if (srm == null) { sdaResult.resMsg = nofoundStackerMsg; return sdaResult; } var result = false; if ((srm.View.R_Mode != Convert.ToInt32(ESrmMode.自动) || srm.View.R_State != Convert.ToInt32(ESrmState.空闲) || srm.View.R_AlarmCode > 0)) result = false; result = true; sdaResult.result = true; sdaResult.resData = result; return sdaResult; } catch (Exception ex) { msg = "验证堆垛机是否满足下发任务的要求出现异常:" + ex.Message; Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex); sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } } /// /// 写入STB /// /// /// /// public SdaResEntity WriteStb(int deviceId, int value) { SdaResEntity sdaResult = new SdaResEntity(); string msg; try { var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == deviceId); if (srm == null) { sdaResult.resMsg = nofoundStackerMsg; return sdaResult; } MessageModel fr = srm.plcService.WriteValuePoint(srm.DBBlockForWrite.W_Stb, value, srm.View.W_Stb); if (fr.result) { sdaResult.result = true; return sdaResult; } else { sdaResult.resMsg = fr.resMsg; return sdaResult; } } catch (Exception ex) { msg = "写入STB出现异常:" + ex.Message; Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex); sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } } /// /// 写入AckTaskFinish /// /// /// /// public SdaResEntity WriteAckTaskFinish(int deviceId, int value) { SdaResEntity sdaResult = new SdaResEntity(); string msg; try { var srm = Srm_CacheEntity.DeviceObjs.FirstOrDefault(x => x.View.DeviceId == deviceId); if (srm == null) { sdaResult.resMsg = nofoundStackerMsg; return sdaResult; } MessageModel fr = srm.plcService.WriteValuePoint( srm.DBBlockForWrite.W_TaskFinishConfirm, value, srm.View.W_TaskFinishConfirm); if (fr.result) { sdaResult.result = true; return sdaResult; } else { sdaResult.resMsg = fr.resMsg; return sdaResult; } } catch (Exception ex) { msg = "写入Task_Finish_ACK出现异常:" + ex.Message; Log4NetHelper.WriteErrorLog(LogType.SrmSdaService, msg, ex); sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } } } }