OPC Unified Architecture (OPC UA)是一种用于工业自动化的M2M协议(Machine-to-machine),具有平台独立性,在Windows和Linux上都可以运行。随着云服务在工业现场的不断普及,OPCUA服务也开始大量部署在云端。
本文以华为云云耀云服务器L为基础,讲述如何把OPCUA服务器部署在云上,目前OPCUA最流行的开源实现是open62541,本文将使用它来实现OPCUA服务。
拿到代金券之后,直接去华为云官网购买云耀云服务器L并创建实例,本人创建的实例如下,
因为本人对Ubuntu比较熟悉,所以选择创建了Ubuntu系统实例。然后就是在华为云官网修改登录密码,修改好之后就才可以使用ssh进行远程登录。登录后状态如下,默认是root账户,
系统默认集成了GNU编译套件,但是还需要安装一些其它程序:
安装好之后,我们去open62541官网下载最新的release版本,网址是https://github.com/open62541/open62541
打开后,点击红框按钮,然后往下拉,找到最新的版本,即pack/v1.3.7,然后点击它,
在新界面里先点击右侧的绿色Code,然后在弹出的界面里点击Download ZIP,
这样就把open62541的最新版本下载下来了。下载完毕后通过WinSCP把zip包传输到云耀云服务器L实例上,然后用unzip命令去解压,
unzip open62541-pack-v1.3.7
此时在work目录下创建project目录,然后依次在project目录里创建build目录,src目录,CMakeLists.txt,最后创建open62541-pack-v1.3.7的软链接,创建软链接的操作如下,
PS:使用软链接可以保证多个项目只需要一份open62541源码,不用每个工程都复制一份
接着在src目录下创建main.cpp,创建完成后,使用tree命令查看工程结构,
这样工程就创建好了。
首先打开main.cpp,然后编写如下代码,
#include
#include
#include "open62541.h"
UA_Boolean running = true;
static void stopHandler(int sign)
{
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
running = false;
}
static void addVariable(UA_Server *server)
{
/* Define the attribute of the myInteger variable node */
UA_VariableAttributes attr = UA_VariableAttributes_default;
UA_Int32 myInteger = 42;
UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
attr.description = UA_LOCALIZEDTEXT("en-US","the answer");
attr.displayName = UA_LOCALIZEDTEXT("en-US","the answer");
attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
/* Add the variable node to the information model */
UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
parentReferenceNodeId, myIntegerName,
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), attr, NULL, NULL);
}
int main(void)
{
signal(SIGINT, stopHandler);
signal(SIGTERM, stopHandler);
UA_Server *server = UA_Server_new();
UA_ServerConfig_setDefault(UA_Server_getConfig(server));
addVariable(server);
UA_StatusCode retval = UA_Server_run(server, &running);
UA_Server_delete(server);
return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
}
PS:该代码主要是创建OPCUA服务器,然后在服务器的地址空间里添加名为“the answer”的变量。
然后打开CMakeLists.txt,然后编写如下代码,
cmake_minimum_required(VERSION 3.5)
project(demo)
set(OPEN62541_VERSION "v1.3.7")
set(UA_ENABLE_AMALGAMATION ON CACHE BOOL "xxx" FORCE)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/open62541)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/build/open62541)
add_executable(demo ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp )
target_link_libraries(demo open62541 pthread)
最后在终端下cd进入build目录,并执行下面命令进行编译,
cmake .. && make
编译完成后在build目录下运行demo,
PS: 红框里显示该服务器的地址
这样OPCUA服务器就在云端运行起来了。
这里使用Unified Automation公司的UaExpert作为客户端,该软件功能全面且易用,是一个非常好的服务器测试工具。下载及安装过程这里不再描述,使用教程可以参考本人的这篇文章。
打开软件后点击“+”号,如下图,
在弹出的界面里点击“Advanced”栏,然后在Endpoint Url里输入OPCUA服务器地址,
由于本人的云服务器的公网IP是60.204.136.232,所以这里服务器的地址是“opc.tcp://60.204.136.232:4840”,填写好之后点击OK按钮。
然后在主界面里点击连接,即下图中的那个插座,
点击之后就会连接成功,我们就可以看到服务器的地址空间了,如下图,
“the answer”变量就是我们服务器代码在地址空间里添加的,单击该变量,可以在右侧Attributes窗口里看到其值,和预期一致,
本人在使用过程中遇到2个问题:
创建好云服务实例后 (Ubuntu 22.04系统),发现ping不通,重装了问题依然存在,在提交工单后得到了华为工程师的帮助,
然后按照指示修改了icmp规则的源地址,最后就可以ping通了
问了一些其它用户,都表示没有遇到这样的问题…,可能创建的系统是不一样的。
由于本人的OPCUA服务器启动后默认使用TCP 4840端口,但是使用客户端进行连接时无法连接,最后思考了一下发现需要在入方向规则里添加新规则来允许对4840端口的访问,如下,
这个应该是出于安全考虑,所以默认是不允许使用的,必须管理员把该端口打开才可以。
本文讲述了如何在华为云云耀云服务器L实例上部署OPCUA服务,并使用客户端去连接服务器。总体用下来感觉云耀云服务器L还是很不错的,速度很快,虽然遇到点问题,但都解决了,而且华为的反馈很迅速,这点值得称赞。
最后,祝愿华为云越来越好,也希望越来越多的OPCUA服务可以运行在华为云上。