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

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

Thema: Name & Datentyp zur Laufzeit in globalen DB erzeugen

  1. #1
    Registriert seit
    25.01.2012
    Beiträge
    125
    Danke
    28
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo und ein frohes neues Jahr erstmal,

    ich versuche derzeit im TIA Portal viele Antworttelegramme zu handlen und dem Benutzer strukturiert anzuzeigen.

    Für ein empfangenes Antworttelegramm benutzte ich im Instanz-DB ein Array of Byte [0 ..63] (Name: "InData")
    Da dieses Array allerdings bei jeder neuen Antwort überschrieben wird möchte ich die vorhgerige Antwort in einem globalen DB zwischenspeichern.

    Wie kann ich zur Laufzeit in dem globalen DB das 64Byte Array zwischenspeichern, sodass es möglichst strukturiert aufgelistet ist?
    Er soll mir dabei den Namen (Reply Message) mit zugehörigem Indice und Datentype erstellen und das Antworttelegramm "InData" dort reinkopieren.

    Ich stelle mir das in etwa so vor:

    Reply Message #1 - Array [ 0 ..63] of Byte
    Reply Message #2 - Array [ 0 ..63] of Byte
    .
    .
    usw..

    Viele Grüße
    timeout
    Zitieren Zitieren Name & Datentyp zur Laufzeit in globalen DB erzeugen  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.013
    Danke
    511
    Erhielt 2.647 Danke für 1.910 Beiträge

    Standard

    Ich würde einen PLC-Datentyp erzeugen, in dem du ein Array[0..63] of Byte anlegst.
    Den Datentyp nennt du Reply_Message, das Array ByteNo.
    Dann legst du einen globalen Datenbaustein an, in dem definierst du ein Array[1..1000] of "Reply_Message".
    Dann kannst du z.Bp. mit einem Blockmove oder in SCL mit einer direkten Zuweisung die Array umkopieren.

    Zugriff aus AWL dann:

    Code:
          CALL  BLKMOV
             Any
             SRCBLK  :="Messages".Reply_Message[1]
             RET_VAL :=#RetVal
             DSTBLK  :="Messages".Reply_Message[2]
    Zugriff aus SCL, wobei MyMessage hier eine in Temp definierte Variable vom Typ "Reply_Message" ist.

    Code:
    "Messages".Reply_Message[1] := #MyMessage;
    Du kannst dann für den Index auch eine Int-Variable einsetzen und über diesen Index steuern, wohin das Array denn dann geschrieben werden soll (im Bsp. 1000 Plätze).

    Code:
    "Messages".Reply_Message[My_Int] := #MyMessage;
    PS. Prüfe mal, ob 1..1000 in den DB paßt, bei mir wurde das korrekt im TIA übersetzt, man kann ja auch 1…500 nehmen oder noch weniger, je nach Bedarf.
    Geändert von Ralle (02.01.2014 um 12:38 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

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

    TimeOUT (02.01.2014)

  4. #3
    TimeOUT ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.01.2012
    Beiträge
    125
    Danke
    28
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Vielen Dank für die Antwort

    Werde es mal so umsetzen.
    Mehr als 50 Antworttelegramme erwarte ich nicht, also passt das von daher

    /edit: Sagen wir ich habe 20 ReplyMessages in meinem globalen DB definiert.
    Ich will meine ReplyMessages über eine Int-Variable, die ich nach jedem Telegramm inkrementiere, ansprechen.
    Gibt es in TIA eine Funktion, die mir die Gesamtgröße des DB's zurückgibt?
    Um zu verhindern, dass er mir im Falle von bspw. 21 Antwortelegrammen, bei nur 20 festgelegten ReplyMessages, nicht in undefinierte Bereiche schreibt und abstürzt.
    Sollte der letzte ReplyMessage-"Speicher" (also: ReplyMEssage[20]) gefüllt sein, wird das nächste Antworttelegramm ignoriert.
    Geändert von TimeOUT (02.01.2014 um 13:50 Uhr)

  5. #4
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.013
    Danke
    511
    Erhielt 2.647 Danke für 1.910 Beiträge

    Standard

    Dazu mußt du doch nur den Index überwachen, den du ja selbst inkrementierst. Der darf nicht größer als 20 werden, bzw. du nutzt die 21 als KO-Kriterium.
    Also immer inkrementieren, und vor dem Schreiben abfragen ob die Variable kleiner/gleich 20 ist. Ist sie das nicht (21), dann umspringst du die Scheiboperation, bzw. in SCL machst du das in einer If…Then - Anweisung.
    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

  6. #5
    TimeOUT ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.01.2012
    Beiträge
    125
    Danke
    28
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Das ist mir schon bewusst
    Ich suche nur eine elegante Möglichkeit nicht ständig den Quellcode ändern zu müssen, wenn ich die Anzahl der gespeicherten ReplyMessages ändere.

  7. #6
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.652
    Danke
    310
    Erhielt 1.494 Danke für 1.259 Beiträge

    Standard

    Prinzipiell gibt es bei der S7-300/400 (wovon ich jetzt einfach mal ausgehe), den SFC24 "Test_DB", wird wohl auch in TIA zu finden sein ...
    Dieser gibt unter anderem die DB-Länge in Bytes aus.
    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).

  8. #7
    Registriert seit
    02.04.2013
    Beiträge
    143
    Danke
    7
    Erhielt 22 Danke für 20 Beiträge

    Standard

    Ja, Test_DB gibt es noch:

    Anweisung in S7-300/400:
    TEST_DB


    Anweisung in S7-1500
    ATTR_DB


    Achtung
    Asynchrone Bearbeitung
    Die neuen Anweisungen arbeiten in S7-1500 asynchron, d. h. ihre Ausführung erstreckt sich über mehrere Programmzyklen.
    Beschreibung zu ATTR_DB
    Mit der Anweisung "ATTR_DB" erhalten Sie Informationen über einen im Arbeitsspeicher der CPU liegenden Datenbaustein (DB). Die Anweisung ermittelt für den ausgewählten DB die gesetzten Attribute am Parameter ATTRIB.
    Für Datenbausteine mit optimiertem Zugriff kann die Länge nicht ausgelesen werden, der Parameter DB_LENGH enthält für DBs mit optimiertem Zugriff die Länge "0".
    Datenbausteine für Motion Control können mit der Anweisung "ATTR_DB" nicht ausgelesen werden. Für diese wird der Fehlercode 80B2 ausgegeben.

  9. #8
    TimeOUT ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.01.2012
    Beiträge
    125
    Danke
    28
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Für Datenbausteine mit optimiertem Zugriff kann die Länge nicht ausgelesen werden, der Parameter DB_LENGH enthält für DBs mit optimiertem Zugriff die Länge "0".
    Leider nutze ich nur optimierte DB's

    Dann eben doch über die statische Abfrage.
    Danke!

  10. #9
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.013
    Danke
    511
    Erhielt 2.647 Danke für 1.910 Beiträge

    Standard

    Du kannst ja in dem DB eine Variable vorsehen, die angibt, wie viele Messages maximal möglich sind.
    Erzeugst du einen längeren DB, dann legst du die Länge darin ab.
    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

  11. #10
    Registriert seit
    06.10.2003
    Beiträge
    3.258
    Danke
    426
    Erhielt 476 Danke für 384 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von shutdown_TIA12 Beitrag anzeigen
    Ja, Test_DB gibt es noch:

    Anweisung in S7-300/400:
    TEST_DB


    Anweisung in S7-1500
    ATTR_DB ..
    Kann mir jemand sagen, wie man bei einer S7-1200 vorgeht? Ich habe aus der Classic-Welt einen SCL-Baustein, dem ich u.a. zwei BLOCK_DB übergebe. Ich benötige für indirekte Zugriffe von beiden DBs die DB-Länge und die DB-Nummer.

    Der Code aus Step7-Classic bzw. S7300/400
    Code:
        // DB-Länge ermitteln
            #TEMP_INT:=TEST_DB(DB_NUMBER := BLOCK_DB_TO_WORD(#DB_IN),
               DB_LENGTH      => #TEMP_WORD,
               WRITE_PROT     => #TEMP);
               #DB_IN_LAENGE   := WORD_TO_INT(#TEMP_WORD);
        
        #TEMP_INT:=TEST_DB(DB_NUMBER := BLOCK_DB_TO_WORD(#DB_OUT),
               DB_LENGTH      => #TEMP_WORD,
               WRITE_PROT     => #TEMP);
               #DB_OUT_LAENGE  := WORD_TO_INT(#TEMP_WORD);
        
        // Parameter prüfen
        IF #DB_IN_LAENGE <> #DB_OUT_LAENGE
           OR #DB_IN_LAENGE MOD 4 <> 0
           THEN RETURN;
        END_IF;
        
        // Adresse berechnen
        #ADRESSE := 4 * #AUFRUF_NUMMER;
        IF #ADRESSE > #DB_IN_LAENGE-4
           THEN RETURN;
        END_IF;
        
        // Messwert "Aufrufnummer" bearbeiten
        #x := DWORD_TO_REAL(#DB_IN.DD(#ADRESSE));
        #y := DWORD_TO_REAL(#DB_OUT.DD(#ADRESSE));
    
    //    usw.
    Die BDs sind ausschließlich mit REAL-Werten gefüllt. Ich lese aus dem einen DB ein DW nach dem anderen aus, bearbeite es und schreibe das Ergebnis in den anderen DB. Hat jemand eine Idee, wie man so etwas mit einer S7-1200 eleganter löst? Priorität liegt darauf, flexible DB-Längen als BLOCK_DB zu übergeben. Mit ANY-Pointern würde es sicherlich auch zu machen sein, möchte ich aus einem bestimmten Grund hier aber nicht machen.

    Gruß, Onkel
    Es gibt viel mehr Leute, die freiwillig aufgeben, als solche, die echt scheitern.
    Henry Ford

Ähnliche Themen

  1. TIA E/A Adressen zur Laufzeit bestimmen
    Von NBerger im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 10.10.2013, 19:48
  2. Antworten: 2
    Letzter Beitrag: 25.07.2012, 14:23
  3. Benutzerrechte zur Laufzeit ändern (MP377)
    Von andree2812 im Forum HMI
    Antworten: 1
    Letzter Beitrag: 22.09.2009, 16:45
  4. IP-Adresse zur Laufzeit ändern ??
    Von corrado im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 13.02.2007, 12:18
  5. WinCC Variablen zur Laufzeit erzeugen
    Von Anonymous im Forum HMI
    Antworten: 2
    Letzter Beitrag: 16.06.2005, 19:03

Lesezeichen

Berechtigungen

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