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

📄 pid.~cpp

📁 pid温度控制 利用ac6611新片来设计开发 具有很好的额外我
💻 ~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 + -