前兩天一直在搞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的方法