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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 24

Thema: Ein DB-Array mit Istwerten aus einem Eingang zyklich Füllen in SCL für S7-1200

  1. #1
    Registriert seit
    08.03.2015
    Ort
    Bad Nauheim
    Beiträge
    37
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Unglücklich


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo liebe leute ,

    ich hoffe ihr könnt mir weiterhelfen. Ich suche schon seit einer Woche eine möglichkeit Messwerte in ein DB zyklisch zu speichern. An sich klingt das ganze voll einfach, aber ich hab keine Ahnung von SCL.
    Ich hab mir auch diesen Programmier Guide für S7-1200 durch gelesen und so eine Einführung in die Programmiersprache Strukturierter Text .
    https://w3.siemens.com/mcms/sce/de/f...OKU_v13_de.pdf
    http://www.ipsta.de/download/automat...ap13_ST%20.pdf

    Leider komme ich auch nicht wirklich weiter. Hier im Forum wurde ich auch nicht fündig. Langsam bin ich echt frustiert .

    Ich hoffe hier kann mir einer weiter helfen.

    Also ganz kurz zu meinem Problem.

    Ich hab an meiner s7-1200 am Analogeingang ein Signal das sich ständig ändert. Und ich möchte z.b. alle 5 sekunden das signal in ein DB schreiben, dies soll er jedoch erst tun wenn ich ihm durch ein anderen Digitaleneingang E0.1 eine 1 anlege. Das ganze soll er solange tun bis der DB voll ist oder ich am E0.1 das signal wegnehme. Erstmal soll einfach der DB begrenzt fauf 50 Werte festgelegt sein.

    Ich hab jetzt als Zyklischen Timer nichts gefunden bzw. keine andere idee als einen Taktmerker zu verwenden.

    Anschließend habe ich mir gedacht, wenn ich ein Taktmerker benutze sagen wir mal M1.5 für eine Frequenz von 1 Hz und den E.0.1 baue ich das in eine For schleife ein.

    also so ungefähr

    For E0.1:=1 Do
    if M1.5:=1 then
    Füll mir im DB/Array die nächste Freie Position
    end_if

    Und genau da hört mein latein auf.....Ich hoffe ihr habt Tipps oder könnt mir weiterhelfen

    Schonmal ein ganz lieben Dank im Voraus
    Zitieren Zitieren Gelöst: Ein DB-Array mit Istwerten aus einem Eingang zyklich Füllen in SCL für S7-1200  

  2. "
    Code:
    FOR #Zähler:=0 TO 10 DO
           IF #Array[#Zähler]=0 THEN
                  #Speicher_Var:=#Zähler-1;
                  EXIT;
           ELSE IF #Zähler = 10 THEN
                  #Speicher_Var:=10;
           END_IF;
    END_FOR;
    
    #Ergebnis:=0;
    
    FOR #Zähler:=0 TO #Speicher_Var DO
           #Ergebnis:=#Ergebnis + #Array[#Zähler];
    END_FOR;
    
    Ergebnis:= Ergebnis / #Speicher_Var;
    Sowas?"


  3. #2
    Registriert seit
    21.11.2014
    Beiträge
    228
    Danke
    7
    Erhielt 30 Danke für 28 Beiträge

    Standard

    Im Grundsatz nicht schlecht, aber wenn du eine For-Schleife verwendest, wird diese in dem Bausteinaufruf jedes mal komplett abgearbeitet. D.h. der Eingangswert stünde 50 mal identisch in deinem DB (wenn man den Takt ignoriert).

    grundsätzlich würde ich ein Array anlegen "Messwerte Array[0..49] of int" und das Ganze nicht in einer Forschleife machen lassen sonder eher wie folgt:

    Code:
    IF M1.5 AND E0.1 THEN
         #Messwerte[Zähler] := Input;
         #Zähler:= #Zähler + 1;
    end if;
    Dazu sollte man sagen: Den wenn ich deinen Anwendungsfall richtig verstehe möchtest du die Taktflanke haben, nicht die ganze Zeit des Taktes, korrekt?


    Code:
    #Flankenerkennung:=#"Takt alt" XOR #Taktflanke;
    #"Takt alt":=Taktflanke;
    (Syntax dürfe falsch sein, nur um das Prinzip zu erläutern.)

    Hoffe das hilft etwas.
    Geändert von Christmaspoo (10.02.2016 um 09:22 Uhr)

  4. #3
    Registriert seit
    21.11.2014
    Beiträge
    228
    Danke
    7
    Erhielt 30 Danke für 28 Beiträge

    Standard

    Was soll der Geiz : anbei eine Quelle als Vorschlag:
    Code:
    FUNCTION_BLOCK "MW Speichern"
    { S7_Optimized_Access := 'TRUE' }
    VERSION : 0.1
       VAR_INPUT 
          "Analog in" : Int;   // Analogeingang Hier
          Enable : Bool;   // Dein Beispiel E0.1
          Takt : Bool;   // Taktmerker
       END_VAR
    
       VAR DB_SPECIFIC
          Messwerte : Array[0..49] of Int;
       END_VAR
       VAR 
          Zähler : Int;
          Taktmerker : Bool;
       END_VAR
    
    
    BEGIN
        //Wird ausgeführt wenn eine Taktflanke erkannt wird, der Enable Eingang gesetzt ist und der Zähler kleiner als 50 ist
        IF #Enable AND (#Taktmerker XOR #Takt) AND (#Zähler<50) THEN
            #Messwerte[#Zähler] := #"Analog in";                     // Speichern des Signal im Array
            #Zähler := #Zähler + 1;                                  // Zähler erhöhen
        END_IF;
        
        
        #Taktmerker := #Takt; //Signal Speicher für Flankenerkennung
        
        //WICHTIG: Der Zähler wird nirgendwo wieder auf 0 gesetzt. Bezüglich Rücksetzen des Zählers gab es keine Vorgaben! Demnach funktioniert dies nur für 50 Takte.
            
    END_FUNCTION_BLOCK

  5. #4
    Registriert seit
    08.03.2015
    Ort
    Bad Nauheim
    Beiträge
    37
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hi Christmaspoo,

    ich bedank mich mal ganz schnell bei dir^^... du bist ne riesen Hilfe. Sitz gerade am PC und kämpfe gerade bis ich gesehen habe das du geantwortet hast.

    Ich versuch das mal umzusetzten, aber du hast vollkommen Recht ich hab das garnicht bedacht mit dem Zähler zurück setzten. D.h. der würde 50 istwerte speichern und dann wäre mein Zähler auf 50 und dann geht garnix mehr oder?

    Hast du das in Step 7 V5.x geschrieben?

  6. #5
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Bei indirektem Zugriff auf Arrays empfiehlt es sich immer, den variablen Index vor der Verwendung auf Zulässigkeit zu prüfen. Da kann man bei Ringpuffern auch gleich elegant den Wrap vom Array-Ende auf den Array-Anfang einbauen:
    Code:
        IF #Enable AND (#Taktmerker XOR #Takt) THEN
            #Zähler := #Zähler MOD 50 ;
            #Messwerte[#Zähler] := #"Analog in";
            #Zähler := #Zähler + 1;
        END_IF;
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. #6
    Registriert seit
    08.03.2015
    Ort
    Bad Nauheim
    Beiträge
    37
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich hab das jetzt so übernommen wie Christmispoo es geschrieben hat und es sieht bei mir so aus.
    Die Var_inputs habe ich auch übernommen, jedoch spinnt bei mir der Zähler. Beim Beobachten habe ich das gefühl das der wie verrückt springt.
    Code:
        IF #Enable AND ("Clock_10Hz" XOR #Takt) AND ("Zähler" < 50) THEN
            "DB_SPECIFIC".Messwerte["Zähler"] := #"Analog in";                     // Speichern des Signal im Array
            "Zähler" := "Zähler" + 1;                                  // Zähler erhöhen
        END_IF;
        
        
        "Clock_1Hz" := #Takt;
    #Taktmerker := #Takt; //Signal Speicher für Flankenerkennung
    das ist etwas was mich verwirrt. Der Taktmerker wird doch von der CPU festgelegt und wie kann dann da eine zuweisung stattfinden wenn das die CPU garnicht mitmacht?


    AChja und mein Taktmerker Spinnt, der kriegt immer nur ganz kurz ein True wenn der #Enable =1 ist, dann passiert nix mehr. Und wenn ich den Schalter immer wieder betätige passiert immer das selbe.
    Geändert von SPS-Praktikantin (10.02.2016 um 11:59 Uhr)

  8. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Hast Du den Code in einer FC programmiert? Und/oder "Zähler" in TEMP deklariert?
    Bei Christmaspoo sind "Zähler" und "Taktmerker" im STAT eines FB.
    Er hat auch keine Zuweisungen an die globalen CPU-Taktmerker drin, Dein " "Clock_1Hz" := #Takt; " ist falsch.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. #8
    Registriert seit
    08.03.2015
    Ort
    Bad Nauheim
    Beiträge
    37
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hi Harald,

    dir auch erstmal vielen Dank für deine Hilfe.

    also ich hab Zähler in Temp deklariert. Dann hat er gemeckert, dass "Zähler" nicht zugewiesen ist. Anschließend habe ich sie in die Variablentabelle eingefügt.

    Komischerweise funktioniert mein Taktmerker nicht obwohl ich ihn in der Hardwarekonfig eingeschaltet habe.

    Ich hab mal Screenshots mit angehängt vlt. seht ihr den Fehler :S.

    Ich hab mal den #Takt Eingang testweise dauerhaft auf 1 gesetzt. Der Zähler zählt nicht hoch, d.h. der beschreibt immer nur den ersten wert.
    Angehängte Grafiken Angehängte Grafiken
    Geändert von SPS-Praktikantin (10.02.2016 um 12:51 Uhr)

  10. #9
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.191
    Danke
    923
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Die Variablen in TEMP können sich nichts merken. Deshalb müssen "Zähler" und "Taktmerker" in Static eines FB deklariert werden oder notfalls globale Variablen (Merker, Global-DB) sein, dann möglichst über InOut an den Baustein bringen. Am besten, Du programmierst den Code in einem FB wie es Christmaspoo gezeigt hat.

    Wegen den nicht funktionierenden Taktmerkern: ist die Hardware-Konfiguration in die CPU geladen? Gibt es Unterschiede Online(CPU) <-> Offline(Projekt)?

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  11. #10
    Registriert seit
    08.03.2015
    Ort
    Bad Nauheim
    Beiträge
    37
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Achh ich bin so doof ich hab das mit dem FB übersehen ...Sorry okay ich mach das jetzt schnell .

    Ja hab die Hardware-Konfiguration geladen, kann auch gerade nicht sagen was da ist :S.

    Noch ne Kurze Frage. Wenn ich das in eine FB schreibe erzeugt er doch ein DB. Speicher ich die istwerte in diesen DB der für den FB ist oder in einem separaten DB ?
    Geändert von SPS-Praktikantin (10.02.2016 um 13:25 Uhr)

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 07.01.2016, 15:07
  2. Aus einem ARRAY ausgewählte Werte in ein anderes ARRAY kopieren
    Von lacosta19 im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 06.08.2014, 15:42
  3. mit einem Zeiger auf ein komplettes ARRAY zeigen???
    Von fk- princess im Forum Simatic
    Antworten: 13
    Letzter Beitrag: 25.09.2012, 11:49
  4. Antworten: 6
    Letzter Beitrag: 30.09.2011, 13:35
  5. Antworten: 5
    Letzter Beitrag: 15.07.2008, 16:38

Stichworte

Lesezeichen

Berechtigungen

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