ich benötige etwas Hilfe bei der Umsetzung einer Leistungsregelung eines Netzteiles.
Ausgangslage:
Ich möchte mit einem Rhode & Schwarz HMP4040 Netzteil eine definierte Leistung -z.B. 20W- in ein Bauelement einbringen und mit einem Thermometer den Temperaturverlauf ermitteln.
Dazu ist bereits ein Python-Code vorhanden (im Internet gefunden und für meine Zwecke umgestaltet) mit dem ich die Temperatur eines Voltcraft Thermologgers auslese. Das funktioniert soweit. Momentan betreibe ich es so, dass ich anfangs einmalig Spannung & Strom am Netzteil einstelle und den Versuch starte. Durch die Erwärmung des Bauteils ändert sich jedoch dessen Widerstand, was im Konstant-Spannungs-Betrieb eine verminderten Stromfluss zur Folge hat. Die Leistungseinbringung (P=U*I) sinkt also.
Problem bei der Implementierung der Leistungsregelung:
Abseits der Grundlagen habe ich nur wenig Ahnung im Umgang mit jeglicher Programmiersprache, dazu zählt auch die Kommunikation mit Standardgeräten wie das HMP4040 Netzteil über eine RS232 Schnittstelle. Bei der Suche nach vergleichbaren Beispielen werden einem zwar allerlei Zusatzpackete vorgeschlagen:
-VISA, [ https://pyvisa.readthedocs.io/en/latest ... alues.html ]
-RSinstruments, [ https://pypi.org/project/RsInstrument/ ]
-Easy SCPI, [ https://pypi.org/project/easy-scpi/ ]
jedoch verwirren mich die Beispiele darin mehr als es mir hilft.
Mit dem Thermologger kommuniziere ich nur über das Modul "serial", funktioniert diese Methode auch bei dem Netzteil? Im Benutzerhandbuch sind die SCPI Befehle aufgeführt, ich bin aber noch nicht sicher ob ich die Struktur wie man die Befehle übersendet richtig verstehe.
Programierhandbuch PDF:
[ https://cdn.rohde-schwarz.com/pws/dl_do ... _en_01.pdf ]
Darin die für mich wichtigen Befehle:
-Werte auslesen
MEASure[:SCALar]:CURRent [:DC]?
MEASure[:SCALar][:VOLTage] [:DC]? #Wieso steht hier das VOLTage in eckigen Klammern? In eckigen Klammern oder geschweiften sind laut Handbuch optionale Parameter, erklärt auf Seite 9 .
-Werte setzten
[SOURce:]VOLTage[:LEVel][:IMMediate][:AMPLitude] {<voltage>| MIN | MAX}}
[SOURce:]CURRent[:LEVel][:IMMediate][:AMPLitude] {<current>| MIN | MAX}
-Bedienung sowohl über Python-Code, als auch über analoge Bedienknöpfe
SYSTem:MIX
Da ich das Netzteil nicht zuhause habe und jederzeit rumprobieren kann wollte ich zumindest die groben Code-Fehler im voraus vermeiden. Dazu mein Vorschlag wie ich es umsetzen würde:
Code: Alles auswählen
#Module importieren
import time
import serial
#Schnittstelle öffnen
Serial = serial.Serial('COM6', 9600,timeout=1, parity=serial.PARITY_NONE)
#Anfangswerte über bekannten Anfangswiderstand ,zB. 5ohm festelgen, das geschieht außerhalb der Messschleife
# I=sqrt(P/R)
#U=P/I
Serial.write(b"CURR 2.000")
Serial.write(b"VOLT 10.000")
#Abrage des aktuellen Zustandes, Regelung der Strom bzw. Spannungswerte, das steht innerhalb der Messschleife und wird sekündlich ausgeführt
I_aktuell = Serial.write(b"MEAS CURR?")
U_aktuell= Serial.write(b"MEAS VOLT?")
"""
Festlegen des aktuellen Widerstandswertes, um die neuen Werte zu bestimmen. Ob es auf einen Konstant-Spannungsbetrieb oder Konstant-Strombetrieb
hinausläuft muss ich am Netzteil probieren, und entsprechend den anderen Wert im Python-Code ändern. Hier gehe ich von einem Konstant-Spannungsbetrieb
aus und ändere die Stromstärke.
"""
R_aktuell = U_aktuell / I_aktuell
I_neu = (20/R_aktuell)**0,5 #Formel P=I^2 * R auf I umgestellt
#Neuen Stromwert an das Netzteil senden
Serial.write(b"CURR I_neu")
Nun die Frage: Funktioniert das so, bzw. gibt es hier grundsätzliche Fehler in der Syntax?
Vielen Dank im Voraus
Mario