封装一个 C# OPC UA 错误提示类

Posted lee576

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了封装一个 C# OPC UA 错误提示类相关的知识,希望对你有一定的参考价值。

using Opc.Ua;
namespace HenryMes.OpcManager

    public static class OpcUAError
    
        /// <summary>
        /// OPC UA 错误说明
        /// 英文说明 https://www.opcti.com/common-error-codes.aspx
        /// 中文说明 https://blog.csdn.net/ymfz001/article/details/105977012
        /// </summary>
        /// <param name="exception"></param>
        /// <returns></returns>
        public static string Message(ServiceResultException exception)
        
            var errorMsg = $"OPC UA Error【exception.Result.ToString()】:【";
            switch (exception.Result.ToString())
            
                case "Bad":
                    errorMsg += $"值为错误,但原因不明";
                    break;
                case "BadAggregateConfigurationRejected":
                    errorMsg += $"指定节点的集合配置无效";
                    break;
                case "BadAggregateInvalidInputs":
                    errorMsg += $"由于输入数据无效,无法获取集合值";
                    break;
                case "BadAggregateListMismatch":
                    errorMsg += $"请求的集合数量与请求的节点ID数量不匹配";
                    break;
                case "BadAggregateNotSupported":
                    errorMsg += $"服务器不支持请求的集合";
                    break;
                case "BadAlreadyExists":
                    errorMsg += $"等效规则已存在";
                    break;
                case "BadApplicationSignatureInvalid":
                    errorMsg += $"使用客户端证书生成的签名丢失或无效";
                    break;
                case "BadArgumentsMissing":
                    errorMsg += $"客户端未指定该方法的全部输入参数";
                    break;
                case "BadAttributeIdInvalid":
                    errorMsg += $"指定的节点不支持该属性";
                    break;
                case "BadBoundNotFound":
                    errorMsg += $"未找到提供上/下边界值的数据";
                    break;
                case "BadBoundNotSupported":
                    errorMsg += $"服务器无法检索到变量边界";
                    break;
                case "BadBrowseDirectionInvalid":
                    errorMsg += $"浏览方向无效";
                    break;
                case "BadBrowseNameDuplicated":
                    errorMsg += $"浏览名称不是共享相同父节点关系的节点中的唯一名称";
                    break;
                case "BadBrowseNameInvalid":
                    errorMsg += $"浏览器名称无效";
                    break;
                case "BadCertificateChainIncomplete":
                    errorMsg += $"证书链不完整";
                    break;
                case "BadCertificateHostNameInvalid":
                    errorMsg += $"用于连接服务器的主机名与证书中的主机名不匹配";
                    break;
                case "BadCertificateInvalid":
                    errorMsg += $"提供的证书不是有效参数";
                    break;
                case "BadCertificateIssuerRevocationUnknown":
                    errorMsg += $"无法确定发布方证书是否已被吊销";
                    break;
                case "BadCertificateIssuerRevoked":
                    errorMsg += $"发布方证书已被吊销";
                    break;
                case "BadCertificateIssuerTimeInvalid":
                    errorMsg += $"发布方证书已过期或尚未生效";
                    break;
                case "BadCertificateIssuerUseNotAllowed":
                    errorMsg += $"发布方证书可能无法用于请求的操作";
                    break;
                case "BadCertificatePolicyCheckFailed":
                    errorMsg += $"证书不符合安全策略的要求";
                    break;
                case "BadCertificateRevocationUnknown":
                    errorMsg += $"无法确定证书是否已被吊销";
                    break;
                case "BadCertificateRevoked":
                    errorMsg += $"证书已被吊销";
                    break;
                case "BadCertificateTimeInvalid":
                    errorMsg += $"证书已过期或尚未生效";
                    break;
                case "BadCertificateUntrusted":
                    errorMsg += $"证书未被信任";
                    break;
                case "BadCertificateUriInvalid":
                    errorMsg += $"应用程序说明中指定的URI与证书中的URI不匹配";
                    break;
                case "BadCertificateUseNotAllowed":
                    errorMsg += $"证书可能无法用于请求的操作";
                    break;
                case "BadCommunicationError":
                    errorMsg += $"发生底层通信错误";
                    break;
                case "BadConditionAlreadyDisabled":
                    errorMsg += $"该条件已被禁用";
                    break;
                case "BadConditionAlreadyEnabled":
                    errorMsg += $"该条件已被启用";
                    break;
                case "BadConditionAlreadyShelved":
                    errorMsg += $"条件已被搁置";
                    break;
                case "BadConditionBranchAlreadyAcked":
                    errorMsg += $"条件分支已被知悉";
                    break;
                case "BadConditionBranchAlreadyConfirmed":
                    errorMsg += $"条件分支已被确认";
                    break;
                case "BadConditionDisabled":
                    errorMsg += $"属性不可用,或该条件被禁用";
                    break;
                case "BadConditionNotShelved":
                    errorMsg += $"条件当前未被搁置";
                    break;
                case "BadConfigurationError":
                    errorMsg += $"配置存在问题,影响了值的有效性";
                    break;
                case "BadConnectionClosed":
                    errorMsg += $"网络连接已关闭";
                    break;
                case "BadConnectionRejected":
                    errorMsg += $"无法与远程服务器建立网络连接";
                    break;
                case "BadContentFilterInvalid":
                    errorMsg += $"内容过滤器无效";
                    break;
                case "BadContinuationPointInvalid":
                    errorMsg += $"连续点不再有效";
                    break;
                case "BadDataEncodingInvalid":
                    errorMsg += $"数据编码无效";
                    break;
                case "BadDataEncodingUnsupported":
                    errorMsg += $"服务器不支持为该节点请求的数据编码";
                    break;
                case "BadDataLost":
                    errorMsg += $"由于采集开始/停止/丢失,数据已丢失";
                    break;
                case "BadDataTypeIdUnknown":
                    errorMsg += $"由于数据类型ID无法识别,扩展对象无法序列化或解序列化";
                    break;
                case "BadDataUnavailable":
                    errorMsg += $"由于存在未安装的卷、离线存档或磁带,或由于暂时不可用等类似原因,期望的数据在请求的时间范围内不可用";
                    break;
                case "BadDeadbandFilterInvalid":
                    errorMsg += $"死区过滤器无效";
                    break;
                case "BadDecodingError":
                    errorMsg += $"数据流中有非法数据,解码暂停";
                    break;
                case "BadDependentValueChanged":
                    errorMsg += $"相关值已更改,但该更改尚未应用于设备。主导变量的质量很差";
                    break;
                case "BadDeviceFailure":
                    errorMsg += $"生成值的设备/数据源存在故障,对值造成了影响";
                    break;
                case "BadDialogNotActive":
                    errorMsg += $"对话框条件未处于活动状态";
                    break;
                case "BadDialogResponseInvalid":
                    errorMsg += $"响应对于对话框无效";
                    break;
                case "BadDisconnect":
                    errorMsg += $"服务器已从客户端断开连接";
                    break;
                case "BadDiscoveryUrlMissing":
                    errorMsg += $"未指定DiscoveryUrl";
                    break;
                case "BadDominantValueChanged":
                    errorMsg += $"相关的 EngineeringUnit 已更改,但此更改尚未应用于设备。 变量值仍然依赖于前一个单元,但其状态当前为 Bad";
                    break;
                case "BadDuplicateReferenceNotAllowed":
                    errorMsg += $"节点间的引用类型已被定义";
                    break;
                case "BadEncodingError":
                    errorMsg += $"正在序列化的对象中有非法数据,编码暂停";
                    break;
                case "BadEncodingLimitsExceeded":
                    errorMsg += $"栈设置的消息编码和解码限制已超出";
                    break;
                case "BadEndOfStream":
                    errorMsg += $"无法移动至数据流结束之后";
                    break;
                case "BadEntryExists":
                    errorMsg += $"由于存在匹配条目,数据或事件未成功插入";
                    break;
                case "BadEventFilterInvalid":
                    errorMsg += $"事件过滤器无效";
                    break;
                case "BadEventIdUnknown":
                    errorMsg += $"指定的事件ID未被识别";
                    break;
                case "BadEventNotAcknowledgeable":
                    errorMsg += $"事件无法知悉";
                    break;
                case "BadExpectedStreamToBlock":
                    errorMsg += $"数据流未返回所有的请求数据(可能由于数据流为非阻隔性数据流)";
                    break;
                case "BadFilterElementInvalid":
                    errorMsg += $"引用的元素不是内容过滤器中的有效元素";
                    break;
                case "BadFilterLiteralInvalid":
                    errorMsg += $"引用的字面值不是有效值";
                    break;
                case "BadFilterNotAllowed":
                    errorMsg += $"监视筛选器无法与指定的属性配合使用";
                    break;
                case "BadFilterOperandCountMismatch":
                    errorMsg += $"为过滤器运算符提供的操作数少于期望的操作数";
                    break;
                case "BadFilterOperandInvalid":
                    errorMsg += $"内容过滤器中使用的操作数无效";
                    break;
                case "BadFilterOperatorInvalid":
                    errorMsg += $"过滤器中提供了无法识别的运算符";
                    break;
                case "BadFilterOperatorUnsupported":
                    errorMsg += $"提供的运算符有效,但服务器不支持该过滤器运算符";
                    break;
                case "BadHistoryOperationInvalid":
                    errorMsg += $"历史详情参数无效";
                    break;
                case "BadHistoryOperationUnsupported":
                    errorMsg += $"服务器不支持请求的操作";
                    break;
                case "BadIdentityChangeNotSupported":
                    errorMsg += $"服务器不支持更改为会话分配的用户身份";
                    break;
                case "BadIdentityTokenInvalid":
                    errorMsg += $"用户身份令牌无效";
                    break;
                case "BadIdentityTokenRejected":
                    errorMsg += $"用户身份令牌有效,但服务器拒绝该令牌";
                    break;
                case "BadIndexRangeInvalid":
                    errorMsg += $"索引范围参数的语法无效";
                    break;
                case "BadIndexRangeNoData":
                    errorMsg += $"指定的索引范围内无数据存在";
                    break;
                case "BadInsufficientClientProfile":
                    errorMsg += $"当前会话的客户端不支持订阅所需的一个或多个性能";
                    break;
                case "BadInternalError":
                    errorMsg += $"发生内部错误";
                    break;
                case "BadInvalidArgument":
                    errorMsg += $"一个或多个参数无效";
                    break;
                case "BadInvalidSelfReference":
                    errorMsg += $"服务器在该节点上不允许此类自引用";
                    break;
                case "BadInvalidState":
                    errorMsg += $"由于对象被关闭、未初始化或处于其他无效状态,操作无法完成";
                    break;
                case "BadInvalidTimestamp":
                    errorMsg += $"定义的返回的时间标识无效";
                    break;
                case "BadInvalidTimestampArgument":
                    errorMsg += $"定义的返回的时间标识无效";
                    break;
                case "BadLicenseExpired":
                    errorMsg += $"服务器需要许可证才能正常运行或执行服务或操作,但现有许可证已过期";
                    break;
                case "BadLicenseLimitsExceeded":
                    errorMsg += $"服务器根据安装的许可证限制允许的操作/对象的数量,并且超过这些限制";
                    break;
                case "BadLicenseNotAvailable":
                    errorMsg += $"服务器没有一般操作或执行服务或操作所需的许可证";
                    break;
                case "BadMaxAgeInvalid":
                    errorMsg += $"最大年龄参数无效";
                    break;
                case "BadMaxConnectionsReached":
                    errorMsg += $"操作无法完成,因为所有可用连接都在使用中";
                    break;
                case "BadMessageNotAvailable":
                    errorMsg += $"请求的通知消息不再可用";
                    break;
                case "BadMethodInvalid":
                    errorMsg += $"方法ID未指向指定对象的方法";
                    break;
                case "BadMonitoredItemFilterInvalid":
                    errorMsg += $"监视项的过滤参数无效";
                    break;
                case "BadMonitoredItemFilterUnsupported":
                    errorMsg += $"服务器不支持请求的监视项筛选器";
                    break;
                case "BadMonitoredItemIdInvalid":
                    errorMsg += $"监视ID未指向有效的监视项";
                    break;
                case "BadMonitoringModeInvalid":
                    errorMsg += $"监视模式无效";
                    break;
                case "BadNoCommunication":
                    errorMsg += $"已定义与数据源之间的通信,但尚未建立通信,无可用的最近已知值";
                    break;
                case "BadNoContinuationPoints":
                    errorMsg += $"由于所有的连续点已被分配,无法处理该操作";
                    break;
                case "BadNoData":
                    errorMsg += $"指定的索引范围内无数据存在";
                    break;
                case "BadNoDataAvailable":
                    errorMsg += $"非阻隔数据流中当前没有数据可读取";
                    break;
                case "BadNodeAttributesInvalid":
                    errorMsg += $"节点类的节点属性无效";
                    break;
                case "BadNodeClassInvalid":
                    errorMsg += $"节点类无效";
                    break;
                case "BadNodeIdExists":
                    errorMsg += $"请求的节点ID已被另一个节点使用";
                    break;
                case "BadNodeIdInvalid":
                    errorMsg += $"节点ID的语法无效";
                    break;
                case "BadNodeIdRejected":
                    errorMsg += $"由于节点ID无效或服务器不允许客户端指定节点ID,请求的节点ID被拒绝";
                    break;
                case "BadNodeIdUnknown":
                    errorMsg += $"节点ID指向服务器地址空间中不存在的节点";
                    break;
                case "BadNodeNotInView":
                    errorMsg += $"节点不是视图的一部分";
                    break;
                case "BadNoDeleteRights":
                    errorMsg += $"服务器不允许删除节点";
                    break;
                case "BadNoEntryExists":
                    errorMsg += $"由于不存在匹配条目,数据或事件未成功更新";
                    break;
                case "BadNoMatch":
                    errorMsg += $"请求的操作无匹配可返回";
                    break;
                case "BadNonceInvalid":
                    errorMsg += $"随机数似乎不是随机值,或者它的长度不正确";
                    break;
                case "BadNoSubscription":
                    errorMsg += $"无订阅可用于该会话";
                    break;
                case "BadNotConnected":
                    errorMsg += $"变量应从另一个变量中接收值,但未如此配置";
                    break;
                case "BadNotExecutable":
                    errorMsg += $"可执行属性不允许执行方法";
                    break;
                case "BadNotFound":
                    errorMsg += $"请求的项未找到,或搜索操作已结束但无结果";
                    break;
                case "BadNotImplemented":
                    errorMsg += $"未执行请求的操作";
                    break;
                case "BadNotReadable":
                    errorMsg += $"访问等级不允许读取或订阅该节点";
                    break;
                case "BadNotSupported":
                    errorMsg += $"不支持请求的操作";
                    break;
                case "BadNotTypeDefinition":
                    errorMsg += $"提供的节点ID不是自定义类型节点ID";
                    break;
                case "BadNotWritable":
                    errorMsg += $"访问等级不允许写入节点";
                    break;
                case "BadNothingToDo":
                    errorMsg += $"因为客户端传递了一个没有元素的操作列表,所以没有什么可做的";
                    break;
                case "BadNoValidCertificates":
                    errorMsg += $"客户端未提供至少一个有效且符合服务器配置文件要求的软件证书";
                    break;
                case "BadNumericOverflow":
                    errorMsg += $"由于数字溢出,该数字未被接受";
                    break;
                case "BadObjectDeleted":
                    errorMsg += $"对象已被删除,无法使用";
                    break;
                case "BadOperationAbandoned":
                    errorMsg += $"异步操作已被调用方放弃";
                    break;
                case "BadOutOfMemory":
                    errorMsg += $"内存不足,无法完成操作";
                    break;
                case "BadOutOfRange":
                    errorMsg += $"值超出范围";
                    break;
                case "BadOutOfService":
                    errorMsg += $"数据源未正常运行";
                    break;
                case "BadParentNodeIdInvalid":
                    errorMsg += $"父节点ID未指向有效的节点";
                    break;
                case "BadProtocolVersionUnsupported":
                    errorMsg += $"应用程序没有兼容的协议版本";
                    break;
                case "BadQueryTooComplex":
                    errorMsg += $"请求操作需要的服务器资源过多";
                    break;
                case "BadReferenceLocalOnly":
                    errorMsg += $"远程服务器引用的引用类型无效";
                    break;
                case "BadReferenceNotAllowed":
                    errorMsg += $"由于引用违反了数据模型设定的约束条件,无法创建引用";
                    break;
                case "BadReferenceTypeIdInvalid":
                    errorMsg += $"引用类型ID无效";
                    break;
                case "BadRefreshInProgress":
                    errorMsg += $"条件刷新失败,或已有条件刷新操作正在运行";
                    break;
                case "BadRequestCancelledByClient":
                    errorMsg += $"请求已被客户端取消";
                    break;
                case "BadRequestCancelledByRequest":
                    errorMsg += $"客户端通过Cancel服务取消了请求";
                    break;
                case "BadRequestHeaderInvalid":
                    errorMsg += $"请求的标头无效或丢失";
                    break;
                case "BadRequestInterrupted":
                    errorMsg += $"由于网络中断,无法发送请求";
                    break;
                case "BadRequestNotAllowed":
                    errorMsg += $"服务器拒绝了该请求,因为它不符合服务器设置的条件";
                    break;
                case "BadRequestNotComplete":
                    errorMsg += $"服务器尚未处理该请求";
                    break;
                case "BadRequestTimeout":
                    errorMsg += $"处理请求时发生超时";
                    break;
                case "BadRequestTooLarge":
                    errorMsg += $"请求消息大小超出了服务器设置的限制";
                    break;
                case "BadRequestTypeInvalid":
                    errorMsg += $"安全令牌请求类型无效";
                    break;
                case "BadResourceUnavailable":
                    errorMsg += $"操作系统资源不可用";
                    break;
                case "BadResponseTooLarge":
                    errorMsg += $"响应消息大小超出了客户端设置的限制";
                    break;
                case "BadSecureChannelClosed":
                    errorMsg += $"安全通道已关闭";
                    break;
                case "BadSecureChannelIdInvalid":
                    errorMsg += $"指定的安全通道不再有效";
                    break;
                case "BadSecureChannelTokenUnknown":
                    errorMsg += $"令牌已过期或未被识别";
                    break;
                case "BadSecurityChecksFailed":
                    errorMsg += $"验证安全时发生错误";
                    break;
                case "BadSecurityModeInsufficient":
                    errorMsg += $"不允许在当前安全通道上执行该操作";
                    break;
                case "BadSecurityModeRejected":
                    errorMsg += $"安全模式不满足服务器设定的要求";
                    break;
                case "BadSecurityPolicyRejected":
                    errorMsg += $"安全策略不满足服务器设定的要求";
                    break;
                case "BadSempahoreFileMissing":
                    errorMsg += $"客户端指定的信号量文件无效";
                    break;
                case "BadSensorFailure":
                    errorMsg += $"设备/数据源获取值的传感器存在故障";
                    break;
                case "BadSequenceNumberInvalid":
                    errorMsg += $"序列号无效";
                    break;
                case "BadSequenceNumberUnknown":
                    errorMsg += $"序列号对于服务器未知";
                    break;
                case "BadServerHalted":
                    errorMsg += $"服务器已停止,无法处理任何请求";
                    break;
                case "BadServerIndexInvalid":
                    errorMsg += $"服务器索引无效";
                    break;
                case "BadServerNameMissing":
                    errorMsg += $"未指定ServerName";
                    break;
                case "BadServerNotConnected":
                    errorMsg += $"由于客户端未连接至服务器,操作无法完成";
                    break;
                case "BadServerUriInvalid":
                    errorMsg += $"ServerUri不是有效的URI";
                    break;
                case "BadServiceUnsupported":
                    errorMsg += $"服务器不支持请求的服务";
                    break;
                case "BadSessionClosed":
                    errorMsg += $"会话已被客户端关闭";
                    break;
                case "BadSessionIdInvalid":
                    errorMsg += $"会话ID无效";
                    break;
                case "BadSessionNotActivated":
                    errorMsg += $"由于未调用ActivateSession,无法使用会话";
                    break;
                case "BadShelvingTimeOutOfRange":
                    errorMsg += $"搁置时间不在允许范围内";
                    break;
                case "BadShutdown":
                    errorMsg += $"应用程序正在关闭,所以操作取消";
                    break;
                case "BadSourceNodeIdInvalid":
                    errorMsg += $"源节点ID未引用有效的节点";
                    break;
                case "BadStateNotActive":
                    errorMsg += $"子状态机当前不是活动状态";
                    break;
                case "BadStructureMissing":
                    errorMsg += $"缺少必需的结构化参数或为空";
                    break;
                case "BadSubscriptionIdInvalid":
                    errorMsg += $"订阅ID无效";
                    break;
                case "BadSyntaxError":
                    errorMsg += $"值的语法无效";
                    break;
                case "BadTargetNodeIdInvalid":
                    errorMsg += $"目标节点ID未引用有效的节点";
                    break;
                case "BadTcpEndpointUrlInvalid":
                    errorMsg += $"服务器未识别指定的QueryString";
                    break;
                case "BadTcpInternalError":
                    errorMsg += $"发生内部错误";
                    break;
                case "BadTcpMessageTooLarge":
                    errorMsg += $"标头中指定的消息大小过大";
                    break;
                case "BadTcpMessageTypeInvalid":
                    errorMsg += $"标头中指定的消息类型无效";
                    break;
                case "BadTcpNotEnoughResources":
                    errorMsg += $"无足够的资源处理请求";
                    break;
                case "BadTcpSecureChannelUnknown":
                    errorMsg += $"SecureChannelId和/或TokenId当前未被使用";
                    break;
                case "BadTcpServerTooBusy":
                    errorMsg += $"服务器过于忙碌,无法处理请求";
                    break;
                case "BadTimeout":
                    errorMsg += $"操作超时";
                    break;
                case "BadTimestampNotSupported":
                    errorMsg += $"客户端请求历史数据所使用时间标识格式不受服务器支持。换言之,客户端请求了ServerTimestamp,而服务器仅支持SourceTimestamp";
                    break;
                case "BadTimestampsToReturnInvalid":
                    errorMsg += $"要返回参数的时间标识无效";
                    break;
                case "BadTooManyArguments":
                    errorMsg += $"提供的参数太多";
                    break;
                case "BadTooManyMatches":
                    errorMsg += $"请求操作的返回匹配数量过多";
                    break;
                case "BadTooManyMonitoredItems":
                    errorMsg += $"由于订阅中的监视项过多,无法处理请求";
                    break;
                case "BadTooManyOperations":
                    errorMsg += $"请求指定的操作过多,无法进行处理";
                    break;
                case "BadTooManyPublishRequests":
                    errorMsg += $"服务器已达到最大发布请求队列数量";
                    break;
                case "BadTooManySessions":
                    errorMsg += $"服务器已达到最大会话数量";
                    break;
                case "BadTooManySubscriptions":
                    errorMsg += $"服务器已达到最大订阅数量";
                    break;
                case "BadTypeDefinitionInvalid":
                    errorMsg += $"类型定义节点ID未引用正确的类型节点";
                    break;
                case "BadTypeMismatch":
                    errorMsg += $"为属性提供的值与属性值的类型不匹配";
                    break;
                case "BadUnexpectedError":
                    errorMsg += $"发生非预期错误";
                    break;
                case "BadUnknownResponse":
                    errorMsg += $"从服务器接收到的响应无法识别";
                    break;
                case "BadUserAccessDenied":
                    errorMsg += $"用户无权限执行请求的操作";
                    break;
                case "BadUserSignatureInvalid":
                    errorMsg += $"用户令牌签名丢失或无效";
                    break;
                case "BadViewIdUnknown":
                    errorMsg += $"视图ID未指向有效的视图节点";
                    break;
                case "BadViewParameterMismatch":
                    errorMsg += $"视图参数彼此不一致";
                    break;
                case "BadViewTimestampInvalid":
                    errorMsg += $"视图时间标识不可用或不受支持";
                    break;
                case "BadViewVersionInvalid":
                    errorMsg += $"视图版本不可用或不受支持";
                    break;
                case "BadWaitingForInitialData":
                    errorMsg += $"等待服务器从底层数据源获取值";
                    break;
                case "BadWaitingForResponse":
                    errorMsg += $"异步操作正在等待响应";
                    break;
                case "BadWouldBlock":
                    errorMsg += $"需要非阻隔性操作,但该操作会导致阻隔";
                    break;
                case "BadWriteNotSupported":
                    errorMsg += $"服务器不支持写入所提供的值、状态和时间标识的组合";
                    break;
                case "Good":
                    errorMsg += $"无错误";
                    break;
                case "GoodCallAgain":
                    errorMsg += $"操作未完成,需重新调用";
                    break;
                case "GoodClamped":
                    errorMsg += $"写入的值已被接受,但未限定范围";
                    break;
                case "GoodCommunicationEvent":
                    errorMsg += $"通信层已发起事件";
                    break;
                case "GoodCompletesAsynchronously":
                    errorMsg += $"处理过程将异步完成";
                    break;
                case "GoodDataIgnored":
                    errorMsg += $"请求所指定的字段对于EventType无效,或无法被历史记录保存";
                    break;
                case "GoodDependentValueChanged":
                    errorMsg += $"相关值已更改,但该更改尚未应用于设备";
                    break;
                case "GoodEdited":
                    errorMsg += $"该值并非来自真实来源,已由服务器编辑";
                    break;
                case "GoodEntryInserted":
                    errorMsg += $"数据或事件已成功插入历史数据库";
                    break;
                case "GoodEntryReplaced":
                    errorMsg += $"历史数据库中的数据或事件已被成功替换";
                    break;
                case "GoodLocalOverride":
                    errorMsg += $"值已被覆盖";
                    break;
                case "GoodMoreData":
                    errorMsg += $"请求的时间范围内或事件筛选条件下存在更多数据";
                    break;
                case "GoodNoData":
                    errorMsg += $"请求的时间范围内或事件筛选条件下不存在数据";
                    break;
                case "GoodNonCriticalTimeout":
                    errorMsg += $"发生非关键超时";
                    break;
                case "GoodOverload":
                    errorMsg += $"由于资源限制,采样速度已降低";
                    break;
                case "GoodPostActionFailed":
                    errorMsg += $"执行这些后期操作时出错";
                    break;
                case "GoodResultsMayBeIncomplete":
                    errorMsg += $"服务器应跟踪远程服务器的节点引用,但并未跟踪。结果集可能不完整";
                    break;
                case "GoodShutdownEvent":
                    errorMsg += $"系统正在关闭";
                    break;
                case "GoodSubscriptionTransferred":
                    errorMsg += $"订阅被转移至另一个会话";
                    break;
                case "GoodWithOverflowBit":
                    errorMsg += $"不存在";
                    break;
                case "Uncertain":
                    errorMsg += $"该值不确定,但不知道具体原因";
                    break;
                case "UncertainDataSubNormal":
                    errorMsg += $"该值从多个值中获取,包含的Good值数量小于所需数量";
                    break;
                case "UncertainDependentValueChanged":
                    errorMsg += $"相关值已更改,但该更改尚未应用于设备。主导变量的质量不确定";
                    break;
                case "UncertainDominantValueChanged":
                    errorMsg += $"相关的 EngineeringUnit 已更改,但仍根据以前的单位提供变量值";
                    break;
                case "UncertainEngineeringUnitsExceeded":
                    errorMsg += $"值超出了为该参数定义的值范围";
                    break;
                case "UncertainInitialValue":
                    errorMsg += $"该值为变量的初始值,变量通常从另一个变量接收值";
                    break;
                case "UncertainLastUsableValue":
                    errorMsg += $"正在更新该值的操作已停止更新";
                    break;
                case "UncertainNoCommunicationLastUsableValue":
                    errorMsg += $"与数据源通信失败。变量值为最后一个质量为Good的值";
                    break;
                case "UncertainNotAllNodesAvailable":
                    errorMsg += $"由于底层系统不可用,引用列表可能不完整";
                    break;
                case "UncertainReferenceNotDeleted":
                    errorMsg += $"服务器无法删除所有目标引用";
                    break;
                case "UncertainReferenceOutOfServer":
                    errorMsg += $"相对路径中要跟踪的引用之一指向了另一服务器上地址空间中的节点";
                    break;
                case "UncertainSensorNotAccurate":
                    errorMsg += $"该值位于一个传感器的限值";
                    break;
                case "UncertainSubNormal":
                    errorMsg += $"该值从多个源中获取,包含的Good源数量小于所需数量";
                    break;
                case "UncertainSubstituteValue":
                    errorMsg += $"该值为手动改写的运行值";
                    break;
            
            errorMsg += "】";
            return errorMsg;
        
    

以上是罗列了所有的错误提示,供参考,不至于遇到错误的时候找不到方向

以上是关于封装一个 C# OPC UA 错误提示类的主要内容,如果未能解决你的问题,请参考以下文章

是否为 OPC UA 地址空间中的应用程序级节点 ID 保留了 951 到 1999 的范围?

如何获取 .Net C# 上的 OPC UA 服务器列表?

使用 C# 客户端读取 OPC UA 节点属性值

使用OPC UA 封装IEC61499模型

使用 UA-.NET 调用 OPC-UA 方法

C# 读写opc ua服务器,浏览所有节点,读写节点,读历史数据,调用方法,订阅,批量订阅操作