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

📄 succus-s-pid-fuzzy.c

📁 带有模糊算法的PID控制 VC++6.0下调试通过
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <cvirte.h>		
#include <userint.h>
#include "succus.h"
#include <rs232.h>
#include <ansi_c.h>
#include <formatio.h> 
#include <math.h>
#include <string.h>

#define  parameterPID    0.1   //PID常数
#define  maxcontroldata  10		 //最大控制量
#define  parameterfuzzy  12	 //模糊控制常数
#define  Pe1	  4				 //隶属度范围
#define  Pe2	  8
#define  Psess1   2
#define  Psess2   4
#define  parainput  100			 //输入常数

static int panelHandle;
static int L_PIDstart;				 //运行标签
static int L_fuzzystart;

static float P_control;		 //获得参数
static float I_control;
static float D_control;
static int whatmode;
static float model_K;				 //模型参数
static float model_T;
static float model_t;
static float cycle;                 //设定周期
static float savedata[3];			//储存偏差量
static float savecontrol[20];		//存储控制量
static float result[2];			    //存储仿真结果
static float getsum;

static char senddata[22];			//通信协议
static char recievedata[18];
static char nak[6];
static char ack[6];

int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)
		return -1;	/* out of memory */
	if ((panelHandle = LoadPanel (0, "succus.uir", PANEL)) < 0)
		return -1;
		
	OpenComConfig (2, "", 9600, 0, 8, 1, 512, 512);      //打开串口
	
	senddata[0] = 5;                     //构造协议		 
	senddata[1] = '0';
	senddata[2] = 'A';
	senddata[3] = 'F';
	senddata[4] = 'F';
	senddata[5] = 'W';
	senddata[6] = 'W';
	senddata[7] = '0';
	senddata[8] = 'D';
	senddata[9] = '5';
	senddata[10] = '0';
	senddata[11] = '6';
	senddata[12] = '4';
	senddata[13] = '0';
	senddata[14] = '1';
	senddata[21] = 0;
	
	recievedata[0] = 5;
	recievedata[1] = '0';
	recievedata[2] = 'A';
	recievedata[3] = 'F';
	recievedata[4] = 'F';
	recievedata[5] = 'W';
	recievedata[6] = 'R';
	recievedata[7] = '0';
	recievedata[8] = 'D';
	recievedata[9] = '5';
	recievedata[10] = '0';
	recievedata[11] = '0';
	recievedata[12] = '0';
	recievedata[13] = '0';
	recievedata[14] = '1';
	recievedata[15] = '4';
	recievedata[16] = '0';
	recievedata[17] = 0;
	
	nak[0] = 21;
	nak[1] = '0';
	nak[2] = 'A';
	nak[3] = 'F';
	nak[4] = 'F';
	nak[5] = 0;
	
	ack[0] = 6;
	ack[1] = '0';
	ack[2] = 'A';
	ack[3] = 'F';
	ack[4] = 'F';
	ack[5] = 0;
	
	
	FlushInQ (2);
    FlushOutQ (2);
		
	DisplayPanel (panelHandle);
	RunUserInterface ();
	
	CloseCom (2);
	DiscardPanel (panelHandle);
	return 0;
}

int CVICALLBACK autosetPIDCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_COMMIT:
			SetCtrlVal (panelHandle, PANEL_PARAMETER_P, 20.0);
			SetCtrlVal (panelHandle, PANEL_PARAMETER_I, 0.0);
			SetCtrlVal (panelHandle, PANEL_PARAMETER_D, 0.0);
			break;
		}
	return 0;
}

int CVICALLBACK fuzzycontrolCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_COMMIT:
			L_fuzzystart = 1;
			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);
			break;
		}
	return 0;
}

int CVICALLBACK endopjCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
		{
		case EVENT_COMMIT:
			QuitUserInterface (0);
			break;
		}
	return 0;
}

int CVICALLBACK stopCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	int i;
	switch (event)
		{
		case EVENT_COMMIT:
			SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, 0);		 //关闭Timer
			L_PIDstart = 0;														 //清标签
  			L_fuzzystart = 0;
			SetCtrlAttribute (panelHandle, PANEL_FUZZYCONTROL, ATTR_DIMMED, 0);  //按键开启
			SetCtrlAttribute (panelHandle, PANEL_STARTPID, ATTR_DIMMED, 0);
			SetCtrlAttribute (panelHandle, PANEL_AUTOSETPID, ATTR_DIMMED, 0);
			//数据清空
			for(i = 0; i<3; i++)
 				savedata[i] = 0;
 			for(i = 0; i<20; i++)	
 				savecontrol[i] = 0;
 			for(i = 0; i<2; i++)
 				result[i] = 0;
 			getsum = 0;
			break;
		}
	return 0;
}

int CVICALLBACK TimerCallback (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	float givedata;			//目标量
	int   i,j;				//循环量
	int   num;				//滞后数
	float draw[3];			//画点
	float getoutput;	    //输出量
	float ADdata;
	
	int   setsenddata;		//输出控制量
	int   efficacy;			//和效验
	int   strLen; 			//发送数据长度
	char  responsion[5];
	char  getADdata[10];
	
	float ess[5];           //记录隶属度
	float dess[5];
	float outcontrol[4];
	float makematrix[5][5];
	switch (event)
		{
		case EVENT_TIMER_TICK:
			GetCtrlVal (panelHandle, PANEL_SETGIVE, &givedata);
			if(whatmode == 0)
					getoutput = result[1];
			else
			{
				FlushInQ (2);                          
				ComWrt (2, recievedata, strlen(recievedata));
				strLen = 10;
            	ComRd (2, getADdata, strLen);
            	for(i = 5; i < 9; i++)
            		if(getADdata[i] >= '0' && getADdata[i] <= '9')
            			getADdata[i] = getADdata[i] - '0';
            		else
            			getADdata[i] = getADdata[i] - 'A' + 10;
            	ADdata = (float)(getADdata[5] * 4096 + getADdata[6] * 256 + getADdata[7] * 16 + getADdata[8]);
				getoutput = ((ADdata - 678) / 2722.0) * parainput;
				if(getoutput < 0)		  //678     3400
					getoutput = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -