public bool AddItems(List <Tag> biList) { try { #region 入的标签集合为空时,直接返回 if (biList.Count == 0) { return(false); } #endregion #region 当前标签集合已包含此Tag,则退出 if (Tags.Count(p => biList.Select(b => b.TagName).Contains(p.TagName)) != 0) { MessageBox.Show("Tag重复:在在重复的Tag点", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning); return(false); } #endregion //根据组名,取出组下的子集合 OPCItems items = this.OPCGroup.OPCItems; int itmHandleBegin; int NUMITEMS; Array OPCItemIDs; Array ItemClientHandles; Array ItemServerHandles; Array AddItemServerErrors; Func <Tag, int> f = (p => p != null ? p.ExtraAs <DaExtra>().ItmHandleClient : 0); itmHandleBegin = f(Tags.LastOrDefault()); //itmHandleBegin的逻辑为最后一个标签itmHandle值 NUMITEMS = biList.Count + 1; //OPCitem集合元素是以1为数组的基数,例:如果新增5个标签的话,就需要创建一个长度为6的标签, OPCItemIDs = Array.CreateInstance(typeof(string), NUMITEMS); ItemClientHandles = Array.CreateInstance(typeof(int), NUMITEMS); ItemServerHandles = Array.CreateInstance(typeof(int), NUMITEMS); AddItemServerErrors = default(System.Array); //标签赋值后加入daTags for (int i = 1; i < NUMITEMS; i++) { OPCItemIDs.SetValue(biList[i - 1].OpcTagName, i); ItemClientHandles.SetValue(itmHandleBegin + i, i); biList[i - 1].ExtraAs <DaExtra>().ItmHandleClient = itmHandleBegin + i; Tags.Add((Tag)(Object)biList[i - 1]); } //关键,此步骤将标签添加入OPCclient的监听列表中 items.AddItems(biList.Count, ref OPCItemIDs, ref ItemClientHandles, out ItemServerHandles, out AddItemServerErrors); #region ***********判断tag点是否正常监听************ for (short i = 1; i < NUMITEMS; i++) { if ((int)AddItemServerErrors.GetValue(i) == 0) //If the item was added successfully then allow it to be used. { Tags[i - 1].Message = "OPC Add Item Successful"; Tags[i - 1].Enabled = true; //设置标签的数据类型及ServerHandle OPCItem ki = items.GetOPCItem((int)ItemServerHandles.GetValue(i)); biList[i - 1].DataType = Enum.GetName(typeof(OpcTypes.CanonicalDataTypesForDa), ki.CanonicalDataType); biList[i - 1].ExtraAs <DaExtra>().ItmHandleServer = (int)ItemServerHandles.GetValue(i); } else { Tags[i - 1].Message = "OPC Add Item Fail"; Tags[i - 1].Enabled = false; //ItemServerHandles(i) = 0; // If the handle was bad mark it as empty //OPCItemValue(i).Enabled = false; //OPCItemValue(i).Text = "OPC Add Item Fail"; } } #endregion return(true); } catch (Exception e) { throw; } }
/// <summary> /// Adresleri Ekler... /// </summary> public void OPCAddItems(string groupname) { SetConnectedGroup(groupname); if ((ConnectedGroup != null)) { List <OpcItems> grupitems = OPCItem.FindAll(p => p == null || p.OpcGroupName == groupname || p.OpcGroupName == "lks" + groupname); try { int ItemCount = grupitems.Count - 1; //' Array for potential error returns. This example doesn't //' check them but yours should ultimately. System.Array AddItemServerErrors; if (OPCItemIDs.Count == 0) { OPCItemIDs.Add(null); OPCItemIsArray.Add(0); ClientHandles.Add(0); } //' Load the request OPC Item names and build the ClientHandles list for (int i = 1; i < grupitems.Count; i++) { //' Load the name of then item to be added to this group. You can add //' as many items as you want to the group in a single call by building these //' arrays as needed. List <OpcItems> item = grupitems.FindAll(p => p != null && p.GrupAdresNo == i); OPCItemIDs.Add(item[0].OPCItemName); //' ASSume all aren't an array. If it is, this holds size and is set in //' Data change event. OPCItemIsArray.Add(0); //' The client handles are given to the OPC Server for each item you intend //' to add to the group. The OPC Server will uses these client handles //' by returning them to you in the 'DataChange' event. You can use the //' client handles as a key to linking each valued returned from the Server //' back to some element in your application. In this example we are simply //' placing the Index number of each control that will be used to display //' data for the item. In your application the ClientHandle value you use //' can by whatever you need to best fit your program. You will see how //' these client handles are used in the 'DataChange' event handler. ClientHandles.Add(i); //' Make the Items active start control Active, for the demo I want all items to start active //' Your application may need to start the items as inactive. item[0].OPCItemActiveState = true; } ConnectedGroup.OPCItems.DefaultIsActive = true; System.Array clienthandles = ClientHandles.ToArray <int>(); System.Array oPCitemIDs = OPCItemIDs.ToArray <string>(); ConnectedGroup.OPCItems.AddItems(ItemCount, ref oPCitemIDs, ref clienthandles, out ItemServerHandles, out AddItemServerErrors); bool AnItemIsGood; AnItemIsGood = false; for (int i = 1; i < grupitems.Count; i++) { List <OpcItems> item = grupitems.FindAll(p => p != null && p.GrupAdresNo == i); if ((int)AddItemServerErrors.GetValue(i) == 0) //'If the item was added successfully then allow it to be used. { AnItemIsGood = true; } else { ItemServerHandles.SetValue(0, i); // ' If the handle was bad mark it as empty item[0].OPCItemValue = "OPC Add Item Fail"; } } for (int i = 1; i < grupitems.Count; i++) { List <OpcItems> item = grupitems.FindAll(p => p != null && p.GrupAdresNo == i); if ((int)AddItemServerErrors.GetValue(i) == 0) //'If the item was added successfully then allow it to be used. { AnItemIsGood = true; } else { ItemServerHandles.SetValue(0, i); // ' If the handle was bad mark it as empty item[0].OPCItemValue = "OPC Add Item Fail"; } } //' Disable the Add OPC item button if any item in the list was good Object Response; //if (!AnItemIsGood) // MessageBox.Show("The OPC Server has not accepted any of the item you have entered, check your item names and try again.", "OPC Add Item", MessageBoxButtons.OK); } catch (Exception ex) { MessageBox.Show("OPC server add items failed with exception: " + ex.Message, "SimpleOPCInterface Exception", MessageBoxButtons.OK); } } }