Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Counter mit If anweisung in AWLfür PWM - Probleme

  1. #1
    Registriert seit
    07.01.2015
    Beiträge
    9
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute,
    Ich bin noch recht frisch in der SPS-Programmierung und brauche für mein Projekt eine PWM steuerung.

    Mein plan war es nun den OB 35 zu benutzen und dort einen Counter von 0-100 zählen und wieder rücksetzen zu lassen.
    Der wert soll in einem DB-variablen mit den namen count1 gespeichert werden.
    In einem anderen FC soll dann der Zählerstand gelesen werden und mit dem Puls/pausen verhältnis verglichen werden.

    Sprich der zähler steht auf 60 und puls pausen verhältnis steht auf 60% dann soll der Ausgang auf 0 gesetzt werden und von 0-59 auf 1


    Nun das Problem:
    Es wird immer der Sprungbefehl ausgeführt und der vergleich wird nicht berücksichtigt.
    Sprich es wird nur das beachtet was bei "els" steht.
    Ich habe schon sämtliche Sprungbefehler ausprobiert sowie vergleichsoperationen und auch direkt zahlen eingegeben (z.b. "L 5" statt 1)

    L "ProzessDaten".count1
    L 100
    >I
    SPB els
    L "ProzessDaten".count1
    L 1
    +I
    T "ProzessDaten".count1

    els: L 22
    T "ProzessDaten".count1


    Wo steckt dort mein Fehler? Oder hat jemand eine bessere Lösung für mich ?
    Vielen Dank!
    Zitieren Zitieren Counter mit If anweisung in AWLfür PWM - Probleme  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.327
    Danke
    932
    Erhielt 3.332 Danke für 2.690 Beiträge

    Standard

    Zitat Zitat von murmelkopf2 Beitrag anzeigen
    Es wird immer der Sprungbefehl ausgeführt und der vergleich wird nicht berücksichtigt.
    Sprich es wird nur das beachtet was bei "els" steht.
    Wie kommst Du darauf? Du solltest den Code mal beobachten.

    Tatsächlich ist es so, daß nach dem Inkrementieren der count-Variable IMMER auch noch die Anweisungen nach der "els"-Sprungmarke ausgeführt werden. Ist das nicht erwünscht, dann müssen diese Anweisungen durch einen extra Sprungbefehl übersprungen werden.

    Dein Code ist außerdem auch logisch falsch. Wenn er funktionieren würde, dann würde er bis 101 zählen ...


    Code:
    // IF
    L "ProzessDaten".count1
    L 100
    >=I
    SPB els
    
    // THEN
    POP  //gelesenen Wert von "ProzessDaten".count1 zurück in AKKU1 (TAK geht auch)
    + 1
    T "ProzessDaten".count1
    SPA M002  //"els"-Anweisungen überspringen
    
    // ELSE
    els: L 0
    T "ProzessDaten".count1
    
    // Weiter
    M002: NOP 0

    Bessere Variante des freilaufenden Zählers:
    Code:
    L "ProzessDaten".count1
    + 1
    L 101
    MOD
    T "ProzessDaten".count1 // wird hier garantiert 0..100

    Mein plan war es nun den OB 35 zu benutzen und dort einen Counter von 0-100 zählen und wieder rücksetzen zu lassen.
    [...]
    In einem anderen FC soll dann der Zählerstand gelesen werden
    Vorsicht: wenn Du die DB-Variable auch außerhalb der OB35-Aufrufebene liest, dann darfst Du den Wert nur einmal lesen. Zwischen dem ersten und dem zweiten Lesen könnte ein OB35-Aufruf gewesen sein und das zweite mal ein anderer Wert gelesen werden.


    brauche für mein Projekt eine PWM steuerung.
    Wie hoch soll die Ausgabefrequenz des PWM-Signal sein? Ist Deine OB35-Idee da nicht zu langsam?
    Welche SPS-Hardware hast Du zur Verfügung?

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    murmelkopf2 (08.01.2015)

  4. #3
    murmelkopf2 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.01.2015
    Beiträge
    9
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,
    Erstmal vielen dank für die Hilfe ich bin gestern schon fast verrückt geworden an dem fehler.
    Die geschichte mit dem 101 ist nicht so wild mir ging es erstmal um die grundlegende funktion dass meine IF schleife funktioniert.
    Den OB 35 habe ich auf 10ms eingestellt und ist eigentlich schon zu schnell.

    Ich brauche es nur um eine Heizspirale in der Leistungs zu drosseln. Dafür brauche ich keine hohe frequenz.

    Zur verfügung habe ich eine S7 314-2ptp wenn ich das gerade richtig in erinnerung habe.
    Ich werde es heute Nachmittag gleich ausprobieren.
    Vielen Dank!

  5. #4
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.367
    Danke
    457
    Erhielt 696 Danke für 521 Beiträge

    Standard

    Klingt als wäre OB35 für deine Anwendung übertrieben.
    Wenn du am einfachsten an ein paar Takte kommen willst könntest du...

    A) Das interne Taktmerkerbyte nehmen.
    Das musst du zunächst in den Hardwareeinstellungen der CPU unter dem Reiter "Zyklus/Taktmerker" mit dem Häkchen aktivieren. Übersetzen und auf die CPU laden.
    Dann hast du bei Standardeinstellung auf MB0 folgende Aufteilung. Das Byte ist sowieso praktisch für Blinktakte bei Anzeigelampen etc.
    Code:
    Takt_10Hz	M       0.0	BOOL	
    Takt_5Hz	M       0.1	BOOL	
    Takt_2,5Hz	M       0.2	BOOL	
    Takt_2Hz	M       0.3	BOOL	
    Takt_1,25Hz	M       0.4	BOOL	
    Takt_1Hz	M       0.5	BOOL	
    Takt_0,625Hz	M       0.6	BOOL	
    Takt_0,5Hz	M       0.7	BOOL
    Dann könntest du für deine Anwendung eine Takt aussuchen und diesen dann folgendermaßen programmieren.
    Code:
     U M0.0  //10 Hz - Ein 0-100 Durchlauf (PWM-Periode) dauert 10s
    FP M10.0 //Flanke da die Taktmerker ein 50/50 Ein/Aus-Verhältnis haben
    SPBN Ma01
    
    L Zählwert
    + 1
    L 101
    MOD
    T Zählwert
    
    Ma01: Nop 0
    Dann brauchst du den OB35 nicht.


    B) Du kannst deinen eigenen Takt mit einem Timer schreiben.


    Deinen Ausgang könntest du dann einfach so programmieren...
    Code:
    U M20.0  //Irgendeine Startbedingung
    U(
    L Zählwert
    L Soll_Verhältnis_PWM 
    <=I
    )
    = Ausgang_PWM
    Ich würde dann auch noch wenn keine Startbedingung da ist, den Zählwert auf 0 setzen damit die PWM beim ersten Durchlauf nicht irgendwo in der Mitte anfängt.
    Geändert von RONIN (08.01.2015 um 14:16 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  6. Folgender Benutzer sagt Danke zu RONIN für den nützlichen Beitrag:

    murmelkopf2 (09.01.2015)

  7. #5
    murmelkopf2 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.01.2015
    Beiträge
    9
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Vielen Dank es funktioniert.
    Nun muss ich nur noch einen regelkreis implementieren, der den Ansteuergrad bestimmt =)


    L "ProzessDaten".count1
    + 1
    L 101
    MOD
    T "ProzessDaten".count1
    NOP 0
    // PWM vergleich + startbedingung

    U "ProzessDaten".relais_1
    U "ProzessDaten".var1 //Freigabe
    U(
    L "ProzessDaten".count1 //gelesenen Wert von "ProzessDaten".count1 zurück in AKKU1 (TAK geht auch)
    L "ProzessDaten".AA0 // laden pwm aussteuergrad
    <=I // vergleich Zähler u Aussteuergrad
    )
    = "ProzessDaten".XSSR1

    U "ProzessDaten".relais_1
    U "ProzessDaten".var2 //Freigabe
    U(
    L "ProzessDaten".count1 //gelesenen Wert von "ProzessDaten".count1 zurück in AKKU1 (TAK geht auch)
    L "ProzessDaten".AA1 // laden pwm aussteuergrad
    <=I // vergleich Zähler u Aussteuergrad
    )
    = "ProzessDaten".XSSR2

    NOP 0

  8. #6
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.367
    Danke
    457
    Erhielt 696 Danke für 521 Beiträge

    Standard

    Ich würde dir jedoch raten den Counter, wenn du keine Freigabe hast, auf 0 zu setzen.
    Du müsstest dann halt 2 getrennte Counter für jeden Ausgang machen.

    Wenn du zum Beispiel einen Ansteuerungsgrad von 50 hast und die Freigabe kommt wenn der Counter bei
    48 ist, dann schaltet dein Ausgang im ersten Durchlauf nur sehr kurz. Je nachdem was für eine Schaltstufe du hast kann das zu Beschädigungen führen.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  9. #7
    murmelkopf2 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.01.2015
    Beiträge
    9
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich habe noch ein Problem:

    Wenn ich der SPS den Strom wegnehme und wieder anschalte macht die SPS einfach mit dem Letzten Zustand weiter:
    Ich möchte aber, dass alle Ausgänge auf 0 gesetzt werden.


    Auszug aus OB100
    L 0 // Alle Ausgänge auf Null
    T PAB 124
    L 0
    T PAB 125
    CLR
    R "ProzessDaten".relais_1
    R "ProzessDaten".relais_2
    R "ProzessDaten".relais_3
    R "ProzessDaten".relais_4
    R "ProzessDaten".relais_5
    R "ProzessDaten".relais_6
    R "ProzessDaten".relais_7
    R "ProzessDaten".var1
    R "ProzessDaten".var2

    Es funktioniert leider nicht!
    Obowohl es eigentlich Doppelt auf 0 gesetzt werden soll. Relais 1 - 7 sind A124.0-6

  10. #8
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.367
    Danke
    457
    Erhielt 696 Danke für 521 Beiträge

    Standard

    Zitat Zitat von murmelkopf2 Beitrag anzeigen
    CLR
    R ...
    Denk mal ein wenig darüber nach...

    Die nächste Frage ist dann ob die Bedingungen (im normalen Programmablauf) zum setzen der Ausgänge nicht womöglich nach dem Neustart erhalten bleiben.
    Geändert von RONIN (16.01.2015 um 22:24 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  11. #9
    murmelkopf2 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    07.01.2015
    Beiträge
    9
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard

    normalerweise sollte es duch die erste Anweisung
    L 0
    T PAB 124

    schon erledigt sein.

    Das andere hab ich noch zum ausporbieren dahinter geschrieben da ersteres nicht gereicht hat.

    OB1 hat folgendes drinnen:
    // Eingänge Lesen und and DB schicken
    L PEB 124
    T DB1.DBB 34
    // DB Lesen und an Ausgänge schicken
    L DB1.DBB 37
    T PAB 124
    L DB1.DBB 38
    T PAB 125


    Wenn ich der SPS den Strom weg nehme und wieder anschalter sollte doch eigentlich der OB 100 durchlaufen werden bevor OB1 aufgerufen wird.
    Demnach sollte im DB alle ausgänge zurückgesetzt werden

    Aber das scheint ja nicht gemacht zu werden. Oder der OB 100 wird nicht aufgerufen

  12. #10
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.367
    Danke
    457
    Erhielt 696 Danke für 521 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von murmelkopf2 Beitrag anzeigen
    normalerweise sollte es duch die erste Anweisung erledigt sein.
    L 0
    T PAB 124

    Aber das scheint ja nicht gemacht zu werden. Oder der OB 100 wird nicht aufgerufen
    Wird erledigt, Boss...
    Wird gemacht, Boss...
    Die Steuerung ist stur und macht immer das was du ihr sagst.

    Zitat Zitat von murmelkopf2 Beitrag anzeigen
    OB1
    // DB Lesen und an Ausgänge schicken
    L DB1.DBB 37
    T PAB 124
    L DB1.DBB 38
    T PAB 125
    Und wer hat jetzt den Wert aus DB1.DBB37 und DB1.DBB38 gelöscht? Da steht immer noch dasselbe drin wie vor dem Stromausfall.
    Zitat Zitat von RONIN Beitrag anzeigen
    Die nächste Frage ist dann ob die Bedingungen (im normalen Programmablauf) zum setzen der Ausgänge nicht womöglich nach dem Neustart erhalten bleiben.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  13. Folgender Benutzer sagt Danke zu RONIN für den nützlichen Beitrag:

    murmelkopf2 (16.01.2015)

Ähnliche Themen

  1. TIA IF Anweisung mit BOOL Variable aus DB - ERROR
    Von CaptainB im Forum Simatic
    Antworten: 19
    Letzter Beitrag: 07.03.2014, 11:32
  2. Sonstiges Counter mit beliebigem Wert zum Inkrementieren
    Von GBat im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 15.07.2013, 08:18
  3. Lüfterregelung mit PWM
    Von slk230-power im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 28.11.2010, 15:46
  4. Probleme mit PWM und Vipa 114
    Von Moppel im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 01.12.2008, 12:35
  5. PWM mit S7/314
    Von noeppkes im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 31.10.2006, 12:16

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •