学习open62541 --- [19] 使用Visual Studio编译及使用open62541

80 篇文章 471 订阅

本文主要讲述在Windows下如何使用Visual Studio来编译open62541,以及基于open62541去开发OPCUA程序。


一 Visual Studio版本选择

必须使用VS2015或者之后的版本,官方教程使用的是VS2015,如下,
在这里插入图片描述
安装后,保证创建工程时有Win32 控制台程序选项,如果没有可以百度一下,容易解决。


二 编译open62541

可以使用上节图片中的命令行方式调用cmake.exe去生成VS2015的工程。本人使用的是cmake-gui,更加方便一点,另外,需要提前安装好Python3
首先在open62541源码目录下创建一个build文件夹,然后打开cmake-gui,
在这里插入图片描述
第一行输入open62541源码目录,第二行输入刚刚创建的build目录,VS工程最后会生成在这个目录里,然后点击左下角的Configure,在弹出的界面里选择Visual Studio 14 2015,如下,
在这里插入图片描述
然后点击Finish开始进行配置,配置完成后如下,
在这里插入图片描述
红色一片是open62541自带的CMakeLists里提供的配置选择,这里以gui的方式显示出来了。这里勾选上UA_ENABLE_AMALGAMATION,其它暂时默认就行了。然后点击Generate进行生成,
在这里插入图片描述
OK之后点击Generate右边的Open Project按钮,打开VS工程,或者进入open62541下的build目录,找到open62541.sln,打开之,
在这里插入图片描述
如下,
在这里插入图片描述
生成下点击生成解决方案就行了,然后等待生成,
在这里插入图片描述
最后生成成功,如下显示,
在这里插入图片描述
这时回到之前的build目录下,可以看到open62541.h,open62541.c以及bin/Debug/open62541.lib都生成出来了。
在这里插入图片描述
在这里插入图片描述


三 编写OPC UA Server

首先使用VS2015建立一个Win32控制台工程,建立过程中选择空项目,
在这里插入图片描述
建好后,把open62541.h和open62541.c拷贝到工程目录里,然后添加到工程里,最后添加一个main.cpp到工程里(main.c也是可以的),其内容如下,

// server.c

/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
 * See http://creativecommons.org/publicdomain/zero/1.0/ for more information. */

#include "open62541.h"

#include <signal.h>
#include <stdlib.h>

UA_Boolean running = true;

static void stopHandler(int sign) {
    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
    running = false;
}

int main(void) 
{
    signal(SIGINT, stopHandler);
    signal(SIGTERM, stopHandler);

    UA_Server *server = UA_Server_new();
    UA_ServerConfig_setDefault(UA_Server_getConfig(server));
    UA_StatusCode retval = UA_Server_run(server, &running);
    
    UA_Server_delete(server);
    
    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
}

整体工程目录如下,
在这里插入图片描述
此时,点击生成->生成解决方案,但是会报错,如下,
在这里插入图片描述
看上去是open62541自身依赖的库没有添加,看名字和网络相关,于是网上搜了下,原因是:open62541使用socket,而windows下的socket要依赖WS2_32.lib。

有2个解决办法:

1. 修改工程配置(推荐)

依次打开项目->属性->链接器->输入->附加依赖项,然后打开并写入WS2_32.lib,然后点击确定就可以了
在这里插入图片描述

2. 工程添加WS2_32.lib

网上找的这个库,然后添加到工程里,也可以点击这里下载(本人下载好后传到百度云,提取码9d92)
在这里插入图片描述

使用以上任意方法后,再次生成解决方案,成功!
在这里插入图片描述
运行,控制台打印如下(只截取一部分),Server运行成功
在这里插入图片描述

有些读者运行时会遇到错误:应用程序没有调用 WSAStartup,或者 WSAStartup 失败。可以在main()开头处添加以下2行代码解决,

WSADATA wsaData; 
WSAStartup(MAKEWORD(2,2), &wsaData); // 使用Winsock 2.2版本

这2行是用于设置程序中用到的Winsock版本,并初始化相应版本的库。


四 编写OPC UA Client

按照相同操作我们再建一个工程来编写OPC UA Client代码,过程不再赘述,Client的main.cpp代码如下,

// client.c,功能主要是从server那里获取时间

#include <stdlib.h>
#include "open62541.h"

int main(void)
{
	UA_Client *client = UA_Client_new();
	UA_ClientConfig_setDefault(UA_Client_getConfig(client));
	UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
	if (retval != UA_STATUSCODE_GOOD) {
		UA_Client_delete(client);
		return (int)retval;
	}

	/* Read the value attribute of the node. UA_Client_readValueAttribute is a
	* wrapper for the raw read service available as UA_Client_Service_read. */
	UA_Variant value; /* Variants can hold scalar values and arrays of any type */
	UA_Variant_init(&value);

	/* NodeId of the variable holding the current time */
	const UA_NodeId nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME);
	retval = UA_Client_readValueAttribute(client, nodeId, &value);

	if (retval == UA_STATUSCODE_GOOD && UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_DATETIME]))
	{
		UA_DateTime raw_date = *(UA_DateTime *)value.data;
		UA_DateTimeStruct dts = UA_DateTime_toStruct(raw_date);
		UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "date is: %u-%u-%u %u:%u:%u.%03u\n",
			dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec);
	}

	/* Clean up */
	UA_Variant_clear(&value);
	UA_Client_delete(client); /* Disconnects the client internally */
	
	system("pause"); // 防止控制台一闪而过
	
	return EXIT_SUCCESS;
}

client的功能是从server那边获取系统时间,然后打印出来,工程结构如下,
在这里插入图片描述
编译成功后,运行(要先运行Server),成功获取时间并打印,
在这里插入图片描述


五 使用UaExpert连接Server

UaExpert的使用可以参照这篇文章,连接成功后如下,
在这里插入图片描述
如果看过前面的系列文章,都知道这是熟悉的界面。


六 总结

本文主要讲述如何在Win下使用VS编译及使用open62541,本系列的第一篇文章是讲述如何在Linux下编译及使用open62541。

能在2个平台下使用,且体验一样,这正体现了OPC UA里的UA,即Unified Architecture,这也符合未来万物互联发展趋势。

如果有写的不对的地方,希望能留言指正,谢谢阅读。

  • 34
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 47
    评论
### 回答1: 在VS2015中使用OPCUA Open62541通过Kepware读写PLC数据需要按照以下步骤进行操作: 1. 安装Kepware软件:首先,需要从Kepware官网下载并安装Kepware软件。安装完成后,启动Kepware。 2. 配置Kepware:在Kepware中,需要配置OPCUA服务器以与PLC进行通信。根据PLC的型号和网络设置,设置适当的连接和通信参数。 3. 下载Open62541库:从Open62541项目的GitHub页面下载Open62541库的源代码。 4. 设置VS2015:打开VS2015并创建一个新的C++项目。在项目属性中,设置正确的包含路径和库文件路径,以便能够引用Open62541库。 5. 编写代码:在VS2015中编写C++代码来实现通过OPCUA Open62541访问PLC数据的功能。代码需要包含Open62541库的头文件,并使用相应的函数来实现与OPCUA服务器的连接、读取和写入PLC数据的操作。 6. 编译和运行:编译代码并运行程序。如果一切顺利,程序应该能够与Kepware建立连接,并能够读取和写入PLC数据。 需要注意的是,确保在编写代码时,按照Open62541库的文档和示例进行操作。此外,还需要了解PLC的数据结构和通信协议,并根据实际情况进行相应的配置和参数设置。 ### 回答2: 在VS2015中使用OPCUA open62541库通过Kepware读写PLC数据,需要按照以下步骤进行操作。 首先,确保已经安装了VS2015和Kepware软件,并成功配置了PLC设备。 1. 下载open62541库并解压缩,然后在VS2015中创建一个新的C++项目。 2. 将open62541库中的源文件添加到项目中,包括open62541.c和open62541.h。 3. 在项目设置中配置附加包含目录,确保可以找到open62541.h文件。 4. 创建一个新的源文件,命名为main.cpp,并在其中包含open62541.h头文件。 5. 在main.cpp中编写代码,首先要连接到Kepware服务器。可以使用opcua_client_create函数创建一个OPC UA客户端对象,并使用opcua_client_connect函数连接到Kepware服务器。 6. 连接成功后,可以使用opcua_client_create_subscription函数创建一个订阅对象,并使用opcua_subscription_add_monitored_item函数添加一个监视项。监视项允许读取和写入PLC数据。 7. 使用opcua_subscription_activate函数激活订阅。 8. 使用opcua_read_value和opcua_write_value函数读写PLC数据。这些函数需要提供节点的标识符,可以使用Kepware提供的OPC UA浏览器工具查找节点标识符。 9. 最后,使用opcua_client_disconnect函数断开与Kepware服务器的连接。 总结起来,通过在VS2015中使用OPCUA open62541库,我们可以创建一个OPC UA客户端,连接到Kepware服务器,创建订阅并添加监视项来读写PLC数据。希望以上步骤能对你有所帮助。 ### 回答3: Visual Studio 2015是一种集成开发环境(IDE),用于开发应用程序。OPC-UA(OPC Unified Architecture)是一种开放式、跨平台、工业自动化通信协议,用于实现工业设备之间的互操作性。open62541是一个开源的OPC-UA库,用于在C和C++应用程序中实现OPC-UA通信。而Kepware是一种常用的OPC服务器软件,用于将PLC和其他设备连接到OPC系统。 要在VS2015中使用open62541通过Kepware读写PLC数据,需要按照以下步骤进行操作: 1. 下载并安装open62541库:从open62541项目的官方网站(https://open62541.org/)下载最新版本的库,并按照指南进行安装。 2. 创建一个新的C或C++项目:在VS2015中创建一个新的空项目,并将open62541库添加到项目中。 3. 编写OPC-UA客户端代码:使用open62541库的API函数编写代码,配置连接到Kepware的OPC-UA客户端。这些代码将实现与PLC的通信,并读取和写入PLC数据。可以使用open62541库提供的函数来连接到OPC服务器、读取和写入节点的数据等。 4. 编译和运行代码:在VS2015中编译和运行代码,确保代码能够成功连接到Kepware OPC服务器并读写PLC数据。 总结来说,使用VS2015和open62541通过Kepware读写PLC数据,需要下载和安装open62541库,并在VS2015中创建一个新的项目。然后编写OPC-UA客户端代码,使用open62541库的API函数来实现与Kepware的连接和数据读写。最后,编译和运行代码,确保代码能够成功连接到OPC服务器并实现PLC数据的读写。
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值