Appearance
安捷OPC UA Server技术架构方案
1 概述
安捷OPC UA Server使用C语言开发,引入了用C 99和C++ 98语言的通用子集实现的开源OPC UA协议库open62541。
该服务器采用PubSub(发布订阅)模式通过UDP协议向群组广播数据信息。目前仅支持接收HTTP的POST请求,数据格式上支持JSON。在接收请求后可读取请求中的数据并存储在安捷OPC UA Server上,用户可通过OPC UA客户端(例如UaExpert、KEPServer)查看数据。
代码构建引入了CMake,跨平台支持Windows和Linux。程序编译后可在Linux系统直接运行,Windows下运行需要的dll库已打包在安装程序中,安装完成后可在目录下的x64和x86文件夹中找到。
2 接口
| 请求方式 | POST |
|---|---|
| 请求参数 | 无 |
| 请求头(Headers) | 需Content-Length |
| 请求体 | "db": 数据库名 , "name": 表名, "fields": { "field":字段名 }, "time": 时间戳 |
| 返回数据 | 204:更新成功 200:部分数据点更新成功,部分数据点因信息缺失更新失败 400: 因接收数据失败\请求体为空\请求体不符合JSON结构 更新失败 405:请求方法不支持 411:请求头中缺少Content-Length信息 |
| 示例 | 请求:[{"db": "my_db","name":"cpu2","fields":{"field85": 2250,"field90": false,"field40":2215.3},"time": "2023-10-27T00:01:02.003004005Z"},{"db":"my_db","name":"cpu2","fields":{"field85": 2250,"field90":true,"field40":2215.3},"time":"2023-10-27T00:01:02.003004005Z"}] __ 返回: 204 No Content__ |
3 架构图
OPC UA PubSub(发布订阅)架构

发布者:
- 发布数据集(PublishedDataSet):
- 数据集元数据(dataSetMetaData):包含数据集格式、数据单位等
- 数据集字段(dataSetField): 每个数据集字段包含一个指定的信息模型节点(information model node)
- 发布数据集(PublishedDataSet):
发布订阅连接(Pubsub Connection): 定义连接所使用的协议、网络地址(TCP)或组播地址(UDP)
安捷OPC UA Server架构

4 模块设计
4.1 数据处理模块
数据处理模块负责HTTP请求的接收与验证、HTTP请求体中JSON数据的验证与处理,其中对JSON数据的处理使用了轻量级的用于处理JSON数据的c语言库cJSON。
数据处理模块通过socket接收数据。对于HTTP POST请求,该模块在接收请求体中的全部数据后会通过相应转换,将各字段的数据从字符串格式转换成对应数据类型并调用更新模块来更新服务器中的数据。
4.2 数据更新模块
OPC UA 使用了对象(objects)作为过程系统表示数据和活动的基础。对象包含了变量,事件和方法,它们通过引用(reference)来互相连接。地址空间中模型的元素被称为节点,为节点分配节点类来代表对象模型的元素。因此在OPC UA服务器中所存储的对象、方法和例如整型、浮点的数据都以节点的形式存在。
数据更新模块负责将数据处理模块传递来的数据转换成OPC UA服务器所能接受的节点信息,并根据请求中的信息添加新的数据库、表、字段或者更新服务器中的数据。对于服务器中数据的更新,若在Config中将“alwaysUpdate"开启,则该模块总是会用请求中的数据覆盖服务器中的数据,无论新旧;若关闭该选项,则该模块会对比数据的时间戳,总是将更新的数据保存在服务器中。
另外由于采用PubSub模式,在添加新字段后需要将该字段和对应数据作为数据集字段(DataSetField)添加到服务器的发布数据集(PublishedDataSet)中。
4.3 OPC UA 服务器模块
该模块负责在服务器启动阶段设置各项参数,比如服务器所使用的端口、连接协议、服务器名称、发布数据集名称、发布间隔等,因此在启动服务器前会先读取Config文件确保将用户的自定义设置保存到服务器中。
4.4 待开发功能
后续会根据需求添加身份权限验证、支持MQTT中间件、支持加密请求体等功能。