Puslweitenmodulation Heizwiderstand auf TwinCAT

FreshSkyline

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

Seit ein paar Monaten habe ich einen neuen Arbeitsgeber und ich bin oft auf mich alleine gestellt, wenn es um Informationen beschaffen geht. Falls ich hier mit meiner Frage am falschen Ort bin dann entschuldigt bitte die Störung.

Ich habe nun mehrere Stunden damit verbracht mir ein Bild einer PWM zu machen, um es auf Twin CAT mit Strukturiertem Text zu realisieren. Da für mich Strukturierter Text absolutes Neuland ist (ich habe jedoch einen TwinCAT Anfängerkurs besucht), komme ich einfach nicht weiter. Zudem finde ich im Internet keine passende Antwort für meine Frage.

Zur Aufgabenstellung:

Ich muss mit einem Potentiometer, durch einer PWM, einen Heizwiderstand steuern und mit 10%-, 30%-, 50%- und 100%er Leistung betreiben.
Zum Schluss sollte ich die Werte: Poti Heizleistung, Ausgang Heizwiderstand und die Temperatur auf Scope View visualisieren und Aufnahmen bei 10-, 30%, 50% und 100% machen



So und jetzt zu meiner Aktuellen Situation:

Um dieses Programm zu schreiben habe ich die OSCAT Basic Library runtergeladen und gedenke den CTRL_PWM Funktionsbaustein zu benutzen.

Dieser sieht dann so aus (mit meinen definierten Variablen):

CTRL_PWM(
CI:= , (*Brauche ich nicht*)
MAN_IN:=rPoti_Einstellung , (*Manueller Eingangswert*)
MANUAL:= bSchalter1, (*Umschalter für Handbetrieb*)
F:= t#20s, (*Periodendauer in Hz*)
Q:= bHeiz1, (*Steuersignal für Heizwiderstand*)
);

rPoti_Einstellung (*Potentiometer Eingangssignal in REAL*)
bSchalter (*Umschalter für PWM in BOOL*)
bHeiz1 (*Ausgangssignal PWM für Heizwiderstand in BOOL*)

Die Variablen für den Temperatursensor hab ich noch nicht definiert.

Da "MAN_IN" in REAL ist muss ich ja das Potentiometersignal (INT) in Real umwandeln, dafür benutze ich die INT_TO_REAL Funktion mit der Formel: rPoti_Einstellung:= (iPoti1)/32767*50;

Nun zu meiner Frage:
Als erstes wollte ich Testen, ob ich auf dem richtigen Weg zur Lösung bin. Jedoch kann ich das Ganze nicht übersetzen, weil beim Übersetzen immer die Fehlermeldung "CTRL_PWM ist keine Funktion" kommt. àAuch hier finde ich auf Google keine Lösung.

Und zweitens: Bin ich überhaupt auf dem richtigen Weg? Kann ich irgendwo mehr Input herkriegen für meine Aufgabe oder gibts irgendwo Beispiele in Codesys?

Freundliche Grüsse,
FreshSkyline
 
Hallo FreshSkyline,

prinzipiell hört sich der Weg doch schon mal gut an. Zu deinem Problem:

CTRL_PWM ist ein Funktionsbaustein, d.h. du darfst ihn nicht einfach so verwenden, sondern musst ihn instanzieren. Folgender Pseudocode:

In der Variablenliste
Code:
PWMBeispiel : CTRL_PWM;

Im Programmcode dann:
Code:
PWMBeispiel( 
CI:= , (*Brauche ich nicht*)
MAN_IN:=rPoti_Einstellung , (*Manueller Eingangswert*)
MANUAL:= bSchalter1, (*Umschalter für Handbetrieb*)
F:= t#20s, (*Periodendauer in Hz*)
Q:= bHeiz1, (*Steuersignal für Heizwiderstand*) 
);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Um den Baustein nutzen zu können, musst du ihn in der Variablendeklaration erstmal instanzieren und deine benötigten Variablen am besten gleich mit deklarieren:
Code:
Var
Heizung1 :CTRL_PWM;
rPoti_Einstellung %i :REAL;(*Potentiometer Eingangssignal in REAL ist bestimmt ein Eingang*)
bSchalter %I :BOOL; (*Umschalter für PWM in BOOL auch hier sicher ein Eingang*)
bHeiz1 %Q :BOOL;(*Ausgangssignal PWM für Heizwiderstand in BOOL ist garantiert ein Ausgang*)
End_Var
Im Code rufst du dann deine Instanz auf, wie du es geplant hast.
Code:
Heizung1( 
CI:= , (*Brauche ich nicht*)
MAN_IN:=rPoti_Einstellung , (*Manueller Eingangswert*)
MANUAL:= bSchalter1, (*Umschalter für Handbetrieb*)
F:= t#20s, (*Periodendauer in Hz*)
Q:= bHeiz1, (*Steuersignal für Heizwiderstand*) 
);
Die Ein- und Ausgänge kannst du dann direkt an die Variablen binden.

MfG Jensemann
 
@ SPS_A und Jensemann

Vielen Dank erstmal für eure raschen Antworten.

Jetzt bin ich so weit, dass ich 3 Bausteine habe: MAIN (PRG), PWM_Heizung(FB) und UmrechnungPoti (FUN).

Hier PWM_Heizung:
Code:
FUNCTION_BLOCK PWM_Heizung
VAR
    Heizung1                : CTRL_PWM;     (*Initialisieren des Funktionsbausteins CTRL_PWM*)
    EingangPotentiometer        : INT;            (*Potentiometer Eingangssignal in REAL*)
    SchalterEingang            : BOOL;            (*Schaltereingang für PWM Aktievierung in BOOL*)
    Ausgang_PWM            : BOOL;            (*Ausgangssignal PWM für Heizwiderstand in BOOL*)
    Controler_Eingang        : REAL;            (*Eingang für Controler*)
END_VAR
-------
Heizung1( CI:= Controler_Eingang                (*Wird nicht benötigt*),               
               MAN_IN:= Umrechnung_Poti_FUN(EingangPotentiometer),    (*Manueller Eingangswert*)
               MANUAL:= SchalterEingang,        (*Umschalter für Handbetrieb*)
               F:= TIME_TO_REAL(t#20s),        (*Periodendauer in Hz*)
               Q=> Ausgang_PWM                   (*Steuersignal für Heizwiderstand*)
);

und hier UmrechnungPoti:

Code:
FUNCTION Umrechnung_Poti_FUN : REAL
VAR_INPUT
    Poti         :INT;
END_VAR
-------
Umrechnung_Poti_FUN := INT_TO_REAL (Poti)/32767*10;

Jetzt hab ich das Problem, dass wenn ich im Main mit F2 die Eingabehilfe aufrufe und unter definierte Funktionsblöcke "PWM_Heizung" hinzufügen möchte, nur PWM_Heizung hinzugefügt wird. Die von mir im FB definierten Inputs und Outputs werden nicht angezeigt.

Also es müsste ja normalerweise so aussehen im MAIN (Wenn ich den FB abrufe):
Code:
PROGRAM MAIN
VAR
(*Inputs*)
    bSchalter1         AT    %IX0.0             :BOOL;
    bSchalter2         AT    %I*                 :BOOL;
    bSchalter3         AT    %I*                 :BOOL;
    bSchalter4         AT    %I*                 :BOOL;
    bSchalter5         AT    %I*                 :BOOL;
    bSchalter6         AT    %I*                 :BOOL;
    bSchalter7         AT    %I*                 :BOOL;


(*Outputs*)
    bHeizung1        AT    %QX0.0             :BOOL;
    bLampe1         AT    %Q*                :BOOL;
    bLampe2        AT    %Q*                :BOOL;
    bLampe3        AT    %Q*                 :BOOL;
END_VAR
-------
PWM(EingangPotentiometer:= , SchalterEingang:= , Ausgang_PWM=> )

Oder hab ich da wieder etwas vergessen? Schlussendlich möchte ich dann mit dem gleichen FB vier verschiedene Potis brauchen. Ausgänge sind dann einmal ein Heizwiderstand und 3 mal LED's.
 
Hallo,

soweit ich das auf die schnelle sehe, ist dein FB "PWM_Heizung" überflüssig, oder? Dieser ist ja in der reingeladenen bib vorhanden. Du müsstest ja somit einfach in deinem Hauptprogramm 4 Instanzen davon anlegen. Das die Input und Output Variablen nicht angezeigt werden, liegt simplerweise daran, dass deine deklarierten Variablen nur normale "VAR"s sind. Sollen es Eingangs- oder Ausgangsvariablen sein, dann brauchst du folgende Syntax:

Code:
VAR_INPUT
    Variable: Datentyp;
END_VAR
VAR_OUTPUT
    Variable: Datentyp;
END_VAR

Soweit erst einmal verständlich?
Viele Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@SPS_A

Vielen Dank, ja ich habs kurz vor deiner Antwort gemerkt, dass ich de Variablen falsch deklariert hatte.

Nun ich brauche den FB "PWM_Heizung schon, denn ich möchte einen einheitlichen Baustein haben, damit ich bei einer Änderung nur eine "Instanz" ändern muss und nicht 4. 4 sind zwar nicht viel, aber es dient ja als Übungszweck damit ich später bei komplexeren Programmen mir die Programmanpassung etwas erleichtere.

So ich habs soweit geschafft dass FAST alles läuft, nur krieg ich beim PWM_Ausgang kein Signal wenn ich das Poti drehe.

Code:
PROGRAM MAIN
VAR
	Potentiometer1			: PWM_Heizung;
	Potentiometer2			: PWM_Heizung;
	Potentiometer3			: PWM_Heizung;
	Potentiometer4			: PWM_Heizung;
END_VAR
-------------------------

(*Potentiometer 1*)


Potentiometer1(
	Controler_Eingang:= , 
	EingangPotentiometer:= bPoti1,
	SchalterEingang:= bSchalter1,
	Frequenz:= t#20s,
	Ausgang_PWM=> bHeizung1 );




(*Potentiometer 2*)


Potentiometer2(
	Controler_Eingang:= , 
	EingangPotentiometer:= bPoti2,
	SchalterEingang:= bSchalter2,
	Frequenz:= t#50s,
	Ausgang_PWM=> bLampe1);




(*Potentiometer 3*)


Potentiometer3(
	Controler_Eingang:= ,
	EingangPotentiometer:= bPoti3,
	SchalterEingang:= bSchalter3,
	Frequenz:= t#10s,
	Ausgang_PWM=> bLampe2);




(*Potentiometer 4*)


Potentiometer4(
	Controler_Eingang:= ,
	EingangPotentiometer:= bPoti4,
	SchalterEingang:= bSchalter4,
	Frequenz:= t#1s,
	Ausgang_PWM=> bLampe3);






FUNCTION_BLOCK PWM_Heizung
VAR
	Heizung1				: CTRL_PWM; 	(*Initialisieren des Funktionsbausteins CTRL_PWM*)
END_VAR
VAR_INPUT
	Controler_Eingang			: REAL;			(*Eingang für Controler*)
	EingangPotentiometer		: INT;			(*Potentiometer Eingangssignal in REAL*)
	SchalterEingang			: BOOL;			(*Schaltereingang für PWM Aktievierung in BOOL*)
	Frequenz				: TIME;			(*Periodendauer der PWM*)
END_VAR
VAR_OUTPUT
	Ausgang_PWM			: BOOL;			(*Ausgangssignal PWM für Heizwiderstand in BOOL*)
END_VAR
-------------------------

Heizung1(		CI:= Controler_Eingang					(*Wird nicht benötigt*),
				MAN_IN:= INT_TO_REAL(EingangPotentiometer)/32767*10,	(*Manueller Eingangswert*)
				MANUAL:= SchalterEingang, 			(*Umschalter für Handbetrieb*)
				F:= TIME_TO_REAL(Frequenz), 				(*Periodendauer in Hz*)
				Q=> Ausgang_PWM					(*Steuersignal für Heizwiderstand*)
);

An was könnte das liegen? Ich komm nicht dahinter :/


Vielen Dank schon mal für die bisherige Hilfe!! Es hat mir sehr geholfen das ganze etwas mehr zu Verstehen.

Freundliche Grüsse,
FreshSkyline
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

anscheinend braucht man auch ein Konto, um die Datei runterzuladen, oder? Zumindest werd ich darauf weitergeleitet.

Anhang hier im Forum kannst du über das Büroklammersymbol hinzufügen, eventuell vorher zippen.

Viele Grüße
 
Hallo,

hab das ganze mal runtergeladen. So ganz konnte ich nicht alles nachvollziehen, aber wo schon mal ein Fehler liegt ist im Programm MAIN, dass die Funktionen "PWM_Poti_Input1" bis "PWM_Poti_Input4" instanziert sind (Funktionen -> Keine Instanz notwendig). Dann fehlte in der Funktion in der ersten Zeile noch ein Semikolon.

Ich habe mal folgendes versucht:
Du rechnest ja die Frequenz (REAL) in Time um. Hab das ganze mal aus dem baustein rausgenommen und die "normale" Frequenz eingetragen (z.B. 3 für alle 3 Sekunden), dann funktioniert das bei mir und ich bekomme alle 3 Sekunden ein moduliertes Signal am Ausgang. Kannst du das auch mal testen, vielleicht liegt hier der Fehler.

Viele Grüße
 
Zurück
Oben