using iWareCommon.Utils; using iWareModel; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace iWareSda { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“RgvService”。 public class RgvService : IRgvService { public SdaResEntity ClearAlarm(int deviceId) { SdaResEntity sdaResult = new SdaResEntity(); try { var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); if (!rgvResult.result) { return rgvResult; } var rgv = rgvResult.resData as RgvEntity; string msg; var result = rgv.ClearAlarm(deviceId, out msg); Log4NetHelper.WriteInfoLog(LogType.RgvSdaService, "下发deviceId=" + deviceId + "的RGV消警指令" + (result ? "成功" : "失败") + "原因:" + msg); sdaResult.result = result; sdaResult.resMsg = msg; return sdaResult; } catch (Exception ex) { sdaResult.result = false; sdaResult.resMsg = JsonConvert.SerializeObject(ex); return sdaResult; } } /// /// 下发RGV任务 /// /// /// /// /// /// /// public SdaResEntity SendRgvTask(int deviceId, int taskId, string sourcePlce, string toPlace) { SdaResEntity sdaResult = new SdaResEntity(); try { var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); if (!rgvResult.result) { return rgvResult; } var rgv = rgvResult.resData as RgvEntity; //如果STP为TRUE,表示不能发任务 string msg; var result = rgv.SendTask(deviceId, taskId, sourcePlce, toPlace, out msg); Log4NetHelper.WriteInfoLog(LogType.RgvSdaService, "下发deviceId=" + deviceId + ",taskId=" + taskId + ",fromPlace=" + sourcePlce + ",toPlace=" + toPlace + "的RGV任务" + (result ? "成功" : "失败") + "原因:" + msg); sdaResult.result = result; sdaResult.resMsg = msg; return sdaResult; } catch (Exception ex) { sdaResult.result = false; sdaResult.resMsg = JsonConvert.SerializeObject(ex); return sdaResult; } } /// /// 任务下发确认(收到PLC反馈后WCS清除) /// /// /// /// public SdaResEntity WriteStp(int deviceId, bool value, string stationCode) { SdaResEntity _SdaResEntity = new SdaResEntity(); try { var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); if (!rgvResult.result) { return rgvResult; } var rgv = rgvResult.resData as RgvEntity; string msg = ""; var result = rgv.WriteStp(deviceId, stationCode, value, out msg); Log4NetHelper.WriteInfoLog(LogType.RgvSdaService, "下发deviceId=" + deviceId + ",站点号=" + stationCode + "的任务下发确认(收到PLC反馈后WCS清除)指令" + (result ? "成功" : "失败") + "原因:" + msg); _SdaResEntity.result = result; _SdaResEntity.resMsg = msg; return _SdaResEntity; } catch (Exception ex) { _SdaResEntity.result = false; _SdaResEntity.resMsg = ex.Message; return _SdaResEntity; } } public SdaResEntity DeleteRgvTask(int deviceId, int taskId) { SdaResEntity sdaResult = new SdaResEntity(); try { var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); if (!rgvResult.result) { return rgvResult; } var rgv = rgvResult.resData as RgvEntity; string msg = ""; var result = rgv.DeleteTask(deviceId, taskId, out msg); Log4NetHelper.WriteInfoLog(LogType.RgvSdaService, "下发deviceId = " + deviceId + "的删除RGV任务指令" + (result ? "成功" : "失败") + "原因:" + msg); sdaResult.result = result; sdaResult.resMsg = msg; return sdaResult; } catch (Exception ex) { sdaResult.result = false; sdaResult.resMsg = JsonConvert.SerializeObject(ex); return sdaResult; } } ///// ///// RGV急停 ///// ///// ///// //public SdaResEntity EmergencyStop(int deviceId) //{ // SdaResEntity sdaResult = new SdaResEntity(); // try // { // var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); // if (!rgvResult.result) // { // return rgvResult; // } // var rgv = rgvResult.resData as RgvEntity; // string msg = ""; // var result = rgv.EmergencyStop(deviceId, out msg); // Log4NetHelper.WriteInfoLog(LogType.RgvSdaService, "下发deviceId = " + deviceId + "的急停任务指令" + (result ? "成功" : "失败") + "原因:" + msg); // sdaResult.result = result; // sdaResult.resMsg = msg; // return sdaResult; // } // catch (Exception ex) // { // sdaResult.result = false; // sdaResult.resMsg = JsonConvert.SerializeObject(ex); // return sdaResult; // } //} /// /// 获取整个RGV对象 /// /// /// public RgvView GetRgvInfo(int deviceId) { var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); if (!rgvResult.result) { return null; } var rgv = (rgvResult.resData as RgvEntity).View; return rgv; } /// /// RGV任务是否完成 /// /// /// /// public SdaResEntity IsTaskFinish(int deviceId, int taskId) { SdaResEntity sdaResult = new SdaResEntity(); try { var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); if (!rgvResult.result) { return rgvResult; } var rgv = rgvResult.resData as RgvEntity; var stationCode = ((int)EDevice.RGV1040).ToString(); var readData = rgv.View.R_RgvForReadCommList.Where(x => x.StationCode == stationCode).FirstOrDefault(); sdaResult.result = readData.R_TaskID == taskId && rgv.View.R_RGV_Finish; sdaResult.resMsg = "成功"; } catch (Exception ex) { sdaResult.result = false; sdaResult.resMsg = JsonConvert.SerializeObject(ex); return sdaResult; } return sdaResult; } /// /// RGV是否是自动模式 /// /// public SdaResEntity IsRgvAuto(int deviceId, string stationCode) { SdaResEntity sdaResult = new SdaResEntity(); try { var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); if (!rgvResult.result) { return rgvResult; } var rgv = rgvResult.resData as RgvEntity; var msg = ""; var result = rgv.RgvIsAuto(stationCode, out msg); if (!rgvResult.result) { sdaResult.result = false; sdaResult.resMsg = msg; return rgvResult; } sdaResult.result = true; } catch (Exception ex) { sdaResult.result = false; sdaResult.resMsg = JsonConvert.SerializeObject(ex); Log4NetHelper.WriteErrorLog(LogType.RgvSdaService, "判断RGV是否是自动模式出现异常,ex:" + JsonConvert.SerializeObject(ex), ex); } return sdaResult; } /// /// RGV是否是自动待机模式 /// /// public SdaResEntity RgvIsAutoAwaitMode(int deviceId, string stationCode) { SdaResEntity sdaResult = new SdaResEntity(); try { var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); if (!rgvResult.result) { return rgvResult; } var rgv = rgvResult.resData as RgvEntity; var msg = ""; var result = rgv.RgvIsAutoAwaitMode(stationCode, out msg); if (!rgvResult.result) { sdaResult.result = false; sdaResult.resMsg = msg; return rgvResult; } sdaResult.result = true; } catch (Exception ex) { sdaResult.result = false; sdaResult.resMsg = JsonConvert.SerializeObject(ex); Log4NetHelper.WriteErrorLog(LogType.RgvSdaService, "判断RGV是否是自动待机模式出现异常,ex:" + JsonConvert.SerializeObject(ex), ex); } return sdaResult; } /// /// 判断RGV是否可用,是否可以发送新任务给RGV /// /// /// /// /// 是否是涉及到RGV的任务 /// public SdaResEntity IsAllowSendTask(bool isNeedValidateRealSourceAndToPlace, int deviceId, string sourceStationCode, string toStationCode, bool isRgvTask) { var msg = ""; SdaResEntity sdaResult = new SdaResEntity(); try { var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); if (!rgvResult.result) { return rgvResult; } var rgv = rgvResult.resData as RgvEntity; var result = false; if (isNeedValidateRealSourceAndToPlace) { //判断起点是否是自动待机模式 result = rgv.RgvIsAutoAwaitMode(sourceStationCode, out msg); if (!result) { sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } //判断起点是否是空闲状态 result = rgv.RgvIsStateFree(sourceStationCode, out msg); if (!result) { sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } } //判断RGV是否是自动模式 result = rgv.RgvIsAuto(((int)EDevice.RGV1040).ToString(), out msg); if (!result) { sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } if (isRgvTask) {//如果是涉及到RGV的任务,需要去验证下RGV是否是空闲状态 //判断RGV是否是自动待机模式 result = rgv.RgvIsAutoAwaitMode(((int)EDevice.RGV1040).ToString(), out msg); if (!result) { sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } result = rgv.RgvIsStateFree(((int)EDevice.RGV1040).ToString(), out msg); if (!result) { sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } } if (isNeedValidateRealSourceAndToPlace) { //判断目标点是否是自动模式 result = rgv.RgvIsAuto(toStationCode, out msg); if (!result) { sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } } sdaResult.result = true; return sdaResult; } catch (Exception ex) { sdaResult.result = false; sdaResult.resMsg = "出现异常:" + JsonConvert.SerializeObject(ex); return sdaResult; } } /// /// 判断是否有心跳 /// /// /// public SdaResEntity IsHaveHeatBeat(int deviceId) { SdaResEntity sdaResult = new SdaResEntity(); string msg; try { var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); if (!rgvResult.result) { return rgvResult; } var rgv = rgvResult.resData as RgvEntity; var result = rgv.IsHaveHeatBeat(); sdaResult.result = true; sdaResult.resData = result; return sdaResult; } catch (Exception ex) { msg = "验证是否有心跳出现异常:" + ex.Message; sdaResult.result = false; sdaResult.resMsg = msg; return sdaResult; } } /// /// 1015重新扫码 /// /// /// /// public SdaResEntity Write1015ReScan(int deviceId, bool value) { SdaResEntity _SdaResEntity = new SdaResEntity(); try { var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); if (!rgvResult.result) { return rgvResult; } var rgv = rgvResult.resData as RgvEntity; string msg = ""; var result = rgv.Write1015ReScan(deviceId, value, out msg); _SdaResEntity.result = result; _SdaResEntity.resMsg = msg; return _SdaResEntity; } catch (Exception ex) { _SdaResEntity.result = false; _SdaResEntity.resMsg = ex.Message; return _SdaResEntity; } } /// /// 1019重新扫码 /// /// /// /// public SdaResEntity Write1019ReScan(int deviceId, bool value) { SdaResEntity _SdaResEntity = new SdaResEntity(); try { var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); if (!rgvResult.result) { return rgvResult; } var rgv = rgvResult.resData as RgvEntity; string msg = ""; var result = rgv.Write1019ReScan(deviceId, value, out msg); _SdaResEntity.result = result; _SdaResEntity.resMsg = msg; return _SdaResEntity; } catch (Exception ex) { _SdaResEntity.result = false; _SdaResEntity.resMsg = ex.Message; return _SdaResEntity; } } /// /// RGV的任务完成ACK赋值 /// /// /// /// public SdaResEntity WriteRGV_FinishACK(int deviceId, bool value, int plcTaskId) { SdaResEntity _SdaResEntity = new SdaResEntity(); try { var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); if (!rgvResult.result) { return rgvResult; } var rgv = rgvResult.resData as RgvEntity; string msg = ""; var result = rgv.WriteRGV_FinishACK(deviceId, value, plcTaskId, out msg); _SdaResEntity.result = result; _SdaResEntity.resMsg = msg; return _SdaResEntity; } catch (Exception ex) { _SdaResEntity.result = false; _SdaResEntity.resMsg = ex.Message; return _SdaResEntity; } } /// /// 四个入库口扫描验证ACK赋值 /// /// /// /// public SdaResEntity WriteScanValidateACK(bool isReset, int deviceId, string stationCode, bool value, int plcTaskId) { SdaResEntity _SdaResEntity = new SdaResEntity(); try { var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); if (!rgvResult.result) { return rgvResult; } var rgv = rgvResult.resData as RgvEntity; string msg = ""; var result = rgv.WriteScanValidateACK(isReset, deviceId, stationCode, value, plcTaskId, out msg); _SdaResEntity.result = result; _SdaResEntity.resMsg = msg; return _SdaResEntity; } catch (Exception ex) { _SdaResEntity.result = false; _SdaResEntity.resMsg = ex.Message; return _SdaResEntity; } } /// /// 发动机出库,给西港PLC发送发动机数据 【Editby shaocx,2023-07-23】 /// /// /// /// /// /// /// public SdaResEntity WriteRGV_XigangGetDataForOut(int deviceId, string value__Out_MaterialModel, string value_Out_OrderNo, string value_Out_SerialNumber, int plcTaskId) { SdaResEntity _SdaResEntity = new SdaResEntity(); try { var rgvResult = Rgv_CacheEntity.GetDeviceObj(deviceId); if (!rgvResult.result) { return rgvResult; } var rgv = rgvResult.resData as RgvEntity; string msg = ""; var result = rgv.WriteRGV_XigangGetDataForOut(deviceId, value__Out_MaterialModel, value_Out_OrderNo, value_Out_SerialNumber, plcTaskId, out msg); _SdaResEntity.result = result; _SdaResEntity.resMsg = msg; return _SdaResEntity; } catch (Exception ex) { _SdaResEntity.result = false; _SdaResEntity.resMsg = ex.Message; return _SdaResEntity; } } } }