零基础实现IEC61850(五)报告客户端 前言报告客户端也就是接收端在前面的报告服务端部分已经介绍了但是是采用的模拟工具作为客户端本文就是介绍如何自己开发报告客户端。报告使能前文我们已经启动了客户端并且完成了与服务端的连接但是并没有使能报告控制块的动作使用YX-PIS可以实现自动使能也就是通过CID文件的修改实现使能建模建模工具直接访问云端版http://scl.yunxing.tech:8888也可在该地址下载桌面版。自动使能打开上一节的CID如下图操作添加后会自动展示填写框工具支持自动填写默认即可保存再启动昨天的程序抓包看看MMS:CMS和昨天的内容相比我们只是修改了CID内容就可以实现自动发起使能功能手动使能手动使能是用户通过代码调用API接口实现文章初期以简单为主暂不介绍了如何处理接收到的报告当接收到报告YX-PIS协议栈会以回调的方式将解析好的数据传递给回调函数回调函数的原型typedef void (IEC61850_UpdateCallback)(void * userData, const voiddataMap, const IEC61850_DataAttributeData * newValue);在API手册以及头文件中都有详细的说明创建回调函数依据这个原型我们创建一个回调函数先在原有工程中添加Callback.c和Callback.h专门用于存放回调函数。在头文件和源文件中分别放入回调函数的声明和定义下面是定义部分先做个空函数。voidUpdateCallbackHandler(void*userData,constvoid*dataMap,constIEC61850_DataAttributeData*newValue){printf(update callback\n);}设置好回调函数及回调模式在iec61850client.c的main函数中调用IEC61850_Create之前设置启动参数位置增加如下两行param.fnUpdateCallbackUpdateCallbackHandler;// 指定update回调param.dataMapModeIEC61850_MAP_MODE_REFERENCE;// 回调函数的数据映射模式这里制定好回调函数并且设置回调模式为引用方式关于回调模式后文会介绍。这里先编译运行服务端和客户端去除周期性触发为了避免周期性触发发送过多报告testIED.cid中报告控制块可以先关闭周期性触发将period由true改为false如下ReportControlbufferedfalseconfRev1datSettestDataSetdesc测试用的报告控制块indexedtrueintgPd9000nametestReportCBTrgOpsdchgtruedupdtruegitrueperiodfalseqchgtrue/OptFields/RptEnabledmax3//ReportControl效果演示在服务端输入一个整数回车在客户端会看到界面打印说明报告的发送已经通过协议栈转移到回调函数这里打印了九次是因为数据集关联的数据A是结构体包含了9个基本类型的成员如图回调函数说明函数中包含三个参数其中userData较少使用暂时不做介绍dataMap指的是数据映射根据参数设置的映射模式当映射模式为引用那么该值就是引用字符串newValue代表传入的数据值接下来修改代码来打印引用voidUpdateCallbackHandler(void*userData,constvoid*dataMap,constIEC61850_DataAttributeData*newValue){printf(reference:%s\n,(char*)dataMap);}当发送报告可见我们可以通过dataMap获取到引用这样我们就可以通过引用的判断而直知道收到的数据是什么了从而针对其类型进行数值的解析重新组织代码如下voidUpdateCallbackHandler(void*userData,constvoid*dataMap,constIEC61850_DataAttributeData*newValue){if(dataMapnewValuenewValue-pvData){if(strcmp((char*)dataMap,TEMPLATELDevice1/MMXU0.A.phsA.cVal.mag.i)0){S32 val*((S32*)newValue-pvData);printf(reference:%s value:%d\n,(char*)dataMap,val);}}}上述代码只判断了一个引用的数值用作参考下面服务端也更新这个数据更新方法参考前面文章效果如下短地址回调首先需要设置好回调模式如下param.dataMapModeIEC61850_MAP_MODE_SADDR;// 回调函数的数据映射模式UpdateCallbackHandler回调函数的参数dataMap则为短地址该短地址需要在testClientIED.cid中设置注意这个短地址是客户端自身的数据映射无需与服务端保持一致短地址是字符串类型同样通过字符串比较来判断即可。DAID回调首先需要设置好回调模式或者删除回调模式的设置DAID是默认的回调模式如下param.dataMapModeIEC61850_MAP_MODE_DAID;// 回调函数的数据映射模式UpdateCallbackHandler回调函数的参数dataMap则为DAID该DAID需要在testClientIED.cid中设置注意这个DAID是客户端自身的数据映射无需与服务端保持一致回调函数对DAID的判断constIEC61850_DataAttributeID*daid(constIEC61850_DataAttributeID*)dataMap;if((daid-field11)(daid-field22)(daid-field33)(daid-field44)(daid-field55)){S32 val*((S32*)newValue-pvData);printf(DAID :%d,%d,%d,%d,%d value:%d\n,daid-field1,daid-field2,daid-field3,daid-field4,daid-field5,val);}这里就不做演示截图了好了关于报告客户端的使用就简单介绍到这里感谢阅读。