open62541 1.0版本使用记录

基于项目需求,需要使用opc开发一个数据读写的小模块,查找了很多决定使用open62541,主要是封装的很好,开发效率很快,而且可以跨平台,不需要对com做任何了解。搞的前期我还看了好久的com组件

我是直接官网拿的源码编译出来的 。c和。h文件,1.0版本不支持这种方法,还是建议用头文件和动态库的方式使用它。。。编译的时候cmake指定下编译选项就好了。如下:

We strongly recommend to not use UA_ENABLE_AMALGAMATION=ON for your installation. This will only generate a single open62541.h header file instead of the single header files. We encourage our users to use the non-amalgamated version to reduce the header size and simplify dependency management.

下载的源码里有很多example,下面是摘取的一部分。

因为开发的是opc的server端,所以记录下server的使用。,添加节点要在new完服务器之后,run之前,而且run是个阻塞接口,因为我们是作为一个模块开发,所有扔到了子线程里。。

 

  创建服务端

   UA_Server *server = UA_Server_new();
    UA_ServerConfig *config = UA_Server_getConfig(server);
    UA_ServerConfig_setDefault(config);

    /* Disable anonymous logins, enable two user/password logins */
    config->accessControl.clear(&config->accessControl);
    UA_StatusCode retval = UA_AccessControl_default(config, false,
             &config->securityPolicies[config->securityPoliciesSize-1].policyUri, 2, logins);
    if(retval != UA_STATUSCODE_GOOD)
        goto cleanup;

    /* Set accessControl functions for nodeManagement */
    config->accessControl.allowAddNode = allowAddNode;
    config->accessControl.allowAddReference = allowAddReference;
    config->accessControl.allowDeleteNode = allowDeleteNode;
    config->accessControl.allowDeleteReference = allowDeleteReference;

    运行服务器

    retval = UA_Server_run(server, &running);

 cleanup:
    UA_Server_delete(server);
    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;

 

   添加节点的时候很多,上面是通过设置属性,把添加方法的接口设置到属性里,没用过,我是直接调用,说实话用到了很少就实现了功能,这个库的功能文档很详细。。目前暂时用到添加节点,修改节点,监听节点改变等功能

修改节点添加节点都是server进行,然后client读取,,监听节点是client写,然后server 读取给底层模块使用。。

如下是一个修改节点的方式,,

 

            UA_Float value = 10;

            UA_Variant vaData;
            UA_Variant_setScalar(&vaData, &value, &UA_TYPES[UA_TYPES_FLOAT]);
            UA_StatusCode res = UA_Server_writeValue(server, currentNodeId, vaData);

 

容易出现问题的地方就是创建完节点返回的nodeid 值保存到容器的时候,这个时候需要进行深拷贝,不能直接吧返回的nodeid放到容器里,需要调用UA_NodeId_copy 进行深拷贝,因为这个nodeid是个结构体,里面有指针,有需要动态开辟内存的地方。。

如果直接放到容器里,当你在其他函数使用的时候,会发现nodeid无效。 所有记得先申请一个变量,使用上述接口实现深拷贝,在放到容器里。。。。

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值