| | |
| | | private static IDictionary<string, string> realtimePlcValueDict_Srm = new Dictionary<string, string>(); |
| | | |
| | | /// <summary> |
| | | /// RGV实时PLC值字典 |
| | | /// Station实时PLC值字典 |
| | | /// </summary> |
| | | private static IDictionary<string, string> realtimePlcValueDict_Rgv = new Dictionary<string, string>(); |
| | | private static IDictionary<string, string> realtimePlcValueDict_Station = new Dictionary<string, string>(); |
| | | |
| | | #region 发送WCS心跳 |
| | | /// <summary> |
| | | /// 发送堆垛机的心跳 |
| | | /// </summary> |
| | | private List<Thread> SendStackerHeartToSrmThreads = new List<Thread>(); |
| | | private List<Thread> SendStackerHeartToRgvThreads = new List<Thread>(); |
| | | private List<Thread> SendStackerHeartToStationThreads = new List<Thread>(); |
| | | /// <summary> |
| | | /// 发送输送线的心跳 |
| | | /// </summary> |
| | |
| | | |
| | | |
| | | private List<Thread> GetSrmStateThreads = new List<Thread>(); |
| | | private List<Thread> GetRgvStateThreads = new List<Thread>(); |
| | | private List<Thread> GetStationStateThreads = new List<Thread>(); |
| | | private List<Thread> GetLineStateThreads = new List<Thread>(); |
| | | |
| | | #endregion |
| | |
| | | public static bool isShowPlcValue_Srm = false; |
| | | |
| | | /// <summary> |
| | | /// 是否要显示实时Rgv的PLC值堆垛机 |
| | | /// 是否要显示实时Station的PLC值堆垛机 |
| | | /// </summary> |
| | | public static bool isShowPlcValue_Rgv = false; |
| | | public static bool isShowPlcValue_Station = false; |
| | | |
| | | static string errorStr = string.Empty; |
| | | |
| | | static string infoStr_ChangeHandshake = string.Empty; |
| | | static string errorStr_Line = string.Empty; |
| | | static string errorStr_Srm = string.Empty; |
| | | static string errorStr_Rgv = string.Empty; |
| | | static string errorStr_Station = string.Empty; |
| | | static string infoStr_SaveLine = string.Empty; |
| | | |
| | | static string infoStr_Connection = string.Empty; |
| | |
| | | InitializeComponent(); |
| | | Control.CheckForIllegalCrossThreadCalls = false; |
| | | |
| | | this.lbl_Main1.Text = SysHelper.Language(WareSdaStruct.LanguageFlg, "潍柴西港数据访问服务", "Data service runing"); |
| | | this.lbl_Main1.Text = SysHelper.Language(WareSdaStruct.LanguageFlg, "鲁丽木业包装线数据访问服务", "Data service runing"); |
| | | this.lbl_Main2.Text = SysHelper.Language(WareSdaStruct.LanguageFlg, "请勿关闭!", "Please do not close!"); |
| | | this.Text = SysHelper.Language(WareSdaStruct.LanguageFlg, "潍柴西港数据访问服务", "Data service"); |
| | | this.Text = SysHelper.Language(WareSdaStruct.LanguageFlg, "鲁丽木业包装线数据访问服务", "Data service"); |
| | | this.tabPage_Main.Text = SysHelper.Language(WareSdaStruct.LanguageFlg, "服务", "Service"); |
| | | } |
| | | |
| | |
| | | try |
| | | { |
| | | #region 对外发布WCF形式数据访问服务 |
| | | var srmServiceHost = new ServiceHost(typeof(iWareSda.SrmService)); |
| | | srmServiceHost.Open(); |
| | | |
| | | //var lineServiceHost = new ServiceHost(typeof(iWareSda.LineService)); |
| | | //lineServiceHost.Open(); |
| | | |
| | | var rgvServiceHost = new ServiceHost(typeof(iWareSda.RgvService)); |
| | | rgvServiceHost.Open(); |
| | | var StationServiceHost = new ServiceHost(typeof(iWareSda.StationService)); |
| | | StationServiceHost.Open(); |
| | | |
| | | #endregion |
| | | |
| | |
| | | #region 状态信息获取 |
| | | |
| | | |
| | | //获取堆垛机的状态信息 |
| | | Srm_CacheEntity.DeviceObjs.ForEach(x => |
| | | { |
| | | var thread = new Thread(new ParameterizedThreadStart(GetSrmInfo)); |
| | | thread.Name = string.Format("获取堆垛机{0}的状态", x.View.DeviceName); |
| | | GetSrmStateThreads.Add(thread); |
| | | StartThread(thread, x); |
| | | }); |
| | | ////模拟测试 |
| | | //var y = Srm_CacheEntity.DeviceObjs[3]; |
| | | //var thread_test = new Thread(new ParameterizedThreadStart(GetSrmInfo)); |
| | | //thread_test.Name = string.Format("获取堆垛机{0}的状态", y.View.DeviceName); |
| | | //GetSrmStateThreads.Add(thread_test); |
| | | //StartThread(thread_test, y); |
| | | |
| | | |
| | | //获取Rgv的状态信息 |
| | | Rgv_CacheEntity.DeviceObjs.ForEach(x => |
| | | //获取Station的状态信息 |
| | | Station_CacheEntity.DeviceObjs.ForEach(x => |
| | | { |
| | | var thread = new Thread(new ParameterizedThreadStart(GetRgvInfo)); |
| | | thread.Name = string.Format("获取Rgv{0}的状态", x.View.DeviceName); |
| | | GetRgvStateThreads.Add(thread); |
| | | var thread = new Thread(new ParameterizedThreadStart(GetStationInfo)); |
| | | thread.Name = string.Format("获取Station{0}的状态", x.View.DeviceName); |
| | | GetStationStateThreads.Add(thread); |
| | | StartThread(thread, x); |
| | | }); |
| | | |
| | | |
| | | /* |
| | | Rgv_CacheEntity.DeviceObjs.ForEach(x => |
| | | { |
| | | var thread = new Thread(new ParameterizedThreadStart(HandleRGVAckBug)); |
| | | thread.Name = string.Format("修复Rgv{0}的ACK BUG", x.View.DeviceName); |
| | | GetRgvStateThreads.Add(thread); |
| | | StartThread(thread, x); |
| | | }); |
| | | //*/ |
| | | |
| | | |
| | | ////获取输送线的状态信息 |
| | | //HuscoLine_CacheEntity.DeviceObjs.ForEach(x => |
| | | //{ |
| | | // var thread = new Thread(new ParameterizedThreadStart(GetLineInfo)); |
| | | // thread.Name = string.Format("获取输送线{0}的状态", x.View.DeviceName); |
| | | // GetLineStateThreads.Add(thread); |
| | | // StartThread(thread, x); |
| | | //}); |
| | | |
| | | #endregion |
| | | |
| | | #region 设备发送心跳 |
| | | |
| | | //开启 堆垛机 心跳的线程 |
| | | Srm_CacheEntity.DeviceObjs.ForEach(x => |
| | | |
| | | //开启 Station 心跳的线程 |
| | | Station_CacheEntity.DeviceObjs.ForEach(x => |
| | | { |
| | | var thread = new Thread(new ParameterizedThreadStart(SendStackerHeartToSrm)); |
| | | thread.Name = string.Format("自动发送堆垛机{0}心跳", x.View.DeviceName); |
| | | SendStackerHeartToSrmThreads.Add(thread); |
| | | var thread = new Thread(new ParameterizedThreadStart(SendStackerHeartToStation)); |
| | | thread.Name = string.Format("自动发送Station{0}心跳", x.View.DeviceName); |
| | | SendStackerHeartToStationThreads.Add(thread); |
| | | StartThread(thread, x); |
| | | }); |
| | | //开启 Rgv 心跳的线程 |
| | | Rgv_CacheEntity.DeviceObjs.ForEach(x => |
| | | { |
| | | var thread = new Thread(new ParameterizedThreadStart(SendStackerHeartToRgv)); |
| | | thread.Name = string.Format("自动发送Rgv{0}心跳", x.View.DeviceName); |
| | | SendStackerHeartToRgvThreads.Add(thread); |
| | | StartThread(thread, x); |
| | | }); |
| | | /* |
| | | //开启 输送线 心跳的线程 |
| | | HuscoLine_CacheEntity.DeviceObjs.ForEach(x => |
| | | { |
| | | var thread = new Thread(new ParameterizedThreadStart(SendStackerHeartToLine)); |
| | | thread.Name = string.Format("自动发送输送线{0}心跳", x.View.DeviceName); |
| | | SendStackerHeartToLineThreads.Add(thread); |
| | | StartThread(thread, x); |
| | | }); |
| | | //*/ |
| | | |
| | | #endregion |
| | | |
| | | #region UI显示 |
| | | |
| | | var treadShowUI = new Thread(ShowUI); |
| | | treadShowUI.Start(); |
| | | |
| | | #endregion |
| | | |
| | | new Thread(DeleteData).Start(); |
| | | //*/ |
| | |
| | | |
| | | #endregion |
| | | |
| | | #region Rgv |
| | | #region Station |
| | | |
| | | #region 设备状态信息 |
| | | /// <summary> |
| | | /// 获取 Rgv 的状态信息 |
| | | /// 获取 Station 的状态信息 |
| | | /// </summary> |
| | | /// <param name="obj"></param> |
| | | private void GetRgvInfo(object obj) |
| | | private void GetStationInfo(object obj) |
| | | { |
| | | var s = (RgvEntity)obj; |
| | | var s = (StationEntity)obj; |
| | | if (s.plcService != null && !s.plcService.IsConnected) |
| | | { |
| | | s.plcService.Close(); |
| | |
| | | s.InitData(); |
| | | if (s.plcService == null || !s.plcService.IsConnected) |
| | | { |
| | | errorStr_Rgv = "Rgv" + s.View.DeviceName + "连接已断开,正在尝试打开。。。"; |
| | | errorStr_Rgv = SysHelper.Language(WareSdaStruct.LanguageFlg, errorStr_Rgv, "Piler connection disconnected,waiting for reconnection "); |
| | | errorStr_Station = "Station" + s.View.DeviceName + "连接已断开,正在尝试打开。。。"; |
| | | errorStr_Station = SysHelper.Language(WareSdaStruct.LanguageFlg, errorStr_Station, "Piler connection disconnected,waiting for reconnection "); |
| | | s.plcService.Close(); |
| | | s.plcService.OpenService(); |
| | | Thread.Sleep(100); |
| | |
| | | else |
| | | { |
| | | var s7 = s.plcService; |
| | | var Rgv_db = s.DBBlockForWrite; |
| | | var Station_db = s.DBBlockForWrite; |
| | | |
| | | s.SetPropertyValueForRead(); |
| | | s.SetPropertyValueForWrite(); |
| | |
| | | //s.View.BodyTestName = s.GetBodyTestName(s.View.r_S); |
| | | //s.View.StateName = s.GetStateName(s.View.R_State); |
| | | |
| | | if (SdaMainForm.isShowPlcValue_Rgv) |
| | | if (SdaMainForm.isShowPlcValue_Station) |
| | | { |
| | | string dbValues = SdaHelper.GetStrShow<RgvView, RgvDBForWrite, RgvDBForRead>(s.View, s.DBBlockForWrite, s.DBBlockForRead, "", "", s.View.DeviceId, s.View.DeviceName); |
| | | realtimePlcValueDict_Rgv[s.View.DeviceName] = dbValues; |
| | | string dbValues = SdaHelper.GetStrShow<StationView, StationDBForWrite, StationDBForRead>(s.View, s.DBBlockForWrite, s.DBBlockForRead, "", "", s.View.DeviceId, s.View.DeviceName); |
| | | realtimePlcValueDict_Station[s.View.DeviceName] = dbValues; |
| | | } |
| | | else |
| | | { |
| | | realtimePlcValueDict_Rgv[s.View.DeviceName] = ""; |
| | | realtimePlcValueDict_Station[s.View.DeviceName] = ""; |
| | | } |
| | | |
| | | foreach (var item in s.View.R_RgvForReadCommList) |
| | | foreach (var item in s.View.R_StationForReadCommList) |
| | | { |
| | | //判断如果ACK=1,则写入STB为0 |
| | | if (item.R_ACK == true) |
| | | { |
| | | var writeObj = s.View.W_RgvForWriteCommList.Where(x => x.StationCode == item.StationCode).FirstOrDefault(); |
| | | var writeAddressObj = s.DBBlockForWrite.W_RgvForWriteCommList.Where(x => x.StationCode == item.StationCode).FirstOrDefault(); |
| | | MessageModel fr = s.plcService.WriteValuePoint(writeAddressObj.W_STP, false, writeObj.W_STP); |
| | | var writeObj = s.View.W_StationForWriteCommList.Where(x => x.StationCode == item.StationCode).FirstOrDefault(); |
| | | var writeAddressObj = s.DBBlockForWrite.W_StationForWriteCommList.Where(x => x.StationCode == item.StationCode).FirstOrDefault(); |
| | | MessageModel fr = null; |
| | | if (fr.result == false) |
| | | { |
| | | Log4NetHelper.WriteErrorLog(LogType.SrmTheadService, "获取 RGV和输送线 的状态信息时,判断ACK=1,更新STB为0时错误:" + fr.resMsg, null); |
| | | Log4NetHelper.WriteErrorLog(LogType.SrmTheadService, "获取 Station和输送线 的状态信息时,判断ACK=1,更新STB为0时错误:" + fr.resMsg, null); |
| | | } |
| | | } |
| | | } |
| | | |
| | | //赋值报警 |
| | | //s.View.R_Line_WarningDBList = s.GetLineAlertDatas(); |
| | | s.View.R_Rgv_WarningDBList = s.GetRgvAlertDatas(); |
| | | s.View.R_Station_WarningDBList = s.GetStationAlertDatas(); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | s.InitData(); |
| | | errorStr_Rgv = "GetRgvInfo出现异常:" + ex.Message; |
| | | errorStr_Rgv = SysHelper.Language(WareSdaStruct.LanguageFlg, errorStr_Rgv, |
| | | "GetRgvInfo throw exceptions: " + ex.Message); |
| | | errorStr_Station = "GetStationInfo出现异常:" + ex.Message; |
| | | errorStr_Station = SysHelper.Language(WareSdaStruct.LanguageFlg, errorStr_Station, |
| | | "GetStationInfo throw exceptions: " + ex.Message); |
| | | |
| | | Log4NetHelper.WriteErrorLog(LogType.RgvSdaService, "获取 Rgv 的状态信息出现异常", ex); |
| | | Log4NetHelper.WriteErrorLog(LogType.StationSdaService, "获取 Station 的状态信息出现异常", ex); |
| | | } |
| | | Thread.Sleep(1000); |
| | | } |
| | |
| | | #region 心跳相关 |
| | | |
| | | /// <summary> |
| | | /// 发送给Rgv的心跳 |
| | | /// 发送给Station的心跳 |
| | | /// </summary> |
| | | /// <param name="obj"></param> |
| | | private void SendStackerHeartToRgv(object obj) |
| | | private void SendStackerHeartToStation(object obj) |
| | | { |
| | | bool handShakeValue = true; |
| | | while (true) |
| | | { |
| | | var s = (RgvEntity)obj; |
| | | var s = (StationEntity)obj; |
| | | handShakeValue = !handShakeValue; |
| | | try |
| | | { |
| | | if (s.plcService != null && !s.plcService.IsConnected) |
| | | { |
| | | |
| | | errorStr_Rgv = SysHelper.Language(WareSdaStruct.LanguageFlg, "Rgv" + s.View.DeviceName + "连接已断开", "Piler connection disconnected "); |
| | | errorStr_Station = SysHelper.Language(WareSdaStruct.LanguageFlg, "Station" + s.View.DeviceName + "连接已断开", "Piler connection disconnected "); |
| | | Thread.Sleep(100); |
| | | continue; |
| | | } |
| | | errorStr_Rgv = SysHelper.Language(WareSdaStruct.LanguageFlg, "Rgv" + s.View.DeviceName + "连接已连接。。。", "Piler connection connected "); |
| | | errorStr_Station = SysHelper.Language(WareSdaStruct.LanguageFlg, "Station" + s.View.DeviceName + "连接已连接。。。", "Piler connection connected "); |
| | | if (s.plcService != null && s.plcService.IsConnected) |
| | | { |
| | | MessageModel fr = s.plcService.WriteValuePoint(s.DBBlockForWrite.W_HandShake, handShakeValue, s.View.W_HandShake); |
| | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | errorStr_Rgv = SysHelper.Language(WareSdaStruct.LanguageFlg, "发送心跳给Rgv出现异常。。。" + ex.Message, "Send to stacker for heart beat throw expection: " + ex.Message); |
| | | Log4NetHelper.WriteErrorLog(LogType.SdaService, "发送给Rgv的心跳出现异常:" + ex.Message, ex); |
| | | errorStr_Station = SysHelper.Language(WareSdaStruct.LanguageFlg, "发送心跳给Station出现异常。。。" + ex.Message, "Send to stacker for heart beat throw expection: " + ex.Message); |
| | | Log4NetHelper.WriteErrorLog(LogType.SdaService, "发送给Station的心跳出现异常:" + ex.Message, ex); |
| | | } |
| | | } |
| | | } |
| | |
| | | //line.View.R_WarningDBList = line.GetAlertDatas(); |
| | | |
| | | string dbValues = SdaHelper.GetStrShow<HuscoLineView, HuscoLineDBForWrite, HuscoLineDBForRead>(line.View, line.DBBlockForWrite, line.DBBlockForRead, HuscoLine_CacheEntity.W_DBHeader, HuscoLine_CacheEntity.R_DBHeader, line.View.DeviceId, line.View.DeviceName); |
| | | this.tb_Rgv.Text = dbValues + " \r\n AssemblyBarcode:" + _AssemblyBarcode + " \r\n CoilCode:" + _CoilCode + " \r\n"; |
| | | this.tb_Station.Text = dbValues + " \r\n AssemblyBarcode:" + _AssemblyBarcode + " \r\n CoilCode:" + _CoilCode + " \r\n"; |
| | | |
| | | //首先读取握手信号是否是true,只有true 的时候才能拿值 |
| | | var isRead = Convert.ToInt32(line.plcService.ReadValuePoint("", handShareAddress, typeof(Int32))); |
| | |
| | | Thread.Sleep(1000); |
| | | try |
| | | { |
| | | foreach (var item in realtimePlcValueDict_Srm) |
| | | { |
| | | if (item.Key == "Srm1") |
| | | { |
| | | this.tb_Srm1.Text = item.Value; |
| | | } |
| | | else if (item.Key == "Srm2") |
| | | { |
| | | this.tb_Srm2.Text = item.Value; |
| | | } |
| | | else if (item.Key == "Srm3") |
| | | { |
| | | this.tb_Srm3.Text = item.Value; |
| | | } |
| | | else if (item.Key == "Srm4") |
| | | { |
| | | this.tb_Srm4.Text = item.Value; |
| | | } |
| | | } |
| | | |
| | | var str_rgv = ""; |
| | | foreach (var item in realtimePlcValueDict_Rgv) |
| | | var str_Station = ""; |
| | | foreach (var item in realtimePlcValueDict_Station) |
| | | { |
| | | str_rgv += item.Value; |
| | | str_Station += item.Value; |
| | | } |
| | | this.tb_Rgv.Text = str_rgv; |
| | | this.tb_Station.Text = str_Station; |
| | | |
| | | } |
| | | catch (Exception) |
| | |
| | | { |
| | | realtimePlcValueDict_Srm.Add(x.View.DeviceName, ""); |
| | | }); |
| | | Rgv_CacheEntity.DeviceObjs.ForEach(x => |
| | | Station_CacheEntity.DeviceObjs.ForEach(x => |
| | | { |
| | | realtimePlcValueDict_Srm.Add(x.View.DeviceName, ""); |
| | | }); |
| | |
| | | |
| | | private void button2_Click_1(object sender, EventArgs e) |
| | | { |
| | | isShowPlcValue_Rgv = true; |
| | | isShowPlcValue_Station = true; |
| | | } |
| | | |
| | | private void button1_Click_1(object sender, EventArgs e) |
| | | { |
| | | isShowPlcValue_Rgv = false; |
| | | isShowPlcValue_Station = false; |
| | | } |
| | | |
| | | /* |
| | | /// <summary> |
| | | /// 一直存在RGVACK信号无法清除的BUG,做个定时清除的线程 |
| | | /// 一直存在StationACK信号无法清除的BUG,做个定时清除的线程 |
| | | /// </summary> |
| | | public void HandleRGVAckBug(object obj) |
| | | public void HandleStationAckBug(object obj) |
| | | { |
| | | var s = (RgvEntity)obj; |
| | | var s = (StationEntity)obj; |
| | | |
| | | while (true) |
| | | { |
| | | Thread.Sleep(1000); |
| | | bool finishRgv = (bool)s.plcService.ReadValuePoint(s.DBBlockForRead.R_RGV_Finish, typeof(bool)); |
| | | bool finisAck = (bool)s.plcService.ReadValuePoint(s.DBBlockForWrite.W_RGV_FinishACK, typeof(bool)); |
| | | bool finishStation = (bool)s.plcService.ReadValuePoint(s.DBBlockForRead.R_Station_Finish, typeof(bool)); |
| | | bool finisAck = (bool)s.plcService.ReadValuePoint(s.DBBlockForWrite.W_Station_FinishACK, typeof(bool)); |
| | | |
| | | if (finisAck == false && finishRgv == true) |
| | | if (finisAck == false && finishStation == true) |
| | | { |
| | | Thread.Sleep(10000);//如果10秒还没清除,就强制清除 |
| | | finishRgv = (bool)s.plcService.ReadValuePoint(s.DBBlockForRead.R_RGV_Finish, typeof(bool)); |
| | | finisAck = (bool)s.plcService.ReadValuePoint(s.DBBlockForWrite.W_RGV_FinishACK, typeof(bool)); |
| | | if (finisAck == false && finishRgv == true) |
| | | finishStation = (bool)s.plcService.ReadValuePoint(s.DBBlockForRead.R_Station_Finish, typeof(bool)); |
| | | finisAck = (bool)s.plcService.ReadValuePoint(s.DBBlockForWrite.W_Station_FinishACK, typeof(bool)); |
| | | if (finisAck == false && finishStation == true) |
| | | { |
| | | s.plcService.WriteValuePoint(s.DBBlockForWrite.W_RGV_FinishACK, true, s.View.W_RGV_FinishACK);//重发一次 20230503 王铮 |
| | | s.plcService.WriteValuePoint(s.DBBlockForWrite.W_Station_FinishACK, true, s.View.W_Station_FinishACK);//重发一次 20230503 王铮 |
| | | } |
| | | |
| | | } |