近一年都比较忙,很久没有更新文档了。这次抽了点时间,把CMS61850的客户端再补上。方便大家进一步的学习。当然61850相关的文档已经写的快吐了。不出意外,这应该是最后一篇关于61850的文章了。
本次提供的demo,可直接在windows上运行,仍然采用的是控制台的方式运行。同时也更新了服务端的demo,也可直接在windows上一键运行。同时功能也得到增加,相较之前的linux x86的版本,功能增加,bug修复。大部分功能已通过南瑞测试
话不多说,开启使用说明
一、demo下载地址
下面这个是终端操作的demo,不太方便
CMS6180客户端及服务端demo
最新的界面操作,参考IEDScout设计,请到此文章的地址进行下载试用
国产61850 CMS_Scout发布_61850客户端-CSDN博客
二、服务端如何使用
国产CMS61850那些事-服务端_cms 测试工具 860-CSDN博客
由于功能及版本更新,原来命令输入由cms61850统一改为cms61850Service
如更新数据指令,原demo为cms61850 KHPDFMONT airGGIO6.tmp mag.f 1.89
现在可改为cms61850Service KHPDFMONT airGGIO6.tmp mag.f 1.89
运行方式也改为解压缩后,进入CMS61850Server目录,双击start.bat即可
三、客户端如何使用
解压附件后,进入CMS61850Client目录。双击start.bat即可运行。注意本客户端在获取模型结构时,并没有采取在线获取的方式,而是静态解析icd文件的方式。这就要求客户端使用的icd与服务端的要保持一致。修改加载icd文件的方式见./config/CMS61850/cms.json
比如本demo的json配置如下:
其中client为客户端的配置,service为服务端的配置
本客户端支持多icd同时加载导入,主要看client里的icd数组,icdPath为需要加载的icd文件路径。
同时为了保证客户端能正确连接,如下图,需要正确修改icd内的ip信息为服务器的ip。
客户端在成功连接后,会自动进行报告块的使能,具体使能哪些报告块,需要根据配置来。比如json配置icd里的ldYcConfig代表的就是非缓存报告块的信息,需要正确填写ied名称,逻辑设备名称,以及报告块名称和报告块id,分别对应icd文件中的以下字段
下面的ldYxConfig代表缓存报告块,配置也是同理修改
四、命令行的使用
程序内置了获取数据及遥控,定值的命令操作。程序运行时,按enter健,根据提示,依次输入用户名和密码。admin/admin123。成功后会打印#。
查看非缓存报告:
cms61850Client getMeasure
如图依次会打印相应节点的值以及更新的时间戳
查看缓存报告块:
cms61850Client getSignal
查看遥控列表
cms61850Client getControl
ctlType
0 状态点 1选控 2直控
查看定值列表
cms61850Client getSetting
选择命令
cms61850Client select PNC_IED MONT GGIO6.YK1 1
解释:
PNC_IED:ied名称
MONT :逻辑设备名称
GGIO6.YK1 :节点名称
1 : 值
当用户使用自己的icd时,可根据实际情况修改
控制命令
cms61850Client control PNC_IED MONT GGIO6.YK1 1
定值命令
cms61850Client pulse PNC_IED MONT GGIO6.YT1 2
以上为本次demo提供的所有命令行操作功能。使用上会有些不方便,主要是没时间去写一些界面化的操作,但用来抓包作为学习验证已经可以了。
五、二次开发接口
/** * @file ICMS61850Client.h * @author (linuxzq93@163.com) * @brief cms61850Client组件基类文件 * @version 1.0 * @date 2024-03-19 * * @copyright Copyright (c) 2024 * */ #ifndef __CMS61850_ICMS61850Client_H__ #define __CMS61850_ICMS61850Client_H__ #include <map> #include "Component/IUnknown.h" #include "Component/ComponentMacroDef.h" #include "Function/Function.h" #include "json/json.h" namespace cms { class ICMS61850Client : public base::IUnknown { SIMPLE_DEF_I(CMS61850Client, "CMS61850Client") public: enum DataType { /// 遥测 MEASURE, /// 遥信 SIGNAL, /// 遥脉 PULSE, /// 时间戳 TIMESTAMP, /// 质量 QUALITY, /// 未知,暂不支持 UNKNOWN }; struct CMSData { /// 遥测 float fValue; /// 遥信 uint8_t stValue; ///遥脉 int iValue; /// 时间戳 sec uint64_t timeNow; uint16_t quality; DataType dataType; }; enum CtlType { /// 只是状态 STATUS, /// 选控 SELECT_OPER, /// 直控 DIRECT_OPER }; struct CtlInfo { std::string name; CtlType ctlType; }; struct SettingInfo { int numSG; std::vector<std::string> vecName; }; public: virtual bool init() { return true; } virtual bool start() { return true; } virtual bool stop() { return true; } virtual bool destroy() { return true; } public: /** * @brief 获取各个IP的连接状态 * * @return std::map<std::string, bool> key:ip value:true or false */ virtual std::map<std::string, bool> getConnectState(){return {};} /** * @brief 获取遥测数据 * * key:domName(iedName + ldDevice) value: LeafName(形如SIMG1$MX$O2$mag$f), CMSData * @return std::map<std::string, std::map<std::string, CMSData>> */ virtual std::map<std::string, std::map<std::string, CMSData>> getMeasureData(){return {};} /** * @brief 获取遥信数据 * * key:domName(iedName + ldDevice) value: LeafName(形如SIMG1$ST$O2$stVal), CMSData * @return std::map<std::string, std::map<std::string, CMSData>> */ virtual std::map<std::string, std::map<std::string, CMSData>> getSignalData(){return {};} /** * @brief 获取遥控列表 * * @return std::map<std::string, std::vector<std::string>> */ virtual std::map<std::string, std::vector<CtlInfo>> getControlList(){return {};} /** * @brief 获取定值列表 * * @return std::map<std::string, std::vector<std::string>> */ virtual std::map<std::string, SettingInfo> getSettingList(){return {};} /** * @brief 遥控预置 * * @param iedName * @param ldName * @param leafName, 精确到doName即可。形如TACD60.ktkz。不需要带上oper这些 * @param value * @return true * @return false */ virtual bool select(const std::string &iedName, const std::string &ldName, const std::string &leafName, int value) {return true;} /** * @brief 遥控 * * @param iedName * @param ldName * @param leafName, 精确到doName即可。形如TACD60.ktkz。不需要带上oper这些 * @param value * @return true * @return false */ virtual bool control(const std::string &iedName, const std::string &ldName, const std::string &leafName, int value) {return true;} /** * @brief 遥调(定值) * * @param iedName * @param ldName * @param leafName, 精确到doName即可 * @param value * @return true * @return false */ virtual bool pulse(const std::string &iedName, const std::string &ldName, const std::string &leafName, float value) {return true;} }; } #endif /* __CMS61850_ICMS61850Client_H__ */六、程序运行
因我的环境可能和大家不一样,虽然我已经尽可能的将依赖库打包,但仍然可能会存在遗漏或者不兼容的情况,可尝试换电脑或者自行百度装一些环境。
本次demo全部采用license的方式,仅提供给实实在在的同学测试学习。不愿意暴漏任何信息的请自行划过。需要license运行测试的,请联系作者