本专利申请属于siemens控制系统二次开发智能控制技术领域,更具体地说,是涉及一种基于step7_300_plc平台下的模糊控制器二次开发设计方法。
背景技术:
siemens控制系统采用常规pid控制较为普遍,对于实际工业生产过程来讲,siemens控制系统自带的常规pid控制在启动、停止、设定值增减幅度大时会使控制量超过执行机构可能最大的动作范围所对应的极限控制量,最终引起系统较大的超调,甚至引起系统的振荡。为了适应自动化发展需要,控制系统可采用模糊控制器,并利用siemens控制系统step7和wincc进行二次开发。
为了实现智能控制,利用siemens控制系统的step7和wincc进行二次开发,以进行模糊控制设计,是一件亟需解决的事情。
技术实现要素:
本发明需要解决的技术问题是提供一种基于西门子_plc平台下模糊控制器二次开发设计方法,提高系统运行的安全性和经济性,并可以减少人员,提高生产。
为了解决上述问题,本发明所采用的技术方案是:
一种基于西门子_plc平台下模糊控制器二次开发设计方法,该方法基于siemens控制系统step7_300_plc平台和wincc进行二次开发,构筑模糊控制器,构筑出的模糊控制器以偏差
s1、模糊控制输入;
s2、计算偏差
s3、定义模糊变量及其语言值;
s4、给出输入和输出模糊变量复制表;
s5、计算模糊关系;
s6、合成运算;
s7、计算控制量并清晰化(也就是解模糊化);
s7、模糊控制输出。
本发明技术方案的进一步改进在于:s3中,模糊变量包括如下因素:
令r为设定值,y为测量值,u为输出值;
e为误差,计算公式为e=r-y;
ec为误差变化率,计算公式为ec=e1-e2,式中,e1为当前采样的误差,e2为上次采样的误差;
e和ec分别为e和ec模糊化后的模糊变量;
u为输出模糊变量。
本发明技术方案的进一步改进在于:s4中,模糊变量复制表中的模糊变量隶属函数为:
设定模糊变量e的模糊论域为[-9,9],并将其量化为7个等级{-9,-6,-3,0,3,6,9};设定模糊变量ec的模糊论域为[-18,18],并将其量化为7个等级{-18,-12,-6,0,6,12,18};输出模糊变量u的模糊论域为[-18,18],并量化为13个等级{-18,-15,-12,-9,-6,-3,0,3,6,9,12,15,18};
设定模糊变量的语言值集合,设定输入模糊变量e、输入模糊变量ec和输出模糊变量u的语言值集合均为:负大(nb),负中(nm),负小(ns),零(zo),正小(ps),正中(pm),正大(pb)七级语言变量。
本发明技术方案的进一步改进在于:step7_300_plc中的语句表编译器中编写偏差db10.dbd24、偏差变化率db10.dbd32,数据类型均选择为实型;
wincc中的全局脚本编辑器编写项目函数、动作函数,项目函数编写模糊控制,动作函数调用,动作函数增加触发器,触发器的触发周期t=2s,条件满足自动执行。
本发明技术方案的进一步改进在于:模糊变量e、ec的赋值表为:
本发明技术方案的进一步改进在于:模糊变量u的赋值表为:
本发明技术方案的进一步改进在于:模糊控制规则表为:
由于采用了上述技术方案,本发明取得的有益效果是:
(1)提高系统运行的安全性,因此,模糊控制系统的应用使系统运行的可靠性得到了进-步的提高。
(2)提高系统运行的经济性,因此,控制系统优化不但可以减少事故停机的损失和检修费用,还可以有效提高效率,降低能耗。
(3)提高生产和改善条件,因此,自动装置和监控手段可以减少人员,提高生产。
模糊控制主要优点是:
(1)设计系统时不需要建立被控对象的数学模型,只要求掌握现场操作人员或者有关专家的经验、知识或者操作者在操作过程中的操作数据及被控对象的运行数据等。
(2)被控对象参数的变化具有较强的鲁棒性,适用于对难以建立被控对象的数学模型的复杂系统进行控制,如非线性、时变、滞后系统。
(3)语言型控制,定性认识工业过程,较容易建立语言变量控制规则,易于形成知识库。
(4)控制效果好,且所需设备简单,经济效益显著。
本发明将模糊控制与siemens_plc结合起来,扬长避短,既具有模糊控制灵活而适应性强的优点,又具有plc可靠性高、参数监控修改方便、通讯便捷等优点,提高了控制精度,减轻了人员负担,具有很好的应用价值。采用plc来实现模糊控制,将使模糊控制在工业控制中发挥更大的作用。
附图说明
图1是本发明的模糊控制系统控制流程示意图;
图2是本发明的模糊控制系统结构示意图;
图3是本发明的模糊控制系统运行示意图;
图4是本发明的模糊控制系统e、ec、u语言特征值分布示意图。
具体实施方式
下面结合实施例对本发明做进一步详细说明。
本发明公开了一种基于西门子_plc平台下模糊控制器二次开发设计方法,基于siemens控制系统step7_300_plc平台和wincc进行二次开发,构筑模糊控制器,构筑出的模糊控制器以偏差
s1、模糊控制输入;
s2、计算偏差
s3、定义模糊变量及其语言值;
s4、给出输入和输出模糊变量复制表;
s5、计算模糊关系;
s6、合成运算;
s7、计算控制量并清晰化(也就是解模糊化);
s7、模糊控制输出。
s3中,模糊变量包括如下因素:
令r为设定值,y为测量值,u为输出值;
e为误差,计算公式为e=r-y;
ec为误差变化率,计算公式为ec=e1-e2,式中,e1为当前采样的误差,e2为上次采样的误差;
e和ec分别为e和ec模糊化后的模糊变量;
u为输出模糊变量。
s4中,模糊变量复制表中的模糊变量隶属函数为:
设定模糊变量e的模糊论域为[-9,9],并将其量化为7个等级{-9,-6,-3,0,3,6,9};设定模糊变量ec的模糊论域为[-18,18],并将其量化为7个等级{-18,-12,-6,0,6,12,18};输出模糊变量u的模糊论域为[-18,18],并量化为13个等级{-18,-15,-12,-9,-6,-3,0,3,6,9,12,15,18};
设定模糊变量的语言值集合,设定输入模糊变量e、输入模糊变量ec和输出模糊变量u的语言值集合均为:负大(nb),负中(nm),负小(ns),零(zo),正小(ps),正中(pm),正大(pb)七级语言变量。
step7_300_plc中的语句表编译器中编写偏差db10.dbd24、偏差变化率db10.dbd32,数据类型均选择为实型;
wincc中的全局脚本编辑器编写项目函数、动作函数,项目函数编写模糊控制,动作函数调用,动作函数增加触发器,触发器的触发周期t=2s,条件满足自动执行。
模糊变量e、ec的赋值表为:
模糊变量u的赋值表为:
模糊控制规则表为:
下面结合附图。通过实施例对本发明做进-步详细的说明。
的wincc程序编写具体为:
(1)生成项目程序fuzzy()
在wincc全局脚本中生成一个项目函数fuzzy(),用它来完成模糊控制,其项目函数源程序如下:
#pragmaoption(mbcs)
/*语言值的满幅值*/
#definefmax100
/*输入量偏差e语言值特征点*/
/*输入量偏差变化率ec语言值特征点*/
/*输出量模糊控制器输出u语言值特征点*/
intecff[4]={0,16,32,64};inteff[4]={0,12,24,48};
intuff[7]={0,15,30,45,60,75,90};
/*误差变化率-3,-2,-1,0,1,2,3*/
/*误差-3-2-10123*/
/*定义控制查询表*/
intrule[7][7]={{-6,-6,-6,-5,-5,-5,-4,},
{-5,-4,-4,-3,-2,-2,-1,},{-4,-3,-2,-1,0,1,2,},
{-4,-3,-1,0,1,3,4,},{-2,-1,0,1,2,3,4,},
{1,2,2,3,4,4,5,},{4,5,5,5,6,6,6}};
/*模糊运算引擎*/
intfuzzy(inte,intec)
{
/*偏差,偏差微分以及输出值的精确量*/
/*偏差,偏差微分以及输出值的隶属度*/
intu;unsignedintef[2],ecf[2],uf[4];
inten,ecn,un[4];longa,b;
/*隶属度的确定*/
/*根据e、ec的指定语言值获得有效隶属度*/
if(x>-eff[3]&&x<eff[3])
{
if(x<=-eff[2])
{
en=-2;ef[0]=fmax*((float)(-eff[2]-e)/(eff[3]-eff[2]));
}
elseif(x<=-eff[1])
{
en=-1;ef[0]=fmax*((float)(-eff[1]-e)/(eff[2]-eff[1]));
}
elseif(x<=eff[0])
{
en=0;ef[0]=fmax*((float)(-eff[0]-e)/(eff[1]-eff[0]));
}
elseif(x<=eff[1])
{
en=1;ef[0]=fmax*((float)(eff[1]-e)/(eff[1]-eff[0]));
}
elseif(x<=eff[2])
{
en=2;ef[0]=fmax*((float)(eff[2]-e)/(eff[2]-eff[1]));
}
elseif(x<=eff[3])
{
en=3;ef[0]=fmax*((float)(eff[3]-e)/(eff[3]-eff[2]));
}
}
elseif(x<=-eff[3])
{
en=-2;ef[0]=fmax;
}
elseif(x>=eff[3])
{
en=3;ef[0]=0;
}
ef[1]=fmax-ef[0];
if(y>-ecff[3]&&y<ecff[3])
{
if(y<=-ecff[2])
{
ecn=-2;ecf[0]=fmax*((float)(-ecff[2]-y)/(ecff[3]-ecff[2]));
}
elseif(y<=-ecff[1])
{
ecn=-1;
ecf[0]=fmax*((float)(-ecff[1]-ec)/(ecff[2]-ecff[1]));
}
elseif(y<=ecff[0])
{
ecn=0;
ecf[0]=fmax*((float)(-ecff[0]-ec)/(ecff[1]-ecff[0]));
}
elseif(y<=ecff[1])
{
ecn=1;
ecf[0]=fmax*((float)(ecff[1]-ec)/(ecff[1]-ecff[0]));
}
elseif(y<=ecff[2])
{
ecn=2;ecf[0]=fmax*((float)(ecff[2]-ec)/(ecff[2]-ecff[1]));
}
elseif(y<=ecff[3])
{
ecn=3;ecf[0]=fmax*((float)(ecff[3]-ec)/(ecff[3]-ecff[2]));
}
}
elseif(y<=-ecff[3])
{
ecn=-2;ecf[0]=fmax;
}
elseif(y>=ecff[3])
{
ecn=3;ecf[0]=0;
}
ecf[1]=fmax-ecf[0];
/*使用误差范围优化后的规则表rule[7][7]*/
/*输出值使用13个隶属函数*/
/*中心值由uff[7]指定*/
/*四个规则有效*/
un[0]=rule[en-1 3][ecn-1 3];un[1]=rule[en 3][ecn-1 3];
un[2]=rule[en-1 3][ecn 3];un[3]=rule[en 3][ecn 3];
if(ef[0]<=ecf[0])
uf[0]=ef[0];
else
uf[0]=ecf[0];
if(ef[1]<=ecf[0])
uf[1]=ef[1];
else
uf[1]=ecf[0];
if(ef[0]<=ecf[1])
uf[2]=ef[0];
else
uf[2]=ecf[1];
if(ef[1]<=ecf[1])
uf[3]=ef[1];
else
uf[3]=ecf[1];
/*同隶属函数输出语言值求大*/
if(un[0]==un[1])
{
if(uf[0]>uf[1])
uf[1]=0;
else
uf[0]=0;
}
if(un[0]==un[2])
{
if(uf[0]>uf[2])
uf[2]=0;
else
uf[0]=0;
}
if(un[0]==un[3])
{
if(uf[0]>uf[3])
uf[3]=0;
else
uf[0]=0;
}
if(un[1]==un[2])
{
if(uf[1]>uf[2])
uf[2]=0;
else
uf[1]=0;
}
if(un[1]==un[3])
{
if(uf[1]>uf[3])
uf[3]=0;
else
uf[1]=0;
}
if(un[2]==un[3])
{
if(uf[2]>uf[3])
uf[3]=0;
else
uf[2]=0;
}
/*重心法反模糊*/
/*un[]原值为输出隶属函数标号,转换为隶属函数值*/
if(un[0]>=0)
un[0]=uff[un[0]];
else
un[0]=-uff[-un[0]];
if(un[1]>=0)
un[1]=uff[un[1]];
else
un[1]=-uff[-un[1]];
if(un[2]>=0)
un[2]=uff[un[2]];
else
un[2]=-uff[-un[2]];
if(un[3]>=0)
un[3]=uff[un[3]];
else
un[3]=-uff[-un[3]];
a=uf[0]*un[0] uf[1]*un[1] uf[2]*un[2] uf[3]*un[3];
b=uf[0] uf[1] uf[2] uf[3];
u=a/b;
returnu;
}
(2)在wincc中调用模糊控制程序fuzzy()
由于项目函数本身不能被执行,必须生成一个全局动作来调用这个项目函数fuzzy()。为了将所添加的项目函数和标准函数告知wincc编译器,必须将#include“apdefap.h”作为第一行添加到全局动作函数代码中。其全局动作源程序如下:
#include"apdefap.h"
intgscaction(void)
{
floata=0;floate=0;floatec=0;floatu=0;intstatus;
status=gettagbit("status");
while(status==1)
{
switch(status)
{
case1:
e=gettagfloat("e");ec=gettagfloat("ec");
u=fuzzy(e,ec);settagfloat("u",u);
break;
if(st==0)
{
break;
}
}
break;
}
return0;
}
siemens_plc的step7程序编写
network1:计算误差e=r–y
ldb10.dbd0
ldb10.dbd4
-i
tdb10.dbd24
nop0
network2:保存第一次采样的误差e
anm6.0
jnb_001
ldb10.dbd24
tdb10.dbd28
set
save
clr
_001:abr
sm6.0
network3:计算误差变化率ec=e(i 1)-e2(i)i=1,2,...,i,i 1,...,n
a(
ldb10.dbd24
ldb10.dbd28
-r
tdb10.dbd32
anov
save
clr
abr
)
jnb_002
ldb10.dbd24
tdb10.dbd28
_002:nop0
为了实现智能控制控制,该设计利用siemens控制系统step7和wincc进行二次开发。step7负责计算编写过程值的偏差e和偏差变化率ec。wincc负责编写模糊控制部分。本发明将模糊控制与siemens_plc结合起来,扬长避短,既具有模糊控制灵活而适应性强的优点,又具有plc可靠性高、参数监控修改方便、通讯便捷等优点。采用plc来实现模糊控制,将使模糊控制在工业控制中发挥更大的作用。
step7中的语句表编译器中编写误差db10.dbd24、误差变化率db10.dbd32,数据类型均选择为实型。
wincc中的全局脚本编辑器编写项目函数、动作函数,项目函数编写模糊控制。动作函数调用。动作函数增加触发器(周期t=2s),条件满足自动执行。
1.一种基于西门子_plc平台下模糊控制器二次开发设计方法,其特征在于:
基于siemens控制系统step7_300_plc平台和wincc进行二次开发,构筑模糊控制器,构筑出的模糊控制器以偏差
s1、模糊控制输入;
s2、计算偏差
s3、定义模糊变量及其语言值;
s4、给出输入和输出模糊变量复制表;
s5、计算模糊关系;
s6、合成运算;
s7、计算控制量并清晰化;
s7、模糊控制输出。
2.根据权利要求1所述的基于西门子_plc平台下模糊控制器二次开发设计方法,其特征在于:s3中,模糊变量包括如下因素:
令r为设定值,y为测量值,u为输出值;
e为误差,计算公式为e=r-y;
ec为误差变化率,计算公式为ec=e1-e2,式中,e1为当前采样的误差,e2为上次采样的误差;
e和ec分别为e和ec模糊化后的模糊变量;
u为输出模糊变量。
3.根据权利要求2所述的基于西门子_plc平台下模糊控制器二次开发设计方法,其特征在于:s4中,模糊变量复制表中的模糊变量隶属函数为:
设定模糊变量e的模糊论域为[-9,9],并将其量化为7个等级{-9,-6,-3,0,3,6,9};设定模糊变量ec的模糊论域为[-18,18],并将其量化为7个等级{-18,-12,-6,0,6,12,18};输出模糊变量u的模糊论域为[-18,18],并量化为13个等级{-18,-15,-12,-9,-6,-3,0,3,6,9,12,15,18};
设定模糊变量的语言值集合,设定输入模糊变量e、输入模糊变量ec和输出模糊变量u的语言值集合均为:负大nb,负中nm,负小ns,零zo,正小ps,正中pm,正大pb七级语言变量。
4.根据权利要求3所述的基于西门子_plc平台下模糊控制器二次开发设计方法,其特征在于:step7_300_plc中的语句表编译器中编写偏差db10.dbd24、偏差变化率db10.dbd32,数据类型均选择为实型;
wincc中的全局脚本编辑器编写项目函数、动作函数,项目函数编写模糊控制,动作函数调用,动作函数增加触发器,触发器的触发周期t=2s,条件满足自动执行。
5.根据权利要求4所述的基于西门子_plc平台下模糊控制器二次开发设计方法,其特征在于:模糊变量e、ec的赋值表为:
6.根据权利要求5所述的基于西门子_plc平台下模糊控制器二次开发设计方法,其特征在于:模糊变量u的赋值表为:
7.根据权利要求6所述的基于西门子_plc平台下模糊控制器二次开发设计方法,其特征在于:模糊控制规则表为: