使用python实现opc_ua服务器(写入数据和查询数据)

OPC UA(OPC Unified Architecture)是一个独立于平台、面向服务、开放和安全的通信架构。它被设计用来实现不同供应商的工业自动化设备、系统和软件应用的互操作性。OPC UA 信息模型定义了使用各种传输协议交换数据的编码规格。在工业制造业领域,主要是将PLC特定的协议(如Modbus,Profibus等)抽象成为标准化的接口,作为“中间人”的角色把其通用的“读写”要求转换成具体的设备协议。

 

 

安装环境

pip install opcua -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install asyncua -i https://pypi.tuna.tsinghua.edu.cn/simple

 

NodeID 标识符类型(选择 <identifier_type>(标识符类型)取决于 服务器如何定义节点)

类型格式示例适用场景
数字(Numeric) ns=<X>;i=<N> ns=2;i=1001 PLC、工业设备(如 Siemens、Rockwell)
字符串(String) ns=<X>;s=<NAME> ns=2;s=Motor1.RPM 自定义服务器(如 Python、C# 实现的 OPC UA 服务器)
GUID(全局唯一标识符) ns=<X>;g=<UUID> ns=2;g=123e4567-e89b-12d3-a456-426614174000 分布式系统,需唯一标识
字节字符串(ByteString) ns=<X>;b=<BASE64> ns=2;b=AQIDBA== 较少使用,适用于二进制数据

 

读取opc_ua发布数据的两种方式

方式代码示例适用场景
get_child() 逐级查找 root.get_child(["0:Objects", "2:MyObject"]).get_child("2:MyVar") 适用于不确定 node_id,需要遍历节点树的情况
get_node(node_id) 直接访问 client.get_node("ns=2;s=MyObject.MyVar") 适用于已知完整 node_id,代码更简洁

 

创建OPCUA服务器写入节点值

需要注意的是,add_variable() 方法默认使用的是 数字标识符(Numeric NodeID),如果需要指定标识符类型,则需要显示指定

from opcua import Server, ua
import time
import datetime

# 设置 OPC UA 服务器
server = Server()
server.set_endpoint("opc.tcp://0.0.0.0:4840/freeopcua/server/")

# 设置命名空间
uri = "http://example.org"
idx = server.register_namespace(uri)

# 获取对象节点并添加自定义对象
objects = server.get_objects_node()
myobj = objects.add_object(idx, "MyCustomObject")

# 添加自定义变量 a
a_value = 0.0  # 自定义变量初始值

# add_variable() 方法默认使用的是 数字标识符(Numeric NodeID),实际的 node_id = "ns=2;i=2"
# a_var = myobj.add_variable(idx, "CustomVariableA", a_value)

# add_variable() 方法也可以使用 字符串标识符(String NodeID), 实际的 node_id = "ns=2;s=CustomVariableA"
a_var = myobj.add_variable(
    ua.NodeId("MyCustomObject.CustomVariableA", idx, ua.NodeIdType.String),  # 使用字符串 NodeID
    "CustomVariableA",  # 显示名称
    a_value
)
# 启动服务
server.start()
try:
    print("OPC UA Server is running...")
    while True:
        # 更新变量 a 的值  # 更新规则:每次递增 1
        a_var.set_value(a_value)

        # 打印更新日志
        print(f"Published a = {a_value} at {datetime.datetime.now()}")

        # 等待 3 秒
        time.sleep(3)
except KeyboardInterrupt:
    print("Server is stopping...")
finally:
    server.stop()
    print("Server stopped.")

 

get_node方法和get_child方法

from opcua import Client


def read_opcua_value(endpoint, node_id):
    """
    读取指定OPC UA节点的值

    参数:
        endpoint: OPC UA服务器地址
        node_id: 要读取的节点ID

    返回:
        读取到的值,如果出错返回None
    """
    client = None
    try:
        # 创建客户端并连接
        client = Client(endpoint)
        client.connect()

        # 获取节点值
        node = client.get_node(node_id)
        value = node.get_value()

        return value

    except Exception as e:
        print(f"读取OPC UA数据时出错: {str(e)}")
        return None

    finally:
        # 确保连接被关闭
        if client:
            client.disconnect()

def read_opcua_value2(endpoint, object_name, variable_name):
    """
    读取指定OPC UA节点的值

    参数:
        endpoint: OPC UA服务器地址
        node_id: 要读取的节点ID

    返回:
        读取到的值,如果出错返回None
    """
    client = None
    try:
        # 创建客户端并连接
        client = Client(endpoint)
        client.connect()

        # 获取根节点
        # 获取根节点
        root = client.get_root_node()

        # 获取指定对象节点
        my_object = root.get_child(["0:Objects", f"2:{object_name}"])

        # 获取指定变量节点
        my_variable = my_object.get_child(f"2:{variable_name}")

        # 获取变量的当前值
        value = my_variable.get_value()

        return value

    except Exception as e:
        print(f"读取OPC UA数据时出错: {str(e)}")
        return None

    finally:
        # 确保连接被关闭
        if client:
            client.disconnect()


# 使用示例
if __name__ == "__main__":
    
    # 1.本地轧钢尺寸检测opc_ua参数(get_node方法)
    endpoint = "opc.tcp://192.168.31.164:4840/freeopcua/server/"
    object_name = "MyCustomObject"
    variable_name = "CustomVariableA"
    node_id = f"ns=2;s={object_name}.{variable_name}"
    # node_id = "ns=2;i=2"
    print("node_id:", node_id)
    # 读取数据
    value = read_opcua_value(endpoint, node_id)

    # 2.轧钢尺寸检测opc_ua参数(通过get_child方式)
    endpoint = "opc.tcp://192.1.35.15:4840/freeopcua/server/"
    object_name = "MyCustomObject"
    variable_name = "CustomVariableA"
    # 读取数据
    value = read_opcua_value2(endpoint, object_name, variable_name)

    if value is not None:
        print(f"成功读取节点的值: {value}")
    else:
        print("读取数据失败")

 

扩展:同步和异步连接连接OPCUA服务器查找节点

(1)同步连接OPCUA服务器查找节点

from opcua import Client
from datetime import datetime
import time

# OPC UA 服务器的端点地址
endpoint = "opc.tcp://192.1.35.14:4840/freeopcua/server/"
object_name = "MyCustomObject"
variable_name = "CustomVariableA"

# 创建客户端实例
client = Client(endpoint)

try:
    # 连接到服务器
    client.connect()
    print(f"已连接到 OPC UA 服务器:{endpoint}")

    # 获取根节点
    root = client.get_root_node()

    # 获取指定对象节点
    my_object = root.get_child(["0:Objects", f"2:{object_name}"])

    # 获取指定变量节点
    my_variable = my_object.get_child(f"2:{variable_name}")

    # 循环读取节点值并显示当前时间
    while True:
        # 获取变量的当前值
        value = my_variable.get_value()

        # 获取当前时间
        current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

        # 打印节点值和当前时间
        print(f"节点值:{value}, 当前时间:{current_time}")

        # 等待一秒钟
        time.sleep(1)

except Exception as e:
    print(f"发生错误:{e}")

finally:
    # 断开与服务器的连接
    client.disconnect()
    print("已断开与 OPC UA 服务器的连接")

(2)异步连接OPCUA服务器查找节点

import asyncio
from asyncua import Client
from datetime import datetime

async def async_connect_opcua():
    # OPC UA 服务器的端点地址
    endpoint = "opc.tcp://192.1.35.14:4840/freeopcua/server/"
    object_name = "MyCustomObject"
    variable_name = "CustomVariableA"

    # 创建客户端实例
    client = Client(endpoint)

    try:
        # 连接到服务器
        await client.connect()
        print(f"已连接到 OPC UA 服务器:{endpoint}")

        # 获取根节点
        root = client.get_root_node()

        # 获取指定对象节点
        my_object = await root.get_child(["0:Objects", f"2:{object_name}"])

        # 获取指定变量节点
        my_variable = await my_object.get_child(f"2:{variable_name}")

        # 循环读取节点值并显示当前时间
        while True:
            # 获取变量的当前值
            value = await my_variable.read_value()

            # 获取当前时间
            current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

            # 打印节点值和当前时间
            print(f"节点值:{value}, 当前时间:{current_time}")

            # 等待一秒钟
            await asyncio.sleep(1)

    except Exception as e:
        print(f"发生错误:{e}")

    finally:
        # 断开与服务器的连接
        await client.disconnect()
        print("已断开与 OPC UA 服务器的连接")

if __name__ == '__main__':
    asyncio.run(async_connect_opcua())

 

OPC UA常见故障信息代码

Bad_UnexpectedError 0x80010000 发生非预期错误。
Bad_InternalError 0x80020000 编程或配置错误时发生内部错误。
Bad_OutOfMemory 0x80030000 完成操作所需内存不足。
Bad_ResourceUnavailable 0x80040000 操作系统资源不可用。
Bad_CommunicationError 0x80050000 发生底层通信错误。
Bad_EncodingError 0x80060000 正在序列化的对象中有非法数据,编码暂停。
Bad_DecodingError 0x80070000 数据流中有非法数据,解码暂停。
Bad_EncodingLimitsExceeded 0x80080000 栈设置的消息编码和解码限制已超出。
Bad_RequestTooLarge 0x80B80000 请求消息大小超出了服务器设置的限制。
Bad_ResponseTooLarge 0x80B90000 响应消息大小超出了客户端设置的限制。
Bad_UnknownResponse 0x80090000 从服务器接收到的响应无法识别。
Bad_Timeout 0x800A0000 操作超时。
Bad_ServiceUnsupported 0x800B0000 服务器不支持请求的服务。
Bad_Shutdown 0x800C0000 应用程序正在关闭,所以操作取消。
Bad_ServerNotConnected 0x800D0000 由于客户端未连接至服务器,操作无法完成。
Bad_ServerHalted 0x800E0000 服务器已停止,无法处理任何请求。
Bad_NothingToDo 0x800F0000 客户端传入的操作列表中无任何元素,因此不会执行任何操作。
Bad_TooManyOperations 0x80100000 请求指定的操作过多,无法进行处理。
Bad_TooManyMonitoredItems 0x80DB0000 由于订阅中的监视项过多,无法处理请求。
Bad_DataTypeIdUnknown 0x80110000 由于数据类型ID无法识别,扩展对象无法序列化或解序列化。
Bad_CertificateInvalid 0x80120000 提供的证书不是有效参数。
Bad_SecurityChecksFailed 0x80130000 验证安全时发生错误。
Bad_CertificateTimeInvalid 0x80140000 证书已过期或尚未生效。
Bad_CertificateIssuerTimeInvalid 0x80150000 发布方证书已过期或尚未生效。
Bad_CertificateHostNameInvalid 0x80160000 用于连接服务器的主机名与证书中的主机名不匹配。
Bad_CertificateUriInvalid 0x80170000 应用程序说明中指定的URI与证书中的URI不匹配。
Bad_CertificateUseNotAllowed 0x80180000 证书可能无法用于请求的操作。
Bad_CertificateIssuerUseNotAllowed 0x80190000 发布方证书可能无法用于请求的操作。
Bad_CertificateUntrusted 0x801A0000 证书未被信任。
Bad_CertificateRevocationUnknown 0x801B0000 无法确定证书是否已被吊销。
Bad_CertificateIssuerRevocationUnknown 0x801C0000 无法确定发布方证书是否已被吊销。
Bad_CertificateRevoked 0x801D0000 证书已被吊销。
Bad_CertificateIssuerRevoked 0x801E0000 发布方证书已被吊销。
Bad_UserAccessDenied 0x801F0000 用户无权限执行请求的操作。
Bad_IdentityTokenInvalid 0x80200000 用户身份令牌无效。
Bad_IdentityTokenRejected 0x80210000 用户身份令牌有效,但服务器拒绝该令牌。
Bad_SecureChannelIdInvalid 0x80220000 指定的安全通道不再有效。
Bad_InvalidTimestamp 0x80230000 时间标识超出了服务器允许的范围。
Bad_NonceInvalid 0x80240000 Nonce不是一个随机值,或长度不符合要求。
Bad_SessionIdInvalid 0x80250000 会话ID无效。
Bad_SessionClosed 0x80260000 会话已被客户端关闭。
Bad_SessionNotActivated 0x80270000 由于未调用ActivateSession,无法使用会话。
Bad_SubscriptionIdInvalid 0x80280000 订阅ID无效。
Bad_RequestHeaderInvalid 0x802A0000 请求的标头无效或丢失。
Bad_TimestampsToReturnInvalid 0x802B0000 要返回参数的时间标识无效。
Bad_RequestCancelledByClient 0x802C0000 请求已被客户端取消。
Good_SubscriptionTransferred 0x002D0000 订阅被转移至另一个会话。
Good_CompletesAsynchronously 0x002E0000 处理过程将异步完成。
Good_Overload 0x002F0000 由于资源限制,采样速度已降低。
Good_Clamped 0x00300000 写入的值已被接受,但未限定范围。
Bad_NoCommunication 0x80310000 已定义与数据源之间的通信,但尚未建立通信,无可用的最近已知值。
Bad_WaitingForInitialData 0x80320000 等待服务器从底层数据源获取值。
Bad_NodeIdInvalid 0x80330000 节点ID的语法无效。
Bad_NodeIdUnknown 0x80340000 节点ID指向服务器地址空间中不存在的节点。
Bad_AttributeIdInvalid 0x80350000 指定的节点不支持该属性。
Bad_IndexRangeInvalid 0x80360000 索引范围参数的语法无效。
Bad_IndexRangeNoData 0x80370000 指定的索引范围内无数据存在。
Bad_DataEncodingInvalid 0x80380000 数据编码无效。
Bad_DataEncodingUnsupported 0x80390000 服务器不支持为该节点请求的数据编码。
Bad_NotReadable 0x803A0000 访问等级不允许读取或订阅该节点。
Bad_NotWritable 0x803B0000 访问等级不允许写入节点。
Bad_OutOfRange 0x803C0000 值超出范围。
Bad_NotSupported 0x803D0000 不支持请求的操作。
Bad_NotFound 0x803E0000 请求的项未找到,或搜索操作已结束但无结果。
Bad_ObjectDeleted 0x803F0000 对象已被删除,无法使用。
Bad_NotImplemented 0x80400000 求取的操作未执行。
Bad_MonitoringModeInvalid 0x80410000 监视模式无效。
Bad_MonitoredItemIdInvalid 0x80420000 监视ID未指向有效的监视项。
Bad_MonitoredItemFilterInvalid 0x80430000 监视项的过滤参数无效。
Bad_MonitoredItemFilterUnsupported 0x80440000 服务器不支持请求的监视项筛选器。
Bad_FilterNotAllowed 0x80450000 监视筛选器无法与指定的属性配合使用。
Bad_StructureMissing 0x80460000 强制性架构的参数丢失或为空。
Bad_EventFilterInvalid 0x80470000 事件过滤器无效。
Bad_ContentFilterInvalid 0x80480000 内容过滤器无效。
Bad_FilterOperatorInvalid 0x80C10000 过滤器中提供了无法识别的运算符。
Bad_FilterOperatorUnsupported 0x80C20000 提供的运算符有效,但服务器不支持该过滤器运算符。
Bad_FilterOperandCountMismatch 0x80C30000 为过滤器运算符提供的操作数少于期望的操作数。
Bad_FilterOperandInvalid 0x80490000 内容过滤器中使用的操作数无效。
Bad_FilterElementInvalid 0x80C40000 引用的元素不是内容过滤器中的有效元素。
Bad_FilterLiteralInvalid 0x80C50000 引用的字面值不是有效值。
Bad_ContinuationPointInvalid 0x804A0000 连续点不再有效。
Bad_NoContinuationPoints 0x804B0000 由于所有的连续点已被分配,无法处理该操作。
Bad_ReferenceTypeIdInvalid 0x804C0000 引用类型ID无效。
Bad_BrowseDirectionInvalid 0x804D0000 浏览方向无效。
Bad_NodeNotInView 0x804E0000 节点不是视图的一部分。
Bad_ServerUriInvalid 0x804F0000 ServerUri不是有效的URI。
Bad_ServerNameMissing 0x80500000 未指定ServerName。
Bad_DiscoveryUrlMissing 0x80510000 未指定DiscoveryUrl。
Bad_SempahoreFileMissing 0x80520000 客户端指定的信号量文件无效。
Bad_RequestTypeInvalid 0x80530000 安全令牌请求类型无效。
Bad_SecurityModeRejected 0x80540000 安全模式不满足服务器设定的要求。
Bad_SecurityPolicyRejected 0x80550000 安全策略不满足服务器设定的要求。
Bad_TooManySessions 0x80560000 服务器已达到最大会话数量。
Bad_UserSignatureInvalid 0x80570000 用户令牌签名丢失或无效。
Bad_ApplicationSignatureInvalid 0x80580000 使用客户端证书生成的签名丢失或无效。
Bad_NoValidCertificates 0x80590000 客户端未向服务器提供至少一个有效且满足性能要求的软件证书。
Bad_IdentityChangeNotSupported 0x80C60000 服务器不支持更改为会话分配的用户身份。
Bad_RequestCancelledByRequest 0x805A0000 客户端通过Cancel服务取消了请求。
Bad_ParentNodeIdInvalid 0x805B0000 父节点ID未指向有效的节点。
Bad_ReferenceNotAllowed 0x805C0000 由于引用违反了数据模型设定的约束条件,无法创建引用。
Bad_NodeIdRejected 0x805D0000 由于节点ID无效或服务器不允许客户端指定节点ID,请求的节点ID被拒绝。
Bad_NodeIdExists 0x805E0000 请求的节点ID已被另一个节点使用。
Bad_NodeClassInvalid 0x805F0000 节点类无效。
Bad_BrowseNameInvalid 0x80600000 浏览器名称无效。
Bad_BrowseNameDuplicated 0x80610000 浏览名称不是共享相同父节点关系的节点中的唯一名称。
Bad_NodeAttributesInvalid 0x80620000 节点类的节点属性无效。
Bad_TypeDefinitionInvalid 0x80630000 类型定义节点ID未引用正确的类型节点。
Bad_SourceNodeIdInvalid 0x80640000 源节点ID未引用有效的节点。
Bad_TargetNodeIdInvalid 0x80650000 目标节点ID未引用有效的节点。
Bad_DuplicateReferenceNotAllowed 0x80660000 节点间的引用类型已被定义。
Bad_InvalidSelfReference 0x80670000 服务器在该节点上不允许此类自引用。
Bad_ReferenceLocalOnly 0x80680000 远程服务器引用的引用类型无效。
Bad_NoDeleteRights 0x80690000 服务器不允许删除节点。
Uncertain_ReferenceNotDeleted 0x40BC0000 服务器无法删除所有目标引用。
Bad_ServerIndexInvalid 0x806A0000 服务器索引无效。
Bad_ViewIdUnknown 0x806B0000 视图ID未指向有效的视图节点。
Bad_ViewTimestampInvalid 0x80C90000 视图时间标识不可用或不受支持。
Bad_ViewParameterMismatch 0x80CA0000 视图参数彼此不一致。
Bad_ViewVersionInvalid 0x80CB0000 视图版本不可用或不受支持。
Uncertain_NotAllNodesAvailable 0x40C00000 由于底层系统不可用,引用列表可能不完整。
Good_ResultsMayBeIncomplete 0x00BA0000 服务器应跟踪远程服务器的节点引用,但并未跟踪。结果集可能不完整。
Bad_NotTypeDefinition 0x80C80000 提供的节点ID不是自定义类型节点ID。
Uncertain_ReferenceOutOfServer 0x406C0000 相对路径中要跟踪的引用之一指向了另一服务器上地址空间中的节点。
Bad_TooManyMatches 0x806D0000 请求操作的返回匹配数量过多。
Bad_QueryTooComplex 0x806E0000 请求操作需要的服务器资源过多。
Bad_NoMatch 0x806F0000 请求的操作无匹配可返回。
Bad_MaxAgeInvalid 0x80700000 最大年龄参数无效。
Bad_HistoryOperationInvalid 0x80710000 历史详情参数无效。
Bad_HistoryOperationUnsupported 0x80720000 服务器不支持请求的操作。
Bad_InvalidTimestampArgument 0x80BD0000 定义的返回的时间标识无效。
Bad_WriteNotSupported 0x80730000 服务器不支持写入所提供的值、状态和时间标识的组合。
Bad_TypeMismatch 0x80740000 为属性提供的值与属性值的类型不匹配。
Bad_MethodInvalid 0x80750000 方法ID未指向指定对象的方法。
Bad_ArgumentsMissing 0x80760000 客户端未指定该方法的全部输入参数。
Bad_TooManySubscriptions 0x80770000 服务器已达到最大订阅数量。
Bad_TooManyPublishRequests 0x80780000 服务器已达到最大发布请求队列数量。
Bad_NoSubscription 0x80790000 无订阅可用于该会话。
Bad_SequenceNumberUnknown 0x807A0000 序列号对于服务器未知。
Bad_MessageNotAvailable 0x807B0000 请求的通知消息不再可用。
Bad_InsufficientClientProfile 0x807C0000 当前会话的客户端不支持订阅所需的一个或多个性能。
Bad_StateNotActive 0x80BF0000 子状态机当前不是活动状态。
Bad_TcpServerTooBusy 0x807D0000 服务器过于忙碌,无法处理请求。
Bad_TcpMessageTypeInvalid 0x807E0000 标头中指定的消息类型无效。
Bad_TcpSecureChannelUnknown 0x807F0000 SecureChannelId和/或TokenId当前未被使用。
Bad_TcpMessageTooLarge 0x80800000 标头中指定的消息大小过大。
Bad_TcpNotEnoughResources 0x80810000 无足够的资源处理请求。
Bad_TcpInternalError 0x80820000 发生内部错误。
Bad_TcpEndpointUrlInvalid 0x80830000 服务器未识别指定的QueryString。
Bad_RequestInterrupted 0x80840000 由于网络中断,无法发送请求。
Bad_RequestTimeout 0x80850000 处理请求时发生超时。
Bad_SecureChannelClosed 0x80860000 安全通道已关闭。
Bad_SecureChannelTokenUnknown 0x80870000 令牌已过期或未被识别。
Bad_SequenceNumberInvalid 0x80880000 序列号无效。
Bad_ProtocolVersionUnsupported 0x80BE0000 应用程序没有兼容的协议版本。
Bad_ConfigurationError 0x80890000 配置存在问题,影响了值的有效性。
Bad_NotConnected 0x808A0000 变量应从另一个变量中接收值,但未如此配置。
Bad_DeviceFailure 0x808B0000 生成值的设备/数据源存在故障,对值造成了影响。
Bad_SensorFailure 0x808C0000 设备/数据源获取值的传感器存在故障。
Bad_OutOfService 0x808D0000 数据源未正常运行。
Bad_DeadbandFilterInvalid 0x808E0000 死区过滤器无效。
Uncertain_NoCommunicationLastUsableValue 0x408F0000 与数据源通信失败。变量值为最后一个质量为Good的值。
Uncertain_LastUsableValue 0x40900000 正在更新该值的操作已停止更新。
Uncertain_SubstituteValue 0x40910000 该值为手动改写的运行值。
Uncertain_InitialValue 0x40920000 该值为变量的初始值,变量通常从另一个变量接收值。
Uncertain_SensorNotAccurate 0x40930000 该值位于一个传感器的限值。
Uncertain_EngineeringUnitsExceeded 0x40940000 值超出了为该参数定义的值范围。
Uncertain_SubNormal 0x40950000 该值从多个源中获取,包含的Good源数量小于所需数量。
Good_LocalOverride 0x00960000 值已被覆盖。
Bad_RefreshInProgress 0x80970000 条件刷新失败,或已有条件刷新操作正在运行。
Bad_ConditionAlreadyDisabled 0x80980000 该条件已被禁用。
Bad_ConditionAlreadyEnabled 0x80CC0000 该条件已被启用。
Bad_ConditionDisabled 0x80990000 属性不可用,或该条件被禁用。
Bad_EventIdUnknown 0x809A0000 指定的事件ID未被识别。
Bad_EventNotAcknowledgeable 0x80BB0000 事件无法知悉。
Bad_DialogNotActive 0x80CD0000 对话框条件未处于活动状态。
Bad_DialogResponseInvalid 0x80CE0000 响应对于对话框无效。
Bad_ConditionBranchAlreadyAcked 0x80CF0000 条件分支已被知悉。
Bad_ConditionBranchAlreadyConfirmed 0x80D00000 条件分支已被确认。
Bad_ConditionAlreadyShelved 0x80D10000 条件已被搁置。
Bad_ConditionNotShelved 0x80D20000 条件当前未被搁置。
Bad_ShelvingTimeOutOfRange 0x80D30000 搁置时间不在允许范围内。
Bad_NoData 0x809B0000 请求的时间范围内或事件筛选条件下不存在数据。
Bad_BoundNotFound 0x80D70000 未找到提供上/下边界值的数据。
Bad_BoundNotSupported 0x80D80000 服务器无法检索到变量边界。
Bad_DataLost 0x809D0000 由于采集开始/停止/丢失,数据已丢失。
Bad_DataUnavailable 0x809E0000 由于存在未安装的卷、离线存档或磁带,或由于暂时不可用等类似原因,期望的数据在请求的时间范围内不可用。
Bad_EntryExists 0x809F0000 由于存在匹配条目,数据或事件未成功插入。
Bad_NoEntryExists 0x80A00000 由于不存在匹配条目,数据或事件未成功更新。
Bad_TimestampNotSupported 0x80A10000 客户端请求历史数据所使用时间标识格式不受服务器支持。换言之,客户端请求了ServerTimestamp,而服务器仅支持SourceTimestamp。
Good_EntryInserted 0x00A20000 数据或事件已成功插入历史数据库。
Good_EntryReplaced 0x00A30000 历史数据库中的数据或事件已被成功替换。
Uncertain_DataSubNormal 0x40A40000 该值从多个值中获取,包含的Good值数量小于所需数量。
Good_NoData 0x00A50000 请求的时间范围内或事件筛选条件下不存在数据。
Good_MoreData 0x00A60000 请求的时间范围内或事件筛选条件下存在更多数据。
Bad_AggregateListMismatch 0x80D40000 请求的集合数量与请求的节点ID数量不匹配。
Bad_AggregateNotSupported 0x80D50000 服务器不支持请求的集合。
Bad_AggregateInvalidInputs 0x80D60000 由于输入数据无效,无法获取集合值。
Bad_AggregateConfigurationRejected 0x80DA0000 指定节点的集合配置无效。
Good_DataIgnored 0x00D90000 请求所指定的字段对于EventType无效,或无法被历史记录保存。
Good_CommunicationEvent 0x00A70000 通信层已发起事件。
Good_ShutdownEvent 0x00A80000 系统正在关闭。
Good_CallAgain 0x00A90000 操作未完成,需重新调用。
Good_NonCriticalTimeout 0x00AA0000 发生非关键超时。
Bad_InvalidArgument 0x80AB0000 一个或多个参数无效。
Bad_ConnectionRejected 0x80AC0000 无法与远程服务器建立网络连接。
Bad_Disconnect 0x80AD0000 服务器已从客户端断开连接。
Bad_ConnectionClosed 0x80AE0000 网络连接已关闭。
Bad_InvalidState 0x80AF0000 由于对象被关闭、未初始化或处于其他无效状态,操作无法完成。
Bad_EndOfStream 0x80B00000 无法移动至数据流结束之后。
Bad_NoDataAvailable 0x80B10000 非阻隔数据流中当前没有数据可读取。
Bad_WaitingForResponse 0x80B20000 异步操作正在等待响应。
Bad_OperationAbandoned 0x80B30000 异步操作已被调用方放弃。
Bad_ExpectedStreamToBlock 0x80B40000 数据流未返回所有的请求数据(可能由于数据流为非阻隔性数据流)。
Bad_WouldBlock 0x80B50000 需要非阻隔性操作,但该操作会导致阻隔。
Bad_SyntaxError 0x80B60000 值语法无需。
Bad_MaxConnectionsReached 0x80B70000 由于所有变量连接正在使用,操作无法完成。

posted @ 2025-02-14 17:35  马铃薯1  阅读(945)  评论(0)    收藏  举报