學習open62541 --- [19] 使用Visual Studio編譯及使用open62541

本文主要講述在Windows下如何使用Visual Studio來編譯open62541,以及基於open62541去開發OPCUA程序。


一 Visual Studio版本選擇

本人使用的是VS2015,之前使用的是VS2013,但是生成open62541工程時總是各種錯誤,不知咋回事,官方教程使用的是VS2015,
在這裏插入圖片描述
於是又安裝了VS2015,安裝完VS2015時又遇到個坑,創建工程時沒有Win32 控制檯程序選項,百度一下也解決了,後面就都OK了。

PS:估計VS2015及以後的版本都是可以的。


二 編譯open62541

可以使用上節圖片中的命令行方式調用cmake.exe去生成VS2015的工程。本人使用的是cmake-gui,更加方便一點。
首先在open62541源碼目錄下創建一個build文件夾,然後打開cmake-gui,
在這裏插入圖片描述
第一行輸入open62541源碼目錄,第二行輸入剛剛創建的build目錄,VS工程最後會生成在這個目錄裏,然後點擊左下角的Configure,在彈出的界面裏選擇Visual Studio 14 2015,如下,
在這裏插入圖片描述
然後點擊Finish開始進行配置,配置完成後如下,
在這裏插入圖片描述
紅色一片是open62541自帶的CMakeLists裏提供的配置選擇,這裏以gui的方式顯示出來了。這裏勾選上UA_ENABLE_AMALGAMATION,其它暫時默認就行了。然後點擊Generate進行生成,
在這裏插入圖片描述
OK之後我們打開open62541下的build目錄,可以看到生成的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。

網上找的這個庫,然後添加到工程裏,也可以點擊這裏下載(本人下載好後傳到百度雲,提取碼9d92)
在這裏插入圖片描述
再次生成解決方案,成功!
在這裏插入圖片描述
運行,控制檯打印如下(只截取一部分),Server運行成功
在這裏插入圖片描述


四 編寫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,這也符合未來萬物互聯發展趨勢。

如果有寫的不對的地方,希望能留言指正,謝謝閱讀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章