private async void RunSimulator() { //创建驱动 for (int i = 0; i < this.Communications.Count; i++) { await Task.Run(() => { if (this.Communications[i].CommunicateDriver == null) { MonitorDataBaseModel.IOCommunications[i].CommunicateDriver = DriverAssembly.CreateCommunicateDriver(MonitorDataBaseModel.IOCommunications[i].DriverInfo); } ScadaCommunicateKernel driverDll = (ScadaCommunicateKernel)MonitorDataBaseModel.IOCommunications[i].CommunicateDriver; driverDll.IsCreateControl = false; driverDll.InitKernel(this.Servers.Find(x => x.SERVER_ID == this.Communications[i].IO_SERVER_ID), this.Communications[i], Communications[i].Devices, Communications[i].DriverInfo); driverDll.Simulator(Interval, false); driverDll.SimulatorStart(); driverDll.SimulatorLog += DriverDll_SimulatorLog; driverDll.CommunctionClose += IOMonitorManager.CDriverDll_CommunctionClose; driverDll.CommunctionContinue += IOMonitorManager.CDriverDll_CommunctionContinue; driverDll.CommunctionPause += IOMonitorManager.CDriverDll_CommunctionPause; driverDll.CommunctionStart += IOMonitorManager.CDriverDll_CommunctionStart; driverDll.CommunctionStop += IOMonitorManager.CDriverDll_CommunctionStop; driverDll.DeviceSended += IOMonitorManager.CDriverDll_DeviceSended; driverDll.DeviceStatusChanged += IOMonitorManager.CDriverDll_DeviceStatusChanged; driverDll.Exception += IOMonitorManager.CDriverDll_Exception; driverDll.OnDataReceived += IOMonitorManager.CDriverDll_OnDataReceived; driverDll.OnShowFormLog += IOMonitorManager.CDriverDll_OnShowFormLog; }); } }
//开始任务 public static void Start() { //创建通信子任务 for (int i = 0; i < MonitorDataBaseModel.IOCommunications.Count; i++) { if (MonitorDataBaseModel.IOCommunications[i].CommunicateDriver != null) { try { ScadaCommunicateKernel driverDll = (ScadaCommunicateKernel)MonitorDataBaseModel.IOCommunications[i].CommunicateDriver; //创建主任务 Task.Run(() => { driverDll.StartServer(); }); } catch (Exception emx) { ThrowExceptionToMain(emx); } } } TaskOperator = TaskOperator.运行; if (OnMonitorOperator != null) { OnMonitorOperator(TaskOperator); } AddLogToMainLog("启动采集服务"); }
//关闭并释放任务,该任务要求初始化所有任务 public static void Close() { Task.Run(() => { try { for (int i = 0; i < MonitorDataBaseModel.IOCommunications.Count; i++) { //此处不用线程,在具体实现中用户采用线程 if (MonitorDataBaseModel.IOCommunications[i].CommunicateDriver != null) { ScadaCommunicateKernel driverDll = (ScadaCommunicateKernel)MonitorDataBaseModel.IOCommunications[i].CommunicateDriver; driverDll.CommunctionClose -= CDriverDll_CommunctionClose; driverDll.CommunctionContinue -= CDriverDll_CommunctionContinue; driverDll.CommunctionPause -= CDriverDll_CommunctionPause; driverDll.CommunctionStart -= CDriverDll_CommunctionStart; driverDll.CommunctionStop -= CDriverDll_CommunctionStop; driverDll.DeviceSended -= CDriverDll_DeviceSended; driverDll.DeviceStatusChanged -= CDriverDll_DeviceStatusChanged; driverDll.Exception -= CDriverDll_Exception; driverDll.OnDataReceived -= CDriverDll_OnDataReceived; driverDll.OnShowFormLog -= CDriverDll_OnShowFormLog; driverDll.StopServer(); } } TaskOperator = TaskOperator.关闭; if (OnMonitorOperator != null) { OnMonitorOperator(TaskOperator); } AddLogToMainLog("停止并并关闭采集服务"); if (ClearMemoryTimer != null) { ClearMemoryTimer.Dispose(); ClearMemoryTimer = null; } if (TcpClient != null) { TcpClient.Stop(); TcpClient.Dispose(); TcpClient = null; } } catch (Exception emx) { ThrowExceptionToMain(emx); } }); }
/// <summary> /// 创建通讯驱动 /// </summary> /// <param name="commModel"></param> /// <returns></returns> public static ScadaCommunicateKernel CreateCommunicateDriver(Scada.Model.SCADA_DRIVER commModel) { try { ScadaCommunicateKernel river = (ScadaCommunicateKernel)CreateObject(commModel.CommunicationFullName, commModel.FillName); return(river); } catch { return(null); } }
private void comboDrive_SelectedIndexChanged(object sender, EventArgs e) { if (comboDrive.SelectedItem != null) { try { Scada.Model.SCADA_DRIVER driver = comboDrive.SelectedItem as Scada.Model.SCADA_DRIVER; DriverCom = FormManager.CreateCommunicateDriver(driver); if (DriverCom == null) { return; } try { DriverCom.InitKernel(this.Server, this.Comunication, null, driver); } catch (Exception emx) { FormManager.DisplayException(new Exception("通讯驱动初始化InitDriver失败" + emx.Message)); } try { if (DriverCom.CommunicationControl != null) { DriverCom.CommunicationControl.SetUIParameter(Comunication.IO_COMM_PARASTRING); } } catch (Exception emx) { FormManager.DisplayException(new Exception("解析通讯驱动参数失败(SetUIParameter)" + emx.Message)); } this.tabPage2.Controls.Clear(); this.tabPage2.Controls.Add(DriverCom.CommunicationControl); } catch (Exception emx) { FormManager.DisplayException(new Exception("加载通讯驱动失败" + emx.Message)); } } }
public static void Continue() { Task.Run(() => { for (int i = 0; i < MonitorDataBaseModel.IOCommunications.Count; i++) { //此处不用线程,在具体实现中用户采用线程 if (MonitorDataBaseModel.IOCommunications[i].CommunicateDriver != null) { ScadaCommunicateKernel driverDll = (ScadaCommunicateKernel)MonitorDataBaseModel.IOCommunications[i].CommunicateDriver; driverDll.ContinueServer(); } } TaskOperator = TaskOperator.运行; if (OnMonitorOperator != null) { OnMonitorOperator(TaskOperator); } AddLogToMainLog("继续采集服务"); }); }
public static void Stop() { Task.Run(() => { try { if (MonitorDataBaseModel.IOCommunications != null) { for (int i = 0; i < MonitorDataBaseModel.IOCommunications.Count; i++) { //此处不用线程,在具体实现中用户采用线程 if (MonitorDataBaseModel.IOCommunications[i].CommunicateDriver != null) { ScadaCommunicateKernel driverDll = (ScadaCommunicateKernel)MonitorDataBaseModel.IOCommunications[i].CommunicateDriver; driverDll.StopServer(); } } } if (MonitorDataBaseModel.IODevices != null) { for (int i = 0; i < MonitorDataBaseModel.IODevices.Count; i++) { MonitorDataBaseModel.IODevices[i].ClearCollectDatas(); } } TaskOperator = TaskOperator.停止; if (OnMonitorOperator != null) { OnMonitorOperator(TaskOperator); } AddLogToMainLog("停止采集服务"); } catch (Exception emx) { ThrowExceptionToMain(emx); } }); }
/// <summary> /// 结束模拟器 /// </summary> public void ColseSimulator() { Task.WaitAll(); IsSimulator = false; for (int i = 0; i < this.Communications.Count; i++) { try { if (this.Communications[i].CommunicateDriver == null) { MonitorDataBaseModel.IOCommunications[i].CommunicateDriver = DriverAssembly.CreateCommunicateDriver(MonitorDataBaseModel.IOCommunications[i].DriverInfo); } ScadaCommunicateKernel driverDll = (ScadaCommunicateKernel)MonitorDataBaseModel.IOCommunications[i].CommunicateDriver; driverDll.SimulatorClose(); } catch { continue; } } GC.Collect(); }
/// <summary> /// 传入的是实际的数据包,并不包含头标识和尾标识 /// </summary> /// <param name="receivebytes"></param> /// <param name="count"></param> /// <param name="c"></param> private void SplitReceivePack(byte[] receivebytes, int count, AsyncTcpClient c) { //将实际字节转化成字符串 string message = Encoding.UTF8.GetString(receivebytes); //心跳包,不做处理 if (message == c.HeartBeat) { return; } #region 处理实际数据体 byte opeartor = receivebytes[0]; ScadaTcpOperator operatorEnum = (ScadaTcpOperator)opeartor; if (c.IsOperator(opeartor)) { switch (operatorEnum) { case ScadaTcpOperator.登录反馈: { try { #region 处理采集器端登录 TcpData tcpData = new TcpData(); byte[] narra = new byte[count - 1]; System.Array.Copy(receivebytes, 1, narra, 0, count - 1); tcpData.BytesToTcpItem(narra); if (tcpData == null) { if (OnUserLogined != null) { OnUserLogined(c, false, "登录失败"); } return; } STATION_TCP_INFO loginInfo = new STATION_TCP_INFO(); try { loginInfo.IO_SERVER_ID = tcpData.GetItemValue("IO_SERVER_ID"); loginInfo.IO_SERVER_IP = tcpData.GetItemValue("IO_SERVER_IP"); loginInfo.PASSWROD = tcpData.GetItemValue("PASSWROD"); loginInfo.USER = tcpData.GetItemValue("USER"); loginInfo.RESULT = tcpData.GetItemValue("RESULT"); loginInfo.MSG = tcpData.GetItemValue("MSG"); loginInfo.FUNCTION = tcpData.GetItemValue("FUNCTION"); //判断是否已经存在有发布的采集站工程 if (loginInfo.RESULT == "true") { if (OnUserLogined != null) { OnUserLogined(c, true, loginInfo.MSG); } } else { if (OnUserLogined != null) { OnUserLogined(c, false, loginInfo.MSG); } } } catch { if (OnUserLogined != null) { OnUserLogined(c, false, "登录失败"); } return; } tcpData.Dispose(); #endregion } catch (Exception ex) { ThrowExceptionToMain(new Exception("ERR10024" + ex.Message)); } } break; case ScadaTcpOperator.更新采集站报警: //接收到服务器端更新采集站中报警配置通知 { try { #region 更新采集站报警 TcpData tcpData = new TcpData(); byte[] narra = new byte[count - 1]; System.Array.Copy(receivebytes, 1, narra, 0, count - 1); tcpData.BytesToTcpItem(narra); if (tcpData == null) { //解析字符串失败 return; } IO_ALARM_CONFIG alarmConfig = new IO_ALARM_CONFIG(); try { alarmConfig.IO_ALARM_LEVEL = tcpData.GetItemValue("IO_ALARM_LEVEL"); alarmConfig.IO_ALARM_NUMBER = int.Parse(tcpData.GetItemValue("IO_ALARM_NUMBER")); alarmConfig.IO_ALARM_TYPE = tcpData.GetItemValue("IO_ALARM_TYPE"); alarmConfig.IO_COMM_ID = tcpData.GetItemValue("IO_COMM_ID"); alarmConfig.IO_CONDITION = tcpData.GetItemValue("IO_CONDITION"); alarmConfig.IO_DEVICE_ID = tcpData.GetItemValue("IO_DEVICE_ID"); alarmConfig.IO_ENABLE_MAX = int.Parse(tcpData.GetItemValue("IO_ENABLE_MAX")); alarmConfig.IO_ENABLE_MAXMAX = int.Parse(tcpData.GetItemValue("IO_ENABLE_MAXMAX")); alarmConfig.IO_ENABLE_MIN = int.Parse(tcpData.GetItemValue("IO_ENABLE_MIN")); alarmConfig.IO_ENABLE_MINMIN = int.Parse(tcpData.GetItemValue("IO_ENABLE_MINMIN")); alarmConfig.IO_ID = tcpData.GetItemValue("IO_ID"); alarmConfig.IO_MAXMAX_TYPE = tcpData.GetItemValue("IO_MAXMAX_TYPE"); alarmConfig.IO_MAXMAX_VALUE = int.Parse(tcpData.GetItemValue("IO_MAXMAX_VALUE")); alarmConfig.IO_MAX_TYPE = tcpData.GetItemValue("IO_MAX_TYPE"); alarmConfig.IO_MAX_VALUE = int.Parse(tcpData.GetItemValue("IO_MAX_VALUE")); alarmConfig.IO_MINMIN_TYPE = tcpData.GetItemValue("IO_MINMIN_TYPE"); alarmConfig.IO_MINMIN_VALUE = int.Parse(tcpData.GetItemValue("IO_MINMIN_VALUE")); alarmConfig.IO_MIN_TYPE = tcpData.GetItemValue("IO_MIN_TYPE"); alarmConfig.IO_MIN_VALUE = int.Parse(tcpData.GetItemValue("IO_MIN_VALUE")); alarmConfig.IO_SERVER_ID = tcpData.GetItemValue("IO_SERVER_ID"); alarmConfig.UPDATE_DATE = ""; alarmConfig.UPDATE_RESULT = ""; alarmConfig.UPDATE_UID = ""; } catch (Exception ex) { ThrowExceptionToMain(new Exception("ERROR20102 " + ex.Message)); alarmConfig = null; } if (alarmConfig != null) { if (alarmconfigBll.Update(alarmConfig)) { byte[] sendbytes = tcpData.StringToTcpByte(tcpData.TcpItemToString(), ScadaTcpOperator.更新采集站报警反馈); this.Send(new ArraySegment <byte>(sendbytes)); IO_DEVICE device = MonitorDataBaseModel.IODevices.Find(x => x.IO_DEVICE_ID == alarmConfig.IO_DEVICE_ID); if (device != null) { IO_PARA para = device.IOParas.Find(x => x.IO_ID == alarmConfig.IO_ID); if (para != null) { para.AlarmConfig = alarmConfig; AddLogToMainLog("管理员更新" + device.IO_DEVICE_NAME + "[" + device.IO_DEVICE_LABLE + "]//" + para.IO_NAME + "[" + para.IO_LABEL + "]" + "报警配置成功! "); } } } else { AddLogToMainLog("管理员更新" + alarmConfig.IO_ID + "报警配置失败! "); } } tcpData.Dispose(); #endregion } catch (Exception ex) { ThrowExceptionToMain(new Exception("ERR10029" + ex.Message)); } } break; case ScadaTcpOperator.置命令: //接收到用户要下置命令 { try { byte[] contentbytes = new byte[receivebytes.Length - 1]; System.Array.Copy(receivebytes, 1, contentbytes, 0, receivebytes.Length - 1); TcpData tcpData = new TcpData(); tcpData.BytesToTcpItem(contentbytes); IO_COMMANDS command = new IO_COMMANDS() { COMMAND_DATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), COMMAND_ID = tcpData.GetItemValue("COMMAND_ID"), COMMAND_RESULT = tcpData.GetItemValue("COMMAND_RESULT"), COMMAND_USER = tcpData.GetItemValue("COMMAND_USER"), COMMAND_VALUE = tcpData.GetItemValue("COMMAND_VALUE"), IO_COMM_ID = tcpData.GetItemValue("IO_COMM_ID"), IO_DEVICE_ID = tcpData.GetItemValue("IO_DEVICE_ID"), IO_ID = tcpData.GetItemValue("IO_ID"), IO_LABEL = tcpData.GetItemValue("IO_LABEL"), IO_NAME = tcpData.GetItemValue("IO_NAME"), IO_SERVER_ID = tcpData.GetItemValue("IO_SERVER_ID") }; Scada.Model.IO_COMMUNICATION _COMMUNICATION = MonitorDataBaseModel.IOCommunications.Find(x => x.IO_COMM_ID == command.IO_COMM_ID && command.IO_SERVER_ID == x.IO_SERVER_ID); Scada.Model.IO_DEVICE device = MonitorDataBaseModel.IODevices.Find(x => x.IO_COMM_ID == command.IO_COMM_ID && command.IO_SERVER_ID == x.IO_SERVER_ID && x.IO_DEVICE_ID == command.IO_DEVICE_ID); if (_COMMUNICATION != null && device != null) { Scada.Model.IO_PARA para = device.IOParas.Find(x => x.IO_COMM_ID == command.IO_COMM_ID && command.IO_SERVER_ID == x.IO_SERVER_ID && x.IO_DEVICE_ID == command.IO_DEVICE_ID && x.IO_ID == command.IO_ID); if (para == null) { AddLogToMainLog(device.IO_DEVICE_NAME + "[" + device.IO_DEVICE_LABLE + "] 设备下参数 " + para.IO_ID + " " + para.IO_LABEL + " " + para.IO_NAME + " 参数不存在"); return; } if (_COMMUNICATION.DriverInfo == null) { AddLogToMainLog("请在采集站中设置该通讯通道驱动!"); return; } try { if (_COMMUNICATION.CommunicateDriver == null) { AddLogToMainLog("请在采集站中设置该通讯通道驱动!"); return; } else { ((ScadaCommunicateKernel)_COMMUNICATION.CommunicateDriver).IsCreateControl = false; } ScadaCommunicateKernel driverDll = (ScadaCommunicateKernel)_COMMUNICATION.CommunicateDriver; driverDll.SetUIParameter(_COMMUNICATION.IO_COMM_PARASTRING); driverDll.IsCreateControl = false; driverDll.InitKernel(MonitorDataBaseModel.IOServer, _COMMUNICATION, _COMMUNICATION.Devices, _COMMUNICATION.DriverInfo); try { driverDll.SendCommand(MonitorDataBaseModel.IOServer, _COMMUNICATION, device, para, command.COMMAND_VALUE); AddLogToMainLog(device.IO_DEVICE_NAME + "[" + device.IO_DEVICE_LABLE + "] 设备下参数 " + para.IO_ID + " " + para.IO_LABEL + " " + para.IO_NAME + " 已经下置成功,下置值" + command.COMMAND_VALUE); } catch (Exception ex) { ThrowExceptionToMain(new Exception("ERROR600002" + ex.Message)); } } catch (Exception ex) { ThrowExceptionToMain(new Exception("ERROR600001" + ex.Message)); } } } catch (Exception ex) { ThrowExceptionToMain(new Exception("ERR10030" + ex.Message)); } } break; case ScadaTcpOperator.重新启动: break; } } #endregion }
public static void InitMonitor() { commDriverBll = new Scada.Business.SCADA_DRIVER(); //开启日志保存服务 MonitorLogRun(); #region 创建通讯和设备驱动 int num = MonitorDataBaseModel.ProgressMaxNum + 4; //执行方法 #region 读取当前采集站工程数据 try { TaskOperator = TaskOperator.关闭; IOServer = MonitorDataBaseModel.IOServer; //创建驱动模块 for (int i = 0; i < MonitorDataBaseModel.IOCommunications.Count; i++) { if (MonitorDataBaseModel.IOCommunications[i].DriverInfo == null) { AddLogToMainLog("创建通道" + MonitorDataBaseModel.IOCommunications[i].IO_COMM_NAME.ToString() + @"[" + MonitorDataBaseModel.IOCommunications[i].IO_COMM_LABEL + @"]驱动失败,请在采集站中设置该通讯通道驱动!"); continue; } try { if (MonitorDataBaseModel.IOCommunications[i].CommunicateDriver == null) { continue; } else { ((ScadaCommunicateKernel)MonitorDataBaseModel.IOCommunications[i].CommunicateDriver).IsCreateControl = false; } AddLogToMainLog("创建通道" + MonitorDataBaseModel.IOCommunications[i].IO_COMM_NAME.ToString() + @"[" + MonitorDataBaseModel.IOCommunications[i].IO_COMM_LABEL + @"]驱动成功!"); ScadaCommunicateKernel driverDll = (ScadaCommunicateKernel)MonitorDataBaseModel.IOCommunications[i].CommunicateDriver; driverDll.SetUIParameter(MonitorDataBaseModel.IOCommunications[i].IO_COMM_PARASTRING); driverDll.IsCreateControl = false; driverDll.InitKernel(MonitorDataBaseModel.IOServer, MonitorDataBaseModel.IOCommunications[i], MonitorDataBaseModel.IOCommunications[i].Devices, MonitorDataBaseModel.IOCommunications[i].DriverInfo); driverDll.CommunctionClose += CDriverDll_CommunctionClose; driverDll.CommunctionContinue += CDriverDll_CommunctionContinue; driverDll.CommunctionPause += CDriverDll_CommunctionPause; driverDll.CommunctionStart += CDriverDll_CommunctionStart; driverDll.CommunctionStop += CDriverDll_CommunctionStop; driverDll.DeviceSended += CDriverDll_DeviceSended; driverDll.DeviceStatusChanged += CDriverDll_DeviceStatusChanged; driverDll.Exception += CDriverDll_Exception; driverDll.OnDataReceived += CDriverDll_OnDataReceived; driverDll.OnShowFormLog += CDriverDll_OnShowFormLog; AddLogToMainLog("准备创建该通道下的设备驱动....."); for (int d = 0; d < MonitorDataBaseModel.IOCommunications[i].Devices.Count; d++) { Scada.Model.IO_DEVICE device = MonitorDataBaseModel.IOCommunications[i].Devices[d]; try { if (MonitorDataBaseModel.IOCommunications[i].Devices[d].DriverInfo == null) { AddLogToMainLog("创建设备" + device.IO_DEVICE_LABLE.ToString() + @"[" + device.IO_DEVICE_NAME + @"]驱动失败,请在采集站中设置该设备驱动!"); continue; } ((ScadaDeviceKernel)device.DeviceDrive).IsCreateControl = false; ((ScadaDeviceKernel)device.DeviceDrive).ExceptionEvent += CDriverDll_ExceptionEvent; ((ScadaDeviceKernel)device.DeviceDrive).InitKernel(MonitorDataBaseModel.IOServer, MonitorDataBaseModel.IOCommunications[i], device, null, device.DriverInfo); } catch (Exception ex) { ThrowExceptionToMain(new Exception("创建设备" + MonitorDataBaseModel.IOCommunications[i].Devices[d].IO_DEVICE_LABLE.ToString() + @"[" + MonitorDataBaseModel.IOCommunications[i].Devices[d].IO_DEVICE_NAME + @"]驱动失败,!错误原因:" + ex.Message)); } } } catch (Exception ex) { ThrowExceptionToMain(new Exception("ERROR600001" + ex.Message)); } } #endregion //创建垃圾定时回收 ClearMemoryTimer = new System.Threading.Timer(delegate { ClearMemory(); }, null, 1000, 30000); } catch (Exception ex) { ThrowExceptionToMain(new Exception("ERROR600002" + ex.Message)); } #endregion receiveRealCache = new ReceiveRealCache(100, 3000); //批量上传实时数据 receiveRealCache.WillUpload = (List <ReceiveCacheObject> result) => { try { //定时从缓存区上传数据 var analysisTask = Task.Run(() => { RealDataDBUtility.UploadReal(result); }); return(analysisTask); } catch { return(null); } }; ///批量上传报警数据 receiveRealCache.WillUploadAlarm = (List <AlarmCacheObject> result) => { try { //定时从缓存区上传数据 var analysisTask = Task.Run(() => { RealDataDBUtility.UploadAlarm(result); }); return(analysisTask); } catch { return(null); } }; receiveRealCache.Read(); Start(); }