前兩天一直在搞open62541,因爲milo庫的server sdk沒有辦法根據xml生成結點文件,於是準備用open62541來搭建服務器,milo結合Spring Boot來構件客戶端。
網絡上大多是建立一個open62541.h的頭文件,還有就是open62541.c的執行文件,但是新版好像並不是這樣的。
然後很多教程都是講的linux,但是初學者用linux的還是比較少,所我寫了這一篇幫助大家配置。
但是open62541的構件相當的麻煩,我試了一下午都沒搞明白,今天上午算是終於有點懂了。接下來,我一步一步來講。
爲什麼用open62541?
- 和商業庫一樣,可以根據uamodeler生成的xml文件直接生成相應的代碼,步驟簡單。
- 有完備的tutorial,適合新手,一步一步上手。
3.國內有許多關於open62541的博客可供參考
瞭解了理由,我們就需要來實操,首先是最難的一步,也就是安裝
1.首先是下載
我們進入open62541的github官網open62541,選擇release版本。
這裏我用的是win64的版本。
下好解壓完成後得到如下文件,這個myserver.c是一會兒要建立的文件
2.建立工程
在VS2019中新建一個C++的 空工程。
打開工程,並打開工程所在的文件夾 E:\Code_Library\TeachingOPC\TeachingOPC,注意是sln裏面的那個文件夾。複製我們下載的release文件夾中的這幾個文件到工程文件夾中。
位置如下
一個是open62541的x64庫文件,一個是open62541的頭文件
在VS中打開工程,然後對所有文件選擇 包括在項目中
這是包括完後
然後最玄學的地方來了,我到現在還是沒搞明白爲什麼的東西。這個時候我們需要VS2015,對又要打開2015
然後在附加包含目錄裏面加上這一句,$(ProjectDir),然後就可以了。
關於這點我也有疑問,這個操作我再VS2019上做就不行,然後在2015上做就可以,我猜測可能是因爲原來的文件是用的2015編譯的,但是這樣操作後2019上面也可以使用,就很奇怪。
接下來我們新建一個c或者cpp文件,輸入以下代碼,這個是源碼:
#include <open62541/plugin/log_stdout.h>
#include <open62541/server.h>
#include <open62541/server_config_default.h>
#include <signal.h>
#include <stdlib.h>
static volatile UA_Boolean running = true;
static void stopHandler(int sig) {
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "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;
}
運行成功
PS:
- 如果Console裏面出現異常報錯的話,可能是端口被佔用了,參見解決端口占用
- 如果提示少了個dll文件的話,去網上搜這個文件,有教程怎麼下,具體什麼名字我忘了,很好解決的問題
這個就是windows端,建立opc server的方法