近一年都比较忙,很久没有更新文档了。这次抽了点时间,把CMS61850的客户端再补上。方便大家进一步的学习。当然61850相关的文档已经写的快吐了。不出意外,这应该是最后一篇关于61850的文章了。
本次提供的demo,可直接在windows上运行,仍然采用的是控制台的方式运行。同时也更新了服务端的demo,也可直接在windows上一键运行。同时功能也得到增加,相较之前的linux x86的版本,功能增加,bug修复。大部分功能已通过南瑞测试
话不多说,开启使用说明
一、demo下载地址
CMS6180客户端及服务端demo
二、服务端如何使用
国产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运行测试的,请联系作者