OPC Foundation框架中OPCItem.AddItems添加项失败求助
OPC Foundation框架下AddItems失败问题排查与修复
问题描述
开发了一款从API读取数据并写入OPC的服务,基于OPC Foundation框架。已成功连接OPC服务器并创建Group,但调用OPCItems.AddItems向Group中添加项时始终失败,OPCGroup.OPCItems.Count始终为0,后续读取操作触发空引用异常。
相关代码
public bool AddOPCItems(int itemCount, ref List<Vehicles> vehicles) { bool itemsAdded = false; try { // Size of array must be number of parameters plus one // since array index starts at 0 and OPC reads/writes array starting at 1 int size = (vehicles.Count * ventObjReadProp.Length + 1); Array OPCItemIDs = Array.CreateInstance(typeof(string), size); Array clientHandles = Array.CreateInstance(typeof(int), size); Array itemServerErrors = Array.CreateInstance(typeof(int), size); int index = 1; itemServerHandles = Array.CreateInstance(typeof(int), size); for (int n = 0; n < vehicles.Count; n++) //Loop all ventObj { //_log.Log("Adding Object= " + n + " of " + vehicles.Count, "", LogType.Main); for (int i = 0; i < ventObjReadProp.Length; i++) //Loop trough all the properties in each ventObj { string item = vehicles.ElementAt(n).OpcTag + ventObjReadProp[i]; OPCItemIDs.SetValue(item, index); clientHandles.SetValue(index, index); //if (i == 0) { UGMLogFile.addToLogFile("Add item: " + item + " at index " + index); } _log.Log("Adding Object= " + n + " of " + vehicles.Count + ": "+ item, "", LogType.Main); index++; } } index = 0; _OPCGroup.OPCItems.DefaultIsActive = true; _log.Log("Nr of OPCItemIDs --> " + OPCItemIDs.Length, "", LogType.Main); _log.Log("Before: _OPCGroup.OPCItems --> " + _OPCGroup.OPCItems.Count, "", LogType.Main); _OPCGroup.OPCItems.AddItems(size - 1, ref OPCItemIDs, ref clientHandles, out itemServerHandles, out itemServerErrors); _log.Log("After: _OPCGroup.OPCItems --> " + _OPCGroup.OPCItems.Count, "", LogType.Main); if (itemServerHandles != null && itemServerHandles.Length > 0) { for (int i = 1; i <= itemServerHandles.Length; i++) { _log.Log("Error from itemServerHandles --> " + itemServerHandles.GetValue(i), "", LogType.Main); } } itemsAdded = true; _log.Log("AddOPCReadVentObjItems: " + "Added items = " + _OPCGroup.OPCItems.Count.ToString() + " XML config = " + (size - 1), "", LogType.Main); if (itemServerErrors.Length > 1) { _log.Log("", "", LogType.Main); } // UGMLogFile.addToLogFile("AddOPCReadVentObjItems: " + itemServerErrors.ToString()); } catch (Exception ex) { _log.Log(ex.Message, "", LogType.Main); } return itemsAdded; }
日志信息
Connected to OPC 2023-11-29 02:34 PM Connected to ---> True 2023-11-29 02:34 PM Group added 2023-11-29 02:34 PM BEFORE THE LOOP 2023-11-29 02:34 PM numOfObjects 6 2023-11-29 02:34 PM item --->: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment1 2023-11-29 02:34 PM item --->: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment2 2023-11-29 02:34 PM item --->: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment3 2023-11-29 02:34 PM item --->: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment4 2023-11-29 02:34 PM item --->: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment5 2023-11-29 02:34 PM item --->: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment6 2023-11-29 02:34 PM Before AddOPCItems, ventObjList.Count is: 6 2023-11-29 02:34 PM Adding Object= 0 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment1.Name 2023-11-29 02:34 PM Adding Object= 0 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment1.LocationData.LocationName 2023-11-29 02:34 PM Adding Object= 0 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment1.LocationData.Timestamp 2023-11-29 02:34 PM Adding Object= 0 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment1.LocationData.Macaddress 2023-11-29 02:34 PM Adding Object= 1 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment2.Name 2023-11-29 02:34 PM Adding Object= 1 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment2.LocationData.LocationName 2023-11-29 02:34 PM Adding Object= 1 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment2.LocationData.Timestamp 2023-11-29 02:34 PM Adding Object= 1 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment2.LocationData.Macaddress 2023-11-29 02:34 PM Adding Object= 2 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment3.Name 2023-11-29 02:34 PM Adding Object= 2 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment3.LocationData.LocationName 2023-11-29 02:34 PM Adding Object= 2 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment3.LocationData.Timestamp 2023-11-29 02:34 PM Adding Object= 2 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment3.LocationData.Macaddress 2023-11-29 02:34 PM Adding Object= 3 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment4.Name 2023-11-29 02:34 PM Adding Object= 3 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment4.LocationData.LocationName 2023-11-29 02:34 PM Adding Object= 3 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment4.LocationData.Timestamp 2023-11-29 02:34 PM Adding Object= 3 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment4.LocationData.Macaddress 2023-11-29 02:34 PM Adding Object= 4 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment5.Name 2023-11-29 02:34 PM Adding Object= 4 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment5.LocationData.LocationName 2023-11-29 02:34 PM Adding Object= 4 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment5.LocationData.Timestamp 2023-11-29 02:34 PM Adding Object= 4 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment5.LocationData.Macaddress 2023-11-29 02:34 PM Adding Object= 5 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment6.Name 2023-11-29 02:34 PM Adding Object= 5 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment6.LocationData.LocationName 2023-11-29 02:34 PM Adding Object= 5 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment6.LocationData.Timestamp 2023-11-29 02:34 PM Adding Object= 5 of 6: Root/Smart Mid/Mina_Pastefill/Applicatoin/VoDMLI_App/MobilarisZoneTranslation:MEStorage.MobileEquipment6.LocationData.Macaddress 2023-11-29 02:34 PM Nr of OPCItemIDs --> 25 2023-11-29 02:34 PM Before: _OPCGroup.OPCItems --> 0 2023-11-29 02:34 PM After: _OPCGroup.OPCItems --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM Error from itemServerHandles --> 0 2023-11-29 02:34 PM AddOPCReadVentObjItems: Added items = 0 XML config = 24 2023-11-29 02:34 PM 2023-11-29 02:34 PM Before Write to OPC 2023-11-29 02:34 PM _OPCGroup Name -->Vehicles 2023-11-29 02:34 PM _OPCGroup items-->System.__ComObject 2023-11-29 02:34 PM itemCount -->0 2023-11-29 02:34 PM Try To get syncItemValues.GetValue(i)--> 2023-11-29 02:34 PM Errors -->Object reference not set to an instance of an object.
排查与修复方案
1. 修正OPC项ID的拼写与格式问题
日志中显示的项ID存在明显拼写错误:Applicatoin应为Application,这会导致OPC服务器无法识别节点。同时需确认:
- OPC服务器是否支持
/分隔的层级路径,部分服务器要求使用.作为节点分隔符 - 用OPC客户端工具(如OPC Quick Client)手动验证项ID的合法性,确保服务器能找到对应节点
2. 修复AddItems的数组索引逻辑
OPC Foundation的AddItems方法要求数组从索引0开始填充,而非代码中使用的索引1。修改数组初始化与填充逻辑:
public bool AddOPCItems(int itemCount, ref List<Vehicles> vehicles) { bool itemsAdded = false; try { int size = vehicles.Count * ventObjReadProp.Length;
相关产品推荐
相关产品推荐

