网络知识 娱乐 libIEC61850:编译MMS服务端

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地址传进去就可以了,这样的话,基本的流程代码结构就比较完整了,后续我们把模拟量、回调函数什么的加上,提高程序的异步处理能力。