变周期控制思路

举例:热值调节的过程中,调节周期在偏差较小时,可以设置较大些,调节周期在偏差较大时,可以设置较小些。并且在偏差较大时,立刻进入调节(计时器清零)。
-350<=偏差<=600,调节周期20秒,从零开始计数,大于等于20,清零,计时器等于0,调节一次,其它计数值不调节,当偏差>600 || 偏差<-350时,计数器立刻清零,调节一次,且调节周期由20变为10。

变周期控制思路_第1张图片

#include "apdefap.h"

int gscAction( void )
{

double r=GetTagDouble("R");
double rset=GetTagDouble("RSET");
double dout;

static int timer;
static int mode;
static int modearray[2];

int i;
int inum;
int time;
//modearray[2]数组大小为2
inum=2;
if(mode==1)
	time=10;
else
	time=20;
if(timer!=0)
{	
	if(r-rset<-350 || r-rset>600)
		mode=1;
	else
		mode=2;
}
//if(modearray[0]-modearray[1]<0)//模式2到模式1(下降沿)
//	timer=0;
if(fabs(modearray[0]-modearray[1])>0)
	timer=0;

if(mode==1 && timer==0)
	dout = xtoy(r-rset,-1,1, 200,-0.5,-200, 0.5);
else if(mode==2 && timer==0)
	dout = xtoy(r-rset,-1,1, 200,-0.5,-200, 0.5);
else
	dout = 0;


if(timer>=time)
	timer=0;
else
	timer=timer+1;

for(i = inum-1;i>=1;i--)
{
	modearray[i]=modearray[i-1];
}
modearray[0]=mode;

//modearray[1]=modearray[0];
//modearray[0]=mode;

SetTagDouble("DOUT",dout);
SetTagWord("TIMER",timer);
SetTagWord("MODE",mode);
return 0; 
}

源代码下载地址`
https://download.csdn.net/download/weixin_37928884/88552808

你可能感兴趣的:(WinCC,二级控制系统,建模,变周期控制)