📄 customcontroller.cpp
字号:
// CustomController.cpp: implementation of the CCustomController class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "watertank.h"
#include "CustomController.h"
#include "ExternData.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define DllImport __declspec(dllimport)
extern DllImport ExternData Dll_ExternData;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CustomController::CustomController()
{
m_nType = CONTROLLER_CUSTOM;
m_cstrName = "----自定义控制";
//-------------
m_nLoop = 1;
for(int loop = 0; loop < m_nLoop; loop ++)
{
prev_u[loop] = 0.0;
prev_e1[loop] = 0.0;
prev_e2[loop] = 0.0;
}
m_Kp[0] = 0.0;//0.000000001;
m_Ki[0] = 0.0; //0.0002;
m_Kd[0] = 0.0;// 2; //0.00001;
m_Kp[1] = 0.0;//0.000000001;
m_Ki[1] = 0.0; //0.0002;
m_Kd[1] = 0.0;// 2; //0.00001;
}
CustomController::~CustomController()
{
}
void CustomController::CalcU(const double *input, double *output, const double *reference)
{
//首先,利用DA3(chan 4)来控制AD3(chan3)的液位
//由于AD3的液体会流到AD2
//然后,利用DA2(chan 2)来控制AD2的液位
int indim = 0; //the 1st AD variable
int outdim = 0; //the 1st DA variable
//alwayes close 阀1
//output[0] = 10.0;
for(int loop = 0; loop < m_nLoop; loop++)
{
switch(loop)
{
case 0: //loop 1, 希望控制第一个液柱
indim = 0; //AD1,液位1
outdim = 0; //DA1,阀1
break;
default: //loop 2, 希望控制第二液柱
indim = 1; //AD2,液位2
outdim = 1; //DA2,阀2
break;
/*
希望将第3液位控制在300mm,第2液位控制在200mm
可以先控制
也可以同时开始控制吗?
*/
}
double cur_err = reference[indim] - input[indim];
double delta_u = 0.0;
double integ_bound = 10.0;
if(cur_err < integ_bound && cur_err > -integ_bound)
delta_u = m_Kp[loop] * (cur_err - prev_e1[loop])
+ m_Ki[loop] * cur_err
+ m_Kd[loop] * (cur_err - 2*prev_e1[loop] + prev_e2[loop]);
else
delta_u = m_Kp[loop] * (cur_err - prev_e1[loop])
+ m_Kd[loop] * (cur_err - 2*prev_e1[loop] + prev_e2[loop]);
output[outdim] = prev_u[loop] + delta_u;
//shift variables
prev_e2[loop] = prev_e1[loop];
prev_e1[loop] = cur_err;
prev_u[loop] = output[outdim];
//limit the minimum value
if(output[outdim] > -1.0
&& output[outdim] < Dll_ExternData.m_DASetting[outdim].m_MINVALIDU) //special limit controller output
output[outdim] = Dll_ExternData.m_DASetting[outdim].m_MINVALIDU;
}
}
void CustomController::Reset()
{
for(int loop = 0; loop < m_nLoop; loop ++)
{
prev_u[loop] = 0.0;
prev_e1[loop] = 0.0;
prev_e2[loop] = 0.0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -