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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: Matlab Code auf S7 implementieren

  1. #11
    T-Rex22 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    08.11.2011
    Beiträge
    11
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Michael,
    Zitat Zitat von MCerv Beitrag anzeigen
    Ja, jedoch läuft das Programm immer zeilenweise von oben nach unten durch und beginnt dann wieder von oben.

    Code:
    Besispiel := M0.0 // Die Variable "Beispiel" wird nur im 1. Programmzyklus "0" sein, danach ist die Variable M0.0 bereits "1"
    
    M0.0 := False;  // Dieses Zurücksetzen ist nur in dieser Zeile wirksam, da in der Nächsten M0.0 wieder auf "1" gesetzt wird!
    M0.0 := True;
    Ja, ok verstehe das Problem.

    Ich hab jetzt 2 verschiedene Ansätze um den Timer neuzustarten. Vielleicht klappts ja.

    Variante 1: Um den Timer neuzustarten, rufe ich ihn zwischen setzen und rücksetzen des Starteingangs nochmals auf:
    Code:
                // obere Grenze wurde verletzt
                1 : IF oG_alarm = True THEN     // Wenn obere Grenze erneut verletzt wird dann 
                        Zustand := 1;           // bleibe in Zustand 1 und
                        Zeit_Start := False;          
                        zeit(IN:= Zeit_Start, PT:= Zeit_Wert);
                        Zeit_Start := True;     // starte Zeit erneut.
                        
                    ELSIF uG_alarm = True THEN  // wenn untere Grenze verletzt wird dann
                        M0.0 :=False;           // starte Zeit erneut und 
                        zeit(IN:= Zeit_Start, PT:= Zeit_Wert);
                        Zeit_Start :=True;
                        Zustand := 3;           // wechsle in Zustand 3.
                        
                    ELSIF Zeit_Status = True THEN      // Wenn Zeitintervall zur Detektion abgelaufen ist dann
                        Zeit_Start := False;           // setze Zeit zurück und 
    
                        Zustand := 0;                  // wechsle in Zustand 0.
                        
                    ELSIF oG_alarm = False AND Zeit_Status = 0 THEN // Wenn obere  Grenze nicht erneut verletzt wird & das Intervall nicht abgelaufen ist dann
                        Zustand := 1;                               // bleibe in Zustand 1.
                    ELSE
                        Zustand := 0;                               // Sonst gehe zurück zu Zustand 0.                    
                    END_IF;
                ;
                ...
    
             END_CASE;
    Variante 2
    Ich lege noch eine Variable für die abgelaufene Zeit (Ausgang ET des Timers) an:
    Code:
    zeit_abgelaufen: TIME;
    und setze wenn ich die Zeit neustarten will den Ausgang auf 0 Sekunden:
    Code:
    zeit_abgelaufen := T#0s;
    Würde der Timer in dem Fall einfach von 0s wieder hochzählen oder bleibt der Zeitwert stehen bis er wieder eine positive Flanke am Eingang bekommt?


    Grüße Christian
    Geändert von T-Rex22 (17.11.2011 um 14:07 Uhr)
    Zitieren Zitieren Neustart des Timers  

  2. #12
    T-Rex22 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    08.11.2011
    Beiträge
    11
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hab nochmal Variante 2 überdacht und bin zu dem Entschluss gekommen, dass das so realisierbar ist.

  3. #13
    Registriert seit
    17.05.2010
    Ort
    Paderborn
    Beiträge
    824
    Danke
    84
    Erhielt 125 Danke für 94 Beiträge

    Standard

    Ich kann Deiner Lösung nicht ganz zustimmen,

    1. Zeitglieder, auch wenn es so funktioniert, werden in der Regel möglichst immer permanent aufgerufen und nicht in einer Bedingung.

    2. Den Ausgang setzen bringt gar nichts, denn dieser wird im nächsten Zyklus wieder mit der bereits gelaufenen Zeit überschrieben. Beachte die Variablendekaration: IN-Parameter können nur Werte einlesen! OUT-P. können nur Werte ausgeben! IN-/OUT-P. können beides, aber Du hast hier eine Systemfunktion, und die hat die Schnittstelle bereits festgelegt!

    Bau Dir doch ein oder mehrere Flanken, mit der Du ein Signal setzt bzw. rücksetzt und gib das auf den IN des Timers!
    Grüße
    Michael

    1001101110110100... Das ist meine Welt

  4. Folgender Benutzer sagt Danke zu MCerv für den nützlichen Beitrag:

    T-Rex22 (21.11.2011)

  5. #14
    T-Rex22 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    08.11.2011
    Beiträge
    11
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von MCerv Beitrag anzeigen
    Ich kann Deiner Lösung nicht ganz zustimmen,
    Natürlich kannst du das nicht , hab mich in meinem letzten Post verschrieben. Es muss natürlich heißen "nicht realisierbar". Hatte da gerade nachgelesen wie die Parameter deklariert sind und festgestellt, dass ET eben nicht IN-/OUT-P ist, wie ich angenommen hatte.

  6. #15
    T-Rex22 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    08.11.2011
    Beiträge
    11
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Michael,

    Zitat Zitat von MCerv Beitrag anzeigen
    Bau Dir doch ein oder mehrere Flanken, mit der Du ein Signal setzt bzw. rücksetzt und gib das auf den IN des Timers!
    Hab das jetzt mal probiert und mir eine positive und eine negative Flanke erzeugt.

    Code:
    ...
    Zeit_Eingang: BOOL := False;
    pos_flanke : BOOL := False;
    neg_flanke : BOOL := True;
    END_VAR
    Die Merker würde ich folgendermaßen in den case Anweisungen setzen,

    Start (von Zustand 0 --> (1 oder 2) )
    Code:
    pos_flanke := True;
    neg_flanke := False;
    Reset (von (1, 2 oder 3 )--> 0)
    Code:
    pos_flanke := False;
    neg_flanke := True;
    Hinweis:
    Die Bezeichnungen 1a, 2a, 1b & 2b dienen nur der Unterscheidung der Umschaltbedingung da ich doch jeweils 2 Möglichkeiten (Zeit weiterlaufen lassen oder Neustarten bei neuem Grenzwartalarm) habe um im aktuellen Zustand zu bleiben.

    Weiterzählen (1 --> 1a oder 2 --> 2a oder 3 --> 3)
    Code:
    pos_flanke := False;
    neg_flanke := False;
    Neustart ( (1 oder 2) --> 3 oder 1 --> 1b oder 2 --> 2b)
    Code:
    pos_flanke := True;
    neg_flanke := True;

    Den Timer würde ich dann nach meiner Case Anweisung laufen lassen.
    Code:
            // Timer bei negativer Flanke am Starteingang zuruecksetzen 
            zeit(IN:= Zeit_Eingang, PT:= Zeit_Wert);  
            Zeit_Eingang := NOT neg_Flanke;
            Zeit_Status := zeit.Q;
            
            // Timer bei positiver Flanke am Starteingang starten oder weiterzählen lassen
            zeit(IN:= Zeit_Eingang, PT:= Zeit_Wert);
            Zeit_Eingang := pos_Flanke                            // bei positiver Flanke starten
                          OR 
                          (NOT pos_Flanke AND NOT neg_Flanke);  // weiterzählen lassen   
            Zeit_Status := zeit.Q;
    Ich hoffe das ist so richtig.
    Zitieren Zitieren Flanken als Eingang des Timers  

  7. #16
    T-Rex22 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    08.11.2011
    Beiträge
    11
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Mal so als Gedanken-Experiment. Ich starte im Zustand 0 gehe im nächsten Zyklus nach 1 (Start) dann nach 3 (Neustart) bleibe dort weil die Zeit noch nicht abgelaufen ist (weiterzählen) und gehe dann zurück nach 0 (Reset).

    Zyklus 1:
    In der Case-Anweisung geschieht folgendes:
    Ich gehe von Zustand 0 nach 1 und setze die Merker neg_flanke = False und pos_flanke= True und verlasse die Case-Anweisung
    Ich rufe den Timer auf. Am Eingang liegt False an (Initialisierung).
    Dann lege ich das neue Signal (True = NOT neg_Flanke ) an den Eingang. Der Timer Startet
    Jetzt Rufe ich den Timer wieder auf.
    Lege ein neues Signal (True: pos_Flanke=True). Der Timer behält sein Eingangssignal und zählt weiter.


    Zyklus 2:
    In case Anweisung gehe ich von Zustand 1 nach 3 (Timer Neustarten)
    dazu setze ich beide Flanken auf True:
    jetzt rufe ich wieder den Timer auf (Eingang ist auf True aus vorherigem Zyklus).
    ich setze den neuen Eingang auf False (NOT neg_Flanke). Die zeit wird angehalten.
    Ich rufe den Timer wieder auf.
    Dann lege ich ein neues Signal an den Eingang (True: pos_Flanke = True). Die Zeit startet neu.


    Zyklus 3:
    In case Anweisung gehe ich von Zustand 3 nach 3 (weiterzählen)
    dazu setze ich beide Flanken auf False.
    jetzt rufe ich wieder den Timer auf (Eingang ist auf True aus vorherigem Zyklus).
    Ich setze den neuen Eingang auf True (NOT neg_Flanke). Die zeit läuft weiter.
    Ich rufe den Timer wieder auf.
    Dann lege ich ein neues Signal an den Eingang (True: NOT pos_Flanke AND NOT neg_Flanke) ). Die Zeit läuft weiter.


    Zyklus 4:
    In case Anweisung gehe ich von Zustand 3 nach 0 (Reset) und setze die Merker neg_flanke = True und pos_flanke= False und verlasse die Case-Anweisung
    jetzt rufe ich wieder den Timer auf (Eingang ist auf True aus vorherigem Zyklus).
    Ich setze den neuen Eingang auf False (NOT neg_Flanke). Die zeit wird zurückgesetzt.
    Ich rufe den Timer wieder auf.
    Dann lege ich ein neues Signal an den Eingang (False: NOT pos_Flanke AND NOT neg_Flanke = False) ). Die Zeit bleibt bei 0.

  8. #17
    Registriert seit
    17.05.2010
    Ort
    Paderborn
    Beiträge
    824
    Danke
    84
    Erhielt 125 Danke für 94 Beiträge

    Standard

    Hey Christian,

    kannst Du mal den gesamten Code posten? Ich verliere etwas den Überblick.
    Grüße
    Michael

    1001101110110100... Das ist meine Welt

  9. #18
    T-Rex22 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    08.11.2011
    Beiträge
    11
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo Michael,
    hab heute endlich PLCSIM bereitgestellt bekommen und das Progamm getestet. Es funktioniert alles wie es soll.

    Vielen Dank du hast mir wirklich sehr weitergeholfen.

  10. #19
    Registriert seit
    17.05.2010
    Ort
    Paderborn
    Beiträge
    824
    Danke
    84
    Erhielt 125 Danke für 94 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Gern geschehen
    Grüße
    Michael

    1001101110110100... Das ist meine Welt

Ähnliche Themen

  1. Mit S7 werte von MATLAB auslesen und verarbeiten
    Von Freakadelle im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 02.02.2009, 13:56
  2. S7-PLCSIM & MATLAB/Simulink
    Von sse im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 28.01.2009, 21:48
  3. SM331 implementieren HILFE
    Von BOBZ im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 18.01.2007, 13:52
  4. OPC Kommunikation mit Matlab/Simulink
    Von farforward im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 25.01.2006, 21:13
  5. Antworten: 0
    Letzter Beitrag: 23.01.2006, 16:52

Stichworte

Lesezeichen

Berechtigungen

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