OPC UA https://en.wikipedia.org/wiki/OPC_Unified_Architecture
OPCUA指的是 Open Platform Communications Unified Architecture
以前OPC指的是 OLE for Process Control
但是以前的OPC只支持Windows系统,需要DCOM支持,用起来特别难用。
所以就有了现在的OPCUA,统一架构。
OPC 规范由国际非营利组织 OPC 基金会制定,该组织于 1994 年由领先的工业自动化产品制造商制定。
OPCUA与modbus的突出区别是OPCUA带有语义属性 semantic description,了解modbus的人都知道,modbus协议是以地址为位置存储数据的,每个位置存储一个word,16个bit。 比如modbus协议取地址100这个位置寄存器的值 0x 00 01 02 03, 数拿到了,至于这数代表的意思是温度还是速度等等,都是由设备定义,外界也要知道。 因此负责PLC开发的工程师要向SCADA的工程师提供一份数据点表,就是说明某个位置的值代表什么意思。
OPCUA就不需要这,OPCUA是对外界的抽象,以节点进行封装,还只需要一个节点名即可拿到这个值。
可以参考这个网页进行了解:
https://zhuanlan.zhihu.com/p/346842505
open62541(http://open62541.org)是一个开源的免费实现OPC UA,用C99和C ++ 98语言的通用子集编写。该库可与所有主要编译器一起使用,并提供实现专用OPC UA客户端和服务器的必要工具,或将基于OPC UA的通信集成到现有应用程序中。open62541库与平台无关。所有特定于平台的功能都是通过可交换的插件实现的。为主要操作系统提供了插件实现。
open62541根据Mozilla Public License v2.0获得许可。因此open62541库可用于非开源项目。
代码主页位于:GitHub - open62541/open62541: Open source implementation of OPC UA (OPC Unified Architecture) aka IEC 62541 licensed under Mozilla Public License v2.0
open62541的文档位于这里:
https://open62541.org/doc/current/index.html
编译open62541参考:
Building open62541 — open62541 1.2.0-rc2-44-ge5eba7bd documentation
安装参考:
Installing open62541 — open62541 1.2.0-rc2-44-ge5eba7bd documentation
一般流程是这样的:
cd open62541
mkdir build
cd build
cmake ..
make
但是需要注意在cmake的时候有几个参数需要注意一下:
cmake -DBUILD_SHARED_LIBS=OFF \
-DCMAKE_BUILD_TYPE=Debug \
-DUA_ENABLE_AMALGAMATION=OFF \
-DUA_BUILD_EXAMPLES=ON \
-DUA_ENABLE_SUBSCRIPTIONS=ON \
-DUA_ENABLE_PUBSUB=ON \
-DUA_ENABLE_PUBSUB_ETH_UADP=ON \
-DUA_ENABLE_PUBSUB_INFORMATIONMODEL=ON \
..
make -j
UA_BUILD_EXAMPLES 是否生成examples
UA_BUILD_SELFSIGNED_CERTIFICATE 是否生成自签名证书
UA_ENABLE_SUBSCRIPTIONS 启用 sub订阅
UA_ENABLE_AMALGAMATION 用来生成独立的open62541.c 和 open62541.h头文件,不推荐开启这个选项,但编译61499的forte时要用
UA_ENABLE_PUBSUB 用于开启pub/sub功能 ,目前是试验性功能
编译选项说明见于:
Building open62541 — open62541 1.2.0-rc2-44-ge5eba7bd documentation
与FORTE集成的时候可以参考:
OPC UA with IEC 61499 Tutorial
编译生成的examples位于build/bin/examples目录下。
不同的cmake选项会生成不同的文件,比如是否启用SUBSCRIPTIONS会对是否编译与 订阅相关的demo产生影响。
在CMakeLists.txt中是这么写的:
if(UA_ENABLE_SUBSCRIPTIONS)
add_example(tutorial_server_monitoreditems tutorial_server_monitoreditems.c)
endif()
生成的examples
~/work/plc/open62541/build/bin/examples$ ll
总用量 45276
drwxrwxr-x 2 pcl pcl 4096 2月 17 15:00 ./
drwxrwxr-x 3 pcl pcl 4096 2月 17 15:00 ../
-rwxrwxr-x 1 pcl pcl 1866824 2月 17 15:00 access_control_client*
-rwxrwxr-x 1 pcl pcl 1819168 2月 17 15:00 access_control_server*
-rwxrwxr-x 1 pcl pcl 1926112 2月 17 15:00 client*
-rwxrwxr-x 1 pcl pcl 1894248 2月 17 15:00 client_async*
-rwxrwxr-x 1 pcl pcl 1871248 2月 17 15:00 client_connect*
-rwxrwxr-x 1 pcl pcl 1835808 2月 17 15:00 client_connectivitycheck_loop*
-rwxrwxr-x 1 pcl pcl 1871384 2月 17 15:00 client_connect_loop*
-rwxrwxr-x 1 pcl pcl 1844440 2月 17 15:00 client_subscription_loop*
-rwxrwxr-x 1 pcl pcl 1870576 2月 17 15:00 custom_datatype_client*
-rwxrwxr-x 1 pcl pcl 1825032 2月 17 15:00 custom_datatype_server*
-rwxrwxr-x 1 pcl pcl 1863112 2月 17 15:00 server_ctt*
-rwxrwxr-x 1 pcl pcl 1837120 2月 17 15:00 server_inheritance*
-rwxrwxr-x 1 pcl pcl 1823888 2月 17 15:00 server_instantiation*
-rwxrwxr-x 1 pcl pcl 1818144 2月 17 15:00 server_mainloop*
-rwxrwxr-x 1 pcl pcl 1841568 2月 17 15:00 server_nodeset*
-rwxrwxr-x 1 pcl pcl 1818008 2月 17 15:00 server_repeated_job*
-rwxrwxr-x 1 pcl pcl 1842832 2月 17 15:00 tutorial_client_events*
-rwxrwxr-x 1 pcl pcl 1867296 2月 17 15:00 tutorial_client_firststeps*
-rwxrwxr-x 1 pcl pcl 176728 2月 17 15:00 tutorial_datatypes*
-rwxrwxr-x 1 pcl pcl 1831056 2月 17 15:00 tutorial_server_datasource*
-rwxrwxr-x 1 pcl pcl 1817856 2月 17 15:00 tutorial_server_firststeps*
-rwxrwxr-x 1 pcl pcl 1830024 2月 17 15:00 tutorial_server_method*
-rwxrwxr-x 1 pcl pcl 1824104 2月 17 15:00 tutorial_server_monitoreditems*
-rwxrwxr-x 1 pcl pcl 1839960 2月 17 15:00 tutorial_server_object*
-rwxrwxr-x 1 pcl pcl 1825456 2月 17 15:00 tutorial_server_variable*
-rwxrwxr-x 1 pcl pcl 1825112 2月 17 15:00 tutorial_server_variabletype*
英文原版specification链接如下
最新版本是v1.0.4
Unified Architecture - OPC Foundation