You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:36:09