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

Seite 4 von 7 ErsteErste ... 23456 ... LetzteLetzte
Ergebnis 31 bis 40 von 66

Thema: Optimierter Bausteinzugriff S7-1500

  1. #31
    Registriert seit
    09.08.2006
    Beiträge
    3.641
    Danke
    912
    Erhielt 661 Danke für 543 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Erema Beitrag anzeigen
    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.

  2. #32
    Registriert seit
    25.01.2008
    Ort
    Hamburg
    Beiträge
    308
    Danke
    16
    Erhielt 86 Danke für 48 Beiträge

    Standard

    Zitat Zitat von Jochen Kühner Beitrag anzeigen
    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
    Geändert von miasma (23.02.2016 um 10:39 Uhr)

  3. #33
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.758
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Zitat Zitat von miasma Beitrag anzeigen
    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

    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!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  4. #34
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    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.
    Geändert von Ralle (25.02.2016 um 08:18 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

  5. #35
    Registriert seit
    25.01.2008
    Ort
    Hamburg
    Beiträge
    308
    Danke
    16
    Erhielt 86 Danke für 48 Beiträge

    Standard

    Zitat Zitat von Jochen Kühner Beitrag anzeigen
    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.

  6. Folgender Benutzer sagt Danke zu miasma für den nützlichen Beitrag:

    zako (24.02.2016)

  7. #36
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    Zitat Zitat von miasma Beitrag anzeigen
    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.
    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

  8. #37
    Registriert seit
    25.09.2013
    Beiträge
    260
    Danke
    10
    Erhielt 35 Danke für 34 Beiträge

    Standard

    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

  9. #38
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    Zitat Zitat von DOD666 Beitrag anzeigen
    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.
    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

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

    ducati (25.02.2016)

  11. #39
    Registriert seit
    25.09.2013
    Beiträge
    260
    Danke
    10
    Erhielt 35 Danke für 34 Beiträge

    Standard

    Sobald du dadurch eine größere Lizenz brauchst ist der Kunde gerne bereit auf optimierten zugriff zu verzichten.

    Gruß

    Jens

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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

Ä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
  •