📄 pidcontrol.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 + -