📢作者留言:写到第五期,终于要聊 OPC UA 了。这玩意儿有点特殊——它不是"设备到设备"的协议,而是系统到系统的协议。你在工厂里搞 MES、SCADA、ERP,想让它们互相"打电话",OPC UA 就是那个标准普通话。而且,工业 4.0 的标配就是 OPC UA,不懂这个,出门都不好意思跟人打招呼。
1. OPC UA 是什么?
OPC UA =Open Platform Communications Unified Architecture
翻译过来就是"开放平台通讯统一架构"。
先说历史:OPC UA 的前身是 OPC(OLE for Process Control),1996 年由微软、几个自动化厂商联合制定,用来解决 Windows 平台下工控软件之间的通讯问题。早期的 OPC 依赖 DCOM 技术——这玩意儿配置起来能把人逼疯,防火墙一升级,通讯就挂。
于是,OPC UA 在 2006 年诞生,彻底重构,核心目标只有一个:让工业数据和云端数据自由流动。
1.1 它能解决什么问题?
传统工厂的数据孤岛: ┌──────────┐ ┌──────────┐ ┌──────────┐ │ PLC 1 │ │ PLC 2 │ │ PLC 3 │ │ (西门子) │ │(罗克韦尔) │ │ (三菱) │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ └───────┬───────┴───────────────┘ │ 各玩各的,无法互通 ▼ ┌──────┐ │ 数据 │ ← 只能靠 OPC 服务器做翻译 │ 孤岛 │ └──────┘ OPC UA 时代: ┌──────────┐ ┌──────────┐ ┌──────────┐ │ PLC 1 │ │ PLC 2 │ │ PLC 3 │ │ (西门子) │ │(罗克韦尔) │ │ (三菱) │ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │ │ └───────┬───────┴───────────────┘ │ ▼ ┌────────────────┐ │ OPC UA 服务器 │ ← 统一接口 └───────┬────────┘ │ ┌──────┼──────┐ ▼ ▼ ▼ ┌────┐ ┌────┐ ┌────┐ │MES │ │SCADA│ │ERP │ ← 任何系统都能访问 └────┘ └────┘ └────┘1.2 OPC UA vs 传统 OPC
| 维度 | OPC Classic (DA/A&E/HDA) | OPC UA |
|---|---|---|
| 平台 | 仅 Windows | 跨平台(Win/Linux/Unix/嵌入式) |
| 传输 | DCOM | TCP/HTTP/SOAP |
| 数据模型 | 简单标签 | 复杂对象模型 |
| 安全性 | 弱 | 端到端加密 + 认证 |
| 防火墙 | 噩梦 | 友好 |
| 互联网 | ❌ | ✅ |
2. 信息模型:OPC UA 的精髓
OPC UA 不仅仅是传输数据,它是自带数据模型的协议。
2.1 地址空间(Address Space)
OPC UA 服务器内部维护一个地址空间,像文件系统一样组织数据:
Address Space (地址空间) │ ├─ Devices (设备) │ ├─ PLC_01 │ │ ├─ Inputs │ │ │ ├─ Temperature (Float, ℃) │ │ │ ├─ Pressure (Float, bar) │ │ │ └─ Status (Boolean) │ │ └─ Outputs │ │ ├─ Valve_1 (Boolean) │ │ └─ Motor_Speed (Float, RPM) │ │ │ └─ Conveyor_01 │ ├─ Speed (Float) │ └─ Fault_Code (UInt16) │ ├─ Alarms (报警) │ ├─ High_Temperature_Alarm │ ├─ Low_Pressure_Alarm │ └─ Motor_Overload_Alarm │ └─ Historical (历史数据) ├─ Temperature_Trend └─ Production_Count_History每个节点(Node)都有:
- NodeId:唯一标识符(类似文件的路径)
- BrowseName:浏览名称
- DisplayName:显示名称
- DataType:数据类型
- Value:当前值
- AccessLevel:访问权限
2.2 OPC UA 的数据类型
| 类型 | 说明 | 示例 |
|---|---|---|
| Boolean | 布尔值 | TRUE / FALSE |
| SByte/Byte | 有符号/无符号字节 | 0 ~ 255 |
| Int16/Int32/Int64 | 整数 | -32768 ~ 32767 |
| Float/Double | 浮点数 | 3.14159 |
| String | 字符串 | “Temperature_01” |
| DateTime | 时间戳 | 2024-01-15T10:30:00Z |
| UAObject | 对象 | <