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

📄 customcontroller.cpp

📁 三容水箱的 CustomController VC++环境下编写
💻 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 + -