基于C++和Qt开发IEC104规约主站调试软件(第四章)
第四章:IEC104主站调试软件遥控、遥调功能
基于C++和Qt开发IEC104规约主站调试软件需要综合协议规范、多线程编程和GUI框架知识以及IEC104通讯规约相关知识,以下是分步骤实现方案:
最终成果展示: 最终成果
IEC104通讯规约知识学习:https://download.csdn.net/download/liangwwe0/90616493?spm=1011.2124.3001.6210
上一章内容回顾: IEC104主站解析遥信、遥测数据
1.创建遥控遥调命令下发对话框
2.下发单点遥控功能(0x2D)
int dataAddr = sendfui->dataAddrEdit->text().toInt();
QString typeStr = sendfui->typeBox->currentText();
int l=typeStr.indexOf('(');
int r = typeStr.indexOf(')');
int type = typeStr.mid(l+1,r-l-1).toInt();
switch (type) {
case C_SC_NA_1:
{
bool selectCommand = false;
if(cmd){
int state = MessageReminder("选择单点遥控执行方式","选择执行","立即执行","取消");
if(state==1)
selectCommand = true;
else if(state==-1)
return;
}
else if(!MessageReminder("从站返回单点遥控激活确认","确认","取消"))
return;
SingleCommand cmd = SingleCommand_create(nullptr, dataAddr, value.toBool(), selectCommand, IEC60870_QUALITY_GOOD);
CS104_Connection_sendProcessCommand(m_iec104con, (IEC60870_5_TypeID)type, (CS101_CauseOfTransmission)cause,dataAddr, (InformationObject)cmd);
SingleCommand_destroy(cmd);
if(selectCommand)
emit showMessageSignal(QString("类型:%1,执行方式:选择执行,原因:%2,地址:%3,值:%4,时间:%5").arg(typeStr).arg(causeStr).arg(dataAddr).arg(value.toBool()).arg(time),0);
else
emit showMessageSignal(QString("类型:%1,执行方式:立即执行,原因:%2,地址:%3,值:%4,时间:%5").arg(typeStr).arg(causeStr).arg(dataAddr).arg(value.toBool()).arg(time),0);
}
break;3.归一化遥调设置(0x30)
case C_SE_NA_1:
{
QVariant value = sendfui->valueEdit->text();
MeasuredValueNormalized cmd = MeasuredValueNormalized_create(nullptr, dataAddr,value.toFloat(), IEC60870_QUALITY_GOOD);
CS104_Connection_sendProcessCommand(m_iec104con, (IEC60870_5_TypeID)type, (CS101_CauseOfTransmission)cause,dataAddr, (InformationObject)cmd);
MeasuredValueNormalized_destroy(cmd);
emit showMessageSignal(QString("类型:%1,原因:%2,地址:%3,值:%4,时间:%5").arg(typeStr).arg(causeStr).arg(dataAddr).arg(value.toFloat()).arg(time),0);}
break;

