public void Stop() { try { // 点表采集者服务 if (stationCollecter != null) { stationCollecter.Stop(); if (!stationCollecter.IsRuning) { TraceManagerForOPC.AppendDebug("点表采集管理服务已停止"); this.stationCollecter = null; } else { TraceManagerForOPC.AppendErrMsg("点表采集管理服务停止失败"); } } // 命令消费器 if (commandCustomer != null) { commandCustomer.Stop(); if (!commandCustomer.IsRuning) { TraceManagerForOPC.AppendDebug("命令消费器已停止"); this.commandCustomer = null; } else { TraceManagerForOPC.AppendErrMsg("命令消费器停止失败"); } } //OPC客户端管理服务 if (opcClientManager != null) { opcClientManager.Stop(); if (!opcClientManager.IsRuning) { TraceManagerForOPC.AppendDebug("OPC客户端管理服务已停止"); this.opcClientManager = null; } else { TraceManagerForOPC.AppendErrMsg("OPC客户端管理服务停止失败"); } } } catch { } IsRuning = false; }
// 定时采集任务执行体 public bool ExcuteCollectHandle(out string errMsg) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); // 开始监视代码运行时间 // 加载需要采集点 if (!LoadCache(out List <PumpJZ> jzs, out errMsg)) { return(false); } if (jzs.Count == 0) { errMsg = "机组表没有读取模式为OPC的有效机组";; return(false); } // 从OPC缓存中取数 if (!Collect(ref jzs, out errMsg)) { return(false); } // 存入到数据库 string saveSQL = GetSavePointsSQL(jzs); if (string.IsNullOrWhiteSpace(saveSQL)) { errMsg = string.Format(@"采集OPC-机组数量{0}获取存入数据库SQL失败", jzs.Count); return(false); } DBUtil.ExecuteNonQuery(saveSQL, out string err); stopwatch.Stop(); // 停止监视 TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间 double milliseconds = timespan.TotalMilliseconds; // 总毫秒数 if (!string.IsNullOrWhiteSpace(err)) { errMsg = "更新OPC-二供实时数据失败" + ",耗时:" + milliseconds.ToString() + "毫秒," + err; return(false); } TraceManagerForOPC.AppendDebug("更新OPC-二供实时数据成功" + ",耗时:" + milliseconds.ToString() + "毫秒"); return(true); }
// 定时采集任务执行体 public bool ExcuteCollectHandle(out string errMsg) { errMsg = ""; Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); // 开始监视代码运行时间 // 加载需要采集点 if (!LoadCache(out Dictionary <int, Station> dicStations, out errMsg)) { return(false); } // 从OPC缓存中取数 if (!Collect(ref dicStations, out errMsg)) { return(false); } // 存入到数据库 string saveSQL = GetSavePointsSQL(dicStations); if (string.IsNullOrWhiteSpace(saveSQL)) { errMsg = string.Format(@"采集OPC-站点数量{0}获取存入数据库SQL失败", dicStations.Count); return(false); } DBUtil.ExecuteNonQuery(saveSQL, out string err); stopwatch.Stop(); // 停止监视 TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间 double milliseconds = timespan.TotalMilliseconds; // 总毫秒数 if (!string.IsNullOrWhiteSpace(err)) { errMsg = "更新OPC-SCADA实时数据失败" + ",耗时:" + milliseconds.ToString() + "毫秒," + err; return(false); } TraceManagerForOPC.AppendDebug("更新OPC-SCADA实时数据成功" + ",耗时:" + milliseconds.ToString() + "毫秒"); return(true); }
public void Start(out string errMsg) { errMsg = ""; if (IsRuning) { return; } try { // Scada-OPC通信服务 if (opcScadaService != null) { opcScadaService.Stop(); } opcScadaService = new OPCScadaService(Config.projectConfigPath); opcScadaService.Start(out errMsg); if (opcScadaService.IsRuning) { TraceManagerForOPC.AppendDebug("Scada-OPC通信服务已经打开"); } else { errMsg = "Scada-OPC通信服务打开失败"; Stop(); return; } } catch (Exception e) { errMsg = e.Message; Stop(); return; } IsRuning = true; }
public void Stop() { if (opcCaches == null) { return; } foreach (string key in opcCaches.Keys) { OpcDaClient opc = opcCaches[key]; if (opc == null) { continue; } try { opc.Stop(); TraceManagerForOPC.AppendDebug(key + "已断开连接"); } catch { } } opcCaches = null; IsRuning = false; }
public void Start(out string errMsg) { errMsg = ""; if (IsRuning) { return; } try { // 环境检查 if (!EnvChecker.CheckForScada(out errMsg)) { TraceManagerForOPC.AppendErrMsg("SCADA-OPC环境检查未通过:" + errMsg); return; } TraceManagerForOPC.AppendDebug("SCADA-OPC环境检查通过"); //OPC客户端管理服务打开 if (opcClientManager != null) { opcClientManager.Stop(); } opcClientManager = new OpcClient(OPCClientManagerType.Scada); opcClientManager.Start(); if (opcClientManager.IsRuning) { TraceManagerForOPC.AppendDebug("OPC客户端管理服务已经打开"); } else { TraceManagerForOPC.AppendErrMsg("OPC客户端管理服务打开失败"); Stop(); return; } // 命令消费器 if (commandCustomer != null) { commandCustomer.Stop(); } commandCustomer = new StationCommandConsumer(opcClientManager); commandCustomer.Start(); if (commandCustomer.IsRuning) { TraceManagerForOPC.AppendDebug("命令消费器已经打开"); } else { TraceManagerForOPC.AppendErrMsg("命令消费器打开失败"); Stop(); return; } // 泵房点表采集者服务 if (stationCollecter != null) { stationCollecter.Stop(); } stationCollecter = new StationCollecter(opcClientManager, commandCustomer); stationCollecter.Start(); if (stationCollecter.IsRuning) { TraceManagerForOPC.AppendDebug("点表采集管理服务已经打开"); } else { TraceManagerForOPC.AppendErrMsg("点表采集管理服务打开失败"); Stop(); return; } } catch (Exception e) { errMsg = e.Message; TraceManagerForOPC.AppendErrMsg("SCADA_OPC服务启动异常" + e.Message + "堆栈:" + e.StackTrace); Stop(); return; } IsRuning = true; }
public void Start() { // 同步配置信息 LoadConfig(); // 同步 jz 表中有几种 OPCServer string[] dbServerNames = LoadPumpJZOPCServerNames(); if (dbServerNames == null || dbServerNames.Length == 0) { TraceManagerForOPC.AppendErrMsg("机组表中没有读取模式为 OPC 的机组, 无法启动 OPC 服务"); Stop(); return; } string[] serverNames = OpcDaClient.GetLocalServer(); if (serverNames == null || serverNames.Length == 0) { TraceManagerForOPC.AppendErrMsg("本地计算机没有安装 OPCServer, 无法启动 OPC 服务"); Stop(); return; } opcCaches = new ConcurrentDictionary <string, OpcDaClient>(); // 创建 OPC 客户端对象 foreach (string dbServerName in dbServerNames) { if (string.IsNullOrWhiteSpace(dbServerName) || dbServerName.Length < 6) { TraceManagerForOPC.AppendErrMsg("数据库中 OPC 服务器名非法, 无法启动 OPC 客户端"); Stop(); return; } string dbServerNameHead = dbServerName.Trim().ToLower().Substring(0, 5); if (serverNames.Where(str => str.Contains(dbServerNameHead)).ToArray().Length == 0) { TraceManagerForOPC.AppendErrMsg("本地没有安装 " + dbServerName + " 服务器, 无法启动 OPC 客户端"); Stop(); return; } OpcDaClient opc = new OpcDaClient(serverNames.Where(str => str.Contains(dbServerNameHead)).ToArray()[0], UpdateRate, null, DefaultGroupDeadband); opcCaches.TryAdd(dbServerName, opc); } // OPC 客户端连接服务器 foreach (string key in opcCaches.Keys) { OpcDaClient opc = opcCaches[key]; if (opc != null) { FuncTimeout <OpcDaClient, bool> timeout = new FuncTimeout <OpcDaClient, bool>(); timeout.Do = StartOPCClient; bool isTimeout = timeout.DoWithTimeout(opc, new TimeSpan(0, 0, 0, 15), out bool reslut); // 只等待 15 秒 if (isTimeout) { // 超时 if (key == "KingView.View.1") { TraceManagerForOPC.AppendErrMsg("连接 " + opc.ProgID + " OPC服务器超时 " + ", 可能原因为未配置其 DCOM 权限"); } else { TraceManagerForOPC.AppendErrMsg("连接 " + opc.ProgID + " OPC服务器超时"); } Stop(); return; } if (reslut) { TraceManagerForOPC.AppendDebug("已连接 " + opc.ProgID + " OPC 服务器"); } else { if (key == "KingView.View.1") { TraceManagerForOPC.AppendErrMsg("连接 " + opc.ProgID + " OPC 服务器失败" + ", 可能原因为组态王未运行"); } else { TraceManagerForOPC.AppendErrMsg("连接 " + opc.ProgID + " OPC 服务器失败"); } Stop(); return; } } } IsRuning = true; }