OPC DA (OPC Data Access) 是工业自动化领域的一种通信协议标准,属于经典 OPC(OLE for Process Control)技术的核心部分。它的主要目标是实现 Windows 环境下工业设备与软件(如 SCADA、HMI、数据库)之间的实时数据交互。OPC DA 基于 COM / DCOM 实现,是一个轻量级的协议,分为服务器和客户端两个角色。
IoTDB (V2.0.5.1及以后的V2.x版本支持) 提供的 OPC DA Sink 支持将树模型数据推送到本地 COM 服务器的插件,它封装了 OPC DA 接口规范及其固有复杂性,显著简化了集成流程。OPC DA Sink 推送数据流图如下所示。
---- 注意这里的 clsID 需要替换为自己的 clsID create pipe opc ( 'sink'='opc-da-sink', --- 'opcda.progid'='opcserversim.Instance.1' 'opcda.clsid'='CAE8D0E1-117B-11D5-924B-11C0F023E91C' );
| 参数 | 描述 | **取值范围 ** | 是否必填 |
|---|---|---|---|
| sink | OPC DA SINK | String: opc-da-sink | 必填 |
| sink.opcda.clsid | OPC Server 的 ClsID(唯一标识字符串)。建议使用 clsID 而非 progID。 | String | 和 progId 二选一 |
| sink.opcda.progid | OPC Server 的 ProgID,如果有 clsID,优先使用 clsID。 | String | 和 clsID 二选一 |
使用时,IoTDB 将会将自身的树模型最新数据推送到服务器,数据的 itemID 为树模型下的时间序列的全路径,如 root.a.b.c.d。注意根据 OPC DA 标准,客户端无权直接在 server 侧创建 item,因此需要服务器提前将 IoTDB 的时间序列以 itemID 和对应数据类型的格式创建为 item。
| IoTDB | OPC-DA Server |
|---|---|
| INT32 | VT_I4 |
| INT64 | VT_I8 |
| FLOAT | VT_R4 |
| DOUBLE | VT_R8 |
| TEXT | VT_BSTR |
| BOOLEAN | VT_BOOL |
| DATE | VT_DATE |
| TIMESTAMP | VT_DATE |
| BLOB | VT_BSTR(Variant 不支持 VT_BLOB,因此用 VT_BSTR 替代) |
| STRING | VT_BSTR |
| 符号 | 错误码 | 描述 |
|---|---|---|
| OPC_E_BADTYPE | 0xC0040004 | 服务器无法在指定格式/请求的数据类型与规范数据类型之间转换数据。即服务器的数据类型与 IoTDB 的注册类型不一致。 |
| OPC_E_UNKNOWNITEMID | 0xC0040007 | 在服务器地址空间中未定义该条目ID(添加或验证时),或该条目ID在服务器地址空间中已不存在(读取或写入时)。即 IoTDB 的测点在服务器内没有对应的 itemID。 |
| OPC_E_INVALIDITEMID | 0xC0040008 | 该 itemID不符合服务器的语法规范。 |
| REGDB_E_CLASSNOTREG | 0x80040154 | 未注册类 |
| RPC_S_SERVER_UNAVAILABLE | 0x800706ba | RPC服务不可用 |
| DISP_E_OVERFLOW | 0x8002000a | 超过类型的最大值 |
| DISP_E_BADVARTYPE | 0x80020005 | 类型不匹配 |
修改 server 配置,以避免 IoTDB 的写入 client 与 Kepware 的读取 client 连接到两个不同的实例而无法调试。
dcomcnfg,打开 dcom 的组件配置:AGG Software Simple OPC Server Simulator,右键“属性”:标识内,将用户账户改为交互式用户。注意这里不要为启动用户,否则可能导致两个 client 分别启动不同的 server 实例。dcomcnfg,打开 dcom 的组件配置;AGG Software Simple OPC Server Simulator,右键“属性”。常规 中可以获取该应用程序的 clsID,用于之后 opc-da-sink 的连接,注意不带大括号Help > Show OPC Server Infocreate pipe opc ('sink'='opc-da-sink', 'opcda.clsid'='CAE8D0E1-117B-11D5-924B-11C0F023E91C')
Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 1107: Failed to connect to server, error code: 0x80040154,则可以参考该解决方案进行处理:https://opcexpert.com/support/0x80040154-class-not-registered/create timeseries root.a.b.c.r string;
insert into root.a.b.c (time, r) values(10000, "SomeString")
查看 Quick client 的数据,应该已经得到更新。