系统:Windows 7旗舰版 软件:Visual Studio2010 SIMATIC_NET_8.2 opc库文件源代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using OPCAutomation; using System.Net; namespace OPCHelper { class OPCHelper:IDisposable { #region Version 3 #region 变量 private string strHostIP; private string strHostName; private OPCServer opcServer; private OPCGroups opcGroups; private OPCGroup opcGroup; private List<int> itemHandleClient = new List<int>(); private List<int> itemHandleServer = new List<int>(); private List<string> itemNames = new List<string>(); private OPCItems opcItems; private OPCItem opcItem; private string itemNamePreAppend; private Dictionary<string, string> itemValues = new Dictionary<string, string>(); public bool Connected = false; #endregion #region 构造函数 public OPCHelper(string strHostIP, string strHostName, int updateRate) { this.strHostIP = strHostIP; this.strHostName = strHostName; if (!CreatServer()) return; if (!ConnectServer(strHostIP, strHostName)) return; Connected = true; opcGroups = opcServer.OPCGroups; opcGroup = opcGroups.Add("OPCDOTNETGROUP"); SetGroupProperty(opcGroup, updateRate); opcGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(opcGroup_DataChange); opcGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(opcGroup_AsyncWriteComplete); opcItems = opcGroup.OPCItems; } #endregion #region 私有方法 private bool CreatServer() { try { opcServer = new OPCServer(); } catch { return false; } return true; } private bool ConnectServer(string strHostIP, string strHostName) { try { opcServer.Connect(strHostName, strHostIP); } catch { return false; } return true; } private void SetGroupProperty(OPCGroup opcGroup, int updateRate) { opcGroup.IsActive = Convert.ToBoolean(true); opcGroup.DeadBand = 0; opcGroup.UpdateRate = updateRate; opcGroup.IsSubscribed = Convert.ToBoolean(true); } #endregion #region 公有方法 public bool Contains(string itemNameContains) { foreach (string key in itemValues.Keys) { if (key == itemNamePreAppend + itemNameContains) return true; } return false; } public void AddItems(string itemNamePreAppend, string[] itemNamesAdded) { this.itemNamePreAppend = itemNamePreAppend; for (int i = 0; i < itemNamesAdded.Length; i++) { this.itemNames.Add(this.itemNamePreAppend + itemNamesAdded[i]); itemValues.Add(this.itemNamePreAppend + itemNamesAdded[i], ""); } for (int i = 0; i < itemNamesAdded.Length; i++) { itemHandleClient.Add(itemHandleClient.Count != 0 ? itemHandleClient[itemHandleClient.Count - 1] + 1 : 1); opcItem = opcItems.AddItem(this.itemNamePreAppend + itemNamesAdded[i], itemHandleClient[itemHandleClient.Count - 1]); itemHandleServer.Add(opcItem.ServerHandle); } } public string[] GetItemValues(string[] getValuesItemNames) { string[] getedValues = new string[getValuesItemNames.Length]; for (int i = 0; i < getValuesItemNames.Length; i++) { if (Contains(getValuesItemNames[i])) itemValues.TryGetValue(itemNamePreAppend + getValuesItemNames[i], out getedValues[i]); } return getedValues; } public void AsyncWrite(string[] writeItemNames, string[] writeItemValues) { OPCItem[] bItem = new OPCItem[writeItemNames.Length]; for (int i = 0; i < writeItemNames.Length; i++) { for (int j = 0; j < itemNames.Count; j++) { if (itemNames[j] == itemNamePreAppend + writeItemNames[i]) { bItem[i] = opcItems.GetOPCItem(itemHandleServer[j]); break; } } } int[] temp = new int[writeItemNames.Length + 1]; temp[0] = 0; for (int i = 1; i < writeItemNames.Length + 1; i++) { temp[i] = bItem[i - 1].ServerHandle; } Array serverHandles = (Array)temp; object[] valueTemp = new object[writeItemNames.Length + 1]; valueTemp[0] = ""; for (int i = 1; i < writeItemNames.Length + 1; i++) { valueTemp[i] = writeItemValues[i - 1]; } Array values = (Array)valueTemp; Array Errors; int cancelID; opcGroup.AsyncWrite(writeItemNames.Length, ref serverHandles, ref values, out Errors, 2009, out cancelID); GC.Collect(); } public void SyncWrite(string[] writeItemNames, string[] writeItemValues) { OPCItem[] bItem = new OPCItem[writeItemNames.Length]; for (int i = 0; i < writeItemNames.Length; i++) { for (int j = 0; j < itemNames.Count; j++) { if (itemNames[j] == itemNamePreAppend + writeItemNames[i]) { bItem[i] = opcItems.GetOPCItem(itemHandleServer[j]); break; } } } int[] temp = new int[writeItemNames.Length + 1]; temp[0] = 0; for (int i = 1; i < writeItemNames.Length + 1; i++) { temp[i] = bItem[i - 1].ServerHandle; } Array serverHandles = (Array)temp; object[] valueTemp = new object[writeItemNames.Length + 1]; valueTemp[0] = ""; for (int i = 1; i < writeItemNames.Length + 1; i++) { valueTemp[i] = writeItemValues[i - 1]; } Array values = (Array)valueTemp; Array Errors; opcGroup.SyncWrite(writeItemNames.Length, ref serverHandles, ref values, out Errors); GC.Collect(); } public void Dispose() { if (opcGroup != null) { opcGroup.DataChange -= new DIOPCGroupEvent_DataChangeEventHandler(opcGroup_DataChange); opcGroup.AsyncWriteComplete -= new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(opcGroup_AsyncWriteComplete); } if (opcServer != null) { opcServer.Disconnect(); opcServer = null; } Connected = false; } #endregion #region 事件 void opcGroup_AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors) { // } void opcGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps) { for (int i = 1; i <= NumItems; i++) { itemValues[itemNames[Convert.ToInt32(ClientHandles.GetValue(i)) - 1]] = ItemValues.GetValue(i).ToString(); } } #endregion #endregion } } 测试图片:
|
电工学习网 ( )
GMT+8, 2021-12-6 20:46