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

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

Thema: zyklische Krafteinwirkung in SFC oder ST?

  1. #1
    Registriert seit
    30.01.2011
    Beiträge
    7
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo an alle Forum-Mitglieder,

    ich soll 7 Kraftgleichungen realisieren, die fortlaufend innerhalb eines Zyklusses von einer Sekunde ablaufen und sich dann wieder auf dieselbe Weise wiederholen sollen. Die 7 Partial-Funktionen sind in der Word-Datei "SPS in ST" zu finden. Bin mir nicht sicher, welche Sprache ich für diese Art von Aufgabe benutzen muss.
    Bei der SFC-Variante überlege ich mir, dass ich je nach Beginn eines Zyklusschrittes die entsprechende Kraftfunktion "aktiviere" bzw. setze, aber ich weiß nicht wie das gehen soll, weil mein doch eigentlcih nur boolsche Variablen setzen/rücksetzen kann und keine Funktionen mit Real-Anteil am Ausgang Y oder? Wenn dies funktionieren würde, wäre schonmal der Großteil erledigt.
    Bei der ST-Variante dagegen weiß ich nicht wie ich nach Ablauf des ersten Zyklusses von einer Sekunde den Zyklus wieder von Neuem beginnen lassen soll.
    Jede noch so kleine Hilfe ist bei mir gerne gesehen.

    Mfg
    alpha.man007
    Angehängte Dateien Angehängte Dateien
    Zitieren Zitieren zyklische Krafteinwirkung in SFC oder ST?  

  2. #2
    Registriert seit
    19.12.2008
    Beiträge
    336
    Danke
    19
    Erhielt 28 Danke für 28 Beiträge

    Standard

    Wenn du in ST eine Schrittkette realisieren willst so geht das zum Beispiel mit einer Hilfs-Variablen - der Schrittzähler. das könnte dann in INT sein, den du von Schritt zu Schritt hochzählst und nach dem letzten Schritt wieder auf 0 bringst. Jetzt könnte dann deine Schrittkette ein CASE-Konstrukt werden - es geht aber genauso mit IF .. THEN - ganz wie du es haben willst.

    Code:
    Select Case Schleifenzähler
       case 0:
          if T1 then
             // tue was zu tun ist
             Schleifenzähler := 1 ;
          end_if ;
       case 1:
          if T2 then
             // tue was zu tun ist
             Schleifenzähler := 2 ;
          end_if ;
     
        // usw.
     
    end_select ;

  3. #3
    alpha.man007 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.01.2011
    Beiträge
    7
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo, danke für die Hilfe.
    Aber funktioniert diese Schrittkette wirklich nach Ablauf der 1. Sekunde?


    Ich habe mal versucht deinen Vorschlag eins zu eins umzusetzen:

    TYPE
    TPARA:STRUCT
    X1:TIME:= #0.03s;
    X2: TIME:= #0.07s;
    X3: TIME:= #0.13s;
    X4: TIME:= #0.25s;
    X5: TIME:= #0.45s;
    X6: TIME:= #0.60s;
    END_STRUCT;
    END_TYPE

    VAR
    Y AT %QW1.7 :REAL;
    END_VAR
    FUNCTION KRAFT:REAL
    VAR_INPUT
    X:REAL;
    PARA:TPARA;
    END_VAR
    END_FUNCTION

    SELECT CASE Schleifenzähler
    CASE 1:
    IF X ≤ PARA.X1 THEN
    Y:= (-382000000/3 * X^3 + 5,73 * 10^6 * X^2 + 16;
    SCHLEIFENZAEHLER := 1 ;
    END_IF;
    CASE 2:
    IF X ≤ PARA.X2 THEN
    Y:= (2,225 * 10^7 * x^3 - 3,3375 * 10^6 * x^2 + 140175 * x + 84,75);
    SCHLEIFENZAEHLER := 1 ;
    END_IF;
    CASE 3:
    IF X ≤ PARA.X3 THEN
    Y:= (-118750000/9 * x^3 + 11875000/3 *x^2 - 1080625/3 * x + 103675/9);
    SCHLEIFENZAEHLER := 1 ;
    END_IF;
    CASE 4:
    IF X ≤ PARA.X4 THEN
    Y:= (55062500/27 * x^3 - 10461875/9 * x^2 + 7158125 * x - 3492359/432);
    SCHLEIFENZAEHLER := 1 ;
    END_IF;
    CASE 5:
    IF X ≤ PARA.X5 THEN
    Y:= (-398750 * x^3 + 418687,5 * x^2 - 134578,125 * x + 465441/32);
    SCHLEIFENZAEHLER := 1 ;
    END_IF;
    CASE 6:
    IF X ≤ PARA.X6 THEN
    Y:= (12080000/9 * x^3 - 2,114*10^6 * x^2 + 1,0872 * 10^6 * x – 181032);
    SCHLEIFENZAEHLER := 1 ;
    END_IF;
    CASE 7:
    IF X ≤ PARA.X7 THEN
    Y:= 168;
    SCHLEIFENZAEHLER := 1 ;
    END_IF;
    END_SELECT ;


    Im Programm kommen dann leider viele Fehler-Meldungen vor. Kannst du mir dabei behilflich sein, diese Fehler nach und nach zu korrigieren? Leider bin ich ein Anfänger beim Programmieren in der ST-Sprache.

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Hallo,
    was mir hier gleich so auffällt :
    - du vergleichst einen REAL mit einer TIME
    - du erhöhst den Schleifenzähler nicht
    - ich glaube, ST mag genauso wie SCL keine Umlaute ("Schleifenzähler") bei Variablen-Namen
    - x^3 schreibt man m.E. x**3
    - ich weiß jetzt nicht, ob man einer STRUCT-Definition schon Werte zuweisen darf - m.E. nicht ...
    - Es sieht IMMER schöner aus, wenn mit Einrückungen programmiert wird.
    - End_Function schreibt man am Ende der Funktion und nicht am Ende der Deklaration.

    Berichtige das jetzt mal und dann schaun wir weiter.
    Ach ja ... in ST gibt es m.W. auf ein Äquivalent zu "F1"

    Gruß
    Larry

  5. #5
    Registriert seit
    18.01.2011
    Ort
    Mainz
    Beiträge
    42
    Danke
    0
    Erhielt 4 Danke für 4 Beiträge

    Standard

    Der Syntax einer CASE Anweisung ist nicht
    Code:
    SELECT CASE <Variable>
    CASE 0: <Anweisung>
    CASE 1: <Anweisung>
    END_SELECT
    sondern:
    Code:
    CASE <Variable> OF
    0: <Anweisung>
    1: <Anweisung>
    END_CASE
    Außerdem ist die Variable für den "Schleifenzähler" (für das bessere Verständnis eher "Schrittnummer") am Anfang typischerweise = 0. Dein Quellcode prüft aber im ersten Schritt auf 1..

    Ach ja, du solltest natürlich auch noch die Variable für die Schrittnummer erhöhen, bis jetzt setzt du sie in jedem Schritt auf 1
    Geändert von mainzelmann (31.01.2011 um 15:35 Uhr)

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    ... das mit dem CASE-Befehl ist mir gar nicht aufgefallen - das sah schon so schön plausibel aus ...
    kann man doch mal sehen ...

  7. #7
    alpha.man007 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    30.01.2011
    Beiträge
    7
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    So dann füge ich erst einmal den bisherigen Stand ein:

    TYPE
    TPARA: STRUCT
    X1: TIME;
    X2: TIME;
    X3: TIME;
    X4: TIME;
    X5: TIME;
    X6: TIME;
    X7: TIME;
    END_STRUCT;
    END_TYPE

    PARA.X1:= 30 ms;
    PARA.X2:= 70 ms;
    PARA.X3:= 130 ms;
    PARA.X4:= 250 ms; {Wie kann man diesen Part richtig notieren?}
    PARA.X5:= 450 ms;
    PARA.X6:= 600 ms;
    PARA.X7:= 1000 ms;

    VAR
    Y AT %QW1.7 :REAL;
    END_VAR
    FUNCTION KRAFT:REAL
    VAR_INPUT
    X:REAL;
    PARA:TPARA;
    END_VAR
    END_FUNCTION

    CASE SCHLEIFENZAEHLER OF
    0:
    IF X <= PARA.X1 THEN
    Y:= (-382000000/3 * X**3 + 5,73 * 10^6 * X**2 + 16);
    SCHLEIFENZAEHLER := 1 ;
    END_IF;
    1:
    IF X <= PARA.X2 THEN
    Y:= (2,225 * 10^7 * x**3 - 3,3375 * 10^6 * x**2 + 140175 * x + 84,75);
    SCHLEIFENZAEHLER := 2 ;
    END_IF;
    2:
    IF X <= PARA.X3 THEN
    Y:= (-118750000/9 * x**3 + 11875000/3 *x**2 - 1080625/3 * x + 103675/9);
    SCHLEIFENZAEHLER := 3 ;
    END_IF;
    3:
    IF X <= PARA.X4 THEN
    Y:= (55062500/27 * x**3 - 10461875/9 * x**2 + 7158125 * x - 3492359/432);
    SCHLEIFENZAEHLER := 4 ;
    END_IF;
    4:
    IF X <= PARA.X5 THEN
    Y:= (-398750 * x**3 + 418687,5 * x**2 - 134578,125 * x + 465441/32);
    SCHLEIFENZAEHLER := 5 ;
    END_IF;
    5:
    IF X <= PARA.X6 THEN
    Y:= (12080000/9 * x**3 - 2,114*10^6 * x**2 + 1,0872 * 10^6 * x - 181032);
    SCHLEIFENZAEHLER := 6 ;
    END_IF;
    6:
    IF X <= PARA.X7 THEN
    Y:= 168;
    SCHLEIFENZAEHLER := 7 ;
    END_IF;
    END_CASE ;


    Larry Laffer, du sagst:"du vergleichst einen REAL mit einer TIME."

    REAL deswegen, weil der Ausgang aus einer Zahl mit Nahkommastellen bestehen kann. Und TIME, weil die x-Achse von der Zeit beeinflusst ist. Sobald dis SPS startet, soll der interne Zeitgeber des deklarierten Bausteines die verstrichene Zeit als Maßstab für den realen Ausgang Y nehmen. Aber sorry war mein Fehler, dass ich den Baustein falsch gezeichnet habe. Habe den richtigen nun im Anhang eingefügt.

    Außerdem sagst du:"End_Function schreibt man am Ende der Funktion und nicht am Ende der Deklaration." Aber ich glaube das habe ich doch, oder?


    Ansonsten erstmal vielen Dank.
    Angehängte Grafiken Angehängte Grafiken

  8. #8
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Ich bin jetzt zu faul zum Zitieren ...

    End_Function komt ganz ans Ende - also noch hinter den End_Select.
    Die Zuweisung der Werte Para.X? kommt vor den Case ... of und hinter den Begin ... wo steht der übrigens ?

    Übrigens ... wenn du Programm-Code einstellst dann sieht das schöner mit den Code-Tags (oder dem #-Button oben im Fenster) aus ...

    Was sagt dein Compiler sonst ?

    Gruß
    Larry

    Ach noch etwas :
    Var - End_Var kommt natürlich auch IN die Function und nicht außerhalb - nur die Struct Type darf DRAUSSEN bleiben ...

  9. #9
    Registriert seit
    18.01.2011
    Ort
    Mainz
    Beiträge
    42
    Danke
    0
    Erhielt 4 Danke für 4 Beiträge

    Standard

    Zitat Zitat von alpha.man007 Beitrag anzeigen
    PARA.X4:= 250 ms; {Wie kann man diesen Part richtig notieren?}
    Im ST:
    Code:
    PARA.X4:= T#250ms;
    Weiß nicht, obs im SCL genau so ist, evt. statt T#250ms TIME#250ms?

    Aber trotzdem wirst du nicht deine Eingangsvariable X vom Typ REAL mit einer Variable vom Typ TIME vergleichen können. X muss auch vom Typ TIME sein.
    Geändert von mainzelmann (31.01.2011 um 17:06 Uhr)

  10. #10
    Registriert seit
    17.08.2010
    Ort
    Blaichach
    Beiträge
    84
    Danke
    1
    Erhielt 9 Danke für 9 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hier mal meine Version...
    für den Compiler ist sie mal Fehlerfrei...

    TYPE TPARA :
    STRUCT
    X1:TIME:= t#0.03S;
    X2: TIME:= t#0.07s;
    X3: TIME:= t#0.13s;
    X4: TIME:= t#0.25s;
    X5: TIME:= t#0.45s;
    X6: TIME:= t#0.60S;
    X7: TIME:= t#1S;

    END_STRUCT
    END_TYPE

    FUNCTION Kraft : REAL
    VAR_INPUT
    X:REAL;
    PARA:TPARA;
    END_VAR

    VAR
    SchleifenZaehler : INT := 1;
    END_VAR


    IF SchleifenZaehler<1
    THEN
    SchleifenZaehler:=1;
    END_IF


    CASE SchleifenZaehler OF
    1:
    IF X > TIME_TO_REAL(PARA.X1) THEN
    Kraft:= -382000000/3 * EXPT(X,3) + 5.73 * EXPT(10,6) * EXPT(X,2) + 16;
    SCHLEIFENZAEHLER := 2 ;
    END_IF;
    2:
    IF X > TIME_TO_REAL(PARA.X2) THEN
    Kraft:= (2.225 * EXPT(10,7) * EXPT(x,3) - 3.3375 * EXPT(10,6) * EXPT(x,2) + 140175 * x + 84.75);
    SCHLEIFENZAEHLER := 3 ;
    END_IF;
    3:
    IF X > TIME_TO_REAL(PARA.X3) THEN
    Kraft:= (-118750000/9 * EXPT(x,3) + 11875000/3 * EXPT(x,2) - 1080625/3 * x + 103675/9);
    SCHLEIFENZAEHLER := 4 ;
    END_IF;
    4:
    IF X > TIME_TO_REAL(PARA.X4) THEN
    Kraft:= (55062500/27 * EXPT(x,3) - 10461875/9 * EXPT(x,2) + 7158125 * x - 3492359/432);
    SCHLEIFENZAEHLER := 5 ;
    END_IF;
    5:
    IF X > TIME_TO_REAL(PARA.X5) THEN
    Kraft:= (-398750 * EXPT(x,3) + 418687.5 * EXPT(x,2) - 134578.125 * x + 465441/32);
    SCHLEIFENZAEHLER := 6 ;
    END_IF;
    6:
    IF X > TIME_TO_REAL(PARA.X6) THEN
    Kraft:= 12080000/9 * EXPT(x,3) - 2.114 * EXPT(10,6) * EXPT(x,2) + 1.0872 * EXPT(10,6) * x - 181032;
    SCHLEIFENZAEHLER := 7 ;
    END_IF;
    7:
    IF X > TIME_TO_REAL(PARA.X7) THEN
    Kraft:= 168;
    SCHLEIFENZAEHLER := 0 ;
    END_IF;
    END_CASE



    Hab mal noch statt "Y" den Rückgabewert der Funktionbenutzt... ob sinn macht weiß ich nicht... *g*

    Gruß Bernd
    Real programmers don’t comment their code. It was hard to write, it should be hard to understand.

Ähnliche Themen

  1. NOVRAM-Klemme EL6080 - Zyklische Prozessdaten
    Von StructuredTrash im Forum CODESYS und IEC61131
    Antworten: 5
    Letzter Beitrag: 01.01.2012, 19:33
  2. Zyklische Aufgabe WinCC
    Von SPSSchlapf im Forum HMI
    Antworten: 1
    Letzter Beitrag: 10.01.2011, 09:41
  3. OB35 und zyklische Bearbeitung
    Von hank12 im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 28.06.2009, 19:18
  4. Antworten: 15
    Letzter Beitrag: 20.05.2008, 21:23
  5. Zyklische Speicherung von Daten in der S7 Steuerung
    Von rene.schnitzeler im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 26.04.2007, 12:58

Lesezeichen

Berechtigungen

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