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

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

Thema: SCL - ganzes Array wird überschrieben obwohl nur eine Stelle verwendet wird

  1. #1
    Registriert seit
    08.12.2016
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Beitrag


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo erstmal,

    nun muss ich nach 3 Jahren stillen mitlesen doch einmal einen Beitrag verfassen.

    Ich hab folgendes Problem ich versuche in SCL einen Alarmbaustein zu schreiben, und der funktioniert auch einwandfrei solange ich ihn nur einmal aufrufe.
    Nur sobald ich ihn öfter verwende scheint es als würde er jedes mal wenn er aufgerufen wird jeden anderen Alarm in meinem Melde-DB rücksetzen wobei ich mir nicht erklären kann warum.


    Meinem Baustein übergebe ich natürlich den Störeingang (+ Zustand separat), ein Array für die Meldetrigger (DB101.DBX0.0), ein Array für die Quittiervariablen der PLC (DB101.DBX250.0) und ein Array mit dem ich auch den Zustand der Quittiervariable der HMI sehen kann (DB101.DBX500.0). Zusätzlich eine Melde-ID (mitdessen Hilfe ich den jeweiligen Alarm in meinem Array anspreche) und einen externen Quittiereingang.


    IF #Zustand THEN //Nur für Anzeige
    #Daten.Status.EIN := True;
    #Daten.Status.AUS := False;
    ELSE
    #Daten.Status.EIN := FALSE;
    #Daten.Status.AUS := true;
    END_IF;
    #pf := #Taktmerker AND NOT #fm; //für Verzögerung
    #fm := #Taktmerker;
    IF #Stoereingang AND NOT #Daten.Status.Stoerung THEN //neuer Alarm
    IF #pf THEN
    #i := #i + 1;
    END_IF;
    IF #i >= #Daten.Verz THEN
    #Quitt_PLC[#"Melde-ID" - 1] := FALSE;
    #StoerDB[#"Melde-ID" - 1] := True;
    #Daten.Status.Stoerung := True;
    #Daten.Status.Stoerung_unquittiert := True;
    END_IF;
    ELSE
    #i := 0;
    END_IF;
    IF NOT #Stoereingang AND (NOT #Daten.Status.Stoerung_unquittiert OR NOT #Quitt_HMI_Array[#"Melde-ID"-1]) THEN
    #StoerDB[#"Melde-ID" - 1] := false;
    #Daten.Status.Stoerung := false;
    #Daten.Status.Stoerung_unquittiert := false;
    END_IF;
    IF #Quitt_Ext THEN
    IF NOT #Stoereingang THEN
    #Daten.Status.Stoerung := false;
    END_IF;
    #Daten.Status.Stoerung_unquittiert := false;
    #Quitt_PLC[#"Melde-ID" - 1] := True;
    END_IF;

    Kann mir jemand sagen wo da mein großer Denkfehler ist?

    Wenn ich den Baustein nur einmal verwende arbeitet er genauso wie er soll (zumindest wirkt es so).

    Sobald ich ihn aber öfter verwende (ja unterschiedliche Melde-ID's, unterschiedliche Instanzen, alles 3-mal kontrolliert von der Beschaltung) wechseln sich die Alarme in meiner Meldeanzeige ab.
    Das heißt ein Alarm kommt, geht, ein neuer kommt, der neue geht,...usw... und auch in meinem DB sehe ich eigentlich nur den Zustand des Alarms an der Stelle der letzten Melde-ID die ich verwende.

    Beste Grüße Schornie
    Geändert von Schornsteiner (11.02.2019 um 12:19 Uhr)
    Zitieren Zitieren Gelöst: SCL - ganzes Array wird überschrieben obwohl nur eine Stelle verwendet wird  

  2. "aber gut...
    wenn es sich um die Variable Melde_DB.Trigger handelt von der du glaubst das sie überschrieben wird und die eigentlich ein Array wäre, dann darf sie nicht als Output deklariert sein.
    Um die gesetzten Bits der vorherigen Aufrufe zu erhalten, müsste die Variable Melde_DB.Trigger als In/Out übergeben werden -> die bereits gesetzten Bits gehen quasi in deinen Baustein rein (In), und werden um ggf. weitere Störungen ergänzt (Out).
    "


  3. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    12.046
    Danke
    409
    Erhielt 2.470 Danke für 2.053 Beiträge

    Standard

    Für mich liegt das an dem Flankenmerker.
    Der wird wahrscheinlich nicht STAT sein und nach meinem Dafürhalten wirst du für jeden neuen Aufruf einen neuen FM benötigen.
    Rufst du den Baustein immer mit dem gleichen I-DB auf ? Wahrscheinlich ja ...

    Gruß
    Larry

  4. #3
    Schornsteiner ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    08.12.2016
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Bausteinaufruf.JPG

    Multiinstanz, jeder Alarm neue Instanz -> für Visualisierung.

    Der "fm" (Flankenmerker) ist statisch und die Variable "pf" (positive Flanke) ist Temporär, gehört die auch statisch?

    Gruß Schornie

  5. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    13.074
    Danke
    1.071
    Erhielt 3.866 Danke für 3.119 Beiträge

    Standard

    Für bessere Lesbarkeit von Code mit Erhalt der Einrückungen bitte [CODE]-Tags verwenden (der #-Button im Beitragseditor):
    Code:
    IF #Zustand THEN     //Nur für Anzeige
        #Daten.Status.EIN := True;
        #Daten.Status.AUS := False;
    ELSE
        #Daten.Status.EIN := FALSE;
        #Daten.Status.AUS := true;
    END_IF;
    
    #pf := #Taktmerker AND NOT #fm; //für Verzögerung
    #fm := #Taktmerker;
    
    IF #Stoereingang AND NOT #Daten.Status.Stoerung THEN //neuer Alarm
        IF #pf THEN
            #i := #i + 1;
        END_IF;
        IF #i >= #Daten.Verz THEN
            #Quitt_PLC[#"Melde-ID" - 1] := FALSE;
            #StoerDB[#"Melde-ID" - 1] := True;
            #Daten.Status.Stoerung := True;
            #Daten.Status.Stoerung_unquittiert := True;
        END_IF;
    ELSE
        #i := 0;
    END_IF;
    
    IF NOT #Stoereingang AND (NOT #Daten.Status.Stoerung_unquittiert OR NOT #Quitt_HMI_Array[#"Melde-ID"-1]) THEN
        #StoerDB[#"Melde-ID" - 1] := false;
        #Daten.Status.Stoerung := false;
        #Daten.Status.Stoerung_unquittiert := false;
    END_IF;
    
    IF  #Quitt_Ext THEN
        IF NOT #Stoereingang THEN
            #Daten.Status.Stoerung := false;
        END_IF;
        #Daten.Status.Stoerung_unquittiert := false;
        #Quitt_PLC[#"Melde-ID" - 1] := True;
    END_IF;
    Ist Dein Baustein ein FC oder FB, wie sind die Variablen und Übergabeparameter deklariert?

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. #5
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    13.074
    Danke
    1.071
    Erhielt 3.866 Danke für 3.119 Beiträge

    Standard

    Kurz überflogen:
    Wofür ist die Verarbeitung des Taktmerkers? Wofür ist das i?

    PS: Warum schreibst Du diese logischen Verknüpfungen in SCL? KOP/FUP wäre viel weniger anfällig für logische Fehler und jeder könnte Deinen Code viel leichter verstehen ...

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. #6
    Schornsteiner ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    08.12.2016
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    EinAusgaenge.JPG

    Hier sieht man die Beschaltung des Bausteins.

    der Baustein ist ein FB (sonst könnte er sich ja statisch gar nichts "merken").

    Variablen sind einmal ein großer Melde DB der aus drei Array of Bool (0...1999) besteht (Trigger, PLC-Quitt, HMI-Quitt).

    ein Taktmerker (CPU-Intern) ein Merker für externe Quittierung und halt 2 Eingänge.

    Außerdem übergebe ich die Daten innerhalb meines FB's auf einen UDT den ich in der HMI auswerte.

    Es wirkt halt so als würde er immer alle Stellen des Array's auf false setzen bei Bausteinaufruf oder einfach überschreiben wenn ich eine andere Stelle beschreibe.

    Vielen Dank für die schnellen Antworten übrigens!

    Grüße Schornie

  8. #7
    Schornsteiner ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    08.12.2016
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Die Verarbeitung des Taktmerkers ist nur um ohne einen IEC-Timer zu verwenden eine Verzögerung zu realisieren das i sind quasi die Sekunden die ablaufen (bei Clock_1Hz).

    Ich soll alle Standard-Bausteine in SCL halten, laut Kunde wäre zwar KOP/FUP in Ordnung aber Firmenintern haben wir uns auf SCL geeinigt, deswegen wär ich schon erpicht eine Lösung in SCL zu finden
    kann doch nicht so schwer sein.

    Ich bin kurz davor das ansprechen über die Melde-ID rauszunehmen und jedes mal den jeweiligen Platz im Array an den Baustein zu verschalten.

  9. #8
    Registriert seit
    27.06.2015
    Ort
    Hamburg
    Beiträge
    579
    Danke
    101
    Erhielt 149 Danke für 132 Beiträge

    Standard

    Moin,

    Zitat Zitat von Schornsteiner Beitrag anzeigen
    Zitat Zitat von Schornsteiner Beitrag anzeigen
    Meinem Baustein Übergebe ich natürlich den Störeingang (+ Zustand separat), ein Array für die Meldetrigger (DB101.DBX0.0), ein Array für die Quittiervariablen der PLC (DB101.DBX250.0) und ein Array mit dem ich auch den Zustand der Quittiervariable der HMI sehen kann (DB101.DBX500.0). Zusätzlich eine Melde-ID (mitdessen Hilfe ich den jeweiligen Alarm in meinem Array anspreche) und einen externen Quittiereingang.
    also ehrlich gesagt sehe ich in deinen Bildern nicht, dass du auch nur ein einziges Array übergibst.
    Du übergibst laut Schnittstelle lediglich Bool-Variablen. Und die Variable Melde_DB.Trigger am Output ist bei beiden Calls die selbe?!

  10. #9
    Registriert seit
    27.06.2015
    Ort
    Hamburg
    Beiträge
    579
    Danke
    101
    Erhielt 149 Danke für 132 Beiträge

    Standard

    aber gut...
    wenn es sich um die Variable Melde_DB.Trigger handelt von der du glaubst das sie überschrieben wird und die eigentlich ein Array wäre, dann darf sie nicht als Output deklariert sein.
    Um die gesetzten Bits der vorherigen Aufrufe zu erhalten, müsste die Variable Melde_DB.Trigger als In/Out übergeben werden -> die bereits gesetzten Bits gehen quasi in deinen Baustein rein (In), und werden um ggf. weitere Störungen ergänzt (Out).

  11. #10
    Schornsteiner ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    08.12.2016
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Schnittstelle.JPGMelde DB.JPGAufruf.JPG

    Hab im Eifer des Gefechts wohl die Schnittstelle meiner Alternative geschickt bei der ich die einzelnen Bits des Arrays verschalte (anders wärs schon angenehmer).
    Hier nochmal die Schnittstelle des Bausteins an dem ich die Arrays übergebe.

    Ich hab jetzt die Alternative auch ausprobiert -> funktioniert einwandfrei, also wenn ich die Trigger und die Quittierbits direkt übergebe und nicht die ganzen Arrays übergebe wird auch nichts überschrieben.

    Aber ich verstehe einfach nicht was da falsch ist, sollte doch im Endeffekt genau das gleiche sein ob ich an der Schnittstelle z.B.: Melde_DB.HMI_Quitt[0] übergebe oder das ganze Array und dafür dann im Baustein auf das jeweilige Bit mit Quitt_HMI_Array[0] zugreife oder etwa nicht?!

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 11.02.2015, 11:35
  2. Variable wird nicht verwendet.
    Von Dimon86 im Forum PHOENIX CONTACT
    Antworten: 4
    Letzter Beitrag: 13.02.2014, 08:53
  3. Antworten: 5
    Letzter Beitrag: 14.08.2013, 17:27
  4. Antworten: 3
    Letzter Beitrag: 27.04.2012, 19:53
  5. Antworten: 5
    Letzter Beitrag: 05.03.2010, 11:45

Stichworte

Lesezeichen

Berechtigungen

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