libIEC61850交流QQ群:610793899
操作系统:Ubuntu 16.04 x64
我们将要做两件事情:
1)选择并使用合适的Client端代码,编译、运行通过;
2)修改Client端,与Server端通信正常;
3)在Qt工程中测试上述Client端代码,调试通过。(使用Qt工程进行编译的目的在于,Server重在后台建模、数据采集、转发、与本地数据存储打交道等工作,简单来说,没有界面的情况下,对Server端影响是不大的;而Client端重在数据采集、展示、检查,数据展示通常是借助UI界面的方式来做,而这也正是Qt给人印象最深刻的地方)
首先,我们选择iec61850_client_example_no_thread文件夹中的代码入手,由于该文件夹中存在CMakelists.txt文件,因此理论上修改该文件内容后生成的Makefile可以编译,但是我对比了该文件生辰的Makefile文件和当前目录下的Makefile文件,差异较大,且无法编译通过。我没有深究这个问题,将该目录复制到一个新的目录:
> cp -rf ./iec61850_client_example_no_thread ./client_mms_sddgbyq
> cd client_mms_sddgbyq
> mv client_example_no_thread.c client_mms_sddgbyq.c
并修改Makefile中的文件名称,如下所示:
LIBIEC_HOME=../..
PROJECT_BINARY_NAME = client_mms_sddgbyq
PROJECT_SOURCES = client_mms_sddgbyq.c
include $(LIBIEC_HOME)/make/target_system.mk
include $(LIBIEC_HOME)/make/stack_includes.mk
all: $(PROJECT_BINARY_NAME)
include $(LIBIEC_HOME)/make/common_targets.mk
$(PROJECT_BINARY_NAME): $(PROJECT_SOURCES) $(LIB_NAME)
$(CC) $(CFLAGS) $(LDFLAGS) -o $(PROJECT_BINARY_NAME) $(PROJECT_SOURCES) $(INCLUDES) $(LIB_NAME) $(LDLIBS)
clean:
rm -f $(PROJECT_BINARY_NAME)
> make
一切正常的话,编译后的可执行就已经在本目录下生成了。
接下来,我们在client_mms_sddgbyq.c文件中增加获取Server端固定节点数据的代码,在main函数中增加如下代码:
IedConnection_readObjectAsync(con, &error, "SDDGBYQMonMONT/MMXN1.Amp.mag.f", IEC61850_FC_MX, readObjectHandler, "SDDGBYQMonMON T/MMXN1.Amp.mag.f");
if (error != IED_ERROR_OK) {
printf("read object error %i\n", error);
}
waitWithTick(con, 1000);
其中SDDGBYQMonMONT是IED与LD的组合:SDDGBYQMon是<IED>的名字,<MONT>是LD的Inst名称。
不出意外的话,编译、运行一切正常。
启动Server端进程,然后启动Client端进程,将会看到Client端打印出的Amp的数据值。
以上编译都是基于源代码进行编译的,而我们新建Qt工程的话,使用源代码编译是不现实的,必须基于libIEC的库,libIEC提供的静态库在该路径下:
> ./build/libiec61850.a
新建Qt工程(我新建的是Qt Form工程),并在.pro文件中增加头文件目录,以及Lib文件的依赖关系:
INCLUDEPATH += $$PWD/. \
$$PWD/include/ \
$$PWD/include/iec61850/config \
$$PWD/include/iec61850/hal/inc \
$$PWD/include/iec61850/src/common/inc \
$$PWD/include/iec61850/src/mms/inc \
$$PWD/include/iec61850/src/mms/inc_private \
$$PWD/include/iec61850/src/mms/asn1 \
$$PWD/include/iec61850/src/iec61850/inc \
$$PWD/include/iec61850/src/iec61850/inc_private \
$$PWD/include/iec61850/src/goose \
$$PWD/include/iec61850/src/sampled_values \
$$PWD/include/iec61850/src/logging
DEPENDPATH += $$PWD/. \
$$PWD/include/ \
$$PWD/include/iec61850/config \
$$PWD/include/iec61850/hal/inc \
$$PWD/include/iec61850/src/common/inc \
$$PWD/include/iec61850/src/mms/inc \
$$PWD/include/iec61850/src/mms/inc_private \
$$PWD/include/iec61850/src/mms/asn1 \
$$PWD/include/iec61850/src/iec61850/inc \
$$PWD/include/iec61850/src/iec61850/inc_private \
$$PWD/include/iec61850/src/goose \
$$PWD/include/iec61850/src/sampled_values \
$$PWD/include/iec61850/src/logging
unix:!macx: LIBS += -L$$PWD/lib/ -liec61850
unix:!macx: PRE_TARGETDEPS += $$PWD/lib/libiec61850.a
为了快速测试,可以将iec61850_example_client_no_thread.c文件中的内容复制过来放到main.cpp文件中(后续再对main函数进行修改)。
然后执行rebuild命令,编译、链接通过。
与Server端联合测试,数据通信正常。