📄 succus-s-pid-fuzzy.c
字号:
FlushInQ (2);
ComWrt (2, ack, strlen(ack));
}
if(L_PIDstart == 1)
{
savedata[0] = savedata[1]; //控制算法实现
savedata[1] = savedata[2];
savedata[2] = givedata - getoutput;
if(savedata[2] < 10 && savedata[2] > -10)
getsum = getsum + savedata[2];
for(i = 0; i < 19; i ++)
savecontrol[i] = savecontrol[i+1];
savecontrol[19] = P_control * savedata[2] + D_control * (savedata[2] - savedata[1]) + I_control * getsum;
savecontrol[19] = savecontrol[19] * parameterPID; //使用位置试PID
//savecontrol[19] = savecontrol[19] + savecontrol[18];
if(savecontrol[19] < 0)
savecontrol[19] = 0; //控制信号最少为零
if(savecontrol[19] > maxcontroldata)
savecontrol[19] = maxcontroldata; //控制信号饱和
SetCtrlVal (panelHandle, PANEL_DISPLAY_CONTROL, (savecontrol[19] * 10));
}
else if(L_fuzzystart == 1)
{
for(i = 0; i < 5; i ++)
ess[i] = 0;
for(i = 0; i < 5; i ++)
dess[i] = 0;
for(i = 0; i < 4; i ++)
outcontrol[i] = 0;
savedata[1] = savedata[2]; //记录偏差;savedata[0]为偏差变化
savedata[2] = givedata - getoutput;
savedata[0] = savedata[2] - savedata[1];
if(savedata[2] < -Pe2) //开始计算隶属度
ess[0] = 1;
else if(savedata[2] >= -Pe2 && savedata[2] < -Pe1)
{
ess[0] = (savedata[2] + Pe2) / (Pe2 - Pe1);
ess[1] = (Pe1 - savedata[2]) / (Pe2 - Pe1);
}
else if(savedata[2] >= -Pe1 && savedata[2] < 0)
{
ess[1] = (savedata[2] + Pe1) / (Pe2 - Pe1);
ess[2] = ( - savedata[2]) / (Pe2 - Pe1);
}
else if(savedata[2] >= 0 && savedata[2] < Pe1)
{
ess[2] = savedata[2] / (Pe2 - Pe1);
ess[3] = (Pe1 - savedata[2]) / (Pe2 - Pe1);
}
else if(savedata[2] >= Pe1 && savedata[2] < Pe2)
{
ess[3] = (savedata[2] - Pe1) / (Pe2 - Pe1);
ess[4] = (Pe2 - savedata[2]) / (Pe2 - Pe1);
}
else if(savedata[2] >= Pe2)
{
ess[4] = 1;
}
else;
if(savedata[0] < -Psess2) //开始计算偏差变化的隶属度
dess[0] = 1;
else if(savedata[0] >= -Psess2 && savedata[0] < -Psess1)
{
dess[0] = (savedata[0] + Psess2) / (Psess2 - Psess1);
dess[1] = (Psess1 - savedata[0]) / (Psess2 - Psess1);
}
else if(savedata[0] >= -Psess1 && savedata[0] < 0)
{
dess[1] = (savedata[0] + Psess1) / (Psess2 - Psess1);
dess[2] = ( - savedata[0]) / (Psess2 - Psess1);
}
else if(savedata[0] >= 0 && savedata[0] < Psess1)
{
dess[2] = savedata[0] / (Psess2 - Psess1);
dess[3] = (Psess1 - savedata[0]) / (Psess2 - Psess1);
}
else if(savedata[0] >= Psess1 && savedata[0] < Psess2)
{
dess[3] = (savedata[0] - Psess1) / (Psess2 - Psess1);
dess[4] = (Psess2 - savedata[0]) / (Psess2 - Psess1);
}
else if(savedata[0] >= Psess2)
{
dess[4] = 1;
}
else;
for(i = 0; i < 5; i++)
for(j = 0; j < 5; j++)
makematrix[i][j] = ess[i] > dess[j] ? dess[j] : ess[i];
if(makematrix[4][4] > 0)
{
outcontrol[3] = makematrix[4][4];
}
if(makematrix[4][2] > 0 || makematrix[4][3] > 0)
{
outcontrol[2] = makematrix[4][2] > makematrix[4][3] ? makematrix[4][2] : makematrix[4][3];
}
if(makematrix[2][4] > 0 || makematrix[4][1] > 0 || makematrix[3][2] > 0 || makematrix[3][3] > 0 ||
makematrix[3][4])
{
outcontrol[1] = makematrix[2][4] > makematrix[4][1] ? makematrix[2][4] : makematrix[4][1];
outcontrol[1] = makematrix[3][2] > outcontrol[1] ? makematrix[3][2] : outcontrol[1];
outcontrol[1] = makematrix[3][3] > outcontrol[1] ? makematrix[3][3] : outcontrol[1];
outcontrol[1] = makematrix[3][4] > outcontrol[1] ? makematrix[3][4] : outcontrol[1];
}
if(makematrix[1][4] > 0 || makematrix[1][3] > 0 || makematrix[2][3] > 0 || makematrix[2][2] > 0 ||
makematrix[2][1] > 0 || makematrix[3][1] > 0 || makematrix[3][0] > 0 || makematrix[4][0] > 0)
{
outcontrol[0] = makematrix[1][4] > makematrix[1][3] ? makematrix[1][4] : makematrix[1][3];
outcontrol[0] = makematrix[2][3] > outcontrol[0] ? makematrix[2][3] : outcontrol[0];
outcontrol[0] = makematrix[2][2] > outcontrol[0] ? makematrix[2][2] : outcontrol[0];
outcontrol[0] = makematrix[2][1] > outcontrol[0] ? makematrix[2][1] : outcontrol[0];
outcontrol[0] = makematrix[3][1] > outcontrol[0] ? makematrix[3][1] : outcontrol[0];
outcontrol[0] = makematrix[3][0] > outcontrol[0] ? makematrix[3][0] : outcontrol[0];
outcontrol[0] = makematrix[4][0] > outcontrol[0] ? makematrix[4][0] : outcontrol[0];
}
for(i = 0; i < 19; i ++)
savecontrol[i] = savecontrol[i+1];
if(outcontrol[0] == 0 && outcontrol[1] == 0 && outcontrol[2] == 0 && outcontrol[3] == 0)
savecontrol[19] == 0;
else
savecontrol[19] = parameterfuzzy * (outcontrol[1] + outcontrol[2] * 2 + outcontrol[3] * 3) / (outcontrol[0] + outcontrol[1] + outcontrol[2] + outcontrol[3]);
if(savecontrol[19] < 0)
savecontrol[19] = 0; //控制信号最少为零
if(savecontrol[19] > maxcontroldata)
savecontrol[19] = maxcontroldata; //控制信号饱和
SetCtrlVal (panelHandle, PANEL_DISPLAY_CONTROL, (savecontrol[19] * 10));
}
else;
if(whatmode == 0)
{
num = model_t/cycle;
if(num > 19) //计算滞后时间
num = 19;
result[0] = result[1]; //模拟过程
result[1] = exp(-cycle / model_T) * result[0] + savecontrol[19 - num];
draw[0] = givedata;
draw[1] = savecontrol[19] * 10;
draw[2] = result[1];
SetCtrlVal (panelHandle, PANEL_DISPLAY_REAL, result[1]);
PlotStripChart (panelHandle, PANEL_STRIPCHART, draw, 3, 0, 0, VAL_FLOAT);
}
else
{
//savecontrol[19] = 5;
setsenddata = (int)((savecontrol[19] / maxcontroldata) * 2743 + 683);
//setsenddata = 3426; //683 3426
senddata[15] = (char)(setsenddata / 4096);
senddata[16] = (char)((setsenddata % 4096) / 256);
senddata[17] = (char)((setsenddata % 256)/ 16);
senddata[18] = (char)(setsenddata % 16);
for(i = 15; i < 19; i++)
if(senddata[i] >= 0 && senddata[i] <= 9)
senddata[i] = senddata[i] + '0';
else
senddata[i] = senddata[i] + 'A' - 10;
efficacy = 0; //和效验
for(i = 1; i < 19; i++)
efficacy = efficacy + senddata[i];
senddata[19] = (efficacy / 16) % 16;
senddata[20] = efficacy % 16;
for(i = 19; i < 21; i++)
if(senddata[i] >= 0 && senddata[i] < 10)
senddata[i] = '0' +senddata[i];
else
senddata[i] = 'A' + senddata[i] - 10;
FlushInQ (2); //发送数据
ComWrt (2, senddata, strlen(senddata));
ComRd (2, responsion, 5);
if(responsion[0] =! ('0' + 6))
MessagePopup ("传输错误", "与PLC通讯失败");
draw[0] = givedata;
draw[1] = savecontrol[19] * 10;
draw[2] = getoutput;
SetCtrlVal (panelHandle, PANEL_DISPLAY_REAL, getoutput);
PlotStripChart (panelHandle, PANEL_STRIPCHART, draw, 3, 0, 0, VAL_FLOAT);
}
break;
}
return 0;
}
int CVICALLBACK startPIDCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
L_PIDstart = 1; //开始标签
GetCtrlVal (panelHandle, PANEL_PARAMETER_P, &P_control); //获得PID参数
GetCtrlVal (panelHandle, PANEL_PARAMETER_I, &I_control);
GetCtrlVal (panelHandle, PANEL_PARAMETER_D, &D_control);
GetCtrlVal (panelHandle, PANEL_WORKMODE, &whatmode); //获得工作状态
if(whatmode == 0)
{
GetCtrlVal (panelHandle, PANEL_EMLUATOR_K, &model_K); //模型
GetCtrlVal (panelHandle, PANEL_EMLUATOR_T, &model_T);
GetCtrlVal (panelHandle, PANEL_EMLUATOR_t, &model_t);
}
GetCtrlVal (panelHandle, PANEL_SAMPLINGTIME, &cycle);
SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_INTERVAL, cycle);
SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, 1); //获得抽样时间。并开始运行
ClearStripChart (panelHandle, PANEL_STRIPCHART); //版面清空
SetCtrlAttribute (panelHandle, PANEL_FUZZYCONTROL, ATTR_DIMMED, 1); //按键关闭
SetCtrlAttribute (panelHandle, PANEL_STARTPID, ATTR_DIMMED, 1);
SetCtrlAttribute (panelHandle, PANEL_AUTOSETPID, ATTR_DIMMED, 1);
getsum = 0;
break;
}
return 0;
}
void CVICALLBACK saveCallback (int menuBar, int menuItem, void *callbackData,
int panel)
{
}
void CVICALLBACK exitCallback (int menuBar, int menuItem, void *callbackData,
int panel)
{
QuitUserInterface (0);
}
void CVICALLBACK editionCallback (int menuBar, int menuItem, void *callbackData,
int panel)
{
MessagePopup ("Edition", "HUST AC0201 1.0");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -