TIA Optimierter Bausteinzugriff S7-1500

Zuviel Werbung?
-> Hier kostenlos registrieren
Slice ist doch Mist, meine Störmeldungen haben die Störmeldenummer gleich in der Variablen stehen, ...
Slice ist irgendwie was für den Notfall, wenn einem nichts Besseres einfällt. :)


Das funktioniert nur solange wie die Maschinen immer gleich bleiben. Ich mache Software im Anlagenbereich und jede Software gibt es nur genau 1 mal.

Bei der S7 1500 habe ich in allen Objekten den Program_Alarm eingebaut und muss mir überhaupt keine Gedanken mehr machen um meine Alarme. Zusätzlich habe ich noch per Slicing ein OUT als Alarmwort das ich für 3. oder
die S7 1200 zur Verfügung stelle.

Bei S7 1200 standardisiere ich lieber meine Meldungen im Bezug auf die Objekte und weiß auf welchem Bit eine spezifische Meldung des Objektes liegt.
Der in SCL erstelle Baustein ist Deckungsgleich mit dem in der S7 1500 ich muss nur den Program_Alarm Teil auskommentieren und kann auch in der S7 1200 damit arbeiten.
 
Ich habe gerade einen Test gemacht:

Zugriff auf DBs in Schleifen, optimiert vs. nicht optimiert (AWL)

Folgender SCL Code:

Code:
FOR #outercnt := 1 TO 100 DO
    FOR #cnt := 1 TO 10 DO
        #unitVal := INT_TO_UINT(#cnt);
        #dbany := UINT_TO_DB_ANY(IN := #unitVal);
        #var := DB_ANY_TO_VARIANT(in := #dbany, err => #err);
        VariantGet(SRC := #var,
                   DST => #adt);
        
        IF LEFT(IN:=#adt.Stellplatz.Name,L:=6) = 'AAAAAA' THEN
            "symVar" := #cnt;
        END_IF;
    END_FOR;
END_FOR;

vs. AWL:

Code:
      L     100
outer: T    #z2


      L     10
lp:   T     #zaehler
      L     1000
      +D
      T     #dbnr
      OPN   #dbnr
      A(
      L     %DBW2
      L     'AA'
      ==D
      )
      A(
      L     %DBD4
      L     'AAAA'
      ==D
      )


      JCN   nee
      L     #zaehler
      T     "fixVar"
nee:  NOP 0
      L     #zaehler
      LOOP  lp


      L     #z2
      LOOP  outer


Symbolisch: um Faktor 10 langsamer

(Projekt im Anhang)
 

Anhänge

  • TestTIA.zip
    6,5 MB · Aufrufe: 13
Und wo sollen bitte konkret die Probleme beim optimierten Zugriff liegen ?
Problem ist jetzt wieder so ein großes Wort ... ein in Details umständliches Handling triffts wohl eher.
Sicherlich gibt es einen überwiegenden Teilbereich, in dem Optimiert vs. Nichtoptimiert vom Handling her keinen Unterschied macht.

Bei allen was mit unterschiedlichen Sichten "AT" auf Daten bzw. einen Speicherbereich zu tun hat,
versagt die Optimierte Variante in Bezug auf Symbolik und Nachvollziehbarkeit komplett.
Weil man das im Grunde genommen aber weiß, hat man dann Hilfs-Holzbeine wie "im IDB remant setzen" eingeführt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei S7 1200 standardisiere ich lieber meine Meldungen im Bezug auf die Objekte und weiß auf welchem Bit eine spezifische Meldung des Objektes liegt.
Damit konterkarierst Du die Idee der symbolischen Programmierung. Die Funktion der Bits wird nicht mehr dokumentiert. Das ist ja noch schlimmer als absolute Zugriffe auf Bits in Words.

Wie können Sie in STEP 7 (TIA Portal) bit-, byte- oder wortweise und symbolisch auf die unstrukturierten Datentypen zugreifen?
Die Anwendung der Slice-Zugriffe ermöglicht eine hohe Programmiereffizienz und es ist keine zusätzliche Definition in der Variablendeklaration erforderlich.
Siemens Positiv-Sprech - meint jedoch tatsächlich: Slice-Bits kann man kein Symbol und keinen Kommentar geben

Variablen, die mit Slicezugriffen im Programm adressiert sind, werden nicht mit den Querverweisen angezeigt.

Harald
 
Variablen, die mit Slicezugriffen im Programm adressiert sind, werden nicht mit den Querverweisen angezeigt.
Ist zwar irgendwo klar, aber daran hatte ich noch gar nicht gedacht. Das macht Slice eigentlich wirklich nicht viel besser als jede x-beliebige indirekte Adressierung aus der "alten" Welt.

@Jochen:
Die optimierten DBs sind ja auch nur da schneller wo man mit dem gleichen Aufwand auskommt wie beim nicht optimierten DB.
Bis auf die Tatsache das kein BE/LE-Gewandel anfällt bringt der opt. DB eben keine nennenswerten Vorteile.
Wenn man beide Varianten Symbolisch/Adressen hat, hat man eben eine weitere Variante ein Problem zu lösen. Diese weitere Möglichkeit fällt mit den opt. DBs komplett weg.

Die zerstreute Datenablage und eventuell nötige Mehroperationen um das selbe zu erreichen (so wie in deinem Beispiel), brauchen das aber ganz schnell wieder auf.
Für normale Lade/Transferoperationen ist der opt. DB (no na) im Vorteil, sobald es aber anspruchsvoller wird, steht sich das ganze Konzept eher selber im Weg....
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Ist nicht richtig variablen mit slice zugriff werden auch in querverweise angezeigt! Heute im tia portal ausprobiert, da ich es in siemens beschreibung gelesen hab das es nicht gehen soll!

Gesendet von meinem LG-E975 mit Tapatalk
 
Ist nicht richtig variablen mit slice zugriff werden auch in querverweise angezeigt! Heute im tia portal ausprobiert
Ja schon, hängt davon ab wo du schaust. Wenn du den Slice Zugriff direkt anklickst und in die Querverweise schaust, dann siehst du wo er verwendet wird.

Wenn du aber die Wort-Variable im Datenbaustein versuchst, wirst du feststellen dass im Rechtsklick-Menü keine Querverweise angeboten werden.

Es scheint also TIA grundsätzlich möglich zu sein Slice-Querverweise anzuzeigen, nur (in der V13SP1Upd7) nicht direkt zur Wort-Variablen im DB, da wo es eigentlich wichtig wäre.
Scheint also eher dass diese Querverweise, so wie die restlichen Querverweise auch, im TIA-Portal extrem schlecht umgesetzt sind.
 
Zuletzt bearbeitet:
ich sage nur Störauswertung von einem Bit.
Ich kann meinen StörungsDB nicht mehr Bitweise anlegen, da ich im WINCC V13 Advanced über eine Triggervariable welche ein INT oder WORD ist meine Bitmeldungen generieren muss.
Das ist bei optimierten Bausteinzugriff einfach Käse!

LG

Naja, unabhängig von der Übersichtlichkeit, in WinCC kostet jede ext. Variable einen PowerTAG. Schon allein aus dem Grunde würde ich Bit-Alarme nicht als Einzelnes Bit sondern in nem Byte, Word oder DWord anlegen...

ist leider so.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Denke das Problem ist, der VariantGet kopiert die Daten... Aber wie soll man es sonst lösen?

1 DB mit einem Array aus UDT's wäre mein Ansatz für die symbolische Lösung.

Code:
FOR #outercnt := 1 TO 100 DO    
                  FOR #cnt := 1 TO 10 DO
                          IF LEFT(IN := "OptiDB".Stellplatz[#cnt].Stellplatz.Name, L := 6) = 'AAAAAA' THEN
                          "SymOptiVar" := #cnt;
        END_IF;
    END_FOR;
END_FOR;

Wenn ich das Programm und die Datenhaltung auf TIA optimiere ist symbolisch schneller als absolut.

TIASYM.jpg
 
Zuletzt bearbeitet:
1 DB mit einem Array aus UDT's wäre mein Ansatz für die symbolische Lösung.

Code:
FOR #outercnt := 1 TO 100 DO    
                  FOR #cnt := 1 TO 10 DO
                          IF LEFT(IN := "OptiDB".Stellplatz[#cnt].Stellplatz.Name, L := 6) = 'AAAAAA' THEN
                          "SymOptiVar" := #cnt;
        END_IF;
    END_FOR;
END_FOR;

Wenn ich das Programm und die Datenhaltung auf TIA optimiere ist symbolisch schneller als absolut.

Anhang anzeigen 31841


Ja, aber dann muß Ich mit einem Index arbeiten. Bei uns hat jeder DB einen Namen, der Service findet so schnell den Platz wo der Fehler ist! Wenn er dann erst wieder eine Liste mit Zuordnung Nummer == Name braucht... Finde Ich nicht so toll!
 
Ich hab das gestern mal mit einem Kollegen von Siemens diskutiert.
Er hat mein Problem durchaus verstanden, meinte aber auch, hier sollte man dann vielleicht doch "nicht optimiert" bleiben.
Der Begriff ist von Siemens wirklich echt unglücklich gewählt, es gibt nun halt Leute, die meinen, wenn sie vorschreiben, alle DB müssen optimiert sein, wäre alles gut, schick und schnell, aber sowas ist leider wie so oft einfach nur unfachmännischer Stuß.

In meinem Fall, die Bits im DB müssen in einem Word zu HMI, denn sonst müßten für 512 Fehlermeldungen optimiert 512 Bit als Byte (das ist ja in optimierten DB so) übertragen werden. Auch das wäre nicht optimal.

Nun hab ich ein Programm bekommen, da werden immer 16 Bit eines optimierten DB als Einzelmeldungen genutzt und durch einen extra FC in ein Word desselben optimierten Bausteins kopiert und dieses Wort geht an die HMI.

Ergebnis
1. Das kopieren dauert natürlich auch seine Zit
2. Die Fehlerbits in der SPS sind als Array angelegt und haben keinerlei Nummer oder Bezug zum Fehler.
3. Wenn eine Störmeldung erscheint und der User sagt einem, welche es ist, sucht man sich einen Wolf, ehe man das dann vom HMI ausgehend in der PLC findet. Querverweis aus Word, dann den FC suchen, die Bits und dann irgendwo die Störmeldung, das ist der Horror, ich habs mal probiert.

Also: Das ist sowas von gar nicht optimiert! :) Dann bleiben wir beim nicht optimierten DB, schreiben da Bits und das HMI greift sich die Word aus dem DB, wie schon mit ser S7-300 praktiziert.

PS: Alarmbausteine ok, aber die will ich nicht unbedingt, es gibt auch noch andere HMI, nicht nur Siemens.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, aber dann muß Ich mit einem Index arbeiten. Bei uns hat jeder DB einen Namen, der Service findet so schnell den Platz wo der Fehler ist! Wenn er dann erst wieder eine Liste mit Zuordnung Nummer == Name braucht... Finde Ich nicht so toll!

Kann ich nachvollziehen das Problem hatten wir auch in der Classic Welt, bei der Verwaltung unserer Silos und Materiallose. Bei TIA haben wir die Diagnose komplett in die HMI/SCADA verlegt von daher können wir mit Arrays arbeiten da der Service nicht mehr an das PG muss. Ich denke TIA bringt vieles mit um mit der Arbeitsweise von Classic zu brechen sofern man bereit ist seine ganze Software einmal umzustellen.
 
Kann ich nachvollziehen das Problem hatten wir auch in der Classic Welt, bei der Verwaltung unserer Silos und Materiallose. Bei TIA haben wir die Diagnose komplett in die HMI/SCADA verlegt von daher können wir mit Arrays arbeiten da der Service nicht mehr an das PG muss. Ich denke TIA bringt vieles mit um mit der Arbeitsweise von Classic zu brechen sofern man bereit ist seine ganze Software einmal umzustellen.

Und was genau wird damit wirklich Besser? Das suche ich nun schon mind. 2 Jahre. Bin wahrscheinlich zu alt und zu doof um das rauszubekommen.
 
Hallo,

ich nutze für die Fehlermeldungen ein Array of word, da für ein Array nur ein Powertag verwendet wird.

Mittels Excel dann die Bitmeldungen generiert und die Trigger eingetragen, auch für Acknowledge und PLC Acknowlede, importiert und gut ist.

Der DB ist dann in Struct mit der Fehlernummer welche der Fehlernummer die auf dem Panel ausgegeben wird entspricht.

So ist das Ganze schnell erstellt und angebunden.

Natürlich nicht Optimierter DB.


Gruß

Jens
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich nutze für die Fehlermeldungen ein Array of word, da für ein Array nur ein Powertag verwendet wird.

Mittels Excel dann die Bitmeldungen generiert und die Trigger eingetragen, auch für Acknowledge und PLC Acknowlede, importiert und gut ist.

Der DB ist dann in Struct mit der Fehlernummer welche der Fehlernummer die auf dem Panel ausgegeben wird entspricht.

So ist das Ganze schnell erstellt und angebunden.

Natürlich nicht Optimierter DB.


Gruß

Jens

Genau so halte ich es auch für optimal, aber erklär das jetzt mal einem, der von Siemens gehört hat, das es optimierte DB gibt und nun meint, nicht optimierte DB verbieten zu müssen.
 
Sobald du dadurch eine größere Lizenz brauchst ist der Kunde gerne bereit auf optimierten zugriff zu verzichten.

Gruß

Jens
 
Ich mache es über Slice-Zugriff:

Alarm DB:

DB ALARM.jpg

OB100:

Code:
//Anzahl Störmeldungen

      CALL  "T0_Anzahl_Positionen_ermitteln"
         ArraySize :="O2_DB_Stoermeldungen".ErrNrMax
         myArray   :="O2_DB_Stoermeldungen".Error_Msg

      L     "O2_DB_Stoermeldungen".ErrNrMax
      L     2
      /I
      L     16
      *I
      T     "O2_DB_Stoermeldungen".ErrNrMax

ALARM Afruf:

Code:
      L     2                    //Alarm Nummer HMI
      T     #ErrID

      CALL  "O8_ALARM_QUITT"
         Error_Delete  :=#Fehler_ignorieren
         EVENT         :=#Bandriss
         EVENT_NEGIERN :=FALSE
         RESET         :=#Reset_Stoerungen
         ErrMax        :="O2_DB_Stoermeldungen".ErrNrMax
         ErrNr         :=#ErrID
         HmiErrSet     :="O2_DB_Stoermeldungen".HMIErrSet[#ErrID]
         HmiQuit       :="O2_DB_Stoermeldungen".HMIQuitt[#ErrID]

ALARM FC:

Code:
FUNCTION "O8_ALARM_QUITT" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      Error_Delete : Bool;
      EVENT : Bool;
      EVENT_NEGIERN : Bool;
      RESET : Bool;
      ErrMax : Int;
      ErrNr : Int;
   END_VAR

   VAR_IN_OUT 
      HmiErrSet : Bool;
      HmiQuit : Bool;
   END_VAR

   VAR_TEMP 
      SPSQuit : Bool;
      HmiErrWord : Int;
      HmiErrBit : Int;
      SPSQuitWord : Int;
      SPSErrBit : Int;
   END_VAR


BEGIN
    //Bit Nummer eliminieren, Array (Word) Nummer gewinnen
    //+1 ist weil der Index von 1..10 im Array angelegt ist.
    //Im Panel ist dem Bit "0" die ID 1 zugeornet, daher die Korrektur Errnr -1.
    //Das Anlegen von 1 - 160 entspricht der Fehler ID 1 - 160 im Panel.
    
    #HmiErrWord := SHR(IN := (#ErrNr - 1), N := 4) + 1;
    
    //Error ID durch 16 (Bits in Word) teilen, Rest = Bitnummer
    
    #HmiErrBit := (#ErrNr - 1) MOD 16;
    
    //Zweite Hälfte von Error Array ist SPS Quittirbereich
    
    #SPSQuitWord := SHR(IN := (#ErrNr + #ErrMax - 1), N := 4) + 1;
    #SPSErrBit := #HmiErrBit;
    
    
    IF NOT #Error_Delete THEN
        
        //Error vom SPS zurücksetzen
        //
        IF #RESET THEN
            #SPSQuit := true;
        ELSE
            #SPSQuit := false;
        END_IF;
        
        
        //Quittierbit vom HMI zurücksetzen
        //Quittierbit wird zurückgesetzt wenn Quittierbit= 1 und Error = 0 oder im Erste_Zyklus
        
        IF #HmiQuit AND NOT #HmiErrSet THEN
            
            CASE #HmiErrBit OF
                0:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X0 := false;
                1:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X1 := false;
                2:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X2 := false;
                3:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X3 := false;
                4:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X4 := false;
                5:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X5 := false;
                6:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X6 := false;
                7:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X7 := false;
                8:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X8 := false;
                9:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X9 := false;
                10:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X10 := false;
                11:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X11 := false;
                12:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X12 := false;
                13:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X13 := false;
                14:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X14 := false;
                15:
                    "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X15 := false;
            END_CASE;
        END_IF;
        
        //Error setzen
        //Error wird vom OP oder SPS oder Erste Zyklus zurückgesetzt
        
        IF #EVENT XOR #EVENT_NEGIERN THEN
            #HmiErrSet := true;
        ELSIF #SPSQuit OR #HmiQuit THEN
            #HmiErrSet := false;
        END_IF;
        
        //Bits in Word
        
        CASE #HmiErrBit OF
            0:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X0 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X0 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X0;
            1:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X1 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X1 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X1;
            2:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X2 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X2 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X2;
            3:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X3 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X3 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X3;
            4:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X4 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X4 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X4;
            5:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X5 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X5 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X5;
            6:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X6 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X6 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X6;
            7:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X7 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X7 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X7;
            8:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X8 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X8 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X8;
            9:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X9 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X9 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X9;
            10:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X10 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X10 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X10;
            11:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X11 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X11 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X11;
            12:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X12 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X12 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X12;
            13:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X13 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X13 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X13;
            14:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X14 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X14 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X14;
            15:
                "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord].%X15 := #HmiErrSet;
                "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord].%X15 := #SPSQuit;
                #HmiQuit := "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord].%X15;
        END_CASE;
        
    END_IF;
     
    IF #Error_Delete THEN
        #HmiErrSet := false;
        #SPSQuit := false;
        #HmiQuit := false;
        "O2_DB_Stoermeldungen".Error_Msg[#HmiErrWord] := 0;
        "O2_DB_Stoermeldungen".HMI_Quit[#HmiErrWord] := 0;
        "O2_DB_Stoermeldungen".Error_Msg[#SPSQuitWord] := 0;
    END_IF;
    
END_FUNCTION
 
Zurück
Oben