C++Builder PID控制一阶惯性系统

2023-05-16

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Chart.hpp>
#include <ExtCtrls.hpp>
#include <Series.hpp>
#include <TeEngine.hpp>
#include <TeeProcs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TButton *Button1;
        TChart *Chart1;
        TLineSeries *Series1;
        TChart *Chart2;
        TLineSeries *Series2;
        TEdit *Edit1;
        TEdit *Edit2;
        TEdit *Edit3;
        TEdit *Edit4;
        TEdit *Edit5;
        TEdit *Edit6;
        TLabel *Label1;
        TLabel *Label2;
        TLabel *Label3;
        TLabel *Label4;
        TLabel *Label5;
        TLabel *Label6;
        TButton *Button2;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
private:	// User declarations
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

2.Unit1.cpp

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "File1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   Edit1->Text = 1.5;           //控制参数
   Edit2->Text = 0.5;
   Edit3->Text = 0.1;
   Edit4->Text = 3;
   Edit5->Text = 0.3;
   Edit6->Text = 20;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   double Kp = Edit1->Text.ToDouble();
   double Ki = Edit2->Text.ToDouble();
   double Kd = Edit3->Text.ToDouble();

   double T = Edit4->Text.ToDouble();
   double Ts = Edit5->Text.ToDouble();
   double Signal = Edit6->Text.ToDouble();

   CIncrementalPID IPID(Kp,Ki,Kd);
   CPositionalPID  PPID(Kp,Ki,Kd);

   Series1->Clear() ;
   Series2->Clear() ;
   for(int i = 0; i < 200 ;i++)
   {
      IPID.SetStepSignal(Signal);
      IPID.SetInertiaTime(T,Ts);
      PPID.SetStepSignal(Signal);
      PPID.SetInertiaTime(T,Ts);

      Series1->AddXY(i,IPID.SystemOutput,"",clRed );
      Series2->AddXY(i,PPID.SystemOutput,"",clBlue );
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Close();
}
//---------------------------------------------------------------------------
3.File1.h

#ifndef CPID_H
#define CPID_H
/*****************************************************************
#                      增量式PID系统                              #
#*****************************************************************/
class CIncrementalPID
{
public:
   CIncrementalPID(double P, double I, double D);
   ~CIncrementalPID(){}
private:
   double  Kp;
   double  Ki;
   double  Kd;

   double  PIDOutput;            //PID控制器输出
   double  LastSystemOutput;     //上次系统输出值

   double  Error;                //输出值与输入值的偏差
   double  LastError;
   double  LastLastError;
public:
   double  SystemOutput;         //系统输出值
   void    SetStepSignal(double StepSignal);
   void    SetInertiaTime(double InertiaTime,double SampleTime);
};

/******************************************************************
#                      位置式PID系统                               #
# *****************************************************************/
class CPositionalPID
{
public:
   CPositionalPID(double P, double I, double D);
   ~CPositionalPID(){}
private:
   double  Kp;
   double  Ki;
   double  Kd;

   double  ResultValueBack;
   double  PidOutput;

   double  PIDErrADD;
   double  ErrBack;
public:
   double  SystemOutput;
   void    SetStepSignal(double StepSignal);
   void    SetInertiaTime(double InertiaTime,double SampleTime);
};

#endif






4.File1.cpp

#include "File1.h"
CIncrementalPID::CIncrementalPID(double P, double I, double D)
{
   Kp = P;
   Ki = I;
   Kd = D;

   PIDOutput = 0.0;             //PID控制器输出
   SystemOutput = 0.0;          //系统输出值
   LastSystemOutput = 0.0;      //上次系统输出值

   Error = 0.0;                 //输出值与输入值的偏差
   LastError = 0.0;
   LastLastError = 0.0;
}

//设置PID控制器参数
void CIncrementalPID::SetStepSignal(double StepSignal)
{
   Error = StepSignal - SystemOutput;
   double IncrementValue = Kp * (Error - LastError) + Ki * Error + Kd * (Error - 2 * LastError + LastLastError);
   PIDOutput += IncrementValue;
   LastLastError = LastError;
   LastError = Error;
}

//设置一阶惯性环节系统  其中InertiaTime为惯性时间常数
void CIncrementalPID::SetInertiaTime(double InertiaTime,double SampleTime)
{
   SystemOutput = (InertiaTime * LastSystemOutput + SampleTime * PIDOutput) / (SampleTime + InertiaTime);
   LastSystemOutput = SystemOutput;
}

/********************************************************************
#                      位置式PID系统                                #
# ******************************************************************/
CPositionalPID::CPositionalPID(double P, double I, double D)
{
   Kp = P;
   Ki = I;
   Kd = D;

   SystemOutput = 0.0;
   ResultValueBack = 0.0;
   PidOutput = 0.0;
   PIDErrADD = 0.0;
   ErrBack = 0.0;
}

//设置PID控制器参数
void CPositionalPID::SetStepSignal(double StepSignal)
{
   double Err = StepSignal - SystemOutput;
   double KpWork = Kp * Err;
   double KiWork = Ki * PIDErrADD;
   double KdWork = Kd * (Err - ErrBack);
   PidOutput = KpWork + KiWork + KdWork;
   PIDErrADD += Err;
   ErrBack = Err;
}
//设置一阶惯性环节系统  其中InertiaTime为惯性时间常数
void CPositionalPID::SetInertiaTime(double InertiaTime,double SampleTime)
{
   SystemOutput = (InertiaTime * ResultValueBack + SampleTime * PidOutput) / (SampleTime + InertiaTime);
   ResultValueBack = SystemOutput;
}


5.实现效果:




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++Builder PID控制一阶惯性系统 的相关文章

  • 在子类的构造函数中使用生成器模式

    我目前正在使用 Builder 模式 严格遵循 Wikipedia 文章中建议的 Java 实现建造者模式 http en wikipedia org wiki Builder pattern 这是一个示例代码 说明了我的实现 public
  • 在Qt中fork后获取进程的PID

    我正在创建一个成功分叉的 Qt C 控制台应用程序 当我在 fork 之前调用 QCoreApplication applicationPid 然后在 fork 之后 在子进程中 调用 QCoreApplication applicatio
  • flutter firebase 数据库和 ListView 构建器问题

    我想在 ListView 中显示我的 shopList 的每一项 但我找不到它一直显示相同记录的原因 请帮助解决这个问题 这里使用代码 从 firebase 数据库获取数据 databaseReference once then DataS
  • 建造者模式和继承

    我有一个对象层次结构 随着继承树的加深 其复杂性也会增加 这些都不是抽象的 因此 它们的所有实例都或多或少地服务于一个复杂的目的 由于参数数量相当多 我想使用构建器模式来设置属性 而不是编写多个构造函数 由于我需要满足所有排列 继承树中的叶
  • 我可以在java中使用方法链接的抽象构建器类而不执行不安全操作吗?

    我试图为某些构建器类提供一个抽象基类 以便我可以轻松地在构建器实现之间重用代码 我希望我的构建器支持方法链接 因此方法必须返回最具体类型的 this 实例 我想我可以用泛型来做到这一点 不幸的是 我无法在不使用不安全操作的情况下做到这一点
  • 构建器模式是否会做得太多?

    我最近一直在与一个研究小组一起研究设计模式 并且逐渐了解到构建器模式对于创建由许多 可能是可选的 部分组成的复杂对象非常有用 然而 建造者是否在某个时刻做得太多了呢 假设我们有一个包含许多不同对象组合的类 是否有另一种模式可能更适合该类 而
  • iPhone 应用程序转换为 iPad? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想将我的应用程序转换为通用应用程序 谁能推荐一些好的教程来实现这一目标 我需要将 Interface
  • 从命令行启动进程时如何捕获进程的 PID?

    有没有办法纯粹在 bat 文件中执行此操作 目的是推出iexplore exe 然后在完成时杀死该实例 这是我使用的 echo off rem there is a tab in the file at the end of the lin
  • 打印 pid_t 的正确 printf 说明符是什么

    我目前正在使用显式转换为 long 并使用 ld用于印刷pid t 是否有一个说明符 例如 z for size t for pid t 如果不是最好的打印方式是什么pid t 没有这样的说明符 我认为你在做什么 铸造pid t to lo
  • 这个 Monster Builder 是一个很好的 Builder / Factory 模式,用于抽象与 setter 混合的长构造函数吗?

    这是一个关于组合的人机界面问题步骤生成器模式 http rdafbn blogspot co uk 2012 07 step builder pattern 28 html与enhanced https stackoverflow com
  • 将现有查询添加到报告中

    我的报告计算了我商店中的墨水库存 我在VB NET中构建了一条SQL语句并得到了正确的结果 如何在 Crystal Report 中显示这些结果 或者设计一个报告以检索相同的结果 我尝试使用 SQL 表达式生成器但失败了 通常您将使用以下方
  • 改变架构生成器中的列长度?

    我有两个字段需要增加字符限制 我通读了文档 令我惊讶的是我没有找到它的选项 可以做吗 如果不是 我应该如何解决这个问题 我可以删除该列并使用正确的属性重新创建它 但我不想丢失数据库中的任何数据 对于 Laravel 4 DB update
  • Java 中的通用 Fluent Builder

    我知道也有过类似的问题 但我还没有看到我的问题的答案 我将用一些简化的代码来展示我想要的东西 假设我有一个复杂的对象 它的一些值是通用的 public static class SomeObject
  • Process.start() 启动的进程返回错误的进程 ID?

    我正在使用以下代码启动可执行文件 Process proc new Process proc StartInfo FileName executablePath proc Start proc WaitForInputIdle 在这次通话之
  • Eclipse - Builder 到底是什么?

    我不明白CDT中的构建器到底是什么 与 C C Build 内容有什么关系 我在 C C Build 配置中设置了SCons 它确实有效 我做了两个配置 发布和调试 并且启动了我的 SCons 脚本 但当我现在尝试调试时 我正在研究这些 B
  • 具有递归类型参数的泛型类型以及抽象 self 方法如何允许方法链正常工作?

    我在读有效的 Java 版本 3 在第 2 章第 14 页中 作者讨论了构建器模式并呈现了以下代码 public abstract class Pizza public enum Topping HAM MUSHROOM ONION PEP
  • Lombok @Builder 不创建不可变对象?

    在很多网站上 我看到 lombok Builder 可以用来创建不可变的对象 https www baeldung com lombok builder singular https www baeldung com lombok buil
  • 使用 ProcessBuilder 运行 shell 脚本

    我正在尝试使用 Java 和 ProcessBuilder 运行脚本 当我尝试运行时 我收到以下消息 error 2 没有这样的文件或目录 我不知道我做错了什么 但这是我的代码 ps 我尝试只执行不带参数的脚本 错误是相同的 String
  • 使用超类创建构建器时,父类无法返回子类的实例[重复]

    这个问题在这里已经有答案了 如果我使用构建器模式来配置新对象 我可能有两个类 例如Game and HockeyGame 如下所示 当我想创建一个新的HockeyGame 我得到它的构建器并开始调用方法来根据需要配置对象 我遇到的问题显示在
  • 启动 psexec 后获取进程 ID

    我有一个使用 psexec 在远程计算机上调用记事本的脚本 有什么办法可以在启动后获取进程ID吗 这是我所拥有的 PCname MyPC SessionID 2 Program Notepad exe FilePath C temp Fil

随机推荐

  • Unity3D 编辑器调试无响应问题

    问题描述 使用 VS 在 Unity 编辑器中调试代码 xff0c 点击 VS 的 附加到 Unity xff0c Unity 编辑器按下 Play 之后 xff0c 就会一直等待并且无其他响应 xff0c 只能结束 Unity 进程 原因
  • 获取 Windows 操作系统的系统、网络、硬件、软件等信息

    Github 源码 xff1a WindowsInfo Net可执行文件 xff1a WindowsInfo Net exe 获取的信息 能获得的信息如下 xff08 系统 硬件 网络信息已打码 xff09 系统信息 计算机名 xff1a
  • 一个基于 C# 的简单的线程安全日志模块

    一个基于 C 的简单的线程安全日志模块 xff0c 它使用生产者 消费者模式 xff0c 可以在 NET Framework 和 Net Core 中使用 Github 地址 xff1a LogConsumer 使用 将 LogConsum
  • Python爬虫深造篇(一)——多线程网页爬取

    一 前情提要 相信来看这篇深造爬虫文章的同学 xff0c 大部分已经对爬虫有不错的了解了 xff0c 也在之前已经写过不少爬虫了 xff0c 但我猜爬取的数据量都较小 xff0c 因此没有过多的关注爬虫的爬取效率 这里我想问问当我们要爬取的
  • c++多态和虚函数心得

    多态性 xff08 Polymorphism xff09 是指一个名字 xff0c 多种语义 xff1b 或界面相同 xff0c 多种实现 重载函数是多态性的一种简单形式 虚函数允许函数调用与函数体的联系在运行时才进行 xff0c 称为动态
  • IntelliJ IDEA 代码检查规范QAPlug

    转自 xff1a http blog csdn net jizi7618937 article details 51500725 Avoid Array Loops 数组之间的拷贝使用System arrayCopy更加高效 byte Re
  • linux系统中rpm与Yum软件仓库

    rpm的作用 xff1a 在没有rpm软件管理之前我们在安装 升级 卸载服务程序时要考虑到其他程序 库的依赖关系 xff0c 所以在进行安装 校验 卸载 升级等操作时的难度就非常之大 rpm机制则为就是为了解决这些问题而设计的 xff0c
  • Nokov使用说明(Windows系统)

    Nokov使用说明 第一步 镜头硬件调节1 连接镜头 xff0c 打开Seeker软件 xff08 以下简称软件 xff09 2 放置标定框3 调节镜头4 调焦1 xff09 调节后环 xff1a 光圈调到最大2 xff09 调节前环 xf
  • 计算机的存储器层次结构以及一二三级缓存的区别

    hibernate 一级缓存和二级缓存的区别 xff1a 主要的不同是它们的作用范围不同 一级缓存是session级别的 也就是只有在同一个session里缓存才起作用 xff0c 当这个session关闭后这个缓存就不存在了 而二级缓存是
  • Mac安装java反编译工具JD-GUI提示需要安装jdk1.8+解决方案

    一 下载 Java Decompiler JD Java Decompiler http java decompiler github io 二 当打开JD GUI软件时候 xff0c 会弹出以下错误 xff0c 见图示 xff1a 而自己
  • Docker命令详细说明

    Docker命令详细说明 docker help 查看docker帮助 使用方法 xff1a docker 命令选项 命令 参数 docker dameon help docker help v version config 61 dock
  • udev 规则文件介绍

    1 配置文件 udev的配置文件位于 etc udev 和 lib udev xff08 开头的是注释 xff09 udev 的主配置文件是 etc udev udev conf 它包含一套变量 xff0c 允许用户修改 udev 默认值
  • ATSAMV7Xult板卡调试Nuttx系统------NuttX模拟器SIM的的编译和调试

    NUTTX的模拟环境的编译和调试 xff1a 由于开发团队硬件资源紧张 xff0c 因此大家调试时可以使用模拟器来进行一些任务的开发和调试 参考 nuttx 7 17 configs sim readme txt介绍的操作方法 xff1a
  • C语言中,int、char、float、double各占多少字节

    https zhidao baidu com question 619738052995674092 html 只是数据类型不同而已 xff0c 在c语言中数据类型不同 xff0c 占的内存字节数不同 xff0c 所以表示数据大小不一样 i
  • 第一天做LeetCode 19.1.10

    为了备战蓝桥杯 xff0c 今天第一天做LeetCode xff0c 就做了一道题花了半个小时 xff0c 期间有各种错误 xff0c 深深的感受到自己连菜鸡都算不上 题目 xff1a 给定一个数组nums xff0c 与目标值target
  • 麻将通用胡牌算法详解(拆解法)

    1 背景 前几天刚好有项目需要胡牌算法 xff0c 查阅资料后 xff0c 大部分胡牌算法的博客都是只讲原理 xff0c 实现太过简单 xff0c 且没有给出测试用例 然后就有了下面的这个胡牌算法 xff0c 我将从算法原理和算法实现两部分
  • Java并发编程笔记之ThreadLocal内存泄漏探究

    转发 xff1a Java并发编程笔记之ThreadLocal内存泄漏探究 使用 ThreadLocal 不当可能会导致内存泄露 xff0c 是什么原因导致的内存泄漏呢 xff1f 我们首先看一个例子 xff0c 代码如下 xff1a Cr
  • 学长们的求职血泪史(C/C++/JAVA)

    2014届校招基本慢慢收尾 xff0c 现特将本人和小伙伴们的求职血泪史记录 xff0c 并且推荐一些书籍供学弟学妹们参考 xff0c 以壮我皇家理工之名 首先得感谢百度的师兄 xff0c 他教会了我很多东西 xff0c 致以很深的谢意 另
  • [海康威视]-超脑设备的 以图搜图 功能C#实现

    以图搜图意思就是海康超脑设备存储着人脸照片 xff0c 你用一张人脸照片去比对 xff0c 比对找个这个人的信息返回给你们 xff0c 识图拿代码
  • C++Builder PID控制一阶惯性系统

    ifndef Unit1H define Unit1H include lt Classes hpp gt include lt Controls hpp gt include lt StdCtrls hpp gt include lt F