2. OPC UA基础架构:客户端/服务器模型、地址空间概念、节点与引用、服务集概述
大家好,欢迎来到第二章。
这一章,咱们聊聊OPC UA的骨架。说白了,就是它到底是怎么工作的。我见过不少新手,一上来就写代码,结果连客户端和服务器怎么握手都没搞明白,调试起来那叫一个痛苦。所以,咱们先把地基打牢。
2.1 客户端/服务器模型:谁在说话?
OPC UA最经典的通信模式,就是客户端/服务器模型。你想想看,就像你去图书馆借书。
- 服务器(Server):就是图书馆。它存着所有的书(数据),并且知道每本书放在哪个架子上(地址空间)。它等着你来问。
- 客户端(Client):就是你。你走到前台,问“我要找《PLC编程从入门到放弃》这本书”。服务器就去查,然后把书拿给你。
在工业现场,服务器通常运行在PLC、工控机或者专用的OPC UA网关里。客户端呢,一般是你的上位机软件、MES系统或者云平台。
核心要点:客户端主动发起连接,服务器被动响应。客户端说“我要读这个变量”,服务器就把值返回给它。客户端说“我要写那个变量”,服务器就去执行写入操作。
我个人习惯,在搭建系统前,先用一个简单的OPC UA客户端工具(比如UaExpert)去连一下服务器。这能快速验证服务器是不是活着,地址空间是不是对的。我曾经遇到一个项目,现场工程师说“服务器连不上”,结果我一查,IP地址都配错了。这种低级错误,用工具一测就现原形。
避坑指南:我曾经在调试时,客户端一直报“BadNoMatch”。折腾了半天,才发现是客户端请求的节点ID写错了。记住,客户端和服务器必须使用相同的命名空间和节点ID才能对上话。
2.2 地址空间概念:数据藏在哪里?
服务器里的数据不是乱放的。它有一个结构化的“地图”,这就是地址空间(AddressSpace)。
你可以把地址空间想象成一棵大树。树根是Root节点,然后分出很多树枝(文件夹),树枝上再长叶子(具体的变量)。
为什么搞这么复杂?因为工业现场的数据太多了。一个PLC可能有上千个变量,如果没有结构,你找起来就像大海捞针。地址空间让数据有了“路径”,你可以顺着树杈一层层找下去。
举个例子,一个温度传感器的数据,它的路径可能是:
Root -> Objects -> 设备 -> 车间1 -> 反应釜A -> 温度
你看,这样是不是一目了然?
重要概念:地址空间是OPC UA服务器的核心。没有地址空间,服务器就是个空壳子。所有的数据、类型、方法,都挂在这个空间里。
2.3 节点与引用:地图上的点和线
地址空间由什么组成?两个东西:节点(Node)和引用(Reference)。
- 节点:就是地图上的每一个“点”。一个变量是一个节点,一个对象是一个节点,一个方法也是一个节点。每个节点都有一个唯一的ID,就像身份证号。
- 引用:就是连接这些“点”的“线”。它告诉你节点之间的关系。比如,“反应釜A”这个节点通过“HasComponent”引用,指向“温度”这个节点。意思就是“温度是反应釜A的一个组成部分”。
节点有很多种类型,最常见的有:
| 节点类型 | 说明 | 我见过的坑 |
|---|---|---|
| Variable(变量) | 存储实际的数据值,比如温度、压力、转速 | 注意变量的数据类型,Int32和UInt32搞混了会出大问题 |
| Object(对象) | 代表一个实体,比如一台电机、一个阀门 | 对象本身不存数据,它只是“容器”,数据存在它的子变量里 |
| Method(方法) | 可调用的函数,比如“启动电机”、“复位报警” | 调用方法时,输入输出参数的类型必须严格匹配 |
| View(视图) | 地址空间的一个子集,方便客户端只看它关心的部分 | 视图不是必须的,但用好了能大大简化客户端的开发 |
嗯,这里要注意。引用是有方向的。从“反应釜A”指向“温度”,和从“温度”指向“反应釜A”,含义完全不同。前者是“包含”,后者是“属于”。
我的经验:在设计地址空间时,我建议你先画一张树状图。把所有的设备、变量、方法都列出来,然后用箭头标出它们的关系。画清楚了再动手写代码,能省一半的调试时间。
2.4 服务集概述:客户端能干什么?
客户端和服务器怎么交互?靠的是服务(Service)。OPC UA定义了一整套服务,分成了几个服务集。说白了,就是客户端能对服务器做的几类操作。
我把它总结成四类核心操作:
- 发现服务(Discovery Service Set):客户端怎么找到服务器?就像你到了一个新城市,先打开地图App搜一下“附近有什么加油站”。客户端通过发现服务,可以知道网络上有哪些OPC UA服务器,以及它们的基本信息。
- 安全服务(Secure Channel Service Set):建立安全的通信通道。客户端和服务器要先“握手”,确认身份,协商加密方式。这一步不过,后面的操作都免谈。我曾经遇到一个项目,客户端死活连不上服务器,最后发现是证书过期了。
- 会话服务(Session Service Set):建立一次“会话”。就像你登录一个网站,服务器给你发一个Session ID,后续的操作都带着这个ID。会话管理着客户端的身份和权限。
- 数据访问服务(Data Access Service Set):这才是我们最常用的。包括:
- Read:读一个或多个节点的值。
- Write:写一个或多个节点的值。
- Subscribe:订阅。客户端告诉服务器“我对这个变量感兴趣,它一变你就通知我”。这是OPC UA最强大的功能之一,避免了客户端不停地轮询。
除了这些,还有方法调用服务(Method Service Set)、历史数据服务(Historical Access Service Set)等等。但对我们做数据采集来说,最核心的就是上面这四个。
一句话总结:服务集就是客户端和服务器之间的“通信协议”。你不需要记住所有服务的细节,但要知道它们能干什么。遇到具体需求时,知道去查哪个服务集就行。
2.5 本章小结
这一章,我们聊了OPC UA的四大基础概念:
- 客户端/服务器模型:谁主动,谁被动。
- 地址空间:数据怎么组织,像一棵树。
- 节点与引用:树上的点和线,构成了完整的语义。
- 服务集:客户端能对服务器做什么操作。
这些概念,是后面所有实战内容的基础。你想想看,如果你连地址空间都不理解,怎么去配置一个OPC UA服务器?如果你连服务集都不清楚,怎么去写客户端代码?
下一章,咱们就动手,搭建一个真正的OPC UA服务器。到时候,这些概念都会变得鲜活起来。