using NX_LogClassLibrary; using NX_ModelClassLibrary.CustomEnum; using OPCAutomation; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace NX_OpcClassLibrary { /// /// 先导智能OPC操作通用类(基于OPCAutomation) /// Copyright20181102 (C) sunyalong /// 允许修改、添加满足自己项目的需要。 /// 添加、修改后请详细注释。违者会强制删除不予采用。 /// public class LeadOPCServer { #region OPC变量 /// /// OPC服务器对象 /// public OPCServer opcServer; /// /// OPC分组集合 /// public OPCGroups OPCGroups; /// /// OPC分组对象 /// public OPCGroup OPCGroup; /// /// OPC变量集合 /// public OPCItems OPCItems; /// /// 主机IP /// public string strHostIP = ""; /// /// 主机名称 /// public string strHostName = ""; /// /// OPC连接状态 /// public bool opc_connected = false; /// /// 服务端句柄 /// public int itmHandleServer = 0; #endregion #region 方法 /// /// 枚举本地OPC服务器 /// public List GetLocalServer() { //获取本地计算机IP,计算机名称 IPHostEntry IPHost = Dns.GetHostEntry(Environment.MachineName); if (IPHost.AddressList.Length > 0) { strHostIP = IPHost.AddressList[0].ToString(); } else { return null; } //通过IP来获取计算机名称,可用在局域网内 IPHostEntry ipHostEntry = Dns.GetHostEntry(strHostIP); strHostName = ipHostEntry.HostName.ToString(); //获取本地计算机上的OPCServerName try { //申明OPCServer服务器对象 opcServer = new OPCServer(); //获取OPC服务器列表 object serverList = opcServer.GetOPCServers(strHostName); //将获取到的OPC服务器列表复制到list列表中。 List list = new List(); foreach (string turn in (Array)serverList) { list.Add(turn); } return list; } catch (Exception err) { LogHelper.WriteLog($"枚举本地OPC服务器发生异常。【{err.Message}】", LogTypeEnum.Err); return null; } } /// /// 断开连接 /// public void CloseServer() { try { //释放所有组资源 opcServer.OPCGroups.RemoveAll(); //释放OPC连接 opcServer.Disconnect(); opcServer = null; opc_connected = false; } catch(Exception ex) { LogHelper.WriteLog($"关闭OPC服务发生异常。【{ex.Message}】",LogTypeEnum.Err); } } /// /// 创建组 /// public bool CreateGroup()// { try { //创建OPC组资源 OPCGroups = opcServer.OPCGroups; //创建OPC组 OPCGroup = OPCGroups.Add("OPCDOTNETGROUP"); SetGroupProperty(); //OPCGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(OPCGroup_DataChange); //OPCGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(KepGroup_AsyncWriteComplete); OPCItems = OPCGroup.OPCItems; } catch (Exception ex) { LogHelper.WriteLog($"创建OPC组资源发生异常。【{ex.Message}】", LogTypeEnum.Err); return false; } return true; } /// /// 设置组属性 /// private void SetGroupProperty() { opcServer.OPCGroups.DefaultGroupIsActive = true;//激活组。 opcServer.OPCGroups.DefaultGroupDeadband = 0;// 死区值,设为0时,服务器端该组内任何数据变化都通知组。 opcServer.OPCGroups.DefaultGroupUpdateRate = 200;//默认组群的刷新频率为200ms OPCGroup.UpdateRate = 100;//刷新频率为1秒。 OPCGroup.IsSubscribed = true;//使用订阅功能,即可以异步,默认false } /// /// 列出OPC服务器中所有节点 /// /// /// public void RecurBrowse(OPCBrowser oPCBrowser, List list) { //展开分支 oPCBrowser.ShowBranches(); //展开叶子 oPCBrowser.ShowLeafs(true); foreach (object turn in oPCBrowser) { list.Add(turn.ToString()); } } /// /// 连接OPC服务器 /// /// OPCServerIP /// OPCServer名称 public bool ConnectRemoteServer(string remoteServerIP, string remoteServerName) { try { opcServer.Connect(remoteServerName, remoteServerIP); if (opcServer.ServerState == (int)OPCServerState.OPCRunning) { LogHelper.WriteLog($"已连接OPC服务器到-【{opcServer.ServerName}】。", LogTypeEnum.Run); } else { //这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档 LogHelper.WriteLog($"未连接OPC服务器-【{opcServer.ServerName}】。OPC服务器返回状态:【{opcServer.ServerState}】", LogTypeEnum.Err); } } catch (Exception ex) { LogHelper.WriteLog($"连接OPC远程服务器发生异常。【{ex.Message}】", LogTypeEnum.Err); return false; } return true; } #endregion } }