[ref]同步711
@ -0,0 +1,26 @@
|
||||
#include "alarmGeneratePlugin.h"
|
||||
|
||||
alarmGeneratePlugin::alarmGeneratePlugin(): CBlock()
|
||||
{
|
||||
addInPort( CPort(this, "I1", E_PORTDATA_STRING) );
|
||||
addInPort( CPort(this, "I2", E_PORTDATA_BOOL) );
|
||||
setInPortShowName("I1",tr("测点标签"));
|
||||
setInPortShowName("I2",tr("使能"));
|
||||
|
||||
this->setProperty( C_PROPERTY_SHOWNAME, showName() );
|
||||
//this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("Format")).toStdString().c_str(), E_VALUEEDIT_LINEEDIT );
|
||||
|
||||
//Format = tr("%1 失败");
|
||||
}
|
||||
|
||||
alarmGeneratePlugin::~alarmGeneratePlugin()
|
||||
{
|
||||
}
|
||||
|
||||
QString alarmGeneratePlugin::propertyShowName( QString sPropertyName )
|
||||
{
|
||||
//if ( sPropertyName == "Format" )
|
||||
// return tr("告警内容格式");
|
||||
return sPropertyName;
|
||||
}
|
||||
|
||||
@ -0,0 +1,27 @@
|
||||
#ifndef TEMPLATEPLUGIN_H
|
||||
#define TEMPLATEPLUGIN_H
|
||||
|
||||
#include "CBlock.h"
|
||||
|
||||
class alarmGeneratePlugin : public CBlock
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA( IID Block_iid ) // Q_PLUGIN_METADATA 宏用于描述插件元数据
|
||||
Q_INTERFACES( CBlock ) // Q_INTERFACES 宏用于告诉Qt该类实现的接口
|
||||
|
||||
//IMPL_PROPERTY( QString, Format )
|
||||
|
||||
//Q_PROPERTY( QString Format READ get_Format WRITE set_Format USER true DESIGNABLE true )
|
||||
|
||||
public:
|
||||
Q_INVOKABLE alarmGeneratePlugin();
|
||||
Q_INVOKABLE ~alarmGeneratePlugin();
|
||||
|
||||
public:
|
||||
QString name() { return "alarmGenerate"; }
|
||||
QString showName() { return QObject::tr("告警生成"); }
|
||||
QString propertyShowName( QString sPropertyName );
|
||||
QIcon getIcon() { return QIcon(":/icon/"+name()+".png"); }
|
||||
};
|
||||
|
||||
#endif // TEMPLATEPLUGIN_H
|
||||
@ -0,0 +1,38 @@
|
||||
TARGET = alarmGeneratePlugin
|
||||
QT = core gui widgets xml sql
|
||||
CONFIG += dll
|
||||
TEMPLATE = lib
|
||||
CONFIG += qt
|
||||
|
||||
SOURCES += \
|
||||
alarmGeneratePlugin.cpp \
|
||||
|
||||
HEADERS += \
|
||||
alarmGeneratePlugin.h \
|
||||
|
||||
INCLUDEPATH += \
|
||||
../../fbd_block \
|
||||
../../fbd_tree \
|
||||
|
||||
LIBS += \
|
||||
-lfbd_block \
|
||||
-lfbd_tree \
|
||||
|
||||
RESOURCES += \
|
||||
icon.qrc
|
||||
|
||||
!include( ../../../../idl_files/idl_files.pri){
|
||||
error(the file idl_files.pri is not exist!!)
|
||||
}
|
||||
|
||||
!include( ../../../../common.pri ){
|
||||
error(the file common.pri is not exist!!)
|
||||
}
|
||||
|
||||
#fbd_plugins插件的统一规则
|
||||
FBD_PLUGINS_PRI=$$PWD/../fbd_plugins.pri
|
||||
exists($$FBD_PLUGINS_PRI) {
|
||||
include($$FBD_PLUGINS_PRI)
|
||||
}else {
|
||||
error("FATAL error: can not find fbd_plugins.pri")
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file>icon/alarmGenerate.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
After Width: | Height: | Size: 743 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 832 B |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 808 B |
|
Before Width: | Height: | Size: 900 B After Width: | Height: | Size: 597 B |
@ -17,6 +17,7 @@ alarmSubscribePlugin::alarmSubscribePlugin() : CBlock()
|
||||
|
||||
addOutPort( CPort(this, "O1", E_PORTDATA_ALARM) );
|
||||
addOutPort( CPort(this, "O2", E_PORTDATA_BOOL) );
|
||||
addOutPort( CPort(this, "O3", E_PORTDATA_INT) );
|
||||
|
||||
QStringList listTmp;
|
||||
listTmp<<"0-NO"<<"1-YES";
|
||||
|
||||
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 743 B |
@ -0,0 +1,405 @@
|
||||
#include "ApcPdPCSPlugin.h"
|
||||
|
||||
#define CN_MAX_UNIT_COUNT 300 //最大机组数量
|
||||
|
||||
#define CN_WIDTH 230 // 图元宽度
|
||||
#define CN_HEIGHTSPACE 40 // 输入(输出、文字)上下之间的间隔
|
||||
#define CN_FIRSTHEIGHT (m_nCustomPortSpace-14)/2 // 第一个输入(输出、文字)与顶的距离
|
||||
//#define CN_PCSLINEARHEADINPUTNUM 7 // PCSLinear顶框输入个数
|
||||
//#define CN_PCSLINEARHEADOUTPUTNUM 6 // PCSLinear顶框输出个数
|
||||
#define CN_PCSLINEARINPUTNUM 6 // PCS机组框输入个数
|
||||
#define CN_PCSLINEAROUTPUTNUM 4 // PCS机组框输出个数
|
||||
#define CN_MAXPCSLINEARHEADNUM (m_nTopInPortNum>=m_nTopOutPortNum ? m_nTopInPortNum : m_nTopOutPortNum)
|
||||
#define CN_MAXPCSLINEARNUM (CN_PCSLINEARINPUTNUM>=CN_PCSLINEAROUTPUTNUM ? CN_PCSLINEARINPUTNUM : CN_PCSLINEAROUTPUTNUM)
|
||||
#define CN_PCSLINEARHEADHEIGHT CN_MAXPCSLINEARHEADNUM*m_nCustomPortSpace // PCSLinear顶框的高度
|
||||
#define CN_PCSLINEARHEIGHT CN_MAXPCSLINEARNUM*m_nCustomPortSpace // PCSLinear框的高度
|
||||
|
||||
ApcPdPCSPlugin::ApcPdPCSPlugin(): CBlock()
|
||||
{
|
||||
m_nPCSNum = 0;
|
||||
m_nCustomPortSpace = CN_HEIGHTSPACE;
|
||||
m_fCommPrecision = 0.01f;
|
||||
m_fRegulatePrecision = 50;
|
||||
m_fMinAllocP = 50;
|
||||
m_nRegulateCycle = 0;
|
||||
m_nWaitRespTimeout = 3000;
|
||||
|
||||
initPropertyMAP();
|
||||
|
||||
setPortShowNameFunctionEnable( false );
|
||||
|
||||
addInPort( CPort(this, "TotalRegulateEnable", E_PORTDATA_BOOL) );
|
||||
setInPortShowName( "TotalRegulateEnable", tr("总调节使能") );
|
||||
|
||||
addInPort( CPort(this, "TotalTargetP", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "TotalTargetP", tr("AGC目标值") );
|
||||
|
||||
//addInPort( CPort(this, "TotalTargetPUpperLimit", E_PORTDATA_FLOAT) );
|
||||
//setInPortShowName( "TotalTargetPUpperLimit", tr("总有功上限") );
|
||||
//addInPort( CPort(this, "TotalTargetPLowerLimit", E_PORTDATA_FLOAT) );
|
||||
//setInPortShowName( "TotalTargetPLowerLimit", tr("总有功下限") );
|
||||
|
||||
addInPort( CPort(this, "ULSoc", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "ULSoc", tr("SOC上限(单位:%)") );
|
||||
addInPort( CPort(this, "LLSoc", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "LLSoc", tr("SOC下限(单位:%)") );
|
||||
|
||||
addInPort( CPort(this, "TotalDeadband", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "TotalDeadband", tr("调节死区") );
|
||||
addInPort( CPort(this, "Step", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "Step", tr("最大调节步进") );
|
||||
addInPort( CPort(this, "Interval", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "Interval", tr("最小调节周期(ms)") );
|
||||
m_nTopInPortNum = getInPortSize();
|
||||
|
||||
addOutPort( CPort(this, "TotalSetP", E_PORTDATA_FLOAT));
|
||||
setOutPortShowName( "TotalSetP", tr("总分配功率") );
|
||||
addOutPort(CPort(this, "TotalTargetP", E_PORTDATA_FLOAT));
|
||||
setOutPortShowName("TotalTargetP", tr("总目标功率"));
|
||||
addOutPort( CPort(this, "TotalRealP", E_PORTDATA_FLOAT));
|
||||
setOutPortShowName( "TotalRealP", tr("总实时功率") );
|
||||
addOutPort( CPort(this, "Total SOC", E_PORTDATA_FLOAT) );
|
||||
setOutPortShowName( "Total SOC", tr("总SOC(单位:%)") );
|
||||
addOutPort( CPort(this, "TotalMaxChargeP", E_PORTDATA_FLOAT));
|
||||
setOutPortShowName( "TotalMaxChargeP", tr("总最大充电功率") );
|
||||
addOutPort( CPort(this, "TotalMaxDischargeP", E_PORTDATA_FLOAT));
|
||||
setOutPortShowName( "TotalMaxDischargeP", tr("总最大放电功率") );
|
||||
addOutPort( CPort(this, "TotalUpMarginPower", E_PORTDATA_FLOAT) );
|
||||
setOutPortShowName( "TotalUpMarginPower", tr("总可增有功") );
|
||||
addOutPort( CPort(this, "TotalDownMarginPower", E_PORTDATA_FLOAT) );
|
||||
setOutPortShowName( "TotalDownMarginPower", tr("总可减有功") );
|
||||
addOutPort(CPort(this, "TotalNonRegulatePower", E_PORTDATA_FLOAT));
|
||||
setOutPortShowName("TotalNonRegulatePower", tr("总不可调功率"));
|
||||
addOutPort( CPort(this, "StatusCode", E_PORTDATA_INT) );
|
||||
setOutPortShowName( "StatusCode", tr("状态码") );
|
||||
addOutPort( CPort(this, "ErrorCode", E_PORTDATA_INT) );
|
||||
setOutPortShowName( "ErrorCode", tr("错误码") );
|
||||
m_nTopOutPortNum = getOutPortSize();
|
||||
|
||||
this->setProperty( C_PROPERTY_SHOWNAME, showName() );
|
||||
//< 端口间隔
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("PortSpace")).toStdString().c_str(), E_VALUEEDIT_SPINBOX );
|
||||
//< 机组数量
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("UnitCnt")).toStdString().c_str(), E_VALUEEDIT_SPINBOX );
|
||||
|
||||
//< 功率分配算法
|
||||
QStringList listTmp;
|
||||
listTmp<<tr("1-上限比例")<< tr("2-SOC均衡") << tr("3-平均分配");
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("AllocALG")).toStdString().c_str(), E_VALUEEDIT_COMBOBOX );
|
||||
this->setProperty( (C_PREFIX_COMBOBOXITEM+QString("AllocALG")).toStdString().c_str(), listTmp);
|
||||
AllocALG = listTmp.at(0);
|
||||
|
||||
//< 反馈超时时间
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("WaitRespTimeout")).toStdString().c_str(), E_VALUEEDIT_SPINBOX );
|
||||
//< 稳定时定时分配间隔
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("RegulateCycle")).toStdString().c_str(), E_VALUEEDIT_SPINBOX );
|
||||
|
||||
//< 机组参数
|
||||
//< 最小分配功率
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("MinAllocP")).toStdString().c_str(), E_VALUEEDIT_DOUBLESPINBOX );
|
||||
//< 通讯精度
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("CommPrecision")).toStdString().c_str(), E_VALUEEDIT_DOUBLESPINBOX );
|
||||
//< 调节精度
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("RegulatePrecision")).toStdString().c_str(), E_VALUEEDIT_DOUBLESPINBOX );
|
||||
|
||||
}
|
||||
|
||||
ApcPdPCSPlugin::~ApcPdPCSPlugin()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ApcPdPCSPlugin::initPropertyMAP()
|
||||
{
|
||||
m_mapProperty["UnitCnt"] = tr("机组个数");
|
||||
m_mapProperty["PortSpace"] = tr("端口间隔");
|
||||
m_mapProperty["AllocALG"] = tr("功率分配算法");
|
||||
m_mapProperty["CommPrecision"] = tr("通讯精度");
|
||||
m_mapProperty["RegulatePrecision"] = tr("调节精度");
|
||||
m_mapProperty["WaitRespTimeout"] = tr("调节反馈超时时间(单位:ms)");
|
||||
m_mapProperty["RegulateCycle"] = tr("稳定时调节周期(单位:s)");
|
||||
m_mapProperty["MinAllocP"] = tr("最小分配功率");
|
||||
}
|
||||
|
||||
QString ApcPdPCSPlugin::propertyShowName( QString sPropertyName )
|
||||
{
|
||||
auto iter = m_mapProperty.find(sPropertyName);
|
||||
if(iter != m_mapProperty.end())
|
||||
{
|
||||
return iter.value();
|
||||
}
|
||||
|
||||
return sPropertyName;
|
||||
}
|
||||
|
||||
QPointF ApcPdPCSPlugin::getInputTextPos(const int nInputIndex, const int nInputTextWidth)
|
||||
{
|
||||
Q_UNUSED(nInputTextWidth);
|
||||
|
||||
int nY = getInputHeight(nInputIndex);
|
||||
return QPointF(1,nY);
|
||||
}
|
||||
|
||||
QPointF ApcPdPCSPlugin::getOutputTextPos(const int nOutputIndex, const int nOutputTextWidth)
|
||||
{
|
||||
return QPointF( CN_WIDTH - nOutputTextWidth, getOutputHeight(nOutputIndex) );
|
||||
}
|
||||
|
||||
int ApcPdPCSPlugin::getInputHeight(const int nIndex, const int nPortSize, const int nPortHeight)
|
||||
{
|
||||
Q_UNUSED(nPortHeight);
|
||||
Q_UNUSED(nPortSize);
|
||||
|
||||
return getInputHeight(nIndex + 1);
|
||||
}
|
||||
|
||||
int ApcPdPCSPlugin::getOutputHeight(const int nIndex, const int nPortSize, const int nPortHeight)
|
||||
{
|
||||
Q_UNUSED(nPortHeight);
|
||||
Q_UNUSED(nPortSize);
|
||||
|
||||
return getOutputHeight(nIndex + 1);
|
||||
}
|
||||
|
||||
int ApcPdPCSPlugin::getFirstHeight()
|
||||
{
|
||||
return CN_FIRSTHEIGHT;
|
||||
}
|
||||
|
||||
QString ApcPdPCSPlugin::getOutputRealValueSep()
|
||||
{
|
||||
return "\n";
|
||||
}
|
||||
|
||||
QPointF ApcPdPCSPlugin::getIconPos(const QSize &pixmapSize)
|
||||
{
|
||||
int nX = (CN_WIDTH - pixmapSize.width()) / 2;
|
||||
return QPointF(nX,5);
|
||||
}
|
||||
|
||||
QPolygonF ApcPdPCSPlugin::getPolygon(const int nWidth, const int nHeight)
|
||||
{
|
||||
// Set Polygon Top-Left: 0/0
|
||||
QPolygonF polygon;
|
||||
polygon << QPointF(0, 0) << QPointF( nWidth, 0)
|
||||
<< QPointF(nWidth, nHeight) << QPointF(0, nHeight)
|
||||
<< QPointF(0, 0);
|
||||
|
||||
const int nPCSLinearNum = this->property("UnitCnt").toInt();
|
||||
for ( int i=0; i<nPCSLinearNum; i++ )
|
||||
{
|
||||
polygon << QPointF(0, CN_PCSLINEARHEADHEIGHT+i*CN_PCSLINEARHEIGHT+2) << QPointF(CN_WIDTH, CN_PCSLINEARHEADHEIGHT+i*CN_PCSLINEARHEIGHT+2)
|
||||
<< QPointF(0, CN_PCSLINEARHEADHEIGHT+i*CN_PCSLINEARHEIGHT+2);
|
||||
}
|
||||
|
||||
return polygon;
|
||||
}
|
||||
|
||||
bool ApcPdPCSPlugin::isCustomItemPos()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void ApcPdPCSPlugin::setDefaultIconSize()
|
||||
{
|
||||
setIconSize( CN_WIDTH, CN_MAXPCSLINEARHEADNUM*m_nCustomPortSpace );
|
||||
}
|
||||
|
||||
void ApcPdPCSPlugin::afterInitialize()
|
||||
{
|
||||
int nUnitCount = this->property("UnitCnt").toInt();
|
||||
if ( nUnitCount == 0 )
|
||||
{
|
||||
this->setProperty("UnitCnt",1);
|
||||
}
|
||||
}
|
||||
|
||||
int ApcPdPCSPlugin::getInputHeight(const int nIndex)
|
||||
{
|
||||
int nRet = CN_FIRSTHEIGHT;
|
||||
if ( nIndex < m_nTopInPortNum )
|
||||
nRet += nIndex * m_nCustomPortSpace;
|
||||
else
|
||||
{
|
||||
nRet += CN_PCSLINEARHEADHEIGHT+
|
||||
(nIndex-m_nTopInPortNum)/CN_PCSLINEARINPUTNUM*CN_PCSLINEARHEIGHT+
|
||||
(nIndex-m_nTopInPortNum)%CN_PCSLINEARINPUTNUM*m_nCustomPortSpace;
|
||||
}
|
||||
return nRet;
|
||||
}
|
||||
|
||||
int ApcPdPCSPlugin::getOutputHeight(const int nIndex)
|
||||
{
|
||||
int nRet = CN_FIRSTHEIGHT;
|
||||
if ( nIndex < m_nTopOutPortNum )
|
||||
nRet += nIndex * m_nCustomPortSpace;
|
||||
else
|
||||
{
|
||||
nRet += CN_PCSLINEARHEADHEIGHT+
|
||||
(nIndex-m_nTopOutPortNum)/CN_PCSLINEAROUTPUTNUM*CN_PCSLINEARHEIGHT+
|
||||
(nIndex-m_nTopOutPortNum)%CN_PCSLINEAROUTPUTNUM*m_nCustomPortSpace;
|
||||
}
|
||||
return nRet;
|
||||
}
|
||||
|
||||
void ApcPdPCSPlugin::setPCSNum( int nPCSNum )
|
||||
{
|
||||
if ( nPCSNum < 0 )
|
||||
{
|
||||
emit signalErrorDisplay(tr("PCS个数不能小于0个!!!"));
|
||||
return;
|
||||
}
|
||||
if ( nPCSNum > CN_MAX_UNIT_COUNT )
|
||||
{
|
||||
emit signalErrorDisplay(tr("PCS个数不能大于300个!!!"));
|
||||
return;
|
||||
}
|
||||
|
||||
QString sPortName = "";
|
||||
QString sPortDesc = "";
|
||||
for ( int i=nPCSNum+1; i<=m_nPCSNum; i++ )
|
||||
{
|
||||
// 删除输入端口
|
||||
removeInPort(QString("Unit %1 TargetP").arg(i));
|
||||
removeInPort(QString("Unit %1 RealP").arg(i));
|
||||
removeInPort(QString("Unit %1 SOC").arg(i));
|
||||
removeInPort(QString("Unit %1 MaxDischargeP").arg(i));
|
||||
removeInPort(QString("Unit %1 MaxChargeP").arg(i));
|
||||
removeInPort(QString("Unit %1 RegulateEnable").arg(i));
|
||||
|
||||
// 删除输出端口
|
||||
removeOutPort(QString("Unit %1 DistributionPower").arg(i));
|
||||
removeOutPort(QString("Unit %1 RegulateEnable").arg(i));
|
||||
removeOutPort(QString("Unit %1 StatusCode").arg(i));
|
||||
removeOutPort(QString("Unit %1 ErrorCode").arg(i));
|
||||
|
||||
// 删除动态属性
|
||||
|
||||
}
|
||||
for ( int i=m_nPCSNum+1; i<=nPCSNum; i++ )
|
||||
{
|
||||
// 增加输入端口
|
||||
sPortName = QString("Unit %1 TargetP").arg(i);
|
||||
sPortDesc = QString(tr("机组%1有功目标值")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
|
||||
sPortName = QString("Unit %1 RealP").arg(i);
|
||||
sPortDesc = QString(tr("机组%1有功实际值")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
|
||||
sPortName = QString("Unit %1 SOC").arg(i);
|
||||
sPortDesc = QString(tr("机组%1 SOC(单位:%)")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 MaxDischargeP").arg(i);
|
||||
sPortDesc = QString(tr("机组%1最大放电功率")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 MaxChargeP").arg(i);
|
||||
sPortDesc = QString(tr("机组%1最大充电功率")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 RegulateEnable").arg(i);
|
||||
sPortDesc = QString(tr("机组%1调节使能")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_BOOL) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
|
||||
// 增加输出端口
|
||||
sPortName = QString("Unit %1 DistributionPower").arg(i);
|
||||
sPortDesc = QString(tr("机组%1分配有功")).arg(i);
|
||||
addOutPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setOutPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 RegulateEnable").arg(i);
|
||||
sPortDesc = QString(tr("机组%1调节使能")).arg(i);
|
||||
addOutPort( CPort(this, sPortName, E_PORTDATA_BOOL) );
|
||||
setOutPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 StatusCode").arg(i);
|
||||
sPortDesc = QString(tr("机组%1状态码")).arg(i);
|
||||
addOutPort( CPort(this, sPortName, E_PORTDATA_INT) );
|
||||
setOutPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 ErrorCode").arg(i);
|
||||
sPortDesc = QString(tr("机组%1错误码")).arg(i);
|
||||
addOutPort( CPort(this, sPortName, E_PORTDATA_INT) );
|
||||
setOutPortShowName( sPortName, sPortDesc );
|
||||
|
||||
// 增加动态属性
|
||||
|
||||
}
|
||||
m_nPCSNum = nPCSNum;
|
||||
emit signalPortSizeChanged();
|
||||
}
|
||||
|
||||
void ApcPdPCSPlugin::setSpace(int nValue)
|
||||
{
|
||||
if (nValue > 100)
|
||||
{
|
||||
emit signalErrorDisplay(tr("端口间隔不能大于100"));
|
||||
return;
|
||||
}
|
||||
|
||||
if(nValue < 20)
|
||||
{
|
||||
emit signalErrorDisplay(tr("端口间隔不能小于20"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_nCustomPortSpace = nValue;
|
||||
emit signalPortSizeChanged();
|
||||
}
|
||||
|
||||
void ApcPdPCSPlugin::setWaitRespTimeout(int nWaitRespTimeout)
|
||||
{
|
||||
if(nWaitRespTimeout <= 0)
|
||||
{
|
||||
emit signalErrorDisplay(tr("【调节反馈超时时间】值错误,合法值:大于0"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_nWaitRespTimeout = nWaitRespTimeout;
|
||||
}
|
||||
|
||||
void ApcPdPCSPlugin::setRegulateCycle(int nRegulateCycle)
|
||||
{
|
||||
if(nRegulateCycle < 0)
|
||||
{
|
||||
emit signalErrorDisplay(tr("【稳定时调节周期】值错误,合法值:大于等于0"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_nRegulateCycle = nRegulateCycle;
|
||||
}
|
||||
|
||||
void ApcPdPCSPlugin::setMinAllocP(float fMinAllocP)
|
||||
{
|
||||
if(fMinAllocP <= 0)
|
||||
{
|
||||
emit signalErrorDisplay(tr("【最小分配功率】值错误,合法值:大于0"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_fMinAllocP = fMinAllocP;
|
||||
}
|
||||
|
||||
void ApcPdPCSPlugin::setCommPrecision(float fCommPrecision)
|
||||
{
|
||||
if(fCommPrecision < 0)
|
||||
{
|
||||
emit signalErrorDisplay(tr("【通讯精度】值错误,合法值:大于0"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_fCommPrecision = fCommPrecision;
|
||||
}
|
||||
|
||||
void ApcPdPCSPlugin::setRegulatePrecision(float fRegulatePrecision)
|
||||
{
|
||||
if(fRegulatePrecision < 0)
|
||||
{
|
||||
emit signalErrorDisplay(tr("【调节精度】值错误,合法值:大于0"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_fRegulatePrecision = fRegulatePrecision;
|
||||
}
|
||||
@ -0,0 +1,99 @@
|
||||
#ifndef TEMPLATEPLUGIN_H
|
||||
#define TEMPLATEPLUGIN_H
|
||||
|
||||
#include "CBlock.h"
|
||||
#include <QMap>
|
||||
|
||||
class ApcPdPCSPlugin : public CBlock
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA( IID Block_iid ) // Q_PLUGIN_METADATA 宏用于描述插件元数据
|
||||
Q_INTERFACES( CBlock ) // Q_INTERFACES 宏用于告诉Qt该类实现的接口
|
||||
|
||||
public:
|
||||
Q_INVOKABLE ApcPdPCSPlugin();
|
||||
Q_INVOKABLE ~ApcPdPCSPlugin();
|
||||
|
||||
public:
|
||||
QString name() { return "apc_pd_pcs"; }
|
||||
QString showName() { return QObject::tr("储能机组有功分配器V2"); }
|
||||
QString propertyShowName( QString sPropertyName );
|
||||
QIcon getIcon() { return QIcon(":/icon/"+name()+".png"); }
|
||||
|
||||
//< 获取图元输入端口文本的位置坐标,nInputTextWidth是文字边框的宽度
|
||||
QPointF getInputTextPos(const int nInputIndex,const int nInputTextWidth) override;
|
||||
QPointF getOutputTextPos(const int nOutputIndex,const int nOutputTextWidth) override;
|
||||
//< 获取输入端口高度
|
||||
int getInputHeight(const int nIndex, const int nPortSize, const int nPortHeight) override;
|
||||
int getOutputHeight(const int nIndex, const int nPortSize, const int nPortHeight) override;
|
||||
// 第一个输入(输出、文字)与顶的距离
|
||||
int getFirstHeight() override;
|
||||
//< 输出值显示分隔符
|
||||
QString getOutputRealValueSep() override;
|
||||
|
||||
QPointF getIconPos(const QSize &pixmapSize) override;
|
||||
//< 用于画图元外边框的折线
|
||||
QPolygonF getPolygon(const int nWidth,const int nHeight) override;
|
||||
bool isCustomItemPos() override;
|
||||
|
||||
void setDefaultIconSize() override;
|
||||
//< 初始化后执行的操作,可以图元自定义一些特殊操作
|
||||
void afterInitialize() override;
|
||||
|
||||
private:
|
||||
int getInputHeight(const int nIndex);
|
||||
int getOutputHeight(const int nIndex );
|
||||
void initPropertyMAP();
|
||||
|
||||
public:
|
||||
int getPCSNum () { return m_nPCSNum; }
|
||||
void setPCSNum ( int nPCSNum );
|
||||
int getSpace() { return m_nCustomPortSpace; }
|
||||
void setSpace( int nValue );
|
||||
|
||||
void setWaitRespTimeout(int nWaitRespTimeout);
|
||||
int getWaitRespTimeout() {return m_nWaitRespTimeout;}
|
||||
void setRegulateCycle(int nRegulateCycle);
|
||||
int getRegulateCycle() {return m_nRegulateCycle;}
|
||||
|
||||
void setMinAllocP(float fMinAllocP);
|
||||
float getMinAllocP() {return m_fMinAllocP;}
|
||||
|
||||
void setCommPrecision(float fCommPrecision);
|
||||
float getCommPrecision() {return m_fCommPrecision;}
|
||||
void setRegulatePrecision(float fRegulatePrecision);
|
||||
float getRegulatePrecision() {return m_fRegulatePrecision;}
|
||||
|
||||
private:
|
||||
QMap<QString,QString> m_mapProperty;
|
||||
int m_nTopInPortNum; //< 顶框中输入端口个数
|
||||
int m_nTopOutPortNum; //< 顶框中输出端口个数
|
||||
|
||||
int m_nCustomPortSpace;
|
||||
Q_PROPERTY(int PortSpace READ getSpace WRITE setSpace USER true DESIGNABLE true)
|
||||
|
||||
int m_nPCSNum; // PCS个数 机组个数
|
||||
Q_PROPERTY( int UnitCnt READ getPCSNum WRITE setPCSNum USER true DESIGNABLE true )
|
||||
|
||||
IMPL_PROPERTY( QString, AllocALG ) // 功率分配算法 allocation algorithm
|
||||
Q_PROPERTY( QString AllocALG READ get_AllocALG WRITE set_AllocALG USER true DESIGNABLE true )
|
||||
|
||||
int m_nWaitRespTimeout; //< 等待调节反馈超时时间
|
||||
Q_PROPERTY( int WaitRespTimeout READ getWaitRespTimeout WRITE setWaitRespTimeout USER true DESIGNABLE true )
|
||||
|
||||
int m_nRegulateCycle; //< 稳定时定时调节周期
|
||||
Q_PROPERTY( int RegulateCycle READ getRegulateCycle WRITE setRegulateCycle USER true DESIGNABLE true )
|
||||
|
||||
float m_fMinAllocP; //< 最小分配功率
|
||||
Q_PROPERTY( float MinAllocP READ getMinAllocP WRITE setMinAllocP USER true DESIGNABLE true )
|
||||
|
||||
//< 作用:1、若读回来的机组功率设定值与下发的目标值差值的绝对值小于该值,则认为通讯成功。2、下发功率是此值的倍数
|
||||
float m_fCommPrecision;
|
||||
Q_PROPERTY( float CommPrecision READ getCommPrecision WRITE setCommPrecision USER true DESIGNABLE true )
|
||||
|
||||
//< 作用:若机组的功率实际值与设定值差值的绝对值小于该值,则认为成功。
|
||||
float m_fRegulatePrecision;
|
||||
Q_PROPERTY( float RegulatePrecision READ getRegulatePrecision WRITE setRegulatePrecision USER true DESIGNABLE true )
|
||||
};
|
||||
|
||||
#endif // TEMPLATEPLUGIN_H
|
||||
@ -0,0 +1,33 @@
|
||||
TARGET = apc_pd_pcsplugin
|
||||
QT = core gui widgets
|
||||
CONFIG += dll
|
||||
TEMPLATE = lib
|
||||
|
||||
SOURCES += \
|
||||
ApcPdPCSPlugin.cpp
|
||||
|
||||
HEADERS += \
|
||||
ApcPdPCSPlugin.h
|
||||
|
||||
INCLUDEPATH += \
|
||||
../.. \
|
||||
../../fbd_block \
|
||||
../../include
|
||||
|
||||
LIBS += \
|
||||
-lfbd_block
|
||||
|
||||
RESOURCES += \
|
||||
icon.qrc
|
||||
|
||||
!include( ../../../../common.pri ){
|
||||
error(the file common.pri is not exist!!)
|
||||
}
|
||||
|
||||
#fbd_plugins插件的统一规则
|
||||
FBD_PLUGINS_PRI=$$PWD/../fbd_plugins.pri
|
||||
exists($$FBD_PLUGINS_PRI) {
|
||||
include($$FBD_PLUGINS_PRI)
|
||||
}else {
|
||||
error("FATAL error: can not find fbd_plugins.pri")
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file>icon/apc_pd_pcs.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
After Width: | Height: | Size: 563 B |
@ -0,0 +1,175 @@
|
||||
#include "batchActionAOplugin.h"
|
||||
|
||||
batchActionAOplugin::batchActionAOplugin(): CBlock()
|
||||
{
|
||||
m_nInputNum = 0;
|
||||
m_nControlTimeout=10;
|
||||
m_nSendingInterval=50;
|
||||
addInPort( CPort(this, "I1", E_PORTDATA_BOOL) );
|
||||
setInPortShowName("I1",tr("使能"));
|
||||
|
||||
this->setProperty( C_PROPERTY_SHOWNAME, showName() );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("ActionName")).toStdString().c_str(), E_VALUEEDIT_LINEEDIT );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("SendingInterval")).toStdString().c_str(), E_VALUEEDIT_SPINBOX );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("PortSpace")).toStdString().c_str(), E_VALUEEDIT_SPINBOX );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("Width")).toStdString().c_str(), E_VALUEEDIT_SPINBOX );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("InputNum")).toStdString().c_str(), E_VALUEEDIT_SPINBOX );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("ControlTimeout")).toStdString().c_str(), E_VALUEEDIT_SPINBOX );
|
||||
|
||||
|
||||
ActionName = "bactchActionAO";
|
||||
|
||||
}
|
||||
|
||||
batchActionAOplugin::~batchActionAOplugin()
|
||||
{
|
||||
}
|
||||
|
||||
QString batchActionAOplugin::propertyShowName( QString sPropertyName )
|
||||
{
|
||||
if ( sPropertyName == "ActionName" )
|
||||
return tr("动作名称");
|
||||
else if ( sPropertyName == "SendingInterval" )
|
||||
return tr("发送周期(单位:s)");
|
||||
else if ( sPropertyName == "PortSpace" )
|
||||
return tr("端口间距");
|
||||
else if ( sPropertyName == "Width" )
|
||||
return tr("图元宽度");
|
||||
else if ( sPropertyName == "InputNum" )
|
||||
return tr("输入个数");
|
||||
else if ( sPropertyName == "ControlTimeout" )
|
||||
return tr("命令超时时间(单位:ms)");
|
||||
else if ( sPropertyName.startsWith("InputRtu") )
|
||||
return tr("输入")+sPropertyName.remove( "InputRtu" )+tr("Rtu标识");
|
||||
else if ( sPropertyName.startsWith("InputFlag") )
|
||||
return tr("输入")+sPropertyName.remove( "InputFlag" )+tr("控制点标识");
|
||||
else if ( sPropertyName.startsWith("CtrlStr") )
|
||||
return tr("输入")+sPropertyName.remove( "CtrlStr" )+tr("控制测点串");
|
||||
return sPropertyName;
|
||||
}
|
||||
|
||||
void batchActionAOplugin::setWidth(int nValue)
|
||||
{
|
||||
if (nValue > 1000)
|
||||
{
|
||||
emit signalErrorDisplay(tr("宽度不能大于1000"));
|
||||
return;
|
||||
}
|
||||
if (nValue < 40)
|
||||
{
|
||||
emit signalErrorDisplay(tr("宽度不能小于40"));
|
||||
return;
|
||||
}
|
||||
if (nValue == getIconWidth())
|
||||
{
|
||||
emit signalErrorDisplay(tr("输入值与现值相同"));
|
||||
return;
|
||||
}
|
||||
setIconWidth( nValue );
|
||||
emit signalPortSizeChanged();
|
||||
}
|
||||
|
||||
void batchActionAOplugin::setSpace(int nValue)
|
||||
{
|
||||
if (nValue > 400)
|
||||
{
|
||||
emit signalErrorDisplay(tr("端口间隔不能大于400"));
|
||||
return;
|
||||
}
|
||||
if (nValue < 16)
|
||||
{
|
||||
emit signalErrorDisplay(tr("端口间隔不能小于16"));
|
||||
return;
|
||||
}
|
||||
if (nValue == getPortSpace())
|
||||
{
|
||||
emit signalErrorDisplay(tr("输入值与现值相同"));
|
||||
return;
|
||||
}
|
||||
setPortSpace( nValue );
|
||||
emit signalPortSizeChanged();
|
||||
}
|
||||
|
||||
void batchActionAOplugin::setCustomInputNum(int value)
|
||||
{
|
||||
|
||||
if (value < 0)
|
||||
{
|
||||
emit signalErrorDisplay(tr("输入值不能小于0"));
|
||||
return;
|
||||
}
|
||||
if (value == m_nInputNum )
|
||||
{
|
||||
emit signalErrorDisplay(tr("输入值与现值相同"));
|
||||
return;
|
||||
}
|
||||
|
||||
int oldvalue = m_nInputNum;
|
||||
QString PortName;
|
||||
for (int i = value; i < oldvalue; i++)
|
||||
{
|
||||
PortName = QString("I%1").arg(i+1);
|
||||
removeInPort(PortName);
|
||||
|
||||
m_bChangeDynamicProperty = false;
|
||||
QString sPropertyNameRtu = QString("InputRtu%1").arg(i+1);
|
||||
QString sPropertyNameParam = QString("InputFlag%1").arg(i+1);
|
||||
QString sPropertyNameCtrlStr = QString("CtrlStr%1").arg(i+1);
|
||||
this->setProperty( sPropertyNameRtu.toStdString().c_str(), QVariant::Invalid );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+sPropertyNameRtu).toStdString().c_str(), QVariant::Invalid );
|
||||
this->setProperty( sPropertyNameParam.toStdString().c_str(), QVariant::Invalid );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+sPropertyNameParam).toStdString().c_str(), QVariant::Invalid );
|
||||
this->setProperty( sPropertyNameCtrlStr.toStdString().c_str(), QVariant::Invalid );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+sPropertyNameCtrlStr).toStdString().c_str(), QVariant::Invalid );
|
||||
|
||||
m_bChangeDynamicProperty = true;
|
||||
}
|
||||
for (int i = oldvalue; i < value; i++)
|
||||
{
|
||||
PortName = QString("I%1").arg(i+1);
|
||||
addInPort( CPort(this, PortName, E_PORTDATA_FLOAT) );
|
||||
|
||||
m_bChangeDynamicProperty = false;
|
||||
QString sPropertyNameRtu = QString("InputRtu%1").arg(i+1);
|
||||
QString sPropertyNameParam = QString("InputFlag%1").arg(i+1);
|
||||
QString sPropertyNameCtrlStr = QString("CtrlStr%1").arg(i+1);
|
||||
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+sPropertyNameRtu).toStdString().c_str(), E_VALUEEDIT_LINEEDIT );
|
||||
this->setProperty( sPropertyNameRtu.toStdString().c_str(), "" );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+sPropertyNameParam).toStdString().c_str(), E_VALUEEDIT_LINEEDIT );
|
||||
this->setProperty( sPropertyNameParam.toStdString().c_str(), "");
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+sPropertyNameCtrlStr).toStdString().c_str(), E_VALUEEDIT_LINEEDIT );
|
||||
this->setProperty( sPropertyNameCtrlStr.toStdString().c_str(), "");
|
||||
|
||||
m_bChangeDynamicProperty = true;
|
||||
}
|
||||
emit signalPortSizeChanged();
|
||||
m_nInputNum = value;
|
||||
|
||||
}
|
||||
|
||||
void batchActionAOplugin::setSendingInterval(int nValue)
|
||||
{
|
||||
m_nSendingInterval=nValue;
|
||||
}
|
||||
|
||||
void batchActionAOplugin::setControlTimeout(int nValue)
|
||||
{
|
||||
m_nControlTimeout=nValue;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,56 @@
|
||||
#ifndef TEMPLATEPLUGIN_H
|
||||
#define TEMPLATEPLUGIN_H
|
||||
|
||||
#include "CBlock.h"
|
||||
|
||||
class batchActionAOplugin : public CBlock
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA( IID Block_iid ) // Q_PLUGIN_METADATA 宏用于描述插件元数据
|
||||
Q_INTERFACES( CBlock ) // Q_INTERFACES 宏用于告诉Qt该类实现的接口
|
||||
|
||||
IMPL_PROPERTY( QString, ActionName )
|
||||
IMPL_PROPERTY( int, ControlTimeout )
|
||||
IMPL_PROPERTY( int, RedoTimes )
|
||||
|
||||
Q_PROPERTY( QString ActionName READ get_ActionName WRITE set_ActionName USER true DESIGNABLE true )
|
||||
Q_PROPERTY( int SendingInterval READ getSendingInterval WRITE setSendingInterval USER true DESIGNABLE true )
|
||||
Q_PROPERTY( int PortSpace READ getSpace WRITE setSpace USER true DESIGNABLE true )
|
||||
Q_PROPERTY( int Width READ getWidth WRITE setWidth USER true DESIGNABLE true )
|
||||
Q_PROPERTY( int InputNum READ getCustomInputNum WRITE setCustomInputNum USER true DESIGNABLE true )
|
||||
Q_PROPERTY( int ControlTimeout READ getControlTimeout WRITE setControlTimeout USER true DESIGNABLE true )
|
||||
|
||||
public:
|
||||
Q_INVOKABLE batchActionAOplugin();
|
||||
Q_INVOKABLE ~batchActionAOplugin();
|
||||
|
||||
public:
|
||||
QString name() { return "batchActionAO"; }
|
||||
QString showName() { return QObject::tr("AO批量控制"); }
|
||||
QString propertyShowName( QString sPropertyName );
|
||||
QIcon getIcon() { return QIcon(":/icon/"+name()+".png"); }
|
||||
|
||||
int getWidth() { return (int)getIconWidth(); }
|
||||
void setWidth( int nValue );
|
||||
int getSpace() { return getPortSpace(); }
|
||||
void setSpace( int nValue );
|
||||
int getCustomInputNum() { return m_nInputNum; }
|
||||
void setCustomInputNum(int nValue);
|
||||
int getSendingInterval() { return m_nSendingInterval; }
|
||||
void setSendingInterval(int nValue);
|
||||
int getControlTimeout() { return m_nControlTimeout; }
|
||||
void setControlTimeout(int nValue);
|
||||
protected:
|
||||
|
||||
|
||||
private:
|
||||
|
||||
|
||||
private:
|
||||
int m_nInputNum;
|
||||
int m_nSendingInterval;
|
||||
bool m_bChangeDynamicProperty;
|
||||
int m_nControlTimeout;
|
||||
};
|
||||
|
||||
#endif // TEMPLATEPLUGIN_H
|
||||
@ -0,0 +1,39 @@
|
||||
TARGET = batchActionAOplugin
|
||||
QT = core gui widgets xml sql
|
||||
CONFIG += dll
|
||||
TEMPLATE = lib
|
||||
CONFIG += qt
|
||||
|
||||
SOURCES += \
|
||||
batchActionAOplugin.cpp \
|
||||
|
||||
HEADERS += \
|
||||
batchActionAOplugin.h \
|
||||
|
||||
INCLUDEPATH += \
|
||||
../../fbd_block \
|
||||
../../fbd_tree \
|
||||
../../fbd_property \
|
||||
|
||||
LIBS += \
|
||||
-lfbd_block \
|
||||
-lfbd_tree \
|
||||
|
||||
RESOURCES += \
|
||||
icon.qrc
|
||||
|
||||
!include( ../../../../idl_files/idl_files.pri){
|
||||
error(the file idl_files.pri is not exist!!)
|
||||
}
|
||||
|
||||
!include( ../../../../common.pri ){
|
||||
error(the file common.pri is not exist!!)
|
||||
}
|
||||
|
||||
#fbd_plugins插件的统一规则
|
||||
FBD_PLUGINS_PRI=$$PWD/../fbd_plugins.pri
|
||||
exists($$FBD_PLUGINS_PRI) {
|
||||
include($$FBD_PLUGINS_PRI)
|
||||
}else {
|
||||
error("FATAL error: can not find fbd_plugins.pri")
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file>icon/batchActionAO.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
After Width: | Height: | Size: 627 B |
@ -0,0 +1,163 @@
|
||||
#include "demandcontrolplugin.h"
|
||||
#include <QDebug>
|
||||
|
||||
DemandControlPlugin::DemandControlPlugin(): CBlock()
|
||||
{
|
||||
m_fDemandDeadband = 50.0f;
|
||||
m_fReverseDeadband = 50.0f;
|
||||
m_fMaxDischargePower = 0.0f;
|
||||
m_fMaxChargingPower = 0.0f;
|
||||
m_nMinAdjustPeriod = 5000; //默认5秒
|
||||
|
||||
setPortShowNameFunctionEnable( false );
|
||||
//输入端口
|
||||
addInPort( CPort(this, "EnableRegulate", E_PORTDATA_BOOL) );
|
||||
setInPortShowName( "EnableRegulate", tr("调节使能") );
|
||||
|
||||
addInPort( CPort(this, "MeterRealPower", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "MeterRealPower", tr("总实时功率") );
|
||||
|
||||
addInPort( CPort(this, "StorageRealPower", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "StorageRealPower", tr("储能实时功率") );
|
||||
|
||||
addInPort( CPort(this, "PlanPower", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "PlanPower", tr("储能计划功率") );
|
||||
|
||||
addInPort( CPort(this, "DemandSetValue", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "DemandSetValue", tr("需量设定值") );
|
||||
|
||||
addInPort( CPort(this, "ReversePowerSetValue", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "ReversePowerSetValue", tr("逆流功率设定值") );
|
||||
|
||||
//输出端口
|
||||
addOutPort( CPort(this, "OutTargetPower", E_PORTDATA_FLOAT) );
|
||||
setOutPortShowName( "OutTargetPower", tr("目标功率") );
|
||||
|
||||
addOutPort( CPort(this, "EnableOut", E_PORTDATA_BOOL) );
|
||||
setOutPortShowName( "EnableOut", tr("输出使能") );
|
||||
|
||||
//属性
|
||||
this->setProperty( C_PROPERTY_SHOWNAME, showName() );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("EnableDemandCtrl")).toStdString().c_str(), E_VALUEEDIT_COMBOBOX );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("DemandDeadband")).toStdString().c_str(), E_VALUEEDIT_DOUBLESPINBOX );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("MaxDischargePower")).toStdString().c_str(), E_VALUEEDIT_DOUBLESPINBOX );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("EnableReverseCtrl")).toStdString().c_str(), E_VALUEEDIT_COMBOBOX );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("ReverseDeadband")).toStdString().c_str(), E_VALUEEDIT_DOUBLESPINBOX );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("MaxChargingPower")).toStdString().c_str(), E_VALUEEDIT_DOUBLESPINBOX );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("MinAdjustPeriod")).toStdString().c_str(), E_VALUEEDIT_SPINBOX );
|
||||
|
||||
QStringList listDemandTmp;
|
||||
listDemandTmp<<tr("0-禁用需量控制")<<tr("1-启用需量控制");
|
||||
this->setProperty( (C_PREFIX_COMBOBOXITEM+QString("EnableDemandCtrl")).toStdString().c_str(), listDemandTmp);
|
||||
EnableDemandCtrl = listDemandTmp.at(1);
|
||||
|
||||
QStringList listReverseTmp;
|
||||
listReverseTmp<<tr("0-禁用防逆流控制")<<tr("1-启用防逆流控制");
|
||||
this->setProperty( (C_PREFIX_COMBOBOXITEM+QString("EnableReverseCtrl")).toStdString().c_str(), listReverseTmp);
|
||||
EnableReverseCtrl = listReverseTmp.at(1);
|
||||
|
||||
setPortSpace(40);
|
||||
setIconWidth(60);
|
||||
}
|
||||
|
||||
DemandControlPlugin::~DemandControlPlugin()
|
||||
{
|
||||
}
|
||||
|
||||
QString DemandControlPlugin::propertyShowName( QString sPropertyName )
|
||||
{
|
||||
if ( sPropertyName == "EnableDemandCtrl" )
|
||||
return tr("是否启用需量控制");
|
||||
else if ( sPropertyName == "DemandDeadband" )
|
||||
return tr("需量调节死区");
|
||||
else if ( sPropertyName == "MaxDischargePower" )
|
||||
return tr("超需时最大放电功率");
|
||||
else if ( sPropertyName == "EnableReverseCtrl" )
|
||||
return tr("是否启用防逆流控制");
|
||||
else if ( sPropertyName == "MaxChargingPower" )
|
||||
return tr("逆流时最大充电功率");
|
||||
else if ( sPropertyName == "ReverseDeadband" )
|
||||
return tr("逆流调节死区");
|
||||
else if ( sPropertyName == "MinAdjustPeriod" )
|
||||
return tr("最小调节间隔(单位:ms)");
|
||||
|
||||
return sPropertyName;
|
||||
}
|
||||
|
||||
void DemandControlPlugin::setDemandDeadband( float fDemandDeadband )
|
||||
{
|
||||
if ( fDemandDeadband <= 0 )
|
||||
{
|
||||
emit signalErrorDisplay(tr("【需量调节死区】值错误,合法值:大于0"));
|
||||
return;
|
||||
}
|
||||
m_fDemandDeadband = fDemandDeadband;
|
||||
}
|
||||
|
||||
void DemandControlPlugin::setMaxDischargePower(float fMaxDischargePower)
|
||||
{
|
||||
if (fMaxDischargePower < 0)
|
||||
{
|
||||
emit signalErrorDisplay(tr("【最大放电功率】值错误,合法值:大于等于0"));
|
||||
return;
|
||||
}
|
||||
m_fMaxDischargePower = fMaxDischargePower;
|
||||
}
|
||||
|
||||
void DemandControlPlugin::setReverseDeadband(float fReverseDeadband)
|
||||
{
|
||||
if ( fReverseDeadband <= 0 )
|
||||
{
|
||||
emit signalErrorDisplay(tr("【逆流调节死区】值错误,合法值:大于0"));
|
||||
return;
|
||||
}
|
||||
m_fReverseDeadband = fReverseDeadband;
|
||||
}
|
||||
|
||||
void DemandControlPlugin::setMaxChargingPower(float fMaxChargingPower)
|
||||
{
|
||||
if (fMaxChargingPower > 0)
|
||||
{
|
||||
emit signalErrorDisplay(tr("【最大充电功率】值错误,合法值:小于等于0"));
|
||||
return;
|
||||
}
|
||||
m_fMaxChargingPower = fMaxChargingPower;
|
||||
}
|
||||
|
||||
void DemandControlPlugin::setMinAdjustPeriod(int nMinAdjustPeriod)
|
||||
{
|
||||
if (nMinAdjustPeriod < 0)
|
||||
{
|
||||
emit signalErrorDisplay(tr("【最小调节间隔】值错误,合法值:大于等于0"));
|
||||
return;
|
||||
}
|
||||
m_nMinAdjustPeriod = nMinAdjustPeriod;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,74 @@
|
||||
#ifndef TEMPLATEPLUGIN_H
|
||||
#define TEMPLATEPLUGIN_H
|
||||
|
||||
#include "CBlock.h"
|
||||
|
||||
class DemandControlPlugin : public CBlock
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA( IID Block_iid ) // Q_PLUGIN_METADATA 宏用于描述插件元数据
|
||||
Q_INTERFACES( CBlock ) // Q_INTERFACES 宏用于告诉Qt该类实现的接口
|
||||
|
||||
public:
|
||||
Q_INVOKABLE DemandControlPlugin();
|
||||
Q_INVOKABLE ~DemandControlPlugin();
|
||||
|
||||
public:
|
||||
QString name() { return "demandcontrol"; }
|
||||
QString showName() { return QObject::tr("需量/逆流控制策略"); }
|
||||
QString propertyShowName( QString sPropertyName );
|
||||
QIcon getIcon() { return QIcon(":/icon/"+name()+".png"); }
|
||||
|
||||
public:
|
||||
float getDemandDeadband() { return m_fDemandDeadband; }
|
||||
void setDemandDeadband( float fDemandDeadband );
|
||||
|
||||
float getMaxDischargePower() {return m_fMaxDischargePower;}
|
||||
void setMaxDischargePower(float fMaxDischargePower);
|
||||
|
||||
float getReverseDeadband() { return m_fReverseDeadband; }
|
||||
void setReverseDeadband( float fReverseDeadband );
|
||||
|
||||
float getMaxChargingPower() {return m_fMaxChargingPower;}
|
||||
void setMaxChargingPower(float fMaxChargingPower);
|
||||
|
||||
int getMinAdjustPeriod() {return m_nMinAdjustPeriod;}
|
||||
void setMinAdjustPeriod(int nMinAdjustPeriod);
|
||||
|
||||
private:
|
||||
IMPL_PROPERTY( QString, EnableDemandCtrl) // 是否启用需量控制
|
||||
Q_PROPERTY( QString EnableDemandCtrl READ get_EnableDemandCtrl WRITE set_EnableDemandCtrl USER true DESIGNABLE true )
|
||||
|
||||
float m_fDemandDeadband; // 需量调节死区
|
||||
Q_PROPERTY( float DemandDeadband READ getDemandDeadband WRITE setDemandDeadband USER true DESIGNABLE true )
|
||||
|
||||
float m_fMaxDischargePower; // 超需时最大放电功率
|
||||
Q_PROPERTY( float MaxDischargePower READ getMaxDischargePower WRITE setMaxDischargePower USER true DESIGNABLE true )
|
||||
|
||||
IMPL_PROPERTY( QString, EnableReverseCtrl) // 是否启用逆流控制
|
||||
Q_PROPERTY( QString EnableReverseCtrl READ get_EnableReverseCtrl WRITE set_EnableReverseCtrl USER true DESIGNABLE true )
|
||||
|
||||
float m_fReverseDeadband; // 逆流调节死区
|
||||
Q_PROPERTY( float ReverseDeadband READ getReverseDeadband WRITE setReverseDeadband USER true DESIGNABLE true )
|
||||
|
||||
float m_fMaxChargingPower; // 逆流时最大充电功率
|
||||
Q_PROPERTY( float MaxChargingPower READ getMaxChargingPower WRITE setMaxChargingPower USER true DESIGNABLE true )
|
||||
|
||||
int m_nMinAdjustPeriod; // 最小调节间隔,单位:ms
|
||||
Q_PROPERTY( int MinAdjustPeriod READ getMinAdjustPeriod WRITE setMinAdjustPeriod USER true DESIGNABLE true )
|
||||
};
|
||||
|
||||
#endif // TEMPLATEPLUGIN_H
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,33 @@
|
||||
TARGET = demandcontrolplugin
|
||||
QT = core gui widgets
|
||||
CONFIG += dll
|
||||
TEMPLATE = lib
|
||||
|
||||
SOURCES += \
|
||||
demandcontrolplugin.cpp
|
||||
|
||||
HEADERS += \
|
||||
demandcontrolplugin.h
|
||||
|
||||
INCLUDEPATH += \
|
||||
../.. \
|
||||
../../fbd_block \
|
||||
../../include
|
||||
|
||||
LIBS += \
|
||||
-lfbd_block
|
||||
|
||||
RESOURCES += \
|
||||
icon.qrc
|
||||
|
||||
!include( ../../../../common.pri ){
|
||||
error(the file common.pri is not exist!!)
|
||||
}
|
||||
|
||||
#fbd_plugins插件的统一规则
|
||||
FBD_PLUGINS_PRI=$$PWD/../fbd_plugins.pri
|
||||
exists($$FBD_PLUGINS_PRI) {
|
||||
include($$FBD_PLUGINS_PRI)
|
||||
}else {
|
||||
error("FATAL error: can not find fbd_plugins.pri")
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file>icon/demandcontrol.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
@ -15,4 +15,10 @@ SUBDIRS += \
|
||||
alarmsplitplugin \
|
||||
multimapplugin \
|
||||
timetriggerplugin \
|
||||
videocontrolplugin
|
||||
videocontrolplugin \
|
||||
alarmGeneratePlugin \
|
||||
demandcontrolplugin \
|
||||
powercontrolreactiveplugin \
|
||||
powerOutputCtrlplugin \
|
||||
apc_pd_pcsplugin \
|
||||
batchActionAOplugin
|
||||
|
||||
@ -6,8 +6,7 @@
|
||||
#define VAR_TOKEN_BEGIN "{"
|
||||
#define VAR_TOKEN_END "}"
|
||||
|
||||
FmtCfgDialog::FmtCfgDialog(QWidget *parent, CFmtTextPlugin *pTextPlugin) :
|
||||
QDialog(parent),
|
||||
FmtCfgDialog::FmtCfgDialog(QWidget *parent, CFmtTextPlugin *pTextPlugin) : QDialog(parent),
|
||||
ui(new Ui::FmtCfgDialog),
|
||||
m_pFmtTextPlugin(pTextPlugin)
|
||||
{
|
||||
@ -43,48 +42,77 @@ void FmtCfgDialog::previewLoad()
|
||||
{
|
||||
QString text = ui->textEdit_text->toPlainText(), previewText;
|
||||
int begin_index, end_index;
|
||||
|
||||
|
||||
while (text.size() != 0)
|
||||
{
|
||||
if( ( begin_index = text.indexOf(VAR_TOKEN_BEGIN)) != -1)
|
||||
{
|
||||
previewText += text.left(begin_index);
|
||||
if ((end_index = text.indexOf(VAR_TOKEN_END)) != -1)
|
||||
{
|
||||
auto var = text.mid(begin_index + 1,end_index - begin_index - 1);
|
||||
// qDebug() << "----------------------";
|
||||
// qDebug() << "var is |" << var;
|
||||
// qDebug() << VAR_TOKEN_BEGIN << " begin_index is |" << QString::number(begin_index);
|
||||
// qDebug() << VAR_TOKEN_END << " end_index is |" << QString::number(end_index);
|
||||
// qDebug() << "text is |" << text;
|
||||
// qDebug() << "previewText is |" << previewText;
|
||||
|
||||
QString var;
|
||||
if ((begin_index = text.lastIndexOf(VAR_TOKEN_BEGIN,end_index)) != -1)
|
||||
{
|
||||
var = text.mid(begin_index + 1, end_index - begin_index - 1);
|
||||
bool isInt = false;
|
||||
int nVar = var.mid(1).toInt(&isInt);
|
||||
if (var[0] == 'I' && isInt && nVar < m_pFmtTextPlugin->getInPortSize() && nVar > 0)
|
||||
{
|
||||
if (m_pFmtTextPlugin->getInPort(var).dataType() == E_PORTDATA_INT)
|
||||
{
|
||||
previewText += "23";
|
||||
}else if(m_pFmtTextPlugin->getInPort(var).dataType() == E_PORTDATA_STRING){
|
||||
previewText += "sample";
|
||||
}else if(m_pFmtTextPlugin->getInPort(var).dataType() == E_PORTDATA_FLOAT){
|
||||
previewText += "23.3";
|
||||
}else if(m_pFmtTextPlugin->getInPort(var).dataType() == E_PORTDATA_BOOL){
|
||||
previewText += tr("真");
|
||||
}else { previewText += tr("未知类型"); }
|
||||
var = "23";
|
||||
}
|
||||
else if (m_pFmtTextPlugin->getInPort(var).dataType() == E_PORTDATA_STRING)
|
||||
{
|
||||
var = "sample";
|
||||
}
|
||||
else if (m_pFmtTextPlugin->getInPort(var).dataType() == E_PORTDATA_FLOAT)
|
||||
{
|
||||
var = "23.3";
|
||||
}
|
||||
else if (m_pFmtTextPlugin->getInPort(var).dataType() == E_PORTDATA_BOOL)
|
||||
{
|
||||
var = tr("真");
|
||||
}
|
||||
else
|
||||
{
|
||||
var = QString(VAR_TOKEN_BEGIN) + var + VAR_TOKEN_END;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var = QString(VAR_TOKEN_BEGIN) + var + VAR_TOKEN_END;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
begin_index = end_index;
|
||||
var = VAR_TOKEN_END;
|
||||
}
|
||||
// qDebug() << "----------------------";
|
||||
// qDebug() << "var :" << var;
|
||||
// qDebug() << "begin_index:" << QString::number(begin_index);
|
||||
// qDebug() << "end_index:" << QString::number(end_index);
|
||||
// qDebug() << "text:" << text;
|
||||
// qDebug() << "previewText before:" << previewText;
|
||||
previewText += text.left(begin_index) + var;
|
||||
// qDebug() << "previewText after:" << previewText;
|
||||
text = text.mid(end_index + 1);
|
||||
}
|
||||
else{ previewText += tr("后续语法有误"); break;}
|
||||
|
||||
}else{
|
||||
else
|
||||
{
|
||||
// 找不到{ 停止解析
|
||||
previewText += text;
|
||||
text = "";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ui->textEdit_preview->setPlainText(previewText);
|
||||
|
||||
}
|
||||
|
||||
void FmtCfgDialog::varLoad()
|
||||
{
|
||||
if(m_pFmtTextPlugin->getInPortSize() == 1){
|
||||
if (m_pFmtTextPlugin->getInPortSize() == 1)
|
||||
{
|
||||
ui->groupBox_var->setHidden(true);
|
||||
return;
|
||||
}
|
||||
@ -95,9 +123,9 @@ void FmtCfgDialog::varLoad()
|
||||
{
|
||||
QPushButton *tmpBtn = new QPushButton(m_pFmtTextPlugin->getInPortShowName(i) + tr("[") + m_pFmtTextPlugin->getInPort(m_pFmtTextPlugin->getInPortName(i)).dataTypeName() + "]");
|
||||
tmpBtn->setProperty("name", m_pFmtTextPlugin->getInPortName(i));
|
||||
connect(tmpBtn,&QPushButton::clicked, [=]( ) { ui->textEdit_text->insertPlainText( VAR_TOKEN_BEGIN + tmpBtn->property("name").toString() + VAR_TOKEN_END); } );
|
||||
connect(tmpBtn, &QPushButton::clicked, [=]()
|
||||
{ ui->textEdit_text->insertPlainText(VAR_TOKEN_BEGIN + tmpBtn->property("name").toString() + VAR_TOKEN_END); });
|
||||
layout->addWidget(tmpBtn); // TYPE 变量名
|
||||
}
|
||||
layout->addStretch();
|
||||
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 933 B After Width: | Height: | Size: 788 B |
|
Before Width: | Height: | Size: 788 B After Width: | Height: | Size: 563 B |
|
Before Width: | Height: | Size: 219 B After Width: | Height: | Size: 274 B |
|
Before Width: | Height: | Size: 343 B After Width: | Height: | Size: 343 B |
|
Before Width: | Height: | Size: 359 B After Width: | Height: | Size: 377 B |
|
Before Width: | Height: | Size: 285 B After Width: | Height: | Size: 349 B |
|
Before Width: | Height: | Size: 413 B After Width: | Height: | Size: 480 B |
@ -22,12 +22,13 @@
|
||||
#include "pub_utility_api/CharUtil.h"
|
||||
#include <QDebug>
|
||||
|
||||
|
||||
MapCfgDlg::MapCfgDlg(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
CustomUiDialog(parent),
|
||||
ui(new Ui::MapCfgDlg)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
this->setWindowTitle(tr("映射配置"));
|
||||
|
||||
ui->tableWidget->setAcceptDrops(true);
|
||||
ui->tableWidget->setDropIndicatorShown(true);
|
||||
ui->tableWidget->setDragEnabled(true);
|
||||
@ -41,6 +42,8 @@ MapCfgDlg::MapCfgDlg(QWidget *parent) :
|
||||
connect(ui->search,&QLineEdit::textChanged,this,&MapCfgDlg::searchData);
|
||||
connect(ui->ok,&QPushButton::clicked,this,&MapCfgDlg::okClicked);
|
||||
connect(ui->cancle,&QPushButton::clicked,this,&MapCfgDlg::cancleClicked);
|
||||
|
||||
CustomUiDialog::setAutoLayout(true);
|
||||
}
|
||||
|
||||
MapCfgDlg::~MapCfgDlg()
|
||||
|
||||
@ -6,12 +6,13 @@
|
||||
#include <QPair>
|
||||
#include "model_excel/xlsx/xlsxdocument.h"
|
||||
#include "model_excel/xlsx/xlsxformat.h"
|
||||
#include "pub_widget/CustomDialog.h"
|
||||
|
||||
namespace Ui {
|
||||
class MapCfgDlg;
|
||||
}
|
||||
|
||||
class MapCfgDlg : public QDialog
|
||||
class MapCfgDlg : public CustomUiDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
|
||||
@ -30,6 +30,7 @@ LIBS += \
|
||||
-lmodel_excel \
|
||||
-lpub_logger_api \
|
||||
-llog4cplus \
|
||||
-lpub_widget
|
||||
|
||||
RESOURCES += \
|
||||
icon.qrc
|
||||
|
||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1002 B |
@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file>icon/powerOutputCtrl.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
After Width: | Height: | Size: 627 B |
@ -0,0 +1,74 @@
|
||||
#include "powerCtrlplugin.h"
|
||||
|
||||
powerCtrlplugin::powerCtrlplugin(): CBlock()
|
||||
{
|
||||
// CtrlStr属性会因为InPortCtrlStr属性显示或隐藏,所以作为动态属性
|
||||
this->setProperty( QString("CtrlStr").toStdString().c_str(), "" );
|
||||
|
||||
addInPort( CPort(this, "I1", E_PORTDATA_FLOAT) );
|
||||
addInPort( CPort(this, "I2", E_PORTDATA_BOOL) );
|
||||
setInPortShowName("I1",tr("目标值"));
|
||||
setInPortShowName("I2",tr("使能"));
|
||||
|
||||
this->setProperty( C_PROPERTY_SHOWNAME, showName() );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("ActionName")).toStdString().c_str(), E_VALUEEDIT_LINEEDIT );
|
||||
|
||||
QStringList listTmp2;
|
||||
listTmp2<<tr("0-NO")<<tr("1-YES");
|
||||
this->setProperty( (C_PREFIX_COMBOBOXITEM+QString("InPortCtrlStr")).toStdString().c_str(), listTmp2 );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("InPortCtrlStr")).toStdString().c_str(), E_VALUEEDIT_COMBOBOX );
|
||||
|
||||
|
||||
ActionName = "powerCtrl";
|
||||
InPortCtrlStr = listTmp2.at(0);
|
||||
}
|
||||
|
||||
powerCtrlplugin::~powerCtrlplugin()
|
||||
{
|
||||
}
|
||||
|
||||
QString powerCtrlplugin::propertyShowName( QString sPropertyName )
|
||||
{
|
||||
if ( sPropertyName == "ActionName" )
|
||||
return tr("动作名称");
|
||||
else if ( sPropertyName == "CtrlStr" )
|
||||
return tr("控制测点串");
|
||||
else if ( sPropertyName == "InPortCtrlStr" )
|
||||
return tr("输入控制测点串");
|
||||
return sPropertyName;
|
||||
}
|
||||
|
||||
QString powerCtrlplugin::get_InPortCtrlStr()
|
||||
{
|
||||
return InPortCtrlStr;
|
||||
}
|
||||
|
||||
void powerCtrlplugin::set_InPortCtrlStr( QString sValue )
|
||||
{
|
||||
if ( sValue.startsWith("0") )
|
||||
{
|
||||
this->setProperty( QString("CtrlStr").toStdString().c_str(), "" );
|
||||
removeInPort( "I0" );
|
||||
}
|
||||
else
|
||||
{
|
||||
this->setProperty( QString("CtrlStr").toStdString().c_str(), QVariant::Invalid );
|
||||
insertInPort( 0, CPort(this, "I0", E_PORTDATA_STRING) );
|
||||
setInPortShowName("I0",tr("测点"));
|
||||
}
|
||||
emit signalPortSizeChanged();
|
||||
|
||||
InPortCtrlStr = sValue;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
|
||||
#include "CBlock.h"
|
||||
|
||||
class powerCtrlplugin : public CBlock
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA( IID Block_iid ) // Q_PLUGIN_METADATA 宏用于描述插件元数据
|
||||
Q_INTERFACES( CBlock ) // Q_INTERFACES 宏用于告诉Qt该类实现的接口
|
||||
|
||||
IMPL_PROPERTY( QString, ActionName )
|
||||
|
||||
|
||||
Q_PROPERTY( QString ActionName READ get_ActionName WRITE set_ActionName USER true DESIGNABLE true )
|
||||
Q_PROPERTY( QString InPortCtrlStr READ get_InPortCtrlStr WRITE set_InPortCtrlStr USER true DESIGNABLE true )
|
||||
|
||||
public:
|
||||
Q_INVOKABLE powerCtrlplugin();
|
||||
Q_INVOKABLE ~powerCtrlplugin();
|
||||
|
||||
public:
|
||||
QString name() { return "powerOutputCtrl"; }
|
||||
QString showName() { return QObject::tr("功率输出控制"); }
|
||||
QString propertyShowName( QString sPropertyName );
|
||||
QIcon getIcon() { return QIcon(":/icon/"+name()+".png"); }
|
||||
|
||||
private:
|
||||
QString get_InPortCtrlStr();
|
||||
void set_InPortCtrlStr( QString sValue );
|
||||
|
||||
private:
|
||||
QString InPortCtrlStr;
|
||||
};
|
||||
|
||||
|
||||
@ -0,0 +1,39 @@
|
||||
TARGET = powerCtrlplugin
|
||||
QT = core gui widgets xml sql
|
||||
CONFIG += dll
|
||||
TEMPLATE = lib
|
||||
CONFIG += qt
|
||||
|
||||
SOURCES += \
|
||||
powerCtrlplugin.cpp \
|
||||
|
||||
HEADERS += \
|
||||
powerCtrlplugin.h \
|
||||
|
||||
INCLUDEPATH += \
|
||||
../../fbd_block \
|
||||
../../fbd_tree \
|
||||
../../fbd_property \
|
||||
|
||||
LIBS += \
|
||||
-lfbd_block \
|
||||
-lfbd_tree \
|
||||
|
||||
RESOURCES += \
|
||||
icon.qrc
|
||||
|
||||
!include( ../../../../idl_files/idl_files.pri){
|
||||
error(the file idl_files.pri is not exist!!)
|
||||
}
|
||||
|
||||
!include( ../../../../common.pri ){
|
||||
error(the file common.pri is not exist!!)
|
||||
}
|
||||
|
||||
#fbd_plugins插件的统一规则
|
||||
FBD_PLUGINS_PRI=$$PWD/../fbd_plugins.pri
|
||||
exists($$FBD_PLUGINS_PRI) {
|
||||
include($$FBD_PLUGINS_PRI)
|
||||
}else {
|
||||
error("FATAL error: can not find fbd_plugins.pri")
|
||||
}
|
||||
@ -2,6 +2,18 @@
|
||||
|
||||
#define CN_MAX_UNIT_COUNT 50 //最大机组数量
|
||||
|
||||
#define CN_WIDTH 360 // 图元宽度
|
||||
#define CN_HEIGHTSPACE 70 // 输入(输出、文字)上下之间的间隔
|
||||
#define CN_FIRSTHEIGHT (CN_HEIGHTSPACE-14)/2 // 第一个输入(输出、文字)与顶的距离
|
||||
#define CN_GENHEADINPUTNUM 4 // GEN顶框输入个数
|
||||
#define CN_GENHEADOUTPUTNUM 5 // GEN顶框输出个数
|
||||
#define CN_GENINPUTNUM 5 // GEN框输入个数
|
||||
#define CN_GENOUTPUTNUM 4 // GEN框输出个数
|
||||
#define CN_MAXGENHEADNUM (CN_GENHEADINPUTNUM>=CN_GENHEADOUTPUTNUM ? CN_GENHEADINPUTNUM : CN_GENHEADOUTPUTNUM)
|
||||
#define CN_MAXGENNUM (CN_GENINPUTNUM>=CN_GENOUTPUTNUM ? CN_GENINPUTNUM : CN_GENOUTPUTNUM)
|
||||
#define CN_GENHEADHEIGHT CN_MAXGENHEADNUM*CN_HEIGHTSPACE // GEN顶框的高度
|
||||
#define CN_GENHEIGHT CN_MAXGENNUM*CN_HEIGHTSPACE // GEN框的高度
|
||||
|
||||
PowerControlGENPlugin::PowerControlGENPlugin(): CBlock()
|
||||
{
|
||||
m_nGENNum = 0;
|
||||
@ -85,6 +97,117 @@ QString PowerControlGENPlugin::propertyShowName( QString sPropertyName )
|
||||
return sPropertyName;
|
||||
}
|
||||
|
||||
QPointF PowerControlGENPlugin::getInputTextPos(const int nInputIndex, const int nInputTextWidth)
|
||||
{
|
||||
Q_UNUSED(nInputTextWidth);
|
||||
|
||||
int nY = getInputHeight(nInputIndex);
|
||||
return QPointF(1,nY);
|
||||
}
|
||||
|
||||
QPointF PowerControlGENPlugin::getOutputTextPos(const int nOutputIndex, const int nOutputTextWidth)
|
||||
{
|
||||
return QPointF(CN_WIDTH-nOutputTextWidth, getOutputHeight(nOutputIndex));
|
||||
}
|
||||
|
||||
int PowerControlGENPlugin::getInputHeight(const int nIndex, const int nPortSize, const int nPortHeight)
|
||||
{
|
||||
Q_UNUSED(nPortHeight);
|
||||
Q_UNUSED(nPortSize);
|
||||
|
||||
return getInputHeight(nIndex + 1);
|
||||
}
|
||||
|
||||
int PowerControlGENPlugin::getOutputHeight(const int nIndex, const int nPortSize, const int nPortHeight)
|
||||
{
|
||||
Q_UNUSED(nPortHeight);
|
||||
Q_UNUSED(nPortSize);
|
||||
|
||||
return getOutputHeight(nIndex + 1);
|
||||
}
|
||||
|
||||
int PowerControlGENPlugin::getFirstHeight()
|
||||
{
|
||||
return CN_FIRSTHEIGHT;
|
||||
}
|
||||
|
||||
QString PowerControlGENPlugin::getOutputRealValueSep()
|
||||
{
|
||||
return "\n";
|
||||
}
|
||||
|
||||
QPointF PowerControlGENPlugin::getIconPos(const QSize &pixmapSize)
|
||||
{
|
||||
int nX = (CN_WIDTH - pixmapSize.width()) / 2;
|
||||
return QPointF(nX,5);
|
||||
}
|
||||
|
||||
QPolygonF PowerControlGENPlugin::getPolygon(const int nWidth, const int nHeight)
|
||||
{
|
||||
// Set Polygon Top-Left: 0/0
|
||||
QPolygonF polygon;
|
||||
polygon << QPointF(0, 0) << QPointF( nWidth, 0)
|
||||
<< QPointF(nWidth, nHeight) << QPointF(0, nHeight)
|
||||
<< QPointF(0, 0);
|
||||
|
||||
const int nGENNum = this->property("UnitCnt").toInt();
|
||||
for ( int i=0; i<nGENNum; i++ )
|
||||
{
|
||||
polygon << QPointF(0, CN_GENHEADHEIGHT+i*CN_GENHEIGHT+2) << QPointF(CN_WIDTH, CN_GENHEADHEIGHT+i*CN_GENHEIGHT+2)
|
||||
<< QPointF(0, CN_GENHEADHEIGHT+i*CN_GENHEIGHT+2);
|
||||
}
|
||||
|
||||
return polygon;
|
||||
}
|
||||
|
||||
bool PowerControlGENPlugin::isCustomItemPos()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void PowerControlGENPlugin::setDefaultIconSize()
|
||||
{
|
||||
setIconSize( CN_WIDTH, CN_MAXGENHEADNUM*CN_HEIGHTSPACE);
|
||||
}
|
||||
|
||||
void PowerControlGENPlugin::afterInitialize()
|
||||
{
|
||||
int nUnitCount = this->property("UnitCnt").toInt();
|
||||
if ( nUnitCount == 0 )
|
||||
{
|
||||
this->setProperty("UnitCnt",1);
|
||||
}
|
||||
}
|
||||
|
||||
int PowerControlGENPlugin::getInputHeight(const int nIndex)
|
||||
{
|
||||
int nRet = CN_FIRSTHEIGHT;
|
||||
if ( nIndex < CN_GENHEADINPUTNUM )
|
||||
nRet += nIndex * CN_HEIGHTSPACE;
|
||||
else
|
||||
{
|
||||
nRet += CN_GENHEADHEIGHT+
|
||||
(nIndex-CN_GENHEADINPUTNUM)/CN_GENINPUTNUM*CN_GENHEIGHT+
|
||||
(nIndex-CN_GENHEADINPUTNUM)%CN_GENINPUTNUM*CN_HEIGHTSPACE;
|
||||
}
|
||||
return nRet;
|
||||
}
|
||||
|
||||
int PowerControlGENPlugin::getOutputHeight(const int nIndex)
|
||||
{
|
||||
int nRet = CN_FIRSTHEIGHT;
|
||||
if ( nIndex < CN_GENHEADOUTPUTNUM )
|
||||
nRet += nIndex * CN_HEIGHTSPACE;
|
||||
else
|
||||
{
|
||||
nRet += CN_GENHEADHEIGHT+
|
||||
(nIndex-CN_GENHEADOUTPUTNUM)/CN_GENOUTPUTNUM*CN_GENHEIGHT+
|
||||
(nIndex-CN_GENHEADOUTPUTNUM)%CN_GENOUTPUTNUM*CN_HEIGHTSPACE;
|
||||
}
|
||||
|
||||
return nRet;
|
||||
}
|
||||
|
||||
void PowerControlGENPlugin::setGENNum( int nGENNum )
|
||||
{
|
||||
if ( nGENNum < 0 )
|
||||
@ -255,30 +378,3 @@ void PowerControlGENPlugin::setCommRecovDelay( int nCommRecovDelay )
|
||||
}
|
||||
m_nCommRecovDelay = nCommRecovDelay;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -19,6 +19,30 @@ public:
|
||||
QString propertyShowName( QString sPropertyName );
|
||||
QIcon getIcon() { return QIcon(":/icon/"+name()+".png"); }
|
||||
|
||||
//< 获取图元输入端口文本的位置坐标,nInputTextWidth是文字边框的宽度
|
||||
QPointF getInputTextPos(const int nInputIndex,const int nInputTextWidth) override;
|
||||
QPointF getOutputTextPos(const int nOutputIndex,const int nOutputTextWidth) override;
|
||||
//< 获取输入端口高度
|
||||
int getInputHeight(const int nIndex, const int nPortSize, const int nPortHeight) override;
|
||||
int getOutputHeight(const int nIndex, const int nPortSize, const int nPortHeight) override;
|
||||
// 第一个输入(输出、文字)与顶的距离
|
||||
int getFirstHeight() override;
|
||||
//< 输出值显示分隔符
|
||||
QString getOutputRealValueSep() override;
|
||||
|
||||
QPointF getIconPos(const QSize &pixmapSize) override;
|
||||
//< 用于画图元外边框的折线
|
||||
QPolygonF getPolygon(const int nWidth,const int nHeight) override;
|
||||
bool isCustomItemPos() override;
|
||||
|
||||
void setDefaultIconSize() override;
|
||||
//< 初始化后执行的操作,可以图元自定义一些特殊操作
|
||||
void afterInitialize() override;
|
||||
|
||||
private:
|
||||
int getInputHeight(const int nIndex);
|
||||
int getOutputHeight(const int nIndex );
|
||||
|
||||
public:
|
||||
int getGENNum() { return m_nGENNum; }
|
||||
void setGENNum( int nGENNum );
|
||||
@ -51,16 +75,3 @@ private:
|
||||
};
|
||||
|
||||
#endif // TEMPLATEPLUGIN_H
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file>icon/powercontrollinear.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
After Width: | Height: | Size: 563 B |
@ -0,0 +1,266 @@
|
||||
#include "powercontrollinearplugin.h"
|
||||
|
||||
#define CN_MAX_UNIT_COUNT 200 //最大机组数量
|
||||
|
||||
#define CN_WIDTH 360 // 图元宽度
|
||||
#define CN_HEIGHTSPACE 70 // 输入(输出、文字)上下之间的间隔
|
||||
#define CN_FIRSTHEIGHT (CN_HEIGHTSPACE-14)/2 // 第一个输入(输出、文字)与顶的距离
|
||||
#define CN_PCSLINEARHEADINPUTNUM 7 // PCSLinear顶框输入个数
|
||||
#define CN_PCSLINEARHEADOUTPUTNUM 3 // PCSLinear顶框输出个数
|
||||
#define CN_PCSLINEARINPUTNUM 5 // PCSLinear框输入个数
|
||||
#define CN_PCSLINEAROUTPUTNUM 4 // PCSLinear框输出个数
|
||||
#define CN_MAXPCSLINEARHEADNUM (CN_PCSLINEARHEADINPUTNUM>=CN_PCSLINEARHEADOUTPUTNUM ? CN_PCSLINEARHEADINPUTNUM : CN_PCSLINEARHEADOUTPUTNUM)
|
||||
#define CN_MAXPCSLINEARNUM (CN_PCSLINEARINPUTNUM>=CN_PCSLINEAROUTPUTNUM ? CN_PCSLINEARINPUTNUM : CN_PCSLINEAROUTPUTNUM)
|
||||
#define CN_PCSLINEARHEADHEIGHT CN_MAXPCSLINEARHEADNUM*CN_HEIGHTSPACE // PCSLinear顶框的高度
|
||||
#define CN_PCSLINEARHEIGHT CN_MAXPCSLINEARNUM*CN_HEIGHTSPACE // PCSLinear框的高度
|
||||
|
||||
PowerControlLinearPlugin::PowerControlLinearPlugin(): CBlock()
|
||||
{
|
||||
m_nPCSNum = 0;
|
||||
|
||||
|
||||
|
||||
setPortShowNameFunctionEnable( false );
|
||||
|
||||
addInPort( CPort(this, "TotalPowerTargetValue", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "TotalPowerTargetValue", tr("AGC设定值") );
|
||||
addInPort( CPort(this, "Tolerance", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "Tolerance", tr("误差允许") );
|
||||
|
||||
addInPort( CPort(this, "TotalRegulateEnable", E_PORTDATA_BOOL) );
|
||||
setInPortShowName( "TotalRegulateEnable", tr("总调节使能") );
|
||||
addInPort( CPort(this, "ULSoc", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "ULSoc", tr("SOC上限") );
|
||||
addInPort( CPort(this, "LLSoc", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "LLSoc", tr("SOC下限") );
|
||||
addInPort( CPort(this, "Step", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "Step", tr("调节步进") );
|
||||
addInPort( CPort(this, "Interval", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "Interval", tr("调节周期(s)") );
|
||||
|
||||
addOutPort( CPort(this, "TotalPower", E_PORTDATA_FLOAT));
|
||||
setOutPortShowName( "TotalPower", tr("总输出有功") );
|
||||
addOutPort( CPort(this, "StatusCode", E_PORTDATA_INT) );
|
||||
setOutPortShowName( "StatusCode", tr("状态码") );
|
||||
addOutPort( CPort(this, "ErrorCode", E_PORTDATA_INT) );
|
||||
setOutPortShowName( "ErrorCode", tr("错误码") );
|
||||
|
||||
this->setProperty( C_PROPERTY_SHOWNAME, showName() );
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("UnitCnt")).toStdString().c_str(), E_VALUEEDIT_SPINBOX );
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
PowerControlLinearPlugin::~PowerControlLinearPlugin()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QString PowerControlLinearPlugin::propertyShowName( QString sPropertyName )
|
||||
{
|
||||
if ( sPropertyName == "UnitCnt" )
|
||||
return tr("机组个数");
|
||||
return sPropertyName;
|
||||
}
|
||||
|
||||
QPointF PowerControlLinearPlugin::getInputTextPos(const int nInputIndex, const int nInputTextWidth)
|
||||
{
|
||||
Q_UNUSED(nInputTextWidth);
|
||||
|
||||
int nY = getInputHeight(nInputIndex);
|
||||
return QPointF(1,nY);
|
||||
}
|
||||
|
||||
QPointF PowerControlLinearPlugin::getOutputTextPos(const int nOutputIndex, const int nOutputTextWidth)
|
||||
{
|
||||
return QPointF( (CN_WIDTH*0.6) - nOutputTextWidth, getOutputHeight(nOutputIndex) );
|
||||
}
|
||||
|
||||
int PowerControlLinearPlugin::getInputHeight(const int nIndex, const int nPortSize, const int nPortHeight)
|
||||
{
|
||||
Q_UNUSED(nPortHeight);
|
||||
Q_UNUSED(nPortSize);
|
||||
|
||||
return getInputHeight(nIndex + 1);
|
||||
}
|
||||
|
||||
int PowerControlLinearPlugin::getOutputHeight(const int nIndex, const int nPortSize, const int nPortHeight)
|
||||
{
|
||||
Q_UNUSED(nPortHeight);
|
||||
Q_UNUSED(nPortSize);
|
||||
|
||||
return getOutputHeight(nIndex + 1);
|
||||
}
|
||||
|
||||
int PowerControlLinearPlugin::getFirstHeight()
|
||||
{
|
||||
return CN_FIRSTHEIGHT;
|
||||
}
|
||||
|
||||
QString PowerControlLinearPlugin::getOutputRealValueSep()
|
||||
{
|
||||
return "\n";
|
||||
}
|
||||
|
||||
QPointF PowerControlLinearPlugin::getIconPos(const QSize &pixmapSize)
|
||||
{
|
||||
int nX = (CN_WIDTH*0.6 - pixmapSize.width()) / 2;
|
||||
return QPointF(nX,5);
|
||||
}
|
||||
|
||||
QPolygonF PowerControlLinearPlugin::getPolygon(const int nWidth, const int nHeight)
|
||||
{
|
||||
// Set Polygon Top-Left: 0/0
|
||||
QPolygonF polygon;
|
||||
polygon << QPointF(0, 0) << QPointF( nWidth, 0)
|
||||
<< QPointF(nWidth, nHeight) << QPointF(0, nHeight)
|
||||
<< QPointF(0, 0);
|
||||
|
||||
const int nPCSLinearNum = this->property("UnitCnt").toInt();
|
||||
for ( int i=0; i<nPCSLinearNum; i++ )
|
||||
{
|
||||
polygon << QPointF(0, CN_PCSLINEARHEADHEIGHT+i*CN_PCSLINEARHEIGHT+2) << QPointF(CN_WIDTH*0.6, CN_PCSLINEARHEADHEIGHT+i*CN_PCSLINEARHEIGHT+2)
|
||||
<< QPointF(0, CN_PCSLINEARHEADHEIGHT+i*CN_PCSLINEARHEIGHT+2);
|
||||
}
|
||||
|
||||
return polygon;
|
||||
}
|
||||
|
||||
bool PowerControlLinearPlugin::isCustomItemPos()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void PowerControlLinearPlugin::setDefaultIconSize()
|
||||
{
|
||||
setIconSize( CN_WIDTH*0.6, CN_MAXPCSLINEARHEADNUM*CN_HEIGHTSPACE );
|
||||
}
|
||||
|
||||
void PowerControlLinearPlugin::afterInitialize()
|
||||
{
|
||||
int nUnitCount = this->property("UnitCnt").toInt();
|
||||
if ( nUnitCount == 0 )
|
||||
{
|
||||
this->setProperty("UnitCnt",1);
|
||||
}
|
||||
}
|
||||
|
||||
int PowerControlLinearPlugin::getInputHeight(const int nIndex)
|
||||
{
|
||||
int nRet = CN_FIRSTHEIGHT;
|
||||
if ( nIndex < CN_PCSLINEARHEADINPUTNUM )
|
||||
nRet += nIndex * CN_HEIGHTSPACE;
|
||||
else
|
||||
{
|
||||
nRet += CN_PCSLINEARHEADHEIGHT+
|
||||
(nIndex-CN_PCSLINEARHEADINPUTNUM)/CN_PCSLINEARINPUTNUM*CN_PCSLINEARHEIGHT+
|
||||
(nIndex-CN_PCSLINEARHEADINPUTNUM)%CN_PCSLINEARINPUTNUM*CN_HEIGHTSPACE;
|
||||
}
|
||||
return nRet;
|
||||
}
|
||||
|
||||
int PowerControlLinearPlugin::getOutputHeight(const int nIndex)
|
||||
{
|
||||
int nRet = CN_FIRSTHEIGHT;
|
||||
if ( nIndex < CN_PCSLINEARHEADOUTPUTNUM )
|
||||
nRet += nIndex * CN_HEIGHTSPACE;
|
||||
else
|
||||
{
|
||||
nRet += CN_PCSLINEARHEADHEIGHT+
|
||||
(nIndex-CN_PCSLINEARHEADOUTPUTNUM)/CN_PCSLINEAROUTPUTNUM*CN_PCSLINEARHEIGHT+
|
||||
(nIndex-CN_PCSLINEARHEADOUTPUTNUM)%CN_PCSLINEAROUTPUTNUM*CN_HEIGHTSPACE;
|
||||
}
|
||||
return nRet;
|
||||
}
|
||||
|
||||
void PowerControlLinearPlugin::setPCSNum( int nPCSNum )
|
||||
{
|
||||
if ( nPCSNum < 0 )
|
||||
{
|
||||
emit signalErrorDisplay(tr("PCS个数不能小于0个!!!"));
|
||||
return;
|
||||
}
|
||||
if ( nPCSNum > CN_MAX_UNIT_COUNT )
|
||||
{
|
||||
emit signalErrorDisplay(tr("PCS个数不能大于200个!!!"));
|
||||
return;
|
||||
}
|
||||
|
||||
QString sPortName = "";
|
||||
QString sPortDesc = "";
|
||||
for ( int i=nPCSNum+1; i<=m_nPCSNum; i++ )
|
||||
{
|
||||
// 删除输入端口
|
||||
sPortName = QString("Unit %1 MaxDischargeP").arg(i);
|
||||
removeInPort(sPortName);
|
||||
sPortName = QString("Unit %1 MaxChargeP").arg(i);
|
||||
removeInPort(sPortName);
|
||||
sPortName = QString("Unit %1 Actual value of active power").arg(i);
|
||||
removeInPort(sPortName);
|
||||
sPortName = QString("Unit %1 SOC").arg(i);
|
||||
removeInPort(sPortName);
|
||||
sPortName = QString("Unit %1 RegulateEnable").arg(i);
|
||||
removeInPort(sPortName);
|
||||
|
||||
// 删除输出端口
|
||||
sPortName = QString("Unit %1 DistributionPower").arg(i);
|
||||
removeOutPort(sPortName);
|
||||
sPortName = QString("Unit %1 RegulateEnable").arg(i);
|
||||
removeOutPort(sPortName);
|
||||
sPortName = QString("Unit %1 StatusCode").arg(i);
|
||||
removeOutPort(sPortName);
|
||||
sPortName = QString("Unit %1 ErrorCode").arg(i);
|
||||
removeOutPort(sPortName);
|
||||
|
||||
// 删除动态属性
|
||||
|
||||
}
|
||||
for ( int i=m_nPCSNum+1; i<=nPCSNum; i++ )
|
||||
{
|
||||
// 增加输入端口
|
||||
sPortName = QString("Unit %1 MaxDischargeP").arg(i);
|
||||
sPortDesc = QString(tr("机组%1最大放电功率")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 MaxChargeP").arg(i);
|
||||
sPortDesc = QString(tr("机组%1最大充电功率")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 Actual value of active power").arg(i);
|
||||
sPortDesc = QString(tr("机组%1有功实际值")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 SOC").arg(i);
|
||||
sPortDesc = QString(tr("机组%1 SOC")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 RegulateEnable").arg(i);
|
||||
sPortDesc = QString(tr("机组%1调节使能")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_BOOL) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
|
||||
// 增加输出端口
|
||||
sPortName = QString("Unit %1 DistributionPower").arg(i);
|
||||
sPortDesc = QString(tr("机组%1分配有功")).arg(i);
|
||||
addOutPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setOutPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 RegulateEnable").arg(i);
|
||||
sPortDesc = QString(tr("机组%1调节使能")).arg(i);
|
||||
addOutPort( CPort(this, sPortName, E_PORTDATA_BOOL) );
|
||||
setOutPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 StatusCode").arg(i);
|
||||
sPortDesc = QString(tr("机组%1状态码")).arg(i);
|
||||
addOutPort( CPort(this, sPortName, E_PORTDATA_INT) );
|
||||
setOutPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 ErrorCode").arg(i);
|
||||
sPortDesc = QString(tr("机组%1错误码")).arg(i);
|
||||
addOutPort( CPort(this, sPortName, E_PORTDATA_INT) );
|
||||
setOutPortShowName( sPortName, sPortDesc );
|
||||
|
||||
// 增加动态属性
|
||||
|
||||
}
|
||||
m_nPCSNum = nPCSNum;
|
||||
emit signalPortSizeChanged();
|
||||
}
|
||||
@ -0,0 +1,57 @@
|
||||
#ifndef TEMPLATEPLUGIN_H
|
||||
#define TEMPLATEPLUGIN_H
|
||||
|
||||
#include "CBlock.h"
|
||||
|
||||
class PowerControlLinearPlugin : public CBlock
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA( IID Block_iid ) // Q_PLUGIN_METADATA 宏用于描述插件元数据
|
||||
Q_INTERFACES( CBlock ) // Q_INTERFACES 宏用于告诉Qt该类实现的接口
|
||||
|
||||
public:
|
||||
Q_INVOKABLE PowerControlLinearPlugin();
|
||||
Q_INVOKABLE ~PowerControlLinearPlugin();
|
||||
|
||||
public:
|
||||
QString name() { return "powercontrollinear"; }
|
||||
QString showName() { return QObject::tr("储能机组线性有功分配器"); }
|
||||
QString propertyShowName( QString sPropertyName );
|
||||
QIcon getIcon() { return QIcon(":/icon/"+name()+".png"); }
|
||||
|
||||
//< 获取图元输入端口文本的位置坐标,nInputTextWidth是文字边框的宽度
|
||||
QPointF getInputTextPos(const int nInputIndex,const int nInputTextWidth) override;
|
||||
QPointF getOutputTextPos(const int nOutputIndex,const int nOutputTextWidth) override;
|
||||
//< 获取输入端口高度
|
||||
int getInputHeight(const int nIndex, const int nPortSize, const int nPortHeight) override;
|
||||
int getOutputHeight(const int nIndex, const int nPortSize, const int nPortHeight) override;
|
||||
// 第一个输入(输出、文字)与顶的距离
|
||||
int getFirstHeight() override;
|
||||
//< 输出值显示分隔符
|
||||
QString getOutputRealValueSep() override;
|
||||
|
||||
QPointF getIconPos(const QSize &pixmapSize) override;
|
||||
//< 用于画图元外边框的折线
|
||||
QPolygonF getPolygon(const int nWidth,const int nHeight) override;
|
||||
bool isCustomItemPos() override;
|
||||
|
||||
void setDefaultIconSize() override;
|
||||
//< 初始化后执行的操作,可以图元自定义一些特殊操作
|
||||
void afterInitialize() override;
|
||||
|
||||
private:
|
||||
int getInputHeight(const int nIndex);
|
||||
int getOutputHeight(const int nIndex );
|
||||
|
||||
public:
|
||||
int getPCSNum () { return m_nPCSNum; }
|
||||
void setPCSNum ( int nPCSNum );
|
||||
|
||||
|
||||
private:
|
||||
int m_nPCSNum; // PCS个数 机组个数
|
||||
Q_PROPERTY( int UnitCnt READ getPCSNum WRITE setPCSNum USER true DESIGNABLE true )
|
||||
|
||||
};
|
||||
|
||||
#endif // TEMPLATEPLUGIN_H
|
||||
@ -0,0 +1,33 @@
|
||||
TARGET = powercontrollinearplugin
|
||||
QT = core gui widgets
|
||||
CONFIG += dll
|
||||
TEMPLATE = lib
|
||||
|
||||
SOURCES += \
|
||||
powercontrollinearplugin.cpp
|
||||
|
||||
HEADERS += \
|
||||
powercontrollinearplugin.h
|
||||
|
||||
INCLUDEPATH += \
|
||||
../.. \
|
||||
../../fbd_block \
|
||||
../../include
|
||||
|
||||
LIBS += \
|
||||
-lfbd_block
|
||||
|
||||
RESOURCES += \
|
||||
icon.qrc
|
||||
|
||||
!include( ../../../../common.pri ){
|
||||
error(the file common.pri is not exist!!)
|
||||
}
|
||||
|
||||
#fbd_plugins插件的统一规则
|
||||
FBD_PLUGINS_PRI=$$PWD/../fbd_plugins.pri
|
||||
exists($$FBD_PLUGINS_PRI) {
|
||||
include($$FBD_PLUGINS_PRI)
|
||||
}else {
|
||||
error("FATAL error: can not find fbd_plugins.pri")
|
||||
}
|
||||
|
Before Width: | Height: | Size: 553 B After Width: | Height: | Size: 563 B |
@ -2,6 +2,20 @@
|
||||
|
||||
#define CN_MAX_UNIT_COUNT 50 //最大机组数量
|
||||
|
||||
#define CN_WIDTH 360 // 图元宽度
|
||||
#define CN_HEIGHTSPACE 70 // 输入(输出、文字)上下之间的间隔
|
||||
#define CN_PCSHEADINPUTNUM 8 // PCS顶框输入个数
|
||||
#define CN_PCSHEADOUTPUTNUM 6 // PCS顶框输出个数
|
||||
#define CN_PCSINPUTNUM 4 // PCS框输入个数
|
||||
#define CN_PCSOUTPUTNUM 4 // PCS框输出个数
|
||||
#define CN_MAXPCSHEADNUM (CN_PCSHEADINPUTNUM>=CN_PCSHEADOUTPUTNUM ? CN_PCSHEADINPUTNUM : CN_PCSHEADOUTPUTNUM)
|
||||
#define CN_MAXPCSNUM (CN_PCSINPUTNUM>=CN_PCSOUTPUTNUM ? CN_PCSINPUTNUM : CN_PCSOUTPUTNUM)
|
||||
#define CN_PCSHEADHEIGHT CN_MAXPCSHEADNUM*CN_HEIGHTSPACE // PCS顶框的高度
|
||||
#define CN_PCSHEIGHT CN_MAXPCSNUM*CN_HEIGHTSPACE // PCS框的高度
|
||||
#define CN_PCSOUTPUTNUM 4 // PCS框输出个数
|
||||
#define CN_FIRSTHEIGHT (CN_HEIGHTSPACE-14)/2 // 第一个输入(输出、文字)与顶的距离
|
||||
#define CN_WIDTH 360 // 图元宽度
|
||||
|
||||
PowerControlPCSPlugin::PowerControlPCSPlugin(): CBlock()
|
||||
{
|
||||
m_nPCSNum = 0;
|
||||
@ -114,6 +128,119 @@ QString PowerControlPCSPlugin::propertyShowName( QString sPropertyName )
|
||||
return sPropertyName;
|
||||
}
|
||||
|
||||
int PowerControlPCSPlugin::getInputHeight(const int nIndex)
|
||||
{
|
||||
int nY = CN_FIRSTHEIGHT;
|
||||
if ( nIndex < CN_PCSHEADINPUTNUM )
|
||||
{
|
||||
nY += nIndex * CN_HEIGHTSPACE;
|
||||
}
|
||||
else
|
||||
{
|
||||
nY += CN_PCSHEADHEIGHT+
|
||||
(nIndex-CN_PCSHEADINPUTNUM)/CN_PCSINPUTNUM*CN_PCSHEIGHT+
|
||||
(nIndex-CN_PCSHEADINPUTNUM)%CN_PCSINPUTNUM*CN_HEIGHTSPACE;
|
||||
}
|
||||
|
||||
return nY;
|
||||
}
|
||||
|
||||
int PowerControlPCSPlugin::getOutputHeight(const int nIndex)
|
||||
{
|
||||
int nRet = CN_FIRSTHEIGHT;
|
||||
if ( nIndex < CN_PCSHEADOUTPUTNUM )
|
||||
nRet += nIndex * CN_HEIGHTSPACE;
|
||||
else
|
||||
{
|
||||
nRet += CN_PCSHEADHEIGHT+
|
||||
(nIndex-CN_PCSHEADOUTPUTNUM)/CN_PCSOUTPUTNUM*CN_PCSHEIGHT+
|
||||
(nIndex-CN_PCSHEADOUTPUTNUM)%CN_PCSOUTPUTNUM*CN_HEIGHTSPACE;
|
||||
}
|
||||
return nRet;
|
||||
}
|
||||
|
||||
QPointF PowerControlPCSPlugin::getInputTextPos(const int nInputIndex, const int nInputTextWidth)
|
||||
{
|
||||
Q_UNUSED(nInputTextWidth);
|
||||
|
||||
int nY = getInputHeight(nInputIndex);
|
||||
return QPointF(1,nY);
|
||||
}
|
||||
|
||||
QPointF PowerControlPCSPlugin::getOutputTextPos(const int nOutputIndex, const int nOutputTextWidth)
|
||||
{
|
||||
return QPointF(CN_WIDTH-nOutputTextWidth, getOutputHeight(nOutputIndex));
|
||||
}
|
||||
|
||||
QPointF PowerControlPCSPlugin::getIconPos(const QSize &pixmapSize)
|
||||
{
|
||||
int nX = (CN_WIDTH - pixmapSize.width()) / 2;
|
||||
return QPointF(nX,5);
|
||||
}
|
||||
|
||||
int PowerControlPCSPlugin::getInputHeight(const int nIndex, const int nPortSize, const int nPortHeight)
|
||||
{
|
||||
Q_UNUSED(nPortHeight);
|
||||
Q_UNUSED(nPortSize);
|
||||
|
||||
return getInputHeight(nIndex + 1);
|
||||
}
|
||||
|
||||
int PowerControlPCSPlugin::getOutputHeight(const int nIndex, const int nPortSize, const int nPortHeight)
|
||||
{
|
||||
Q_UNUSED(nPortHeight);
|
||||
Q_UNUSED(nPortSize);
|
||||
|
||||
return getOutputHeight(nIndex + 1);
|
||||
}
|
||||
|
||||
int PowerControlPCSPlugin::getFirstHeight()
|
||||
{
|
||||
return CN_FIRSTHEIGHT;
|
||||
}
|
||||
|
||||
void PowerControlPCSPlugin::setDefaultIconSize()
|
||||
{
|
||||
setIconSize( CN_WIDTH, CN_MAXPCSHEADNUM*CN_HEIGHTSPACE );
|
||||
}
|
||||
|
||||
bool PowerControlPCSPlugin::isCustomItemPos()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void PowerControlPCSPlugin::afterInitialize()
|
||||
{
|
||||
int nUnitCount = this->property("UnitCnt").toInt();
|
||||
if ( nUnitCount == 0 )
|
||||
{
|
||||
this->setProperty("UnitCnt",1);
|
||||
}
|
||||
}
|
||||
|
||||
QString PowerControlPCSPlugin::getOutputRealValueSep()
|
||||
{
|
||||
return "\n";
|
||||
}
|
||||
|
||||
QPolygonF PowerControlPCSPlugin::getPolygon(const int nWidth, const int nHeight)
|
||||
{
|
||||
// Set Polygon Top-Left: 0/0
|
||||
QPolygonF polygon;
|
||||
polygon << QPointF(0, 0) << QPointF( nWidth, 0)
|
||||
<< QPointF(nWidth, nHeight) << QPointF(0, nHeight)
|
||||
<< QPointF(0, 0);
|
||||
|
||||
const int nPCSNum = this->property("UnitCnt").toInt();
|
||||
for ( int i=0; i < nPCSNum; i++ )
|
||||
{
|
||||
polygon << QPointF(0, CN_PCSHEADHEIGHT+i*CN_PCSHEIGHT+2) << QPointF(CN_WIDTH, CN_PCSHEADHEIGHT+i*CN_PCSHEIGHT+2)
|
||||
<< QPointF(0, CN_PCSHEADHEIGHT+i*CN_PCSHEIGHT+2);
|
||||
}
|
||||
|
||||
return polygon;
|
||||
}
|
||||
|
||||
void PowerControlPCSPlugin::setPCSNum( int nPCSNum )
|
||||
{
|
||||
if ( nPCSNum < 0 )
|
||||
@ -321,29 +448,3 @@ void PowerControlPCSPlugin::setCommRecovDelay( int nCommRecovDelay )
|
||||
// m_fMinSoc = fMinSoc;
|
||||
//}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -19,6 +19,30 @@ public:
|
||||
QString propertyShowName( QString sPropertyName );
|
||||
QIcon getIcon() { return QIcon(":/icon/"+name()+".png"); }
|
||||
|
||||
//< 获取图元输入端口文本的位置坐标,nInputTextWidth是文字边框的宽度
|
||||
QPointF getInputTextPos(const int nInputIndex,const int nInputTextWidth) override;
|
||||
QPointF getOutputTextPos(const int nOutputIndex,const int nOutputTextWidth) override;
|
||||
//< 获取输入端口高度
|
||||
int getInputHeight(const int nIndex, const int nPortSize, const int nPortHeight) override;
|
||||
int getOutputHeight(const int nIndex, const int nPortSize, const int nPortHeight) override;
|
||||
// 第一个输入(输出、文字)与顶的距离
|
||||
int getFirstHeight() override;
|
||||
//< 输出值显示分隔符
|
||||
QString getOutputRealValueSep() override;
|
||||
|
||||
QPointF getIconPos(const QSize &pixmapSize) override;
|
||||
//< 用于画图元外边框的折线
|
||||
QPolygonF getPolygon(const int nWidth,const int nHeight) override;
|
||||
bool isCustomItemPos() override;
|
||||
|
||||
void setDefaultIconSize() override;
|
||||
//< 初始化后执行的操作,可以图元自定义一些特殊操作
|
||||
void afterInitialize() override;
|
||||
|
||||
private:
|
||||
int getInputHeight(const int nIndex);
|
||||
int getOutputHeight(const int nIndex );
|
||||
|
||||
public:
|
||||
int getPCSNum () { return m_nPCSNum; }
|
||||
void setPCSNum ( int nPCSNum );
|
||||
@ -67,26 +91,3 @@ private:
|
||||
};
|
||||
|
||||
#endif // TEMPLATEPLUGIN_H
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file>icon/powercontrolreactive.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
After Width: | Height: | Size: 563 B |
@ -0,0 +1,401 @@
|
||||
#include "powercontrolreactiveplugin.h"
|
||||
|
||||
#define CN_MAX_UNIT_COUNT 300 //最大机组数量
|
||||
|
||||
#define CN_WIDTH 230 // 图元宽度
|
||||
#define CN_HEIGHTSPACE 50 // 输入(输出、文字)上下之间的间隔
|
||||
#define CN_FIRSTHEIGHT (CN_HEIGHTSPACE-14)/2 // 第一个输入(输出、文字)与顶的距离
|
||||
#define CN_PCSREACTIVEHEADINPUTNUM 4 // PCSREACTIVE顶框输入个数
|
||||
#define CN_PCSREACTIVEHEADOUTPUTNUM 3 // PCSREACTIVE顶框输出个数
|
||||
#define CN_PCSREACTIVEINPUTNUM 4 // PCSREACTIVE框输入个数
|
||||
#define CN_PCSREACTIVEOUTPUTNUM 4 // PCSREACTIVE框输出个数
|
||||
#define CN_MAXPCSREACTIVEHEADNUM (m_nTopInPortNum>=m_nTopOutPortNum ? m_nTopInPortNum : m_nTopOutPortNum)
|
||||
#define CN_MAXPCSREACTIVENUM (CN_PCSREACTIVEINPUTNUM>=CN_PCSREACTIVEOUTPUTNUM ? CN_PCSREACTIVEINPUTNUM : CN_PCSREACTIVEOUTPUTNUM)
|
||||
#define CN_PCSREACTIVEHEADHEIGHT CN_MAXPCSREACTIVEHEADNUM*CN_HEIGHTSPACE // PCSREACTIVE顶框的高度
|
||||
#define CN_PCSREACTIVEHEIGHT CN_MAXPCSREACTIVENUM*CN_HEIGHTSPACE // PCSREACTIVE框的高度
|
||||
|
||||
PowerControlReactivePlugin::PowerControlReactivePlugin(): CBlock()
|
||||
{
|
||||
m_nPCSNum = 0;
|
||||
m_nCustomPortSpace = CN_HEIGHTSPACE;
|
||||
m_fCommPrecision = 0.01f;
|
||||
m_fRegulatePrecision = 50;
|
||||
m_fMinAllocP = 50;
|
||||
m_nRegulateCycle = 0;
|
||||
m_nWaitRespTimeout = 3000;
|
||||
|
||||
initPropertyMAP();
|
||||
|
||||
setPortShowNameFunctionEnable( false );
|
||||
|
||||
addInPort( CPort(this, "TotalRegulateEnable", E_PORTDATA_BOOL) );
|
||||
setInPortShowName( "TotalRegulateEnable", tr("总调节使能") );
|
||||
|
||||
addInPort( CPort(this, "TotalPowerTargetValue", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "TotalPowerTargetValue", tr("AVC设定值") );
|
||||
|
||||
addInPort( CPort(this, "TotalDeadband", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "TotalDeadband", tr("调节死区") );
|
||||
addInPort( CPort(this, "Step", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "Step", tr("最大调节步进") );
|
||||
addInPort( CPort(this, "Interval", E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( "Interval", tr("最小调节周期(ms)") );
|
||||
m_nTopInPortNum = getInPortSize();
|
||||
|
||||
addOutPort( CPort(this, "TotalSetP", E_PORTDATA_FLOAT));
|
||||
setOutPortShowName( "TotalSetP", tr("总分配无功") );
|
||||
addOutPort(CPort(this, "TotalTargetP", E_PORTDATA_FLOAT));
|
||||
setOutPortShowName("TotalTargetP", tr("总目标无功"));
|
||||
addOutPort( CPort(this, "TotalRealP", E_PORTDATA_FLOAT));
|
||||
setOutPortShowName( "TotalRealP", tr("总实时无功") );
|
||||
addOutPort( CPort(this, "TotalUpMarginPower", E_PORTDATA_FLOAT) );
|
||||
setOutPortShowName( "TotalUpMarginPower", tr("总可增无功") );
|
||||
addOutPort( CPort(this, "TotalDownMarginPower", E_PORTDATA_FLOAT) );
|
||||
setOutPortShowName( "TotalDownMarginPower", tr("总可减无功") );
|
||||
addOutPort(CPort(this, "TotalNonRegulatePower", E_PORTDATA_FLOAT));
|
||||
setOutPortShowName("TotalNonRegulatePower", tr("总不可调功率"));
|
||||
addOutPort( CPort(this, "StatusCode", E_PORTDATA_INT) );
|
||||
setOutPortShowName( "StatusCode", tr("状态码") );
|
||||
addOutPort( CPort(this, "ErrorCode", E_PORTDATA_INT) );
|
||||
setOutPortShowName( "ErrorCode", tr("错误码") );
|
||||
m_nTopOutPortNum = getOutPortSize();
|
||||
|
||||
|
||||
this->setProperty( C_PROPERTY_SHOWNAME, showName() );
|
||||
//< 端口间隔
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("PortSpace")).toStdString().c_str(), E_VALUEEDIT_SPINBOX );
|
||||
//< 机组数量
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("UnitCnt")).toStdString().c_str(), E_VALUEEDIT_SPINBOX );
|
||||
|
||||
//< 功率分配算法
|
||||
QStringList listTmp;
|
||||
listTmp<<tr("1-上限比例")<< tr("2-SOC均衡") << tr("3-平均分配");
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("AllocALG")).toStdString().c_str(), E_VALUEEDIT_COMBOBOX );
|
||||
this->setProperty( (C_PREFIX_COMBOBOXITEM+QString("AllocALG")).toStdString().c_str(), listTmp);
|
||||
AllocALG = listTmp.at(0);
|
||||
|
||||
//< 反馈超时时间
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("WaitRespTimeout")).toStdString().c_str(), E_VALUEEDIT_SPINBOX );
|
||||
//< 稳定时定时分配间隔
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("RegulateCycle")).toStdString().c_str(), E_VALUEEDIT_SPINBOX );
|
||||
|
||||
//< 机组参数
|
||||
//< 最小分配功率
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("MinAllocP")).toStdString().c_str(), E_VALUEEDIT_DOUBLESPINBOX );
|
||||
//< 通讯精度
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("CommPrecision")).toStdString().c_str(), E_VALUEEDIT_DOUBLESPINBOX );
|
||||
//< 调节精度
|
||||
this->setProperty( (C_PREFIX_VALUEEDITTYPE+QString("RegulatePrecision")).toStdString().c_str(), E_VALUEEDIT_DOUBLESPINBOX );
|
||||
|
||||
|
||||
}
|
||||
|
||||
PowerControlReactivePlugin::~PowerControlReactivePlugin()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void PowerControlReactivePlugin::initPropertyMAP()
|
||||
{
|
||||
m_mapProperty["UnitCnt"] = tr("机组个数");
|
||||
m_mapProperty["PortSpace"] = tr("端口间隔");
|
||||
m_mapProperty["AllocALG"] = tr("功率分配算法");
|
||||
m_mapProperty["CommPrecision"] = tr("通讯精度");
|
||||
m_mapProperty["RegulatePrecision"] = tr("调节精度");
|
||||
m_mapProperty["WaitRespTimeout"] = tr("调节反馈超时时间(单位:ms)");
|
||||
m_mapProperty["RegulateCycle"] = tr("稳定时调节周期(单位:s)");
|
||||
m_mapProperty["MinAllocP"] = tr("最小分配功率");
|
||||
}
|
||||
|
||||
QString PowerControlReactivePlugin::propertyShowName( QString sPropertyName )
|
||||
{
|
||||
auto iter = m_mapProperty.find(sPropertyName);
|
||||
if(iter != m_mapProperty.end())
|
||||
{
|
||||
return iter.value();
|
||||
}
|
||||
|
||||
return sPropertyName;
|
||||
}
|
||||
|
||||
QPointF PowerControlReactivePlugin::getInputTextPos(const int nInputIndex, const int nInputTextWidth)
|
||||
{
|
||||
Q_UNUSED(nInputTextWidth);
|
||||
|
||||
int nY = getInputHeight(nInputIndex);
|
||||
return QPointF(1,nY);
|
||||
}
|
||||
|
||||
QPointF PowerControlReactivePlugin::getOutputTextPos(const int nOutputIndex, const int nOutputTextWidth)
|
||||
{
|
||||
return QPointF( CN_WIDTH - nOutputTextWidth, getOutputHeight(nOutputIndex) );
|
||||
}
|
||||
|
||||
int PowerControlReactivePlugin::getInputHeight(const int nIndex, const int nPortSize, const int nPortHeight)
|
||||
{
|
||||
Q_UNUSED(nPortHeight);
|
||||
Q_UNUSED(nPortSize);
|
||||
|
||||
return getInputHeight(nIndex + 1);
|
||||
}
|
||||
|
||||
int PowerControlReactivePlugin::getOutputHeight(const int nIndex, const int nPortSize, const int nPortHeight)
|
||||
{
|
||||
Q_UNUSED(nPortHeight);
|
||||
Q_UNUSED(nPortSize);
|
||||
|
||||
return getOutputHeight(nIndex + 1);
|
||||
}
|
||||
|
||||
int PowerControlReactivePlugin::getFirstHeight()
|
||||
{
|
||||
return CN_FIRSTHEIGHT;
|
||||
}
|
||||
|
||||
QString PowerControlReactivePlugin::getOutputRealValueSep()
|
||||
{
|
||||
return "\n";
|
||||
}
|
||||
|
||||
QPointF PowerControlReactivePlugin::getIconPos(const QSize &pixmapSize)
|
||||
{
|
||||
int nX = (CN_WIDTH - pixmapSize.width()) / 2;
|
||||
return QPointF(nX,5);
|
||||
}
|
||||
|
||||
QPolygonF PowerControlReactivePlugin::getPolygon(const int nWidth, const int nHeight)
|
||||
{
|
||||
// Set Polygon Top-Left: 0/0
|
||||
QPolygonF polygon;
|
||||
polygon << QPointF(0, 0) << QPointF( nWidth, 0)
|
||||
<< QPointF(nWidth, nHeight) << QPointF(0, nHeight)
|
||||
<< QPointF(0, 0);
|
||||
|
||||
const int nPCSLinearNum = this->property("UnitCnt").toInt();
|
||||
for ( int i=0; i<nPCSLinearNum; i++ )
|
||||
{
|
||||
polygon << QPointF(0, CN_PCSREACTIVEHEADHEIGHT+i*CN_PCSREACTIVEHEIGHT+2) << QPointF(CN_WIDTH, CN_PCSREACTIVEHEADHEIGHT+i*CN_PCSREACTIVEHEIGHT+2)
|
||||
<< QPointF(0, CN_PCSREACTIVEHEADHEIGHT+i*CN_PCSREACTIVEHEIGHT+2);
|
||||
}
|
||||
|
||||
return polygon;
|
||||
}
|
||||
|
||||
bool PowerControlReactivePlugin::isCustomItemPos()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void PowerControlReactivePlugin::setDefaultIconSize()
|
||||
{
|
||||
setIconSize( CN_WIDTH, CN_MAXPCSREACTIVEHEADNUM*m_nCustomPortSpace );
|
||||
}
|
||||
|
||||
void PowerControlReactivePlugin::afterInitialize()
|
||||
{
|
||||
int nUnitCount = this->property("UnitCnt").toInt();
|
||||
if ( nUnitCount == 0 )
|
||||
{
|
||||
this->setProperty("UnitCnt",1);
|
||||
}
|
||||
}
|
||||
|
||||
int PowerControlReactivePlugin::getInputHeight(const int nIndex)
|
||||
{
|
||||
int nRet = CN_FIRSTHEIGHT;
|
||||
if ( nIndex < m_nTopInPortNum )
|
||||
nRet += nIndex * m_nCustomPortSpace;
|
||||
else
|
||||
{
|
||||
nRet += CN_PCSREACTIVEHEADHEIGHT+
|
||||
(nIndex-m_nTopInPortNum)/CN_PCSREACTIVEINPUTNUM*CN_PCSREACTIVEHEIGHT+
|
||||
(nIndex-m_nTopInPortNum)%CN_PCSREACTIVEINPUTNUM*m_nCustomPortSpace;
|
||||
}
|
||||
return nRet;
|
||||
}
|
||||
|
||||
int PowerControlReactivePlugin::getOutputHeight(const int nIndex)
|
||||
{
|
||||
int nRet = CN_FIRSTHEIGHT;
|
||||
if ( nIndex < m_nTopOutPortNum )
|
||||
nRet += nIndex * m_nCustomPortSpace;
|
||||
else
|
||||
{
|
||||
nRet += CN_PCSREACTIVEHEADHEIGHT+
|
||||
(nIndex-m_nTopOutPortNum)/CN_PCSREACTIVEOUTPUTNUM*CN_PCSREACTIVEHEIGHT+
|
||||
(nIndex-m_nTopOutPortNum)%CN_PCSREACTIVEOUTPUTNUM*m_nCustomPortSpace;
|
||||
}
|
||||
return nRet;
|
||||
}
|
||||
|
||||
|
||||
void PowerControlReactivePlugin::setPCSNum( int nPCSNum )
|
||||
{
|
||||
if ( nPCSNum < 0 )
|
||||
{
|
||||
emit signalErrorDisplay(tr("PCS个数不能小于0个!!!"));
|
||||
return;
|
||||
}
|
||||
if ( nPCSNum > CN_MAX_UNIT_COUNT )
|
||||
{
|
||||
emit signalErrorDisplay(tr("PCS个数不能大于200个!!!"));
|
||||
return;
|
||||
}
|
||||
|
||||
QString sPortName = "";
|
||||
QString sPortDesc = "";
|
||||
for ( int i=nPCSNum+1; i<=m_nPCSNum; i++ )
|
||||
{
|
||||
// 删除输入端口
|
||||
sPortName = QString("Unit %1 Set value of reactive power").arg(i);
|
||||
removeInPort(sPortName);
|
||||
|
||||
sPortName = QString("Unit %1 Actual value of reactive power").arg(i);
|
||||
removeInPort(sPortName);
|
||||
|
||||
sPortName = QString("Unit %1 UpperLimitP").arg(i);
|
||||
removeInPort(sPortName);
|
||||
sPortName = QString("Unit %1 LowerLimitP").arg(i);
|
||||
removeInPort(sPortName);
|
||||
sPortName = QString("Unit %1 RegulateEnable").arg(i);
|
||||
removeInPort(sPortName);
|
||||
|
||||
// 删除输出端口
|
||||
sPortName = QString("Unit %1 DistributionPower").arg(i);
|
||||
removeOutPort(sPortName);
|
||||
sPortName = QString("Unit %1 RegulateEnable").arg(i);
|
||||
removeOutPort(sPortName);
|
||||
sPortName = QString("Unit %1 StatusCode").arg(i);
|
||||
removeOutPort(sPortName);
|
||||
sPortName = QString("Unit %1 ErrorCode").arg(i);
|
||||
removeOutPort(sPortName);
|
||||
|
||||
// 删除动态属性
|
||||
|
||||
}
|
||||
for ( int i=m_nPCSNum+1; i<=nPCSNum; i++ )
|
||||
{
|
||||
// 增加输入端口
|
||||
sPortName = QString("Unit %1 Set value of reactive power").arg(i);
|
||||
sPortDesc = QString(tr("机组%1无功设定值")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
|
||||
sPortName = QString("Unit %1 Actual value of reactive power").arg(i);
|
||||
sPortDesc = QString(tr("机组%1无功实际值")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
|
||||
sPortName = QString("Unit %1 UpperLimitP").arg(i);
|
||||
sPortDesc = QString(tr("机组%1无功功率可调上限")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
|
||||
sPortName = QString("Unit %1 LowerLimitP").arg(i);
|
||||
sPortDesc = QString(tr("机组%1无功功率可调下限")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
|
||||
|
||||
sPortName = QString("Unit %1 RegulateEnable").arg(i);
|
||||
sPortDesc = QString(tr("机组%1调节使能")).arg(i);
|
||||
addInPort( CPort(this, sPortName, E_PORTDATA_BOOL) );
|
||||
setInPortShowName( sPortName, sPortDesc );
|
||||
|
||||
// 增加输出端口
|
||||
sPortName = QString("Unit %1 DistributionPower").arg(i);
|
||||
sPortDesc = QString(tr("机组%1分配无功")).arg(i);
|
||||
addOutPort( CPort(this, sPortName, E_PORTDATA_FLOAT) );
|
||||
setOutPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 RegulateEnable").arg(i);
|
||||
sPortDesc = QString(tr("机组%1调节使能")).arg(i);
|
||||
addOutPort( CPort(this, sPortName, E_PORTDATA_BOOL) );
|
||||
setOutPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 StatusCode").arg(i);
|
||||
sPortDesc = QString(tr("机组%1状态码")).arg(i);
|
||||
addOutPort( CPort(this, sPortName, E_PORTDATA_INT) );
|
||||
setOutPortShowName( sPortName, sPortDesc );
|
||||
sPortName = QString("Unit %1 ErrorCode").arg(i);
|
||||
sPortDesc = QString(tr("机组%1错误码")).arg(i);
|
||||
addOutPort( CPort(this, sPortName, E_PORTDATA_INT) );
|
||||
setOutPortShowName( sPortName, sPortDesc );
|
||||
|
||||
// 增加动态属性
|
||||
|
||||
}
|
||||
m_nPCSNum = nPCSNum;
|
||||
emit signalPortSizeChanged();
|
||||
}
|
||||
void PowerControlReactivePlugin::setSpace(int nValue)
|
||||
{
|
||||
if (nValue > 100)
|
||||
{
|
||||
emit signalErrorDisplay(tr("端口间隔不能大于100"));
|
||||
return;
|
||||
}
|
||||
|
||||
if(nValue < 20)
|
||||
{
|
||||
emit signalErrorDisplay(tr("端口间隔不能小于20"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_nCustomPortSpace = nValue;
|
||||
emit signalPortSizeChanged();
|
||||
}
|
||||
|
||||
void PowerControlReactivePlugin::setWaitRespTimeout(int nWaitRespTimeout)
|
||||
{
|
||||
if(nWaitRespTimeout <= 0)
|
||||
{
|
||||
emit signalErrorDisplay(tr("【调节反馈超时时间】值错误,合法值:大于0"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_nWaitRespTimeout = nWaitRespTimeout;
|
||||
}
|
||||
|
||||
void PowerControlReactivePlugin::setRegulateCycle(int nRegulateCycle)
|
||||
{
|
||||
if(nRegulateCycle < 0)
|
||||
{
|
||||
emit signalErrorDisplay(tr("【稳定时调节周期】值错误,合法值:大于等于0"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_nRegulateCycle = nRegulateCycle;
|
||||
}
|
||||
|
||||
void PowerControlReactivePlugin::setMinAllocP(float fMinAllocP)
|
||||
{
|
||||
if(fMinAllocP <= 0)
|
||||
{
|
||||
emit signalErrorDisplay(tr("【最小分配功率】值错误,合法值:大于0"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_fMinAllocP = fMinAllocP;
|
||||
}
|
||||
|
||||
void PowerControlReactivePlugin::setCommPrecision(float fCommPrecision)
|
||||
{
|
||||
if(fCommPrecision < 0)
|
||||
{
|
||||
emit signalErrorDisplay(tr("【通讯精度】值错误,合法值:大于0"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_fCommPrecision = fCommPrecision;
|
||||
}
|
||||
|
||||
void PowerControlReactivePlugin::setRegulatePrecision(float fRegulatePrecision)
|
||||
{
|
||||
if(fRegulatePrecision < 0)
|
||||
{
|
||||
emit signalErrorDisplay(tr("【调节精度】值错误,合法值:大于0"));
|
||||
return;
|
||||
}
|
||||
|
||||
m_fRegulatePrecision = fRegulatePrecision;
|
||||
}
|
||||
|
||||
@ -0,0 +1,98 @@
|
||||
#ifndef TEMPLATEPLUGIN_H
|
||||
#define TEMPLATEPLUGIN_H
|
||||
|
||||
#include "CBlock.h"
|
||||
|
||||
class PowerControlReactivePlugin : public CBlock
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA( IID Block_iid ) // Q_PLUGIN_METADATA 宏用于描述插件元数据
|
||||
Q_INTERFACES( CBlock ) // Q_INTERFACES 宏用于告诉Qt该类实现的接口
|
||||
|
||||
public:
|
||||
Q_INVOKABLE PowerControlReactivePlugin();
|
||||
Q_INVOKABLE ~PowerControlReactivePlugin();
|
||||
|
||||
public:
|
||||
QString name() { return "powercontrolreactive"; }
|
||||
QString showName() { return QObject::tr("储能无功分配器"); }
|
||||
QString propertyShowName( QString sPropertyName );
|
||||
QIcon getIcon() { return QIcon(":/icon/"+name()+".png"); }
|
||||
|
||||
//< 获取图元输入端口文本的位置坐标,nInputTextWidth是文字边框的宽度
|
||||
QPointF getInputTextPos(const int nInputIndex,const int nInputTextWidth) override;
|
||||
QPointF getOutputTextPos(const int nOutputIndex,const int nOutputTextWidth) override;
|
||||
//< 获取输入端口高度
|
||||
int getInputHeight(const int nIndex, const int nPortSize, const int nPortHeight) override;
|
||||
int getOutputHeight(const int nIndex, const int nPortSize, const int nPortHeight) override;
|
||||
// 第一个输入(输出、文字)与顶的距离
|
||||
int getFirstHeight() override;
|
||||
//< 输出值显示分隔符
|
||||
QString getOutputRealValueSep() override;
|
||||
|
||||
QPointF getIconPos(const QSize &pixmapSize) override;
|
||||
//< 用于画图元外边框的折线
|
||||
QPolygonF getPolygon(const int nWidth,const int nHeight) override;
|
||||
bool isCustomItemPos() override;
|
||||
|
||||
void setDefaultIconSize() override;
|
||||
//< 初始化后执行的操作,可以图元自定义一些特殊操作
|
||||
void afterInitialize() override;
|
||||
|
||||
private:
|
||||
int getInputHeight(const int nIndex);
|
||||
int getOutputHeight(const int nIndex );
|
||||
void initPropertyMAP();
|
||||
|
||||
public:
|
||||
int getPCSNum () { return m_nPCSNum; }
|
||||
void setPCSNum ( int nPCSNum );
|
||||
int getSpace() { return m_nCustomPortSpace; }
|
||||
void setSpace( int nValue );
|
||||
|
||||
void setWaitRespTimeout(int nWaitRespTimeout);
|
||||
int getWaitRespTimeout() {return m_nWaitRespTimeout;}
|
||||
void setRegulateCycle(int nRegulateCycle);
|
||||
int getRegulateCycle() {return m_nRegulateCycle;}
|
||||
|
||||
void setMinAllocP(float fMinAllocP);
|
||||
float getMinAllocP() {return m_fMinAllocP;}
|
||||
|
||||
void setCommPrecision(float fCommPrecision);
|
||||
float getCommPrecision() {return m_fCommPrecision;}
|
||||
void setRegulatePrecision(float fRegulatePrecision);
|
||||
float getRegulatePrecision() {return m_fRegulatePrecision;}
|
||||
|
||||
private:
|
||||
QMap<QString,QString> m_mapProperty;
|
||||
int m_nTopInPortNum; //< 顶框中输入端口个数
|
||||
int m_nTopOutPortNum; //< 顶框中输出端口个数
|
||||
|
||||
int m_nCustomPortSpace;
|
||||
Q_PROPERTY(int PortSpace READ getSpace WRITE setSpace USER true DESIGNABLE true)
|
||||
|
||||
int m_nPCSNum; // PCS个数 机组个数
|
||||
Q_PROPERTY( int UnitCnt READ getPCSNum WRITE setPCSNum USER true DESIGNABLE true )
|
||||
|
||||
IMPL_PROPERTY( QString, AllocALG ) // 功率分配算法 allocation algorithm
|
||||
Q_PROPERTY( QString AllocALG READ get_AllocALG WRITE set_AllocALG USER true DESIGNABLE true )
|
||||
|
||||
int m_nWaitRespTimeout; //< 等待调节反馈超时时间
|
||||
Q_PROPERTY( int WaitRespTimeout READ getWaitRespTimeout WRITE setWaitRespTimeout USER true DESIGNABLE true )
|
||||
|
||||
int m_nRegulateCycle; //< 稳定时定时调节周期
|
||||
Q_PROPERTY( int RegulateCycle READ getRegulateCycle WRITE setRegulateCycle USER true DESIGNABLE true )
|
||||
|
||||
float m_fMinAllocP; //< 最小分配功率
|
||||
Q_PROPERTY( float MinAllocP READ getMinAllocP WRITE setMinAllocP USER true DESIGNABLE true )
|
||||
|
||||
//< 作用:1、若读回来的机组功率设定值与下发的目标值差值的绝对值小于该值,则认为通讯成功。2、下发功率是此值的倍数
|
||||
float m_fCommPrecision;
|
||||
Q_PROPERTY( float CommPrecision READ getCommPrecision WRITE setCommPrecision USER true DESIGNABLE true )
|
||||
|
||||
//< 作用:若机组的功率实际值与设定值差值的绝对值小于该值,则认为成功。
|
||||
float m_fRegulatePrecision;
|
||||
Q_PROPERTY( float RegulatePrecision READ getRegulatePrecision WRITE setRegulatePrecision USER true DESIGNABLE true )
|
||||
};
|
||||
|
||||
#endif // TEMPLATEPLUGIN_H
|
||||
@ -0,0 +1,33 @@
|
||||
TARGET = powercontrolreactiveplugin
|
||||
QT = core gui widgets
|
||||
CONFIG += dll
|
||||
TEMPLATE = lib
|
||||
|
||||
SOURCES += \
|
||||
powercontrolreactiveplugin.cpp
|
||||
|
||||
HEADERS += \
|
||||
powercontrolreactiveplugin.h
|
||||
|
||||
INCLUDEPATH += \
|
||||
../.. \
|
||||
../../fbd_block \
|
||||
../../include
|
||||
|
||||
LIBS += \
|
||||
-lfbd_block
|
||||
|
||||
RESOURCES += \
|
||||
icon.qrc
|
||||
|
||||
!include( ../../../../common.pri ){
|
||||
error(the file common.pri is not exist!!)
|
||||
}
|
||||
|
||||
#fbd_plugins插件的统一规则
|
||||
FBD_PLUGINS_PRI=$$PWD/../fbd_plugins.pri
|
||||
exists($$FBD_PLUGINS_PRI) {
|
||||
include($$FBD_PLUGINS_PRI)
|
||||
}else {
|
||||
error("FATAL error: can not find fbd_plugins.pri")
|
||||
}
|
||||
|
Before Width: | Height: | Size: 723 B After Width: | Height: | Size: 505 B |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1000 B |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 724 B |
|
Before Width: | Height: | Size: 876 B After Width: | Height: | Size: 571 B |