采用WinCC作为上位机框架进行开发工业控制界面,全局脚本中C-Editor进行开发工业控制模型。
我们用C#或者C++时,方法之间调用、类调用等等,比较灵活。其实WinCC和C#或者C++一样。 项目函数之间相互调用用法如下:
项目函数编写完成后,全部关闭,通过选项—>重新生成头文件
#include “AP_PBIB.H”
#include “APDEFAP.H”
必须加上以下头文件
#include "AP_PBIB.H"
#include "APDEFAP.H"
该项目函数添加上述头文件才能实现对其它项目函数进行调用
marst = aupedge(e> 0.20 && e<= 0.25 && ec> 0);
mbrst = bupedge(e> 0.25 && e<= 0.30 && ec> 0);
mcrst = cupedge(e> 0.30 && ec> 0);
mdrst = dupedge(e<-0.20 && e>=-0.25 && ec<0);
merst = eupedge(e<-0.25 && e>=-0.30 && ec<0);
mfrst = fupedge(e<-0.30 && ec< 0);
/*
e:蒸汽压力偏差
ec:蒸汽压力偏差变化率
cf:当前空气流量
krb:设定空燃比
manauto:手自动
*/
#include "AP_PBIB.H"
#include "APDEFAP.H"
double* aflowing_control(double e,double ec,double er,double ecr,double ur,double cf,double krb,double umin,double umidle,double umax,BOOL manauto)
{
BOOL marst,mbrst,mcrst,mdrst,merst,mfrst;
BOOL ma,mb,mc,md,me,mf;
double result[2];
double u;
double ke;
double kec;
double ku;
double egrad,ecgrad;
int E,EC;//索引值
double U;//
double rule[17][13] = {
{ 5.4142, 5.3557, 5.3155, 5.1658, 5.0757, 5.0188, 4.7789, 4.3334, 3.8891, 3.5692, 3.1397, 2.4440, 1.9903,},
{ 5.3390, 5.3338, 5.2910, 5.0465, 4.5707, 4.4888, 4.2632, 3.6773, 3.3778, 3.0630, 2.5135, 1.9192, 1.4531,},
{ 5.3139, 5.2791, 5.2139, 5.0194, 4.5405, 4.0300, 3.8185, 3.3822, 2.6474, 2.2449, 1.8102, 1.1916, 0.6536,},
{ 5.1553, 4.9028, 4.8534, 4.6484, 4.1371, 3.7538, 3.4571, 2.9699, 2.2751, 1.6242, 1.0637, 0.4119, -0.0121,},
{ 4.9277, 4.4331, 4.2646, 4.0716, 3.5638, 3.1049, 2.7887, 2.2806, 1.6649, 0.9845, 0.3107, -0.2975, -0.8005,},
{ 4.9494, 4.4634, 3.9776, 3.7124, 3.2728, 2.5335, 1.9966, 1.5649, 0.8880, 0.2396, -0.3898, -1.0639, -1.5404,},
{ 4.4701, 3.8909, 3.5808, 3.2882, 2.7475, 2.0981, 1.4608, 0.7897, 0.1518, -0.4716, -1.1668, -1.8093, -2.2368,},
{ 3.9287, 3.4818, 2.8249, 2.5070, 2.0421, 1.4297, 0.7181, 0.0750, -0.5364, -1.2412, -1.8928, -2.5119, -3.0558,},
{ 3.5692, 3.1437, 2.4179, 1.7464, 1.3221, 0.6340, 0.0010, -0.6322, -1.3204, -1.7452, -2.4171, -3.1426, -3.5682,},
{ 3.0564, 2.5122, 1.8937, 1.2419, 0.5367, -0.0740, -0.7172, -1.4292, -2.0410, -2.5059, -2.8240, -3.4812, -3.9280,},
{ 2.2364, 1.8089, 1.1665, 0.4713, -0.1522, -0.7900, -1.4607, -2.0980, -2.7475, -3.2881, -3.5808, -3.8908, -4.4700,},
{ 1.5396, 1.0627, 0.3888, -0.2404, -0.8893, -1.5659, -1.9976, -2.5338, -3.2730, -3.7126, -3.9776, -4.4634, -4.9493,},
{ 0.7994, 0.2967, -0.3115, -0.9854, -1.6657, -2.2814, -2.7897, -3.1058, -3.5642, -4.0721, -4.2653, -4.4331, -4.9277,},
{ 0.0104, -0.4135, -1.0655, -1.6251, -2.2761, -2.9712, -3.4578, -3.7548, -4.1385, -4.6492, -4.8545, -4.9039, -5.1553,},
{-0.6547, -1.1931, -1.8115, -2.2462, -2.6482, -3.3829, -3.8194, -4.0303, -4.5410, -5.0203, -5.2144, -5.2796, -5.3144,},
{-1.4525, -1.9183, -2.5135, -3.0627, -3.3772, -3.6778, -4.2632, -4.4886, -4.5711, -5.0468, -5.2913, -5.3340, -5.3392,},
{-1.9896, -2.4432, -3.1387, -3.5683, -3.8883, -4.3322, -4.7776, -5.0178, -5.0746, -5.1652, -5.3155, -5.3557, -5.4142}};
//
double EM=8;
double ECM=6;
double UM=6;
//
double em=er;//0.2;
double ecm=ecr;//0.05;
double um=ur;//300;
marst = aupedge(e> 0.20 && e<= 0.25 && ec> 0);
mbrst = bupedge(e> 0.25 && e<= 0.30 && ec> 0);
mcrst = cupedge(e> 0.30 && ec> 0);
mdrst = dupedge(e<-0.20 && e>=-0.25 && ec<0);
merst = eupedge(e<-0.25 && e>=-0.30 && ec<0);
mfrst = fupedge(e<-0.30 && ec< 0);
printf("%d——%d——%d——%d——%d——%d\r\n", marst,mbrst,mcrst,mdrst,merst,mfrst);
if(e>=-0.20 && e<= 0.20)
{
//
ke = EM/em;
kec = ECM/ecm;
ku = um/UM;
egrad = (int)(ke*e);
if(egrad>EM)
egrad=EM;
if(egrad<-EM)
egrad=-EM;
E = (int)(egrad + EM);
//
ecgrad = (int)(kec*ec);
if(ecgrad>ECM)
ecgrad=ECM;
if(ecgrad<-ECM)
ecgrad=-ECM;
EC = (int)(ecgrad + ECM);
U = rule[E][EC];
u = ku*U;
}
//
else if (e> 0.20 && e<= 0.25 && marst==1)
u =-umin;
else if (e> 0.25 && e<= 0.30 && mbrst==1)
u =-umidle;
else if (e>0.30 && mcrst==1)
u =-umax;
else if (e<-0.20 && e>=-0.25 && mdrst==1)
u = umin;
else if (e<-0.25 && e>=-0.30 && merst==1)
u = umidle;
else if (e<-0.30 && mfrst==1)
u = umax;
//
else if (e> 0.20 && e<= 0.25 && marst==0)
u = 0;
else if (e> 0.25 && e<= 0.30 && mbrst==0)
u =-umidle;
else if (e>0.30 && mcrst==0)
u =-umax;//u = 0;
else if (e<-0.20 && e>=-0.25 && mdrst==0)
u = 0;
else if (e<-0.25 && e>=-0.30 && merst==0)
u = 0;
else if (e<-0.30 && mfrst==0)
u = umax;//u = 0;
if(manauto == 1)
{
result[0] = cf + u;
}
else
{
result[0] = cf;
}
result[1] = result[0]/krb;
return result;
}
abcBoiler项目属于智能控制优化燃烧的锅炉项目,WinCC项目函数相互调用技术。