PID controller parameter

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
JWBM
User
Beiträge: 5
Registriert: Freitag 8. Mai 2020, 00:46

Moin zusammen,

ich programmiere ein Tool für die implementierung eines PID-Reglers in meine Strömungssimulationen.

Ich habe das simple-pid modul entdeckt, allerdings kann ich keine Reglereinstellungen finden um meinen Zielwert zu treffen.

Code: Alles auswählen

#!/usr/bin/python3.7
import sys

import pandas as pd
import numpy as np
import pickle
import matplotlib
import matplotlib.pyplot as plt
import pandas_bokeh
from bokeh.plotting import figure, output_file, show

from simple_pid import PID

def bspfunction(x):
	y = -0,0478*x^2 + 0,0071*x + 0,0433
	return y


setpoint=0.05
pid=PID(28,0,0,setpoint)



pid.sample_time = 0.000000001
start=0.4



v=bspfunction(start)
#write to file
outputfile = open('PID.csv','w')
outputfile.write('J,kQ\n'+str(0)+','+str(v)+' \n')
outputfile.close()



iterations=0
residual=1
while iterations<100:
 	#compute new output
	control = pid(v)
	
	#PID output
	v=bspfunction(control)
	iterations+=1
	#write to file
	outputfile = open('PID.csv','a')
	outputfile.write(str(iterations)+','+str(v)+' \n')
	outputfile.close()
	print('iterations= '+str(iterations)+'	Kq= '+str(v))
	
residual=abs(v-setpoint)
#if iterations%50000==0:
colorIndex=0
p = figure(toolbar_location="above",plot_width=800,title='PID',tools="hover,wheel_zoom,box_zoom,reset,save,pan")
p.toolbar.logo=None
p.xaxis.axis_label='J / -'
#p.xaxis.ticker.max_interval=10
p.yaxis.axis_label='kT,kTN,10KQ,eta0 / -'
p.xgrid.grid_line_color="grey"
p.xgrid.grid_line_width=1
p.ygrid.grid_line_color="grey"
p.ygrid.grid_line_width=1
#p.ygrid.minor_grid_line_color="grey"
#p.ygrid.minor_grid_line_width=0.1
#p.xgrid.minor_grid_line_color="grey"
#p.xgrid.minor_grid_line_width=0.1
df=pd.read_csv("PID.csv")
p.line(df['J'],df["kQ"],legend_label='kQ develop',color="navy",line_width=2,line_dash=str(colorIndex)+" "+str(colorIndex))
show(p)

print("pid controll finished")


die bspfunction ist ein ähnliches Polynom was die Lösung meiner Strömungspoblems annähert. Mit Hilfe der Funktion möchte ich meine Reglerparameter einstellen um möglichst wenig Iterationen in der tatsächlichen Simulation benötigen.

Hat jemand eine Idee?

Viele Grüße
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der ^-Operator ist nicht was du denkst was er ist. Der ** operator ist, was du willst.
JWBM
User
Beiträge: 5
Registriert: Freitag 8. Mai 2020, 00:46

Hast natürlich Recht, hab die Funktion grad schnell abgeleitet, damit es hier jemand nachrechnen kann.

Mein ihr das Problem könnte an den Zeiteinstellungen des Reglers liegen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja. Was du da vorgibst ist absurd. Was hast du denn spaeter fuer Hardware, die einen Control-Loop mit einer *Nanosekunde* umsetzt? Meine Renn-Kopter haben 125 uS, das ist Faktor 125000 mal langsamer, und die sind eigentlich zu schnell fuer ein System, bei dem man keine Schwingungen im KHz-Bereich zu erwarten hat.
JWBM
User
Beiträge: 5
Registriert: Freitag 8. Mai 2020, 00:46

Ich rechne eine Iteration meiner Simulation (dauert btw ca. 2h), dann möchte ich eine Iteration meines Reglers laufen lassen um meine Eingangsgröße in die Strömungsimulation anzupassen und die nächste Iteration rechnen. Ich habe die Regelzeit so weit runtergestellt damit der Regler in diesem Fall wo der Wert einfach aus dem simplen Polynom berechnet wird auf jeden Fall schon geregelt hat.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich glaube nicht, dass das richtig ist. Dieser Wert wird als Divisor verwendet, um aus einem ist-wert eine normalisierten Wert zB in RPM etc zu berechnen. Und auch bei der Berechnung von D und I Termen geht das doch ein. Und was hat das damit zu tun, das der "schon geregelt hat"? Der regelt in dem Moment, wo du im sagst, was Ist ist.
JWBM
User
Beiträge: 5
Registriert: Freitag 8. Mai 2020, 00:46

Für alle die irgendwann einmal auf dieses Thema stoßen:

Ein Blick in den Quellcode brachte wie immer die Lösung --> Es ist möglich eine Variable dt zu definieren welche als default von der realen Systemzeit abhängig ist. Das macht bei einem iterativen Verfahren wie meinem natürlich wenig Sinn.

Vielen Dank _deets_ deine kritischen Nachfragen haben mich sicher in die richtige Richtung getrieben ;)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ah, interessant. Ich hatte erwartet, dass das von mir angesprochene Attribut genau den Zweck erfuellt (tiefer in den Code bin ich da auch nicht), aber damit deckt sich das ja mit meiner Argumentation. Schoen das es geklappt hat.
Antworten