PWM in SCL

waldschrat

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo erstmal,
bin relativ neu hier im Forum und habe da ein Anliegen.
Da AWL zu einfach geworden ist, möchte ich gerne SCl lernen.
Hierzu wurde mir eine Aufgabe gestellt ( schon recht anspruchsvoll) :
Erstellen einer Pulsweitenmodulation (PWM) in SCL.
Hat das jemand schon mal gemacht??
Mirt gehts da um den Aufwand und ob das für den Anfang nicht zuviel ist.
Arbeite zur Zeit mit der Doku von Step 7 und habe bis jetzt nur folgende Zeilen geschafft:

VAR_INPUT
ANA_IN:INT; // 0-10V Analog Eingang als Sollwertgeber
END_VAR

VAR_OUTPUT
DIG_OUT:BOOL:=0 // Ausgabe der PWM als Digital Ausgang ala Frequenzumrichter

END_VAR
VAR
ERGEBNIS:INT:=0;
CONST
Vorgabe_Hz:INT:=50;
MAX_DIGITD:INT:=27648;
PRO_ANTEIL:INT:=98;
END_CONST
BEGIN
FOR ANA_IN >=0& ANA_IN <=27648;
ERGEBNIS:= PRO_ANTEIL MOD MAX_DIGIT;
Nicht viel aber schonmal ein Anfang finde ich.
 
Hast du mal versucht, dein Programm mi dem SCL-Compiler zu übersetzen?
FOR ANA_IN >=0& ANA_IN <=27648;
Was willst du mit dieser Zeile erreichen?
Schau´ dir mal die Syntax zu FOR an.

Der Zweck des Konstrukts
Code:
FOR n:=0 TO max;
Anweisung; [Anweisung;]
END_FOR
ist es, die Anweisungen je einmal für jeden Wert von n auszuführen, wobei n die Werte 0 bis max annimmt.

Hast du eine Vorstellung, wie du die PWM-Funktionalität z.B. in AWL (S7) oder C oder Assembler (Mikrocontroller) programmieren würdest?

ERGEBNIS:= PRO_ANTEIL MOD MAX_DIGIT;
Egal, wozu das gut sein soll, aber in deinem Beispiel sind PRO_ANTEIL und MAX_DIGIT Konstanten, daher ist auch PRO_ANTEIL MOD MAX_DIGIT ein Konstanter Ausdruck. Wozu soll die SPS das jedesmal neu berechnen?
 
Hi,

Code:
FUNCTION_BLOCK PWM
VERSION : '1.0'
AUTHOR  : dalbi

VAR_INPUT
  IN   : INT;              // Eingang 0..100%
  Ta   : TIME := T#100MS;  // Abtastzeit
  Tp   : TIME := T#10s;    // Periodendauer
  RESET: BOOL;             // Reset
END_VAR

VAR_OUTPUT  
  Y : BOOL;                // PWM Signal
END_VAR 

VAR_TEMP
  OFF : DINT;
  #MAX : DINT;
END_VAR

VAR
  TICK : DINT;
END_VAR

BEGIN

  #MAX := TIME_TO_DINT(Tp) / TIME_TO_DINT(Ta);
  
  OFF := #MAX * IN / 100; // Ausdauer berechnen
  TICK := TICK + 1;       // Zyklen addieren
  
  // Zyklenzähler auf 0 setzen
  IF TICK >= #MAX THEN
    TICK := 0;
  END_IF;

  IF TICK >= OFF THEN   // Ausgang ausschalten
    Y := FALSE;
  ELSIF RESET THEN      // Reset  
    TICK := 0;
    Y := FALSE;
  ELSE                  // Ausgang einschalten
    Y := TRUE;
  END_IF;
  
END_FUNCTION_BLOCK

Quelle: http://de.wikipedia.org/wiki/Pulsweitenmodulation

Gruss Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie schon am Anfang geschrieben :
Ich habe sehr wenig Ahnung von SCL und das sind nur erste Gedanken von mir.
Gedanke ist:
Analogwert (+27648) in einen Time wert für einen Impulsgeber umzuwandeln dieser soll an die Zykluszeit der CPU nach Leistung der Ausgangskarte angepasst werden können (je nach Typ).
 
Danke dalbi,
soviel wollte ich eigentlich nicht als Lösung haben...
will das ja selber lernen ,hatte da an so kleine Lösungsschritte gedacht aber das hier ist ja schon super
 
Hi,

sollte auch nur so als Anregung dienen, müsste man eh noch auf Deinen Analogeingang 0..27648 anpassen.

Der Aufruf von meinem Beispiel muss im OB35 erfolgen und die Zykluszeit in Ta entsprechend eingetragen werden.

Gruss Daniel
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
da du mich (auf Anregung von Softmaschine) ja direkt angepostet hast hier auch mein Beitrag dazu :

Im Grunde hat Dalbi ja schon das Wesentliche gesagt.
Mein Ansatz wäre es auch, etwas mit dem OB35 zu machen.
Dein selbsterstellter Baustein könnte ja auch Basis des ihm übergebenen OB35-Aufruf-Intervalls die gewünschten Ein- und Ausschaltzeiten berechnen. Willst du das dann aber auf einen Ausgang leiten so mußt du beachten, das ein im OB35 gesetzter Ausgang nicht automatisch auf der Ausgangskarte (Prozessabbild) landet - du müßtest den also dann "handisch" auf das zugehörige PAB übertragen (so a la "L AB4 - T PAB 4").

Gruß
Larry
 
Danke nochmal an dalbi und Larry für die super Unterstützung hat mich schon weiter gebracht als ich mir erhofft hatte.
Werd es mal versuchen ohne Copy/Paste zu realisieren.
 
Da AWL zu einfach geworden ist, möchte ich gerne SCL lernen.
Hallo,
da du mich (auf Anregung von SoftmaSchine) ja direkt angepostet hast hier auch mein Beitrag dazu...

hallo Larry,
hoffentlich war dir das nicht unangenehm, aber du bist mir inzwischen als SCL-Spezi im Gedächtnis...

@ daniel und Larry:
Aber der uneingeschränkte Dank von Waldschrat an Daniel und Dich haben euch ja entlohnt ... :D:D

@Larry:
Larry, bitte eines noch: lass´ das zweite oben markierte "S" weg ... :cool:

Gruss an beide !
 
Zuviel Werbung?
-> Hier kostenlos registrieren
VAR_INPUT IN : INT; // Eingang 0..100% Ta : TIME := T#100MS; // Abtastzeit Tp : TIME := T#10s; // Periodendauer RESET: BOOL; // Reset END_VAR VAR_OUTPUT Y : BOOL; // PWM Signal END_VAR VAR_TEMP OFF : DINT; #MAX : DINT; END_VAR VAR TICK : DINT; END_VAR BEGIN #MAX := TIME_TO_DINT(Tp) / TIME_TO_DINT(Ta); OFF := #MAX * IN / 100; // Ausdauer berechnen TICK := TICK + 1; // Zyklen addieren // Zyklenzähler auf 0 setzen IF TICK >= #MAX THEN TICK := 0; END_IF; IF TICK >= OFF THEN // Ausgang ausschalten Y := FALSE; ELSIF RESET THEN // Reset TICK := 0; Y := FALSE; ELSE // Ausgang einschalten Y := TRUE; END_IF; END_FUNCTION_BLOCK
funktioniert auch diesen code für Heizungregelung mit einem SSR Relais?
 
Zurück
Oben