?? pid.cpp
字號:
#include <math.h>
#include <vcl.h>
#pragma hdrstop
#include "PID.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
float SP=8.0,PV=0.0;
int pvtrend[480];
int sptrend[480];
int mvtrend[480];
int t1;
float HS=10.0,LS=0.0,HL=7.5,LL=2.5,DH=0.2;
float PID_DB=2,P=20,I=10,D=5,KD=5;
float Un=0.0,DeltaUn=0.0,Un1=0.0,En=0.0,En1=0.0,En2=0.0;
float q0,q1,q2;
float TS=2.0;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
unsigned long ad_data;
unsigned short int da;
AC6611_AD(hDevice, 0, &ad_data);
PV=LS+ad_data*(HS-LS)/4095.0;
En=SP-PV;
DeltaUn=q0*En+q1*En1+q2*En2;
Un=Un1+DeltaUn;
Un1=Un;
En2=En1;
En1=En;
if( Un>100.0) Un=100.0;
if(Un<0) Un=0;
da=(unsigned short int)(Un*4095.0/100.0);
//da=(unsigned short int)(2048+Un*1024.0/100.0);
AC6611_DA(hDevice,da);
//PV=120+50*sin(t1*5*3.1415/360);
t1++;
for(int i=0;i<479;i++)
{
pvtrend[i]=pvtrend[i+1];
pvtrend[479]=300*PV/(HS-LS);
sptrend[i]=sptrend[i+1];
sptrend[479]=300*SP/(HS-LS);
mvtrend[i]=mvtrend[i+1];
mvtrend[479]=300*Un/100.0;
}
Image2->Picture->LoadFromFile("bangtu.bmp");
Image2-> Canvas->Pen->Color = clRed;
Image2-> Canvas->Pen->Width = 3;
Image2->Canvas->MoveTo(20,181);
Image2->Canvas->LineTo(20,181-SP*177/(HS-LS));
Image2-> Canvas->Pen->Color = clBlue;
Image2->Canvas->MoveTo(26,181);
Image2->Canvas->LineTo(26,181-PV*177/(HS-LS));
Image2-> Canvas->Pen->Color = clGreen;
Image2->Canvas->MoveTo(46,181);
Image2->Canvas->LineTo(46,181-Un*177/100.0);
//繪制趨勢曲線
Image1->Picture->LoadFromFile("qushi.bmp");
Image1-> Canvas->Pen->Width = 1;
Image1-> Canvas->Pen->Color = clRed;
Image1->Canvas->MoveTo(0,300);
for(int i=0;i<480;i++) Image1->Canvas->LineTo(i,300-sptrend[i]);
Image1-> Canvas->Pen->Color = clBlue;
Image1->Canvas->MoveTo(0,300);
for(int i=0;i<480;i++) Image1->Canvas->LineTo(i,300-pvtrend[i]);
Image1-> Canvas->Pen->Color = clGreen;
Image1->Canvas->MoveTo(0,300);
for(int i=0;i<480;i++) Image1->Canvas->LineTo(i,300-mvtrend[i]);
//Edit1->Text=FloatToStrF(SP,0,4,4);
Edit2->Text=FloatToStrF(PV,0,4,4);
Edit3->Text=FloatToStrF(Un,0,4,4);
Form1->Caption="《計算機測控系統》PID算法編程范例 " + DateTimeToStr(Now());
}
void __fastcall TForm1::Button5Click(TObject *Sender)
{
if (Edit15->Text=="123456")
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
q0=(100.0/P)*(1+TS/I+D/TS);
q1=-(100.0/P)*(1+2*D/TS);
q2=(100.0/P)*D/TS;
//------------
hDLL=LoadLibrary("ac6611.dll");
if(hDLL!=NULL)Label29->Caption = "AC6611.dll load ok!";
(FARPROC &)AC6611_CreateDevice=GetProcAddress(hDLL,"AC6611_CreateDevice"); //創建驅動句柄
(FARPROC &)AC6611_CloseDevice=GetProcAddress(hDLL,"AC6611_CloseDevice"); //關閉驅動句柄
(FARPROC &)AC6611_DI=GetProcAddress(hDLL,"AC6611_DI"); //數字量輸入,port=0-1兩個通道,8位數據由DiData返回
(FARPROC &)AC6611_DO=GetProcAddress(hDLL,"AC6611_DO"); //數字量輸出,port=0-1兩個通道,8位數據由DoData輸出
(FARPROC &)AC6611_DiBit=GetProcAddress(hDLL,"AC6611_DiBit"); //數字量輸入,port=0-1兩個通道,指定位輸入
(FARPROC &)AC6611_DoBit=GetProcAddress(hDLL,"AC6611_DoBit"); //數字量輸出,port=0-1兩個通道,指定位輸出
(FARPROC &)AC6611_DA=GetProcAddress(hDLL,"AC6611_DA"); //DA輸出,0-4095
(FARPROC &)AC6611_VoltageToDA=GetProcAddress(hDLL,"AC6611_VoltageToDA");
(FARPROC &)AC6611_AD=GetProcAddress(hDLL,"AC6611_AD"); //通用AD采樣
(FARPROC &)AC6611_AD_CHN=GetProcAddress(hDLL,"AC6611_AD_CHN"); //設置AD通道0-15
(FARPROC &)AC6611_ADS=GetProcAddress(hDLL,"AC6611_ADS"); //直接AD采樣,為單通道AD采樣設計
(FARPROC &)AC6611_ADToVoltage=GetProcAddress(hDLL,"AC6611_ADToVoltage");
hDevice=AC6611_CreateDevice(0, &ErrorOf6611); //創建驅動,選擇第0塊卡
if(hDevice != -1){
Label30->Caption = "AC6611 Card Is Exist!";
}else{
Label30->Caption = "AC6611 Card Is not Exist!";
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HS=StrToFloat(Edit5->Text);
LS=StrToFloat(Edit6->Text);
HL=StrToFloat(Edit7->Text);
LL=StrToFloat(Edit8->Text);
DH=StrToFloat(Edit9->Text);
PID_DB=StrToFloat(Edit10->Text);
P=StrToFloat(Edit11->Text);
I=StrToFloat(Edit12->Text);
D=StrToFloat(Edit13->Text);
KD=StrToFloat(Edit14->Text);
q0=(100.0/P)*(1+TS/I+D/TS);
q1=-(100.0/P)*(1+2*D/TS);
q2=(100.0/P)*D/TS;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label13Click(TObject *Sender)
{
SP=StrToFloat(Edit1->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label15Click(TObject *Sender)
{
unsigned short int dav;
dav=(unsigned short int)(4095*StrToFloat(Edit3->Text)/100.0);
if( dav>4095) dav=4095;
AC6611_DA(hDevice,dav);
}
//---------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -