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定义了一整套服务,分成了几个服务集。说白了,就是客户端能对服务器做的几类操作。

我把它总结成四类核心操作:

  1. 发现服务(Discovery Service Set):客户端怎么找到服务器?就像你到了一个新城市,先打开地图App搜一下“附近有什么加油站”。客户端通过发现服务,可以知道网络上有哪些OPC UA服务器,以及它们的基本信息。
  2. 安全服务(Secure Channel Service Set):建立安全的通信通道。客户端和服务器要先“握手”,确认身份,协商加密方式。这一步不过,后面的操作都免谈。我曾经遇到一个项目,客户端死活连不上服务器,最后发现是证书过期了。
  3. 会话服务(Session Service Set):建立一次“会话”。就像你登录一个网站,服务器给你发一个Session ID,后续的操作都带着这个ID。会话管理着客户端的身份和权限。
  4. 数据访问服务(Data Access Service Set):这才是我们最常用的。包括:
    • Read:读一个或多个节点的值。
    • Write:写一个或多个节点的值。
    • Subscribe:订阅。客户端告诉服务器“我对这个变量感兴趣,它一变你就通知我”。这是OPC UA最强大的功能之一,避免了客户端不停地轮询。

除了这些,还有方法调用服务(Method Service Set)历史数据服务(Historical Access Service Set)等等。但对我们做数据采集来说,最核心的就是上面这四个。

一句话总结:服务集就是客户端和服务器之间的“通信协议”。你不需要记住所有服务的细节,但要知道它们能干什么。遇到具体需求时,知道去查哪个服务集就行。

2.5 本章小结

这一章,我们聊了OPC UA的四大基础概念:

  • 客户端/服务器模型:谁主动,谁被动。
  • 地址空间:数据怎么组织,像一棵树。
  • 节点与引用:树上的点和线,构成了完整的语义。
  • 服务集:客户端能对服务器做什么操作。

这些概念,是后面所有实战内容的基础。你想想看,如果你连地址空间都不理解,怎么去配置一个OPC UA服务器?如果你连服务集都不清楚,怎么去写客户端代码?

下一章,咱们就动手,搭建一个真正的OPC UA服务器。到时候,这些概念都会变得鲜活起来。