数据更新及接口IEC61850将电力装置抽象为服务及数据模型就好像盖了一个IEC61850的大厦大厦里有楼层有房间房间里放着数据例如储能设备某电芯的电压就在IEC61850的大厦的某个房间中存放如何将测量到的电压写到对应的房间呢这就用到了YX-PIS的数据更新接口。YX-PIS目前提供了五个数据更新接口本文介绍如下四个接口IEC61850_UpdateWithReference()IEC61850_UpdateWithShortAddr()IEC61850_Update()IEC61850_UpdateWithQT()还有一个批量更新的接口是需要通过控制块进行更新数据本文暂不介绍接口名称如下IEC61850_BatchUpdateControlBlockDatas()先做一些改进本文承接上一文的代码进行为了方便先做一些调整调整环境变量环境变量Path中添加动态库目录这样就不用将dll拷贝到可执行文件目录了调整CID文件位置在项目目录中新建cidFiles目录将cid文件从可执行文件目录拷贝到这个目录加载cid部分的代码调整如下errorIEC61850_LoadSCLFile(g_iec61850,../../../cidFiles/testIED.cid);调整CMakeList为了使得MMS和CMS的切换更方便调整后如下cmake_minimum_required(VERSION3.8)project(iec61850server)set(COMMUNICATION_PROTOCOLMMS)# 设置MMS或者CMSif(COMMUNICATION_PROTOCOL STREQUALMMS)include_directories(yx-pis-dll/mms/include)link_directories(${CMAKE_SOURCE_DIR}/yx-pis-dll/mms)#target_link_libraries(iec61850server mms-ctk)elseif(COMMUNICATION_PROTOCOL STREQUALCMS)include_directories(yx-pis-dll/cms/include)link_directories(${CMAKE_SOURCE_DIR}/yx-pis-dll/cms)#target_link_libraries(iec61850server cms-ctk)endif()add_executable(iec61850serveriec61850server.cIEC61850Functions.c)if(COMMUNICATION_PROTOCOL STREQUALMMS)target_link_libraries(iec61850server mms-ctk)elseif(COMMUNICATION_PROTOCOL STREQUALCMS)target_link_libraries(iec61850server cms-ctk)endif()建立好大厦的房间建模工具直接访问云端版http://scl.yunxing.tech:8888也可在该地址下载桌面版。通过建模工具打开模型文件testIED.cid文件添加一个逻辑节点相当于给大厦加盖一层楼然后选择逻辑节点类选择需要添加的数据保存后效果如图那么这个数据i的引用我们可以看到是TEMPLATELDevice1/MMXU0.A.phsA.cVal.mag.i这里面TEMPLATELDevice1是逻辑设备名称由于我未设置逻辑设备名所以采用IED名称逻辑设备实例代替逻辑设备名。保存这个模型后启动服务端MMS通过iedscout读取如图CMS通过cms-test-tool获取模型如图添加源码文件准备添加一个源码文件专门用于一些函数调用的改名为IEC61850Functions.c同样方法增加IEC61850Functions.h文件IEC61850Functions.h中增加代码#pragmaonce#includestdio.h#includeIEC61850Types.h#includeIEC61850API.h#includesysctype.hIEC61850Functions.c中增加代码#includeIEC61850Functions.hexternIEC61850 g_iec61850;iec61850server.c中#includeIEC61850Types.h#includeIEC61850API.h#includesysctype.h替换为#includeIEC61850Functions.h通过引用更新在IEC61850Functions.h增加函数原型IEC61850_ErrorCode UpdateMMXUPhsAMagi()在IEC61850Functions.h增加函数定义IEC61850_ErrorCodeUpdateMMXUPhsAMagi(){IEC61850_ErrorCode resultS_OK;S32 newVal0;IEC61850_DataAttributeData daData{0};char*referenceTEMPLATELDevice1/MMXU0.A.phsA.cVal.mag.i;printf(Enter an S32 value: );scanf(%d,newVal);daData.bitLengthsizeof(S32)*8;daData.typeIEC61850_DATATYPE_INT32;daData.pvDatanewVal;resultIEC61850_UpdateWithReference(g_iec61850,reference,daData);}iec61850server.c中main函数中getchar()之前调用该函数调试运行程序按提示输入整数例如12345如图然后通过工具读取当前值MMS版如下图CMS版如下图说明数据更新成功。通过短地址更新再调整一下模型按下图设置短地址假设输入 B.i 然后保存编码在IEC61850Functions.h增加函数原型IEC61850_ErrorCode UpdateMMXUPhsBMagi()在IEC61850Functions.h增加函数定义IEC61850_ErrorCodeUpdateMMXUPhsBMagi(){IEC61850_ErrorCode resultS_OK;S32 newVal0;IEC61850_DataAttributeData daData{0};char*sAddrB.i;printf(Enter an S32 value: );scanf(%d,newVal);daData.bitLengthsizeof(S32)*8;daData.typeIEC61850_DATATYPE_INT32;daData.pvDatanewVal;resultIEC61850_UpdateWithShortAddr(g_iec61850,sAddr,daData,1);}调用本函数并运行输入整数例如67890MMS版本查询如图CMS版本查询截图略通过DAID更新在模型中添加DAID在IEC61850Functions.h增加函数原型IEC61850_ErrorCode UpdateMMXUPhsCMagi()在IEC61850Functions.h增加函数定义IEC61850_ErrorCodeUpdateMMXUPhsCMagi(){IEC61850_ErrorCode resultS_OK;S32 newVal0;IEC61850_DataAttributeID daid{1,0,0,0,0};IEC61850_DataAttributeData daData{0};printf(Enter an S32 value: );scanf(%d,newVal);daData.bitLengthsizeof(S32)*8;daData.typeIEC61850_DATATYPE_INT32;daData.pvDatanewVal;resultIEC61850_Update(g_iec61850,daid,daData,1);}调用本函数并运行输入整数例如45678MMS版本查询如图CMS版本查询截图略更新数据及质量和时间IEC61850_UpdateWithQT接口支持引用、短地址、DAID三种方式本次以DAID为例在IEC61850Functions.h增加函数原型IEC61850_ErrorCode UpdateMMXUPhsCMagiWithQT()在IEC61850Functions.h增加函数定义IEC61850_ErrorCodeUpdateMMXUPhsCMagiWithQT(){IEC61850_ErrorCode resultS_OK;S32 newVal0;IEC61850_DataAttributeID daid{1,0,0,0,0};IEC61850_DataAttributeDataQT daData{0};tIEC61850Quality qIEC61850_QUALITY_FAILURE;IEC61850_TimeStamp t{0};IEC61850_DataMapMode mapModeIEC61850_MAP_MODE_DAID;printf(Enter an S32 value: );scanf(%d,newVal);IEC61850_GetTime(NULL,t);daData.dataVal.bitLengthsizeof(S32)*8;daData.dataVal.typeIEC61850_DATATYPE_INT32;daData.dataVal.pvDatanewVal;daData.qq;daData.tt;resultIEC61850_UpdateWithQT(g_iec61850,daid,daData,1,mapMode);}调用该函数运行输入整数例如123MMS版本查询如图可以看到出了数值123质量和时间也同步得到了更新CMS版查询截图略IEC61850Functions.c中全部代码#includeIEC61850Functions.hexternIEC61850 g_iec61850;//采用引用方式更新A.PhsA数据IEC61850_ErrorCodeUpdateMMXUPhsAMagi(){IEC61850_ErrorCode resultS_OK;S32 newVal0;IEC61850_DataAttributeData daData{0};char*referenceTEMPLATELDevice1/MMXU0.A.phsA.cVal.mag.i;printf(Enter an S32 value: );scanf(%d,newVal);daData.bitLengthsizeof(S32)*8;daData.typeIEC61850_DATATYPE_INT32;daData.pvDatanewVal;resultIEC61850_UpdateWithReference(g_iec61850,reference,daData);}//采用短地址方式更新A.PhsB数据IEC61850_ErrorCodeUpdateMMXUPhsBMagi(){IEC61850_ErrorCode resultS_OK;S32 newVal0;IEC61850_DataAttributeData daData{0};char*sAddrB.i;printf(Enter an S32 value: );scanf(%d,newVal);daData.bitLengthsizeof(S32)*8;daData.typeIEC61850_DATATYPE_INT32;daData.pvDatanewVal;resultIEC61850_UpdateWithShortAddr(g_iec61850,sAddr,daData,1);}//采用DAID方式更新A.PhsC数据IEC61850_ErrorCodeUpdateMMXUPhsCMagi(){IEC61850_ErrorCode resultS_OK;S32 newVal0;IEC61850_DataAttributeID daid{1,0,0,0,0};IEC61850_DataAttributeData daData{0};printf(Enter an S32 value: );scanf(%d,newVal);daData.bitLengthsizeof(S32)*8;daData.typeIEC61850_DATATYPE_INT32;daData.pvDatanewVal;resultIEC61850_Update(g_iec61850,daid,daData,1);}//采用DAID方式更新A.PhsC数据,并同步更新质量和时间IEC61850_ErrorCodeUpdateMMXUPhsCMagiWithQT(){IEC61850_ErrorCode resultS_OK;S32 newVal0;IEC61850_DataAttributeID daid{1,0,0,0,0};IEC61850_DataAttributeDataQT daData{0};tIEC61850Quality qIEC61850_QUALITY_FAILURE;IEC61850_TimeStamp t{0};IEC61850_DataMapMode mapModeIEC61850_MAP_MODE_DAID;printf(Enter an S32 value: );scanf(%d,newVal);IEC61850_GetTime(NULL,t);daData.dataVal.bitLengthsizeof(S32)*8;daData.dataVal.typeIEC61850_DATATYPE_INT32;daData.dataVal.pvDatanewVal;daData.qq;daData.tt;resultIEC61850_UpdateWithQT(g_iec61850,daid,daData,1,mapMode);}
阅读完成 · 觉得有帮助?