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

Seite 5 von 7 ErsteErste ... 34567 LetzteLetzte
Ergebnis 41 bis 50 von 66

Thema: Optimierter Bausteinzugriff S7-1500

  1. #41
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von vita-2002 Beitrag anzeigen
    Ich mache es über Slice-Zugriff:

    Alarm DB:

    Anhang 31873

    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
    Klar, wir wissen ja wie das geht, aber durch die Slice-Zugriffe hast du keinen Textbezug zur Störmeldung.
    Bei mit steht da "Störmeldungen".STM_128
    Wenn ich das sehe, weiß ich genau, das ist Störmeldung 128, im HMI dort zu finden, in der SPS ebenfalls.
    Wie siehst du das sofort? Das sollte doch der Vorteil von symbolischer Programmierung sein oder?
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  2. #42
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.732
    Danke
    314
    Erhielt 1.520 Danke für 1.282 Beiträge

    Standard

    @vita-2002
    Damit hast du aber genau erreicht, was Ralle nicht will
    a) Du hast keinen Bezug mehr zwischen Störmeldebit in HMI und PLC (Vielleicht verschmerzbar)
    b) Du hast keine wie auch immer gearteten Symbolischen Störbits mehr (Eigentlich nicht tolerabel)
    c) Deine ganzen Störmeldebits sind überhaupt nicht mehr Querverweistauglich, da du nur Indirekt in deinem Array rumschweinelst.

    In Summe folgt daraus:
    Von allen möglichen Lösungen hast du dich in Punkto nachvollziehbarkeit für die schlechtest mögliche Variante entschieden.
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  3. #43
    Registriert seit
    29.10.2008
    Beiträge
    160
    Danke
    28
    Erhielt 28 Danke für 18 Beiträge

    Standard

    Ich weiß es.
    In Moment geht aber nicht anderes.
    Da muss man entscheiden:

    a) Nicht optimiert, übersichtlich.
    b) Optimiert, aber mit oben beschriebenen Nachteilen.

  4. #44
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Zitat Zitat von vita-2002 Beitrag anzeigen
    Ich weiß es.
    In Moment geht aber nicht anderes.
    Da muss man entscheiden:

    a) Nicht optimiert, übersichtlich.
    b) Optimiert, aber mit oben beschriebenen Nachteilen.
    Ich bin mir nicht mal sicher, ob die ganze Kopierrei und die Sclicezugriffe zum Schluß nicht mehr Zeit kosten, als der Zugriff auf einen nicht optimierten DB. Zumal hier nichts umkopiert wird (von optimiert nach nicht optimiert u. umgekehrt muß das eine Katastrophe sein).
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  5. #45
    Registriert seit
    29.10.2008
    Beiträge
    160
    Danke
    28
    Erhielt 28 Danke für 18 Beiträge

    Standard

    Alle Bausteine sind optimiert. Es wird nichts umkopiert.

    25-02-2016 13-49-13.jpg

  6. #46
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Ich merk schon...
    Alles gut
    Geändert von Ralle (25.02.2016 um 14:37 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  7. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    Telly (25.02.2016)

  8. #47
    Registriert seit
    26.04.2010
    Beiträge
    144
    Danke
    18
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Hallo!

    Weils dazu passt:
    Ich habe eine Automatisierungsaufgabe, die meine S7-1517 an ihre Grenzen bringt. Nun muss ich eine Kommunikationsverbindung über Softnet IE und OPC DA Server zu einem Fremdsystem aufbauen. Dazu müssen meine Kommunikationsbausteine zum OPC DA Server "nicht optimiert" = absolut adressiert sein. Die restliche Steuerung läuft auf "optimierter Zugriff".
    Mit welchen Performanceeinbußen muss ich da rechnen?
    Ist nur das schreiben der Kommunikations-DBs langsam oder läuft das komplette Programm langsamer?
    Gibt es Tabellen oder Formeln um den Verlust berechnen zu können?

    mfg mephisto
    __________________________


  9. #48
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.351
    Danke
    452
    Erhielt 692 Danke für 517 Beiträge

    Standard

    Zitat Zitat von Mephisto Beitrag anzeigen
    Ist nur das schreiben der Kommunikations-DBs langsam oder läuft das komplette Programm langsamer?
    Gibt es Tabellen oder Formeln um den Verlust berechnen zu können?
    Nur die Zugriffe sind langsamer... eine Berechnung erscheint schwer.

    Hauptproblem ist dass die 1500 mit Intel-Notation (Little Endian Byte-Order) arbeitet und die 300 mit Motorola arbeitet.
    Die nicht optimierten Bausteine sind in der Byteorder kompatibel zur 300 und damit muss die 1500 bei jedem Zugriff (lesen/schreiben) Byte-drehen.
    Ein weiterer Punkt ist der Bit-Zugriff. Die 1500 verwendet ein volles Byte für ein Bit. Bei jedem Zugriff auf ein Bit im nicht optimierten DB wird immer das
    volle Byte gelesen und das gewünschte Bit dann rausmaskiert....

    Meiner Meinung ist dass der Hauptgrund für den angeprangerten Performance-Nachteil, positive Eigenschaften der opt. Dbs im Sinne von "Variablen im Speicher
    optimal sortiert" halte ich für vernachlässigbar.

    Im Kapitel 2.6 hier steht das alles ein wenig beschrieben.
    https://support.industry.siemens.com.../view/90885040

    Man kann nicht mal pauschal sagen dass opt. DB immer und überall schneller ist.
    Hängt ganz davon ab wieviele Operationen benötigt werden um das selbe zu erreichen wenn keine Adressen zur Verfügung stehen.
    Bei Standard-Operationen wird opt. aber wegen dem Byte-Gedrehe schneller sein.
    Bei deiner 1517 wirst du dass für nen COM-DB aber nicht merken.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  10. #49
    Registriert seit
    26.04.2010
    Beiträge
    144
    Danke
    18
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Hallo!

    Den Programmierleitfanden kenn ich. Danke. Daraus geht aber auch nicht hervor um wieviel ich langsamer/schneller sein werde.
    In meinem Fall habe ich einen DB mit einem Array[0..9999]of Real. Dieses Array möchte ich als FIFO beschreiben. Da hat er dann schon ganz schön damit zu tun in jedem Zyklus das Real Intel->Motorola und wieder retour zu wandlen. Deshalb hätte es mich interessiert.
    Wenn aber nur der Zugriff auf diese Adressen langsamer ist, dann kann ich - denke ich - damit leben.
    Ich hab mal was gehört von "Faktor 6-7" aber das waren Schlagworte der Siemens Verkäufer. Hat da vielleicht wer Unterlagen dazu?
    Und wenn ich schon dabei bin: Gibt es in der 1500er wieder eine FIFO FUnktion? Die Elemente der 300er gibt's ja anscheinend nicht mehr.
    __________________________


  11. #50
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.351
    Danke
    452
    Erhielt 692 Danke für 517 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Mephisto Beitrag anzeigen
    Daraus geht aber auch nicht hervor um wieviel ich langsamer/schneller sein werde.
    In meinem Fall habe ich einen DB mit einem Array[0..9999]of Real. Dieses Array möchte ich als FIFO beschreiben.
    Eine zuverlässige Aussage wirst du wohl nur durch testen bekommen, mit der RUNTIME-Funktion könntest du den Unterschied sogar direkt messen.

    Zitat Zitat von Mephisto Beitrag anzeigen
    Ich hab mal was gehört von "Faktor 6-7" aber das waren Schlagworte der Siemens Verkäufer. Hat da vielleicht wer Unterlagen dazu?
    Im Worst-Case durchaus möglich, in Realität hab ich über das komplette Programm nie mehr als 1,5 gesehen. Pauschalaussagen sind schwer.
    Aber wie gesagt, betroffen sind definitiv nur Codeteile die mit den nicht optimierten Daten arbeiten.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  12. Folgender Benutzer sagt Danke zu RONIN für den nützlichen Beitrag:

    Mephisto (04.12.2017)

Ähnliche Themen

  1. Antworten: 9
    Letzter Beitrag: 05.12.2017, 12:42
  2. TIA S7-1500 RT Kommunikation mit zweiter S7-1500
    Von HelixX23 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 19.02.2016, 14:46
  3. Antworten: 6
    Letzter Beitrag: 07.07.2015, 09:10
  4. Antworten: 6
    Letzter Beitrag: 01.02.2015, 10:35
  5. TIA 1500 - optimierter Bausteinzugriff - Sinn/Unsinn ?
    Von Draco Malfoy im Forum Simatic
    Antworten: 34
    Letzter Beitrag: 10.09.2014, 22:46

Lesezeichen

Berechtigungen

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