📄 succus-s-pid-fuzzy.c
字号:
#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 + -