Contents:
- 2023 Multiple PID Controllers
- 2021 PID Cascade single file version
- 2014 PID Cascade VS structure version
1. Multiple PID controllers run simutaneously (example code 2023)
LiuZe, May 27, 2023
Recently we need realize 7 embedded PID controllers run simultaneously in a project. Then we use the OOP Class written before created a multiple-controller example. In the example the number of controller and object are 30. This piece of code is as following.
#include <stdio.h> class ConObject { public: double alpha; // Object parameter double *Ui, Uo, Uo1; public: ConObject() { alpha = 0.1; Uo = 0; // Zewen found this important Uo1 = 0; } void Run() { Uo = alpha * (*Ui) + (1 - alpha) * Uo1; //Object Simu Uo1 = Uo; } }; class PID_controller { public: double *sp; double *pv, cv; double kp, ki, kd; double Err, Err1; double sum; public: PID_controller() { kp = 6; ki = 1; kd = 0.5; Err1 = 0; sum = 0; cv = 0; } void Run() { Err = (*sp) - (*pv); sum += Err; //sum = sum + Err; cv = kp * Err + ki * sum + kd * (Err - Err1); //PID Err1 = Err; } }; int main() { const int N_total_controller = 30; int i, j; double sp[N_total_controller]; ConObject Obj[N_total_controller]; // Objects PID_controller Con[N_total_controller]; // Controllers FILE* fp; fp = fopen("Control_output.csv", "w+"); // Print data fprintf(fp, "i,"); for (i = 0; i < N_total_controller; i++) { fprintf(fp, "pv%d,",i+1); } fprintf(fp, "\n"); for (i = 0; i < N_total_controller+1; i++) { fprintf(fp, "0,"); } fprintf(fp, "\n"); // Sp setting for (i = 0; i < N_total_controller; i++) { sp[i] = 4 + 0.2 * i; } // Parameter set in group or specific for (i = 0; i < N_total_controller; i++) { Con[i].kp = 6.2; } Con[2].kp = 4; Con[4].ki = 1.2; Obj[5].alpha = 0.12; // Control loop connections for (i = 0; i < N_total_controller; i++) { Con[i].sp = &sp[i]; Con[i].pv = &(Obj[i].Uo); Obj[i].Ui = &(Con[i].cv); } // System running for (i = 0; i < 100; i++) { fprintf(fp, "%d,", i + 1); for (j = 0; j < N_total_controller; j++) { Con[j].Run(); Obj[j].Run(); fprintf(fp, "%f,", Obj[j].Uo); } fprintf(fp, "\n"); } //===================== fclose(fp); return 0; }
The running result is recorded in the excel file of the project. The PV graph drawing according to the excel file is as following.
![](http://emt.bjtu.edu.cn/wp-content/uploads/2023/05/PID-controllers-30-run-simutaneously-1024x654.png)
Fig.1 PV value of 30 simulated objects controlled by 30 PID controllers
2. Simulation of PID OOP Cascade System with Visual C++ (2021)
LiuZe, April 10, 2021
![](http://emt.bjtu.edu.cn/wp-content/uploads/2022/10/Object-and-controller-Structure20211101.jpg)
2021 We rewrite the cascade PID control program in one single CPP file as following:
#include <stdio.h> class ConObject{ public: double alpha; // Object parameter double *Ui, Uo, Uo1; public: ConObject(){ alpha=0.1; Uo=0; // Zewen found this important Uo1=0; } void Run(){ Uo= alpha * (*Ui) + (1-alpha) * Uo1; //Object Simu Uo1=Uo; } }; class PID_controller{ public: double *sp; double *pv,cv; double kp,ki,kd; double Err, Err1; double sum; public: PID_controller(){ kp=6; ki=1; kd=0.5; Err1=0; sum=0; } void Run(){ Err=(*sp)-(*pv); sum+=Err; //sum = sum + Err; cv=kp*Err + ki*sum + kd * (Err-Err1); //PID Err1=Err; } }; int main() { double sp=5.0; ConObject Obj1,Obj2; // Objects PID_controller Con1,Con2; // Controllers FILE * fp;fp = fopen ("Control_output.csv", "w+"); fprintf(fp, "i, pv\n"); fprintf(fp, "0, 0\n"); Con1.sp=&sp; //No.1 Connection Con1.pv=&(Obj2.Uo); //No.2 Con2.sp=&(Con1.cv); //3 Con2.pv=&(Obj1.Uo); //4 Obj1.Ui=&(Con2.cv); //5 Obj2.Ui=&(Obj1.Uo); //6 for(int i=0;i<100;i++){ Con1.Run(); Con2.Run(); Obj1.Run(); Obj2.Run(); fprintf(fp, "%d, %f\n",i+1,Obj2.Uo); } //===================== fclose(fp); return 0; }
3 Simulation of PID OOP Cascade System with Visual C++ (2014)
LiuZe, April 1st, 2014
Full Program Download (2014 version):
PID control source code (Visual C++ 6 Version)
PID control source code (Visual Studio Version)
Design Introduction: PPT instruction download
Part of programs is as follows:
// PID_OOP.cpp : PID control program MAIN. // Designed by Students and Teacher // in the class of Intelligent Instrument Design // Date: 2014-03-28 // MagtomoLab: http://emt.bjtu.edu.cn // BJTU: http://www.bjtu.edu.cn // ----------------------------------------------- #include "stdafx.h" #include "PID_Controller.h" #include "RC_Object.h" int main(int argc, char* argv[]) { FILE *fp; double sp=2.5; PID_Controller con1,con2; RC_Object obj1,obj2; // Initialize con1.Initialization(); obj1.Initialization(); con2.Initialization(); obj2.Initialization(); // Customized Setting con1.kp=2.0; con1.ki=1; con2.ki=1.2; // Connection con2.pointer_sp=&sp; con1.pointer_sp=&con2.cv; obj1.pointer_cv=&con1.cv; obj2.pointer_cv=&obj1.pv; con2.pointer_pv=&obj2.pv; con1.pointer_pv=&obj1.pv; // Run fp=fopen("Record.csv","wt"); fprintf(fp, "pv\n"); for (int k=0;k<100;k++) { //Print result fprintf(fp, "%f\n", obj2.pv); con2.Calculate(); con1.Calculate(); obj1.Calculate(); obj2.Calculate(); } fclose(fp); printf("Finished!\n"); return 0; }