• 华为云云耀云服务器L实例评测 | 开启OPC UA之旅


    OPC Unified Architecture (OPC UA)是一种用于工业自动化的M2M协议(Machine-to-machine),具有平台独立性,在Windows和Linux上都可以运行。随着云服务在工业现场的不断普及,OPCUA服务也开始大量部署在云端。

    本文以华为云云耀云服务器L为基础,讲述如何把OPCUA服务器部署在云上,目前OPCUA最流行的开源实现是open62541,本文将使用它来实现OPCUA服务。


    一 创建云耀云服务器L实例

    拿到代金券之后,直接去华为云官网购买云耀云服务器L并创建实例,本人创建的实例如下,
    在这里插入图片描述
    因为本人对Ubuntu比较熟悉,所以选择创建了Ubuntu系统实例。然后就是在华为云官网修改登录密码,修改好之后就才可以使用ssh进行远程登录。登录后状态如下,默认是root账户,
    在这里插入图片描述


    二 安装需要的程序

    系统默认集成了GNU编译套件,但是还需要安装一些其它程序:

    • 安装cmake: sudo apt install cmake
    • 安装tree: sudo apt install tree

    三 搭建项目工程

    安装好之后,我们去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
    
    • 1

    解压后如下,
    在这里插入图片描述

    此时在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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    最后在终端下cd进入build目录,并执行下面命令进行编译,

    cmake .. && make
    
    • 1

    编译完成后在build目录下运行demo,
    在这里插入图片描述
    PS: 红框里显示该服务器的地址

    这样OPCUA服务器就在云端运行起来了。


    五 使用UaExpert连接服务器

    这里使用Unified Automation公司的UaExpert作为客户端,该软件功能全面且易用,是一个非常好的服务器测试工具。下载及安装过程这里不再描述,使用教程可以参考本人的这篇文章

    打开软件后点击“+”号,如下图,
    在这里插入图片描述
    在弹出的界面里点击“Advanced”栏,然后在Endpoint Url里输入OPCUA服务器地址,
    在这里插入图片描述
    由于本人的云服务器的公网IP是60.204.136.232,所以这里服务器的地址是“opc.tcp://60.204.136.232:4840”,填写好之后点击OK按钮。

    然后在主界面里点击连接,即下图中的那个插座,
    在这里插入图片描述
    点击之后就会连接成功,我们就可以看到服务器的地址空间了,如下图,
    在这里插入图片描述
    “the answer”变量就是我们服务器代码在地址空间里添加的,单击该变量,可以在右侧Attributes窗口里看到其值,和预期一致,
    在这里插入图片描述


    六 遇到的问题及解决办法

    本人在使用过程中遇到2个问题:

    1. 本地电脑ping不通云服务实例

    创建好云服务实例后 (Ubuntu 22.04系统),发现ping不通,重装了问题依然存在,在提交工单后得到了华为工程师的帮助,
    在这里插入图片描述
    然后按照指示修改了icmp规则的源地址,最后就可以ping通了
    在这里插入图片描述

    问了一些其它用户,都表示没有遇到这样的问题…,可能创建的系统是不一样的。

    2. TCP端口4840无法使用

    由于本人的OPCUA服务器启动后默认使用TCP 4840端口,但是使用客户端进行连接时无法连接,最后思考了一下发现需要在入方向规则里添加新规则来允许对4840端口的访问,如下,
    在这里插入图片描述
    这个应该是出于安全考虑,所以默认是不允许使用的,必须管理员把该端口打开才可以。


    七 总结

    本文讲述了如何在华为云云耀云服务器L实例上部署OPCUA服务,并使用客户端去连接服务器。总体用下来感觉云耀云服务器L还是很不错的,速度很快,虽然遇到点问题,但都解决了,而且华为的反馈很迅速,这点值得称赞。

    最后,祝愿华为云越来越好,也希望越来越多的OPCUA服务可以运行在华为云上。

  • 相关阅读:
    ArrayBuffer 如何使用 以及跟webGl 的关系
    nginx设置全局环境变量、启动停止重启
    机器学习第十四课--神经网络
    vue2 和 vue3 的 路由守卫
    基数排序详解(LSD方法+MSD方法+思路+图解+代码)
    编写hello驱动程序
    Java代码审计面试
    redis分布式锁,setnx+lua脚本的java实现
    【LeetCode每日一题】——404.左叶子之和
    mysql
  • 原文地址:https://blog.csdn.net/whahu1989/article/details/132784010