⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 succus-s-pid-fuzzy.c

📁 带有模糊算法的PID控制 VC++6.0下调试通过
💻 C
📖 第 1 页 / 共 2 页
字号:
				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 + -