using iWareSda.Common; using System.Linq; using iWareModel; using System; using System.Collections.Generic; using System.Threading; using iWareCommon.Utils; using iWareCommon.Common.Globle; using iWareCommon; using iWareSda.Devices._3_Rgv.RgvModel; using Newtonsoft.Json; using iWareSda.Model; namespace iWareSda { //public class RgvEntity : IDevice //{ // public RgvEntity() // { // } // #region OPC相关 // /// // /// 写的DB块 // /// // public RgvDBForWrite DBBlockForWrite { get; set; } // /// // /// 读的DB块 // /// // public RgvDBForRead DBBlockForRead { get; set; } // /// // /// 读取PLC实例 // /// // public PLCService plcService { get; set; } // /// // /// 视图对象 // /// // public RgvView View { get; set; } // #endregion // /// // /// 初始化数据 // /// // public void InitData() // { // } // public RgvEntity(string srmName, int deviceId, RgvDBForWrite _dbBlockForWrite, RgvDBForRead _dbBlockForRead, PLCService _plcService) // { // this.View = new RgvView(); // this.View.DeviceName = srmName; // this.View.DeviceId = deviceId; // //集合赋值初始化 // this.View.R_RgvForReadCommList = new List(); // this.View.W_RgvForWriteCommList = new List(); // for (int i = 0; i < WareSdaStruct.RgvStationList.Count; i++) // { // this.View.R_RgvForReadCommList.Add(new RgvDB2ObjForReadComm() { StationCode = WareSdaStruct.RgvStationList[i] }); // this.View.W_RgvForWriteCommList.Add(new RgvDB2ObjForWriteComm() { StationCode = WareSdaStruct.RgvStationList[i] }); // } // plcService = _plcService; // DBBlockForWrite = _dbBlockForWrite; // DBBlockForRead = _dbBlockForRead; // } // #region 个性化方法 // /// // /// Rgv任务发送 // /// // /// // /// // /// // /// // /// // /// // /// // public bool SendTask(int deviceId, int taskId, string sourcePlce, string toPlace, out string msg) // { // try // { // msg = ""; // if (!CanSendTask(deviceId, out msg)) // { // return false; // } // //这里特殊转换一下 // if (toPlace == ((int)EDevice.出库口1012).ToString()) // { // toPlace = ((int)EDevice.提升机1030).ToString(); // } // RgvDBForWriteComm w_db_source = this.DBBlockForWrite.W_RgvForWriteCommList.FirstOrDefault(x => x.StationCode == sourcePlce); // RgvDB2ObjForWriteComm w_dbObj_source = this.View.W_RgvForWriteCommList.FirstOrDefault(x => x.StationCode == sourcePlce); // //RgvDBForWriteComm w_db_to = this.DBBlockForWrite.W_RgvForWriteCommList.FirstOrDefault(x => x.StationCode == toPlace); // //RgvDB2ObjForWriteComm w_dbObj_to = this.View.W_RgvForWriteCommList.FirstOrDefault(x => x.StationCode == toPlace); // //如果ACK为true,表示不能发任务 // var readObj = this.View.R_RgvForReadCommList.FirstOrDefault(x => x.StationCode == sourcePlce); // if (readObj.R_ACK == true) // { // msg = "ACK为TRUE,不允许发任务"; // return false; // } // MessageModel b2 = this.plcService.WriteValuePoint(w_db_source.W_Destination, Convert.ToInt16(toPlace), w_dbObj_source.W_Destination); // if (!b2.result) // { // msg = string.Format("向Rgv{0},起点{1}发送任务{2},写入目标站点{3}失败,返回结果:" + b2.resMsg, this.View.DeviceName, sourcePlce, taskId, toPlace); // return false; // } // b2 = this.plcService.WriteValuePoint(w_db_source.W_TaskID, Convert.ToInt32(taskId), w_dbObj_source.W_TaskID); // if (!b2.result) // { // msg = string.Format("向Rgv{0},起点{1},目标点{2},写入任务号{3}失败,返回结果:" + b2.resMsg, this.View.DeviceName, sourcePlce, toPlace, taskId); // return false; // } // //将STP改为TRUE // b2 = this.plcService.WriteValuePoint(w_db_source.W_STP, true, w_dbObj_source.W_STP); // if (!b2.result) // { // msg = string.Format("向Rgv{0},起点{1},目标点{2},写入STP{3}失败,返回结果:" + b2.resMsg, this.View.DeviceName, sourcePlce, toPlace, true); // return false; // } // return true; // } // catch (Exception ex) // { // msg = ex.Message; // Log4NetHelper.WriteErrorLog(Rgv_CacheEntity.curLogType, "发送任务出现异常:" + ex.Message, ex); // return false; // } // } // /// // /// 任务下发确认(收到PLC反馈后WCS清除) // /// // /// // /// // /// // public bool WriteStp(int deviceId, string stationCode, bool value, out string msg) // { // try // { // msg = ""; // RgvDBForWriteComm w_db = this.DBBlockForWrite.W_RgvForWriteCommList.FirstOrDefault(x => x.StationCode == stationCode); // RgvDB2ObjForWriteComm w_dbObj = this.View.W_RgvForWriteCommList.FirstOrDefault(x => x.StationCode == stationCode); // MessageModel b2 = this.plcService.WriteValuePoint(w_db.W_STP, value, w_dbObj.W_STP); // if (!b2.result) // { // msg = string.Format("向Rgv{0},站点号{1}写 任务下发确认(收到PLC反馈后WCS清除) " + value + "失败,返回结果:" + b2.resMsg, // this.View.DeviceName, stationCode); // return false; // } // return true; // } // catch (Exception ex) // { // msg = ex.Message; // var logcontext = string.Format("向Rgv{0},站点号{1}写 任务下发确认(收到PLC反馈后WCS清除) " + true + "出现异常:" + JsonConvert.SerializeObject(ex), // deviceId, stationCode); // Log4NetHelper.WriteErrorLog(Rgv_CacheEntity.curLogType, logcontext, ex); // return false; // } // } // /// // /// 1015重新扫码 // /// // /// // /// // /// // /// // public bool Write1015ReScan(int deviceId, bool value, out string msg) // { // try // { // msg = ""; // MessageModel b2 = this.plcService.WriteValuePoint(this.DBBlockForWrite.W_1015_ReScan, value, this.View.W_1015_ReScan); // if (!b2.result) // { // msg = string.Format("向Rgv地址{0} 写 " + value + "失败,返回结果:" + b2.resMsg, // this.DBBlockForWrite.W_1015_ReScan); // return false; // } // return true; // } // catch (Exception ex) // { // msg = ex.Message; // var logcontext = string.Format("向Rgv地址{0} " + value + "出现异常:" + JsonConvert.SerializeObject(ex), // this.DBBlockForWrite.W_1015_ReScan); // Log4NetHelper.WriteErrorLog(Rgv_CacheEntity.curLogType, logcontext, ex); // return false; // } // } // /// // /// RGV的任务完成ACK赋值 // /// // /// // /// // /// // /// // public bool WriteRGV_FinishACK(int deviceId, bool value, int plcTaskId, out string msg) // { // try // { // msg = ""; // MessageModel b2 = this.plcService.WriteValuePoint(this.DBBlockForWrite.W_RGV_FinishACK, value, this.View.W_RGV_FinishACK); // if (!b2.result) // { // msg = string.Format("向Rgv地址{0} 写 " + value + "失败,返回结果:" + b2.resMsg, // this.DBBlockForWrite.W_RGV_FinishACK); // Log4NetHelper.WriteErrorLog(Rgv_CacheEntity.curLogType, msg, null); // return false; // } // Log4NetHelper.WriteInfoLog(Rgv_CacheEntity.curLogType, "写入W_RGV_FinishACK(" + this.DBBlockForWrite.W_RGV_FinishACK + ")值为" + value + "成功!因为PLC任务号:" + plcTaskId); // return true; // } // catch (Exception ex) // { // msg = ex.Message; // var logcontext = string.Format("向Rgv地址{0} " + value + "出现异常:" + JsonConvert.SerializeObject(ex), // this.DBBlockForWrite.W_RGV_FinishACK); // Log4NetHelper.WriteErrorLog(Rgv_CacheEntity.curLogType, logcontext, ex); // return false; // } // } // /// // /// 四个入库口扫描验证ACK赋值 // /// // /// // /// // /// // /// // public bool WriteScanValidateACK(bool isReset, int deviceId, string stationCode, bool value, int plcTaskId, out string msg) // { // msg = ""; // MessageModel b2 = null; // string address_fail = ""; // string address_success = ""; // try // { // switch (stationCode) // { // case "1002": // address_fail = this.DBBlockForWrite.W_1002_ScanFailACK; // address_success = this.DBBlockForWrite.W_1002_ScanSuccessACK; // break; // case "1004": // address_fail = this.DBBlockForWrite.W_1004_ScanFailACK; // address_success = this.DBBlockForWrite.W_1004_ScanSuccessACK; // break; // case "1006": // address_fail = this.DBBlockForWrite.W_1006_ScanFailACK; // address_success = this.DBBlockForWrite.W_1006_ScanSuccessACK; // break; // case "1007": // address_fail = this.DBBlockForWrite.W_1007_ScanFailACK; // address_success = this.DBBlockForWrite.W_1007_ScanSuccessACK; // break; // default: // throw new Exception("不支持的站点"); // } // if (isReset) // {//是重置 // b2 = this.plcService.WriteValuePoint(address_success, false, this.View.W_1002_ScanSuccessACK); // if (!b2.result) // { // msg = string.Format("向Rgv地址{0} 写 " + false + "失败,返回结果:" + b2.resMsg, // address_success); // Log4NetHelper.WriteErrorLog(Rgv_CacheEntity.curLogType, msg, null); // return false; // } // b2 = this.plcService.WriteValuePoint(address_fail, false, this.View.W_1002_ScanFailACK); // if (!b2.result) // { // msg = string.Format("向Rgv地址{0} 写 " + false + "失败,返回结果:" + b2.resMsg, // address_fail); // Log4NetHelper.WriteErrorLog(Rgv_CacheEntity.curLogType, msg, null); // return false; // } // } // else // {//不是重置 // if (value) // {//表示扫描验证通过 // b2 = this.plcService.WriteValuePoint(address_success, true, this.View.W_1002_ScanSuccessACK); // if (!b2.result) // { // msg = string.Format("向Rgv地址{0} 写 " + true + "失败,返回结果:" + b2.resMsg, // address_success); // Log4NetHelper.WriteErrorLog(Rgv_CacheEntity.curLogType, msg, null); // return false; // } // } // else // {//表示扫描验证不通过 // b2 = this.plcService.WriteValuePoint(address_fail, true, this.View.W_1002_ScanFailACK); // if (!b2.result) // { // msg = string.Format("向Rgv地址{0} 写 " + true + "失败,返回结果:" + b2.resMsg, // address_fail); // Log4NetHelper.WriteErrorLog(Rgv_CacheEntity.curLogType, msg, null); // return false; // } // } // } // Log4NetHelper.WriteInfoLog(Rgv_CacheEntity.curLogType, "WriteScanFailACK方法,写入 四个入库口扫描失败ACK赋值 ScanFailACK(" + address_fail + ")值为" + value + "成功!因为PLC任务号:" + plcTaskId + ",isReset:" + isReset); // return true; // } // catch (Exception ex) // { // msg = ex.Message; // var logcontext = string.Format("WriteScanFailACK方法,向Rgv地址{0} " + value + "出现异常:" + JsonConvert.SerializeObject(ex), // address_fail); // if (value) // { // logcontext = string.Format("WriteScanFailACK方法,向Rgv地址{0} " + value + "出现异常:" + JsonConvert.SerializeObject(ex), // address_success); // } // Log4NetHelper.WriteErrorLog(Rgv_CacheEntity.curLogType, logcontext, ex); // return false; // } // } // /// // /// 取消报警 // /// // /// // /// // /// // public bool ClearAlarm(int deviceId, out string msg) // { // msg = ""; // return true; // //try // //{ // // msg = ""; // // var dbNumber = Rgv_CacheEntity.W_DBHeader; // // MessageModel b2 = this.plcService.WriteValuePoint( this.DBBlockForWrite.W_Reset, true, this.View.W_Reset); // // if (!b2.result) // // { // // msg = string.Format("向Rgv{0}写入设备复位" + true + "失败,返回结果:" + b2.resMsg, this.View.DeviceName); // // return false; // // } // // return true; // //} // //catch (Exception ex) // //{ // // msg = ex.Message; // // Log4NetHelper.WriteErrorLog(Rgv_CacheEntity.curLogType, "取消报警出现异常:" + ex.Message, ex); // // return false; // //} // } // /// // /// 任务删除 // /// // /// // /// // /// // /// // public bool DeleteTask(int deviceId, int taskId, out string msg) // { // msg = ""; // return true; // //try // //{ // // msg = ""; // // if (this.View.R_TaskNo != taskId) // // { // // msg = string.Format("RGV当前非执行taskId={0}的任务", taskId); // // return false; // // } // // var dbNumber = Rgv_CacheEntity.W_DBHeader; // // MessageModel b2 = this.plcService.WriteValuePoint( this.DBBlockForWrite.W_TaskNo, taskId, this.View.W_TaskNo); // // if (!b2.result) // // { // // msg = string.Format("向Rgv{0}写入任务号" + taskId + "失败,返回结果:" + b2.resMsg, this.View.DeviceName); // // return false; // // } // // b2 = this.plcService.WriteValuePoint( this.DBBlockForWrite.W_Reset, 1, this.View.W_Reset); // // if (!b2.result) // // { // // msg = string.Format("向Rgv{0}写入设备复位" + 1 + "失败,返回结果:" + b2.resMsg, this.View.DeviceName); // // return false; // // } // // return true; // //} // //catch (Exception ex) // //{ // // msg = ex.Message; // // Log4NetHelper.WriteErrorLog(Rgv_CacheEntity.curLogType, "任务删除出现异常:" + ex.Message, ex); // // return false; // //} // } // /// // /// 急停 // /// // /// // /// // /// // public bool EmergencyStop(int deviceId, string stationCode, out string msg) // { // msg = ""; // return true; // //try // //{ // // msg = ""; // // var dbNumber = Rgv_CacheEntity.W_DBHeader; // // MessageModel b2 = this.plcService.WriteValuePoint( this.DBBlockForWrite.W_RgvForWriteCommList.Find(x => x.StationCode == stationCode)., 1, this.View.W_EStop); // // if (!b2.result) // // { // // msg = string.Format("向Rgv{0}写入急停" + 1 + "失败,返回结果:" + b2.resMsg, this.View.DeviceName); // // return false; // // } // // return true; // //} // //catch (Exception ex) // //{ // // msg = ex.Message; // // Log4NetHelper.WriteErrorLog(Rgv_CacheEntity.curLogType, "急停出现异常:" + ex.Message, ex); // // return false; // //} // } // /// // /// 是否可以发送任务 // /// // /// // /// // /// // /// // public bool CanSendTask(int deviceId, out string msg) // { // msg = ""; // //模拟 // //if (!this.View.IsConnected) // //{ // // msg = "已离线"; // // return false; // //} // //if (this.View.R_Mode != (int)ERgvMode.连机自动模式) // //{ // // msg = "当前非自动模式"; // // return false; // //} // //if (this.View.R_State != (int)ERgvState.空闲) // //{ // // msg = "设备状态非空闲,无法执行其他任务"; // // return false; // //} // return true; // } // /// // /// RGV是否是自动待机模式 // /// // /// // /// // public bool RgvIsAutoAwaitMode(string stationCode, out string msg) // { // msg = ""; // var readData = this.View.R_RgvForReadCommList.Where(x => x.StationCode == stationCode).FirstOrDefault(); // if (readData.R_Model != (int)ERgvMode.自动待机模式) // { // ERgvMode mode = (ERgvMode)Enum.Parse(typeof(ERgvMode), readData.R_Model.ToString()); // msg = "站点" + stationCode + " 当前模式是[" + mode.ToString() + "],非自动待机模式"; // return false; // } // return true; // } // /// // /// RGV是否是自动模式 // /// // /// // /// // public bool RgvIsAuto(string stationCode, out string msg) // { // msg = ""; // var readData = this.View.R_RgvForReadCommList.Where(x => x.StationCode == stationCode).FirstOrDefault(); // if (readData.R_Model != (int)ERgvMode.自动待机模式 && readData.R_Model != (int)ERgvMode.自动运行模式) // { // ERgvMode mode = (ERgvMode)Enum.Parse(typeof(ERgvMode), readData.R_Model.ToString()); // msg = "站点" + stationCode + " 当前模式是[" + mode.ToString() + "],非自动待机模式或自动运行模式"; // return false; // } // return true; // } // /// // /// RGV是否是空闲状态 // /// // /// // /// // public bool RgvIsStateFree(string stationCode, out string msg) // { // msg = ""; // var readData = this.View.R_RgvForReadCommList.Where(x => x.StationCode == stationCode).FirstOrDefault(); // if (readData.R_State != (int)ERgvState.空闲) // { // ERgvMode mode = (ERgvMode)Enum.Parse(typeof(ERgvMode), readData.R_Model.ToString()); // msg = "站点" + stationCode + " 当前状态是[" + mode.ToString() + "],非空闲"; // return false; // } // return true; // } // #endregion // public void SetPropertyValueForRead() // { // var r_dbBlock = this.DBBlockForRead; // SdaHelper.SetPropertyValueForDB(r_dbBlock, this.View, this.plcService, ""); // //特殊处理List集合 // foreach (var item in r_dbBlock.R_RgvForReadCommList) // { // RgvDB2ObjForReadComm rgvDB2ObjForReadComm = this.View.R_RgvForReadCommList.Where(x => x.StationCode == item.StationCode).First(); // SdaHelper.SetPropertyValueForDB(item, rgvDB2ObjForReadComm, this.plcService, ""); // } // } // public void SetPropertyValueForWrite() // { // var w_dbBlock = this.DBBlockForWrite; // SdaHelper.SetPropertyValueForDB(w_dbBlock, this.View, this.plcService, ""); // //特殊处理List集合 // foreach (var item in w_dbBlock.W_RgvForWriteCommList) // { // RgvDB2ObjForWriteComm rgvDB2ObjForWriteComm = this.View.W_RgvForWriteCommList.Where(x => x.StationCode == item.StationCode).First(); // SdaHelper.SetPropertyValueForDB(item, rgvDB2ObjForWriteComm, this.plcService, ""); // } // } // /// // /// 是否有心跳 // /// // /// // public bool IsHaveHeatBeat() // { // try // { // var r_dbBlock = this.DBBlockForRead; // short value = Convert.ToInt16(this.plcService.ReadValuePoint(r_dbBlock.R_HandShake, typeof(short))); // //约定 等待2秒 // Thread.Sleep(2000); // short value_next = Convert.ToInt16(this.plcService.ReadValuePoint(r_dbBlock.R_HandShake, typeof(short))); // if (value == value_next) // {//没有心跳 // return false; // } // else // {//有心跳 // return true; // } // } // catch (Exception ex) // { // throw ex; // } // } // #region 获取当前报警信息 // /// // /// 获取RGV当前报警信息 // /// // /// // public List GetRgvAlertDatas() // { // List db_warningList = new List(); // try // { // string _dbValue; // var isHasAlert = false; // IDictionary rgvAlertDict = new Dictionary(); // rgvAlertDict = WareSdaStruct.RgvAlertDict; // foreach (var item in rgvAlertDict) // { // _dbValue = item.Key; // isHasAlert = Convert.ToBoolean(this.plcService.ReadValuePoint(Rgv_CacheEntity.R_DBHeader_RGV_Alert, item.Key, typeof(bool))); // if (isHasAlert) // { // db_warningList.Add(new DeviceWarningInfo() // { // Address = item.Key, // Code = item.Key, // Context = item.Value.Trim() // }); // } // } // } // catch (Exception ex) // { // throw ex; // } // return db_warningList; // } // /// // /// 获取输送线当前报警信息 // /// // /// // public List GetLineAlertDatas() // { // List db_warningList = new List(); // try // { // IDictionary srmAlertDict = new Dictionary(); // foreach (var item in this.View.R_RgvForReadCommList) // { // if (item.R_AlarmCode > 0) // { // item.R_AlarmCodeMsg = WareSdaStruct.RgvAlertDict[item.R_AlarmCode.ToString()]; // } // } // } // catch (Exception ex) // { // throw ex; // } // return db_warningList; // } // #endregion //} }