libIEC61850:編譯MMS服務端

近期用北京微自恆通提供的61850 SDK構建本地Server端,由於沒有任何61850方面的基礎,惡補了一下。說實話,提供的方案可用,但是說明文件實在太過粗略,對新手未免不太友好。

在使用微自恆通公司的SDK構建了基本的Server端模型、流程程式碼骨架之後,我就考慮用libIEC也做下類似的事情,順便加深對於61850的理解,此處作為手賬記錄吧。

按照慣例,先交代一下背景:

libIEC官網:libIEC61850 / lib60870 | open source libraries for IEC 61850 and IEC 60870-5-101/104

我們後續使用的程式碼也在此處下載。

libIEC版本:1。5。0

作業系統:Ubuntu 16。04 x64(虛擬機器)

首先,下載libIEC61850 1。5。0的程式碼,並解壓到~/code/目錄下。

進入code/libiec61850-1。5。0目錄,看到完整的目錄結構,處於“短平快”的策略,我在examples目錄下找到了兩個例子作為熟悉的跳板:

/server_example_simple

/server_example_dynamic

前者包含CID模型定義、CID模型到。C/。H檔案的生成,個人感覺這個demo的對初學者來說意義比較大,一定要好好利用這個。因為我們後期一定會採用這樣的流程來作為整體結構:1)CID模型檔案定義;

2)將CID模型檔案編譯成static_model。h/static_model。c;

3)在其他檔案中引用static_model。c/static_model。h中自動生成的LD/LN/DO/DA(裝置/節點/資料物件/資料屬性)。

> cd server_example_simple

> make model

該步驟過後,當前目錄中應該已經生成了static_model。h/static_model。c檔案。

> make

> sudo 。/server_example_simple

和微自恆通SDK不同的是,libIEC的Server端不需要配置本機IP地址以及埠號,IP應該是全部放開,埠預設102。

在本地可以使用IEDScout連線Server端IP地址,可以看到Server的模型目錄結構。

當然,此處的資料更新還沒有,而server_example_dynamic給我們提供了一個簡單的例子。

但是server_example_dynamic不好的地方是所有的LD/LN/DO/DA都是在主程式。C檔案中動態定義的,而不是透過CID模型檔案定義。server_example_dynamic。檔案中模型定義部分略去不談(其實和CID檔案定義,然後編譯CID檔案生成。C檔案是一樣的意思),動態賦值的只和主函式中如下程式碼相關:

float val = 0。f;

while (running) {

IedServer_lockDataModel(iedServer);

IedServer_updateUTCTimeAttributeValue(iedServer, temperatureTimestamp, Hal_getTimeInMs());

IedServer_updateFloatAttributeValue(iedServer, temperatureValue, val);

IedServer_unlockDataModel(iedServer);

val += 0。1f;

Thread_sleep(100);

}

IedServer_updateUTCTimeAttributeValue是更新時間的函式,

IedServer_updateFloatAttributeValue是更新MX(測量值FLOAT32)的函式,

只需要把對應static_model。c檔案中的DA地址傳進去就可以了,這樣的話,基本的流程程式碼結構就比較完整了,後續我們把模擬量、回撥函式什麼的加上,提高程式的非同步處理能力。