当前位置: 首页 > news >正文

libiec61850 mms协议异步模式

之前项目中使用到libiec61850库,都是服务端开发。这次新的需求要接收服务端的遥测数据,这就涉及到客户端开发了。 客户端开发没搞过啊,挑战不少,但是人不就是通过战胜困难才成长的嘛。

通过查看libiec61850的客户端API发现,它支持两种模式,一种同步阻塞模式,另一种是异步回调模式。由于我没有打算采用多线程,那就选异步回调模式吧。

首先 ,创建链接,并connect,安装链接回调函数。

    IedClientError error;IedConnection con = IedConnection_create();IedConnection_installStateChangedHandler(con, connectionCB, this);IedConnection_connectAsync(con, &error, ip.c_str(), port);

接着,在链接回调函数中,判断如果连接成功的话,就获取rcb属性。因为客户端一个很重要的功能就是接收服务端的rcb(报告控制块),然后从rcb中解析出服务端更新了哪个字段。

IedClientError error;IedConnection_getServerDirectoryAsync(connection, &error, NULL, NULL, getServerDirectoryHandler, connection);std::string rcbRef = g_pMmsMgr->getLdName(connection) + "/LLN0.RP.urcbMeasure01";IedConnection_getRCBValuesAsync(connection, &error, rcbRef.c_str(), NULL, getRCBValuesCB, connection);

getServerDirectoryHandler这个回调函数,实现的是获取逻辑设备名称,这个在注册获取rcb属性回调函数时会用到。

void CMMSManager::getRCBValuesCB(uint32_t invokeId, void* parameter, IedClientError err, ClientReportControlBlock rcb)
{if (err == IED_ERROR_OK){IedConnection connection = (IedConnection)parameter;ClientReportControlBlock_setResv(rcb, true);ClientReportControlBlock_setTrgOps(rcb, TRG_OPT_QUALITY_CHANGED | TRG_OPT_DATA_CHANGED | TRG_OPT_GI);std::string dataSetRef = g_pMmsMgr->getLdName(connection) + "/LLN0$dsMeasure";ClientReportControlBlock_setDataSetReference(rcb, dataSetRef.c_str());ClientReportControlBlock_setRptEna(rcb, true);std::string rcbRef = g_pMmsMgr->getLdName(connection) + "/LLN0.RP.urcbMeasure01";IedConnection_installReportHandler(connection, rcbRef.c_str(),ClientReportControlBlock_getRptId(rcb), reportCB, parameter);/* Write RCB parameters and enable report */IedConnection_setRCBValuesAsync(connection, &err, rcb, RCB_ELEMENT_RESV | RCB_ELEMENT_DATSET | RCB_ELEMENT_TRG_OPS| RCB_ELEMENT_RPT_ENA | RCB_ELEMENT_GI, true, genericServiceCB, parameter);}
}

最开始时,我的客户端无论如何都收不到服务断的报告控制块,就是这个getRCBValuesCB回调函数里的逻辑没写对。

碰到困难时,一定不要怕,多看libiec61850中关于client的例子,再加上不断尝试,这样基本的功能框架就实现了。

http://www.xdnf.cn/news/927667.html

相关文章:

  • 如何构建船舵舵角和船的航向之间的动力学方程?它是一个一阶惯性环节吗?
  • 抖音怎么下载视频
  • 好未来0520上机考试题1:括号的最大嵌入深度
  • 零基础入门PCB设计 强化篇 第六章(实验——USB拓展坞PCB绘制)
  • Spring注解原理深度解析:从入门到精通
  • 免费 SecureCRT8.3下载、安装、注册、使用与设置
  • c++11线程安全
  • 图片批量格式转换工具
  • pcie 日常问答0604
  • 第一章 无刷电机(BLDC)基础知识
  • 缓冲区溢出
  • 【web笔记】JavaScript实现有动画效果的进度条
  • opencascade 小技巧截取两点间的曲线
  • iview中的table组件点击一行中的任意一点选中本行
  • 第5章:Cypher查询语言进阶
  • C++课设:简易科学计算器(支持+-*/、sin、cos、tan、log等科学函数)
  • RSA加密算法:非对称密码学的基石
  • 滚珠螺杆的预压技术是如何提高精度的?
  • Java-IO流之序列化与反序列化详解
  • 基于ANN-GA优化鲜切萝卜杀菌工艺参数
  • GICv3-PMU
  • 树莓派远程登陆RealVNC Viewer出现卡顿
  • 基于51单片机的多功能风扇控制系统
  • 判断软件是否安装,如果没有则自动安装
  • 声音信号的基频检测(python版本)
  • C++学习思路
  • DL00335-基于深度学习YOLOv11的煤矸石检测含完整数据集
  • [逆向工程] C实现过程调试与钩子安装(二十七)
  • 关于datetime获取时间的问题
  • 顶级创新者在人机互助中成为关键乘数(而并非简单地加数)