61850客户端软件构建
? ? ? ? 61850很久沒有再次更新,今天再更新一版客戶端的使用。同樣,沒有可視化的操作界面,只有終端式操作。但麻雀雖小五臟俱全,擁有最基本的遙信遙測(cè)數(shù)據(jù),以及遙控定值。作為學(xué)習(xí)驗(yàn)證數(shù)據(jù)來說,已經(jīng)足夠了。
一、程序部署及使用
? ? ? ? 首先將附件解壓至任意目錄,如下所示
?
? ? ? ? ?在運(yùn)行之前,首先需要服務(wù)端的icd文件,放到本目錄。比如就叫IEC61850.icd。會(huì)議前篇61850服務(wù)端的構(gòu)建,icd文件是我們自己編寫的。測(cè)試的時(shí)候,可以用我們提供的服務(wù)端程序進(jìn)行快速自測(cè)。
? ? ? ? 其次需要了解的文件,是mmslite.json。內(nèi)容如下:
????????
? ? ? ? 里面的內(nèi)容需要與實(shí)際icd內(nèi)容一致,比如我們想讀取jwjs.icd的服務(wù)端內(nèi)容,那么這里的ICDName就填寫jwjs.icd。
? ? ? ? IEDName對(duì)應(yīng)icd內(nèi)容如下字段
????????
? ? ? ? accessPoint對(duì)應(yīng)
?
? ? ? ? ldConfig就是邏輯設(shè)備了,本demo支持多邏輯設(shè)備讀取,按照數(shù)組形式正確填寫即可?
? ? ? ? ldYcConfig就是就是遙測(cè)報(bào)告塊的具體信息了,ldDevice指邏輯設(shè)備名稱,對(duì)應(yīng)
? ? ? ? ycRpName及ycRptId分別對(duì)應(yīng)
?
? ? ? ? ?在填寫時(shí),要仔細(xì)檢查,填錯(cuò)將無法正確訂閱報(bào)告塊,也就無法取得相應(yīng)數(shù)據(jù)
? ? ? ? 遙信相關(guān)信息與遙測(cè)填寫方法一致
? ? ? ? ycReadTag為遙測(cè)對(duì)應(yīng)的名字標(biāo)簽,一般為mag,但有個(gè)別廠商可能設(shè)置為其它值,對(duì)應(yīng)配置如下:
環(huán)境監(jiān)測(cè)的邏輯設(shè)備模型中的溫度類型為CN_MV,我們進(jìn)一步看其點(diǎn)的模型定義?
?
?此處為mag,當(dāng)發(fā)現(xiàn)此處不一樣時(shí),可修改json中相應(yīng)的配置
? ? ? ? 其實(shí),這些信息都可以通過解析xml進(jìn)行自動(dòng)填充,demo就沒去做這樣的功能了,需要我們自己填寫,這樣也方便我們更加理解61850的相關(guān)概念
? ? ? ? 最后強(qiáng)調(diào)一點(diǎn),本客戶端是在線連接,ip也需要正確填寫,對(duì)應(yīng)如下
? ? ? ? 很多客戶在提供icd文件時(shí),這里的ip可能是亂填寫的,當(dāng)我們發(fā)現(xiàn)此處的ip與服務(wù)實(shí)際的ip不一致時(shí),需要修改成一致。
? ? ? ? 當(dāng)以上配置修改成功后,雙擊demo.exe即可運(yùn)行,本demo可連續(xù)運(yùn)行30分鐘,時(shí)間到后,再次雙擊可繼續(xù)運(yùn)行。運(yùn)行界面如下:
?????????
? ? ? ? 當(dāng)連接服務(wù)成功后,會(huì)有綠色打印提示并且會(huì)有功能選項(xiàng)彈出,如果連接失敗,就會(huì)出現(xiàn)相應(yīng)錯(cuò)誤,這時(shí)候就需要仔細(xì)檢查相關(guān)配置了。
? ? ? ? input func number:標(biāo)識(shí)輸入要測(cè)試的功能項(xiàng),比如要獲取遙測(cè)值,那么就輸入1按回車
????????
? ? ? ? ?此處展示了數(shù)據(jù)節(jié)點(diǎn)名稱以及對(duì)應(yīng)的值,前面的數(shù)據(jù)點(diǎn)模型中,我們其實(shí)可以看到,一個(gè)數(shù)據(jù)點(diǎn)下有很多屬性,比如除了值意外,還含有時(shí)間,品質(zhì)等。但一般程序來說,讀取到值就已經(jīng)可以了。也就說此處的value節(jié)點(diǎn)名稱以EnvHum舉例,應(yīng)為SENV1$MX$EnvHum$mag$f。至于這里為什么是這種形式的組成,可參考我前面的61850服務(wù)端構(gòu)建的文章,此處不再詳述。
? ? ? ? 定值測(cè)試:
? ? ? ? 可先獲取定值列表,下發(fā)定值時(shí)會(huì)用到
????????
?????????
????????domain varName value相信大家都能理解,按照前面獲取的列表實(shí)際填寫即可。regionNum可能不知道什么意思,這個(gè)是定值區(qū)間 ,一般來說我們填1即可。服務(wù)設(shè)置的定值區(qū)間數(shù)值,如下
????????
? ? ? ? 代表服務(wù)最多支持3個(gè)區(qū)間?
? ? ? ? 剩下的功能不一一介紹了,可以實(shí)際操作感受
二、二次開放
? ? ? ? 本次提供的附件支持二次開放,包含61850Client.h即可。
#ifndef __PLAT_61850CLIENT_H__ #define __PLAT_61850CLIENT_H__#ifdef WIN32 #include <process.h> #else #include <pthread.h> #endif#include <map> #include <vector>#ifdef __cplusplus extern "C" { #endifbool start(); bool stop(); /// false表示未連接上 /// true表示連接上 bool getState(); std::map<std::string, double> getMeasureData(); std::map<std::string, char> getSignalData();/** *@brief 獲取域下面所有對(duì)象變量名字,形如SIMG1$MX$O2$mag$f *@return map<std::string, std::vector<std::string>> *key 域名(iedName + ldDevice) *value vector存儲(chǔ)所有當(dāng)前域下面的有名變量列表 */ std::map<std::string, std::vector<std::string>> getAllVarName(); /** *@brief 獲取域下面所有屬于控制變量的名字是getAllVarName的細(xì)化 *@return map<std::string, std::vector<std::string>> *key 域名(iedName + ldDevice) *value vector存儲(chǔ)所有當(dāng)前域下面的控制變量列表 *@note 以oper結(jié)尾的屬于直控方式,sbow為選控方式,cancel為取消,一般直控就可以 */ std::map<std::string, std::vector<std::string>> getControlList(); /** *@brief 下發(fā)控制命令 *@param domain 域 *@param varName 變量名(可從getControlList中拿到) *@param value 下發(fā)控制的值 *@return bool 下發(fā)是否成功 */ bool control(const std::string &domain, const std::string &varName, int value); /** *@brief 獲取域下面所有屬于定值變量的名字是getAllVarName的細(xì)化 *@param fc 功能約束,支持兩種(SG,SE),一般為SE(表示可編輯定值組) *@return map<std::string, std::vector<std::string>> *key 域名(iedName + ldDevice) *value vector存儲(chǔ)所有當(dāng)前域下面的定值變量列表 */ std::map<std::string, std::vector<std::string>> getPulseList(const std::string &fc="SE"); /** *@brief 下發(fā)定值命令 *@param domain 域 *@param varName 變量名(可從getPulseList中拿到) *@param value 下發(fā)定值的值 *@param setrange 定值區(qū)間號(hào) *@return bool 下發(fā)是否成功 */ bool pulse(const std::string &domain, const std::string &varName, int value, int setrange); /** *@brief 獲得節(jié)點(diǎn)變量的值 *@param domain 域 *@param varName 變量名(可從getPulseList中拿到) *@param value 獲取遙調(diào)值 *@return bool 獲取是否成功 *@note 理論上getAllVarName節(jié)點(diǎn)最深的一層值都可以獲取,但注意傳入value指針的類型。比如獲取一個(gè)浮點(diǎn)值 那么value應(yīng)為浮點(diǎn)型變量的地址,如果為字符串,那么傳入的是char數(shù)組。尤其注意,value不支持c++類型的變量傳入,比如string。 */ bool getVarValue(const std::string &domain, const std::string &varName, void *value);/** *@brief 設(shè)置定值區(qū)間的值 *@param domain 域 *@param varName 變量名(可從getPulseList中拿到) *@param value 設(shè)置下發(fā)的值 *@return bool 設(shè)置是否成功 */ bool setVarValue(const std::string &domain, const std::string &varName, int value);#ifdef __cplusplus } #endif#endif /* ifndef __PLAT_61850CLIENT_H__ */大家可基于此,開發(fā)一些圖形界面操作等。
在調(diào)用其它接口前,需調(diào)用start啟動(dòng)相應(yīng)服務(wù)
開發(fā)需要注意的是,得基于mingw64進(jìn)行開發(fā),不能基于vs studio。兩者符號(hào)不兼容。參考編譯指令如下
g++ ./demo.cpp -o ./demo -I ./ -L.?-lProtCollIEC61850
程序下載路徑
61850客戶端,支持遙信遙測(cè)以及遙控定值等操作-C++文檔類資源-CSDN下載
關(guān)于61850問題或需求定制請(qǐng)聯(lián)系微信號(hào)HardAndBetter,或者進(jìn)qq群586166104討論。
總結(jié)
以上是生活随笔為你收集整理的61850客户端软件构建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机单片机毕设答辩问题,单片机毕业论文
- 下一篇: python数字信号处理pdf_数字信号