零基础实现IEC61850一启动服务端不要重复造轮子我们是要造一部豪车但是我们不需要造轮子开发IEC61850产品也是如此。所谓实现IEC61850并不是要开发IEC61850本身而是要开发的智能产品具备IEC61850的功能所以实现IEC61850只需要找到合适的轮子即可本文以国产的YX-PIS协议栈为轮子从零开始手把手指导如何实现IEC61850的功能。如何拿到轮子云行科技分享了一些工具在gitee上地址如下https://gitee.com/yunxingtianxia/yx-tools其中yx-pis-dll目录下分享了yx-pis产品的cms版和mms版的动态库文件目前分享了windows 64位版本在这里我们可以免费获得cms和mms版本的头文件lib文件和dll文件。开始让轮子转一转新建工程这里将采用VS2022进行讲解由于是cmake工程使用其他IDE也可以正常使用。本例采用纯c代码开发所以要做一下更名直接修改iec61850server.cpp文件名为iec61850server.cCMakeList.txt文件中应该会自动同步。删除iec61850server.c中的C代码using namespace std;coutHello CMake.endl;删除iec61850server.h中的C代码#includeiostream编译一下不报错就可以了接下来我们开始IEC61850服务端的开发首先添加头文件目录在CMakeList.txt中增加include_directories(yx-pis-dll/mms/include)如果要开发CMS版本就用下面这句include_directories(yx-pis-dll/cms/include)添加lib库目录link_directories(${CMAKE_SOURCE_DIR}/yx-pis-dll/mms)同理cms是如下link_directories(${CMAKE_SOURCE_DIR}/yx-pis-dll/cms)链接动态库target_link_libraries(iec61850server mms-ctk)同理cms是如下target_link_libraries(iec61850server cms-ctk)精简CMakeList最终效果如图开始代码添加引用添加YX-PIS提供的三个头文件#includeIEC61850Types.h#includeIEC61850API.h#includesysctype.h创建IEC61850对象定义全局变量IEC61850 g_iec61850;使用YX-PIS提供的API接口IEC61850_Create创建在IEC61850API.h中介绍了IEC61850_Create并提供了例程我们参考后在main函数中添加如下代码IEC61850_ErrorCode errorS_OK;IEC61850_Parameters param{0};// 参数结构体param.clientServerFlagIEC61850_SERVER;// 设置为服务端param.Ed1_Ed2_FlagIEC61850_Edition2;// 设置为IEC61850第二版// 创建IEC61850对象g_iec61850IEC61850_Create(param,error);if(g_iec61850){printf(Server success to create: %s (%u)\n,IEC61850_ErrorString(error),error);}我们编译运行一下如果打印了Server成功创建证明对象的创建成功。如果提示下图请将dll文件拷贝到编译的可执行文件目录加载CID准备CID如果已经有CID文件可以直接使用如果没有可以手工创建一个这里推荐使用建模工具创建建模工具直接访问云端版http://scl.yunxing.tech:8888也可在该地址下载桌面版。直接新建然后按照图片设置本机IP即可将文件保存到可执行文件所在目录加载CID//加载CID模型errorIEC61850_LoadSCLFile(g_iec61850,testIED.cid);if(errorS_OK){printf(Server success to load cid file\n);}启动服务//启动服务if(errorS_OK){errorIEC61850_Start(g_iec61850);if(error!S_OK){printf( Cant start server: %s (%i)\n,IEC61850_ErrorString(error),error);}else{printf(Server success to start\n);}}启动后要让程序停下来不然程序就会退出了简单点增加一个getchar()等待任意字符服务的停止和释放printf(Stopping IEC61850 Server \n);errorIEC61850_Stop(g_iec61850);if(error!S_OK){printf( Cant stop server: %s (%i)\n,IEC61850_ErrorString(error),error);}else{printf(Freeing IEC61850 Server \n);errorIEC61850_Free(g_iec61850);//Frees s_iec61850if(errorS_OK){g_iec61850NULL;}else{printf( Free IEC61850 Object has failed: %s (%i)\n,IEC61850_ErrorString(error),error);}}看看运行效果注意在这之前需要安装winpcap4.1.3或者安装wireshark抓包工具会提示安装npcap或者winpcap运行后如下图看到这样的效果就是启动成功了对于mms版本可以使用iedscout尝试连接看看可以正常访问并且获得模型对于CMS版本的验证可以安装yx-tools下提供的cms-test-tool为绿色软件直接运行IEC61850_GSP_Client_Test_Tool.exe即可好了今天的服务端启动工作就完成了为了简单本例子的全部代码都放在iec61850server.c中全部内容如下#includeiec61850server.h#includeIEC61850Types.h#includeIEC61850API.h#includesysctype.hIEC61850 g_iec61850;intmain(){IEC61850_ErrorCode errorS_OK;IEC61850_Parameters param{0};// 参数结构体param.clientServerFlagIEC61850_SERVER;// 设置为服务端param.Ed1_Ed2_FlagIEC61850_Edition2;// 设置为IEC61850第二版// 创建IEC61850对象g_iec61850IEC61850_Create(param,error);if(g_iec61850){printf(Server success to create: %s (%u)\n,IEC61850_ErrorString(error),error);//加载CID模型errorIEC61850_LoadSCLFile(g_iec61850,testIED.cid);if(errorS_OK){printf(Server success to load cid file\n);}}//启动服务if(errorS_OK){errorIEC61850_Start(g_iec61850);if(error!S_OK){printf( Cant start server: %s (%i)\n,IEC61850_ErrorString(error),error);}else{printf(Server success to start\n);}}// 利用获取字符暂停getchar();//停止服务printf(Stopping IEC61850 Server \n);errorIEC61850_Stop(g_iec61850);if(error!S_OK){printf( Cant stop server: %s (%i)\n,IEC61850_ErrorString(error),error);}else{// 释放内存printf(Freeing IEC61850 Server \n);errorIEC61850_Free(g_iec61850);//Frees s_iec61850if(errorS_OK){g_iec61850NULL;}else{printf( Free IEC61850 Object has failed: %s (%i)\n,IEC61850_ErrorString(error),error);}}return0;}有任何疑问欢迎访问 https://yunxing.tech/ 联系大连云行科技有限责任公司
阅读完成 · 觉得有帮助?