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

📄 pidcontrol.cpp

📁 PIDControl的VC动态链接库,写得非常不错
💻 CPP
字号:
// PIDControl.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include <afxdllx.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


static AFX_EXTENSION_MODULE PIDControlDLL = { NULL, NULL };
float ei,ei_1,ei_2;  //历史偏差,用于PID控制
float MV_1;                //上一次控制器输出
void ResetPIDControl()  ;   //初始化变量

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
	// Remove this if you use lpReserved
	UNREFERENCED_PARAMETER(lpReserved);

	if (dwReason == DLL_PROCESS_ATTACH)
	{
		TRACE0("PIDCONTROL.DLL Initializing!\n");
		// Extension DLL one-time initialization
		ResetPIDControl();
		if (!AfxInitExtensionModule(PIDControlDLL, hInstance))
			return 0;

		new CDynLinkLibrary(PIDControlDLL);
	}
	else if (dwReason == DLL_PROCESS_DETACH)
	{
		TRACE0("PIDCONTROL.DLL Terminating!\n");
		// Terminate the library before destructors are called
		AfxTermExtensionModule(PIDControlDLL);
	}
	return 1;   // ok
}
typedef struct 
{
	float R_PV;  //PV返回值
	float R_SV;  //SV返回值
	float R_MV;  //MV返回值
} _CtrlValue;

short CNO=0 ;      //通道号 
void APIENTRY DA_TRANS(WORD DA_V ,WORD DA_C);
WORD APIENTRY AD_TRANS(WORD AD_C);

_CtrlValue APIENTRY
PIDControl(float Kp,float Ti,float Td,float Ts,float MV,float MVMax,float MVMin,float SV,short CtrlMod)//
{
	//CtrlKind=1 为Manul,CtrlKind=2 Auto,CtrlKind=3 Siral;
	float DeltaMV;
	float PV ; // Read from Channel
	short DA_V,AD_V; //DA trans value
	_CtrlValue RV={0,0,0};
	AD_V=AD_TRANS(CNO);   //得到被控对象输出
	PV = (float)AD_V / 4095;
	ei_2=ei_1; ei_1=ei; ei=SV-PV;
	RV.R_SV=SV;
	RV.R_PV=PV;     
	if ( CtrlMod==1 )  //Manul
	{
		RV.R_MV=MV;
	}
	else               //Auto
	{
		if ( Ts==0 )
		{
			RV.R_MV = 0 ;
		}
		else if (Ti==0 && Td==0)
		{
			RV.R_MV = Kp*ei;
		}
		else if (Ti==0)
		{
			DeltaMV = Kp * ( ei - ei_1 + ( Td / Ts) * (ei- 2 * ei_1 + ei_2));
			RV.R_MV = MV_1+DeltaMV;
		}
		else
		{
			DeltaMV = Kp * ( ei - ei_1 + Ts * ei / Ti + (Td / Ts) * (ei- 2 * ei_1 + ei_2));
			RV.R_MV = MV_1+DeltaMV;
		}
	}
	if (RV.R_MV >MVMax) 
	{
		RV.R_MV=MVMax;
	}
	else if (RV.R_MV<MVMin)
	{
		RV.R_MV=MVMin;
	}
	MV_1=RV.R_MV;
	DA_V=RV.R_MV * 4095;
	DA_TRANS(DA_V,CNO);
	return RV;
}

void ResetPIDControl()
{
	ei=0;
	ei_1=0;
	ei_2=0;
	MV_1=0;
}

⌨️ 快捷键说明

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