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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: Datenbaustein mittels Schleife durchlaufen

  1. #11
    Registriert seit
    16.11.2009
    Beiträge
    39
    Danke
    0
    Erhielt 33 Danke für 11 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von PN/DP Beitrag anzeigen
    Irgendwas in Deinem Programm beschreibt doch den String .value in den Strukturen (idealerweise ein FB oder eine Function, der genau eine vars-Struktur übergeben wird, gerne als UDT). Es wäre elegant und schön gekapselt, wenn dieser Code auch das Umkopieren von .value nach .old_value machen würde. Dann müßtest Du nicht nochmal die List_of_vars als Array_of_vars durchgehen.

    Harald
    Das Programm unterteilt sich in folgende Blöcke:

    Eingabe:

    Es werden UDP Telegramme im Format Motor1=12#Lights=1# empfangen, der String wird zerlegt und die entsprechenden Werte (z. B. DB1.Motor1.value) im DB aktualisiert.

    Verarbeitung:

    Gegebenenfalls wird ein Wert auf Grund der SPS Logik verändert, der Zugriff erfolgt über den symbolischen Namen (z. B. DB1.Motor1.value) wegen der Übersichtlichkeit.

    Ausgabe:

    Der DB wird per Schleife durchlaufen um zu prüfen ob .oldvalue ungleich .value ist, sollte dem so sein wird der Wert an eine Stringkette angefügt, welche mittels UDP versandt wird. Im gleichen Schritt wird .old_value mit value gefüllt um im nächsten Zyklus wieder den Vergleich auf Änderung zu machen.

  2. #12
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.708
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Zitat Zitat von fabianfischer Beitrag anzeigen
    Nun möchte ich aber wenn alle FBs abgearbeitet sind mittels einer Schleife den DB durchlaufen und jeweils den aktuellen Wert (z. B. db10.Motor1.value) in den alten Wert (z. B. db10.Motor1.old_value) umkopieren und vorher durch Vergleich prüfen ob sich die Wert (alt/aktuell) im Gegensatz zum letzten Zyklus geändert hat.
    Hallo Fabian,
    das angeführte Argument spricht jetzt aber nicht gegen meinen Vorschlag sondern viel eher dafür.
    Die Instanz eines FB ist ein DB wie jeder andere auch - sie/er wird "nur" durch den FB verwaltet - und genau das wäre ja hier der "Trick". Du könntest so über den/einen spezifizierten FB-Aufruf diese Kummulations-Verarbeitung iniziieren.

    Gruß
    Larry

  3. #13
    Registriert seit
    01.10.2012
    Beiträge
    203
    Danke
    12
    Erhielt 56 Danke für 36 Beiträge

    Standard

    Also wenn in dem DB ein Array of UDT liegt kannst dir einen FB machen und das UDT da als Variable deklarieren, dann machste eine Schleife in der als Index die Arraynummer hochgezählt wird, kopierst das UDT aus dem Array in dein lokales, kannst da symbolisch alles kopieren was du willst und kopierst das lokale UDT am Ende wieder in das Array mit dem entsprechenden Index. So kannst du durch das gesamte Array rennen und alles symbolisch machen.
    Ich mach das aber immer in SCL, sollte aber in AWL auch so funktionieren.
    Nüchtern betrachtet war es besoffen besser.

  4. #14
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von Bapho Beitrag anzeigen
    Also wenn in dem DB ein Array of UDT liegt
    Ich fasse mal zusammen, wie ich den TE verstehe:

    Es geht um eine S7-1500 und TIA.

    Der TE hat einen Global-DB mit einer Ansammlung von 200 "UDT" hintereinander (wie in einem Array of UDT). Er könnte diese Ansammlung von UDTs als Array deklarieren, doch er will im Programm jeden UDT mit einem eigenen "sprechenden" symbolischen Name ansprechen, und nicht als "anonymes" Arrayelement[x].

    Zusätzlich will er aber diese Ansammlung von UDTs auch in einer Schleife bearbeiten, wozu diese Ansammlung als Array deklariert sein müßte oder auf ein Array abgebildet werden müßte oder sonstwie indiziert ansprechbar sein müßte.

    Anscheinend sollen die UDTs nicht Teil von FB-Instanzen sein und jeden der 200 UDT in einen eigenen DB legen scheint auch nicht gewünscht zu sein. Den kompletten DB mit mehreren KByte zweimal umzukopieren (auf ein Array und zurück) ist keine schöne Lösung.


    Seine Frage: Wie kann man einem Arrayelement einen eigenen symbolischen Name geben oder wie kann man eine nicht als Array deklarierte Datenstruktur indiziert ansprechen?

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #15
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von fabianfischer Beitrag anzeigen
    Nun kann ich im Anwenderprogramm über den symbolischen Namen (z. B. FB1.Variablen.Motor1.value) auf die Werte zugreifen und über Variablen_Schleife[0] das ganze in der Schleife verarbeiten.
    Jetzt bleibt aber noch zu lösen wie ich die Namen (Motor1, HVAC1) der Strukturen in der Schleife herausbekomme, da ich die Informationen ja mit Variablen_Schleife[0] bis Variablen_Schleife[1] überschrieben habe.
    Wozu willst Du in der Schleife die Namen der Strukturen herausbekommen?
    Aus einem gegebenen Arrayindex i kann NICHT der zugehörige alternative Name der Struktur ermittelt werden.

    Außerhalb der Schleife bzw. des FB kannst Du die Variablen als IDB1.Variablen.Motor1.value direkt ansprechen, in der Schleife kannst Du sie als Variablen_Schleife[i].value indiziert ansprechen. In dem FB außerhalb der Schleife kannst Du die Variablen als Variablen.Motor1.value oder als Variablen_Schleife[0].value direkt ansprechen.


    Ich kenne das TIA und die S7-1500 nicht, doch eine Frage: kann man vielleicht an einem FB-IN_OUT ein "Array[1..200] of Vars" deklarieren und außen beim Aufruf eine Struktur mit 200 sequentiellen Vars anschalten/übergeben?

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. #16
    Registriert seit
    16.11.2009
    Beiträge
    39
    Danke
    0
    Erhielt 33 Danke für 11 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Wozu willst Du in der Schleife die Namen der Strukturen herausbekommen?
    Aus einem gegebenen Arrayindex i kann NICHT der zugehörige alternative Name der Struktur ermittelt werden.

    Außerhalb der Schleife bzw. des FB kannst Du die Variablen als IDB1.Variablen.Motor1.value direkt ansprechen, in der Schleife kannst Du sie als Variablen_Schleife[i].value indiziert ansprechen. In dem FB außerhalb der Schleife kannst Du die Variablen als Variablen.Motor1.value oder als Variablen_Schleife[0].value direkt ansprechen.


    Ich kenne das TIA und die S7-1500 nicht, doch eine Frage: kann man vielleicht an einem FB-IN_OUT ein "Array[1..200] of Vars" deklarieren und außen beim Aufruf eine Struktur mit 200 sequentiellen Vars anschalten/übergeben?

    Harald
    Hallo Harald,

    du hast das Problem vollständig und richtig erkannt.

    Die Struktur Namen in der Schleife benötige ich um den UDP Sende String wieder zusammen zu bauen.

    Beispiel Sende String: Motor1=12#Lights=1#

    Erläuterung: Motor1 entspricht dem Struktur Namen und 12 ist der in der Struktur gespeicherte Wert.

    Da ich auch zu dem Ergebnis gekommen bin, dass man zu einem Array Element in der AT-Ansicht NICHT den zugehörigen alternative Name der Struktur ermitteln kann, habe ich in der Struktur eine weitere Variable angelegt in der ich den symbolischen Namen noch einmal eintragen muss.

    Ist nicht ganz das was ich gesucht habe lässt sich aber technisch scheinbar nicht anders lösen.

    Gruß Fabian

  7. #17
    Registriert seit
    16.11.2009
    Beiträge
    39
    Danke
    0
    Erhielt 33 Danke für 11 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Hallo Fabian,
    das angeführte Argument spricht jetzt aber nicht gegen meinen Vorschlag sondern viel eher dafür.
    Die Instanz eines FB ist ein DB wie jeder andere auch - sie/er wird "nur" durch den FB verwaltet - und genau das wäre ja hier der "Trick". Du könntest so über den/einen spezifizierten FB-Aufruf diese Kummulations-Verarbeitung iniziieren.

    Gruß
    Larry
    Hallo Larry,

    dein Vorschlag wird meiner Meinung nach nicht funktionieren, denn wenn ich im SCL FB auf die Strukturen zugreifen will benötige ich einen Zeiger auf ein Array, wenn ich die Strukturen aber über ein Array im FB initiiere kann ich für die Strukturen keine Namen mehr vergeben um symbolisch über den Instanz DB auf selbigen zuzugreifen.

    Oder habe ich etwas falsch verstanden?

    Gruß Fabian

  8. #18
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.708
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Zitat Zitat von fabianfischer Beitrag anzeigen
    ... denn wenn ich im SCL FB auf die Strukturen zugreifen will benötige ich einen Zeiger auf ein Array, wenn ich die Strukturen aber über ein Array im FB initiiere kann ich für die Strukturen keine Namen mehr vergeben um symbolisch über den Instanz DB auf selbigen zuzugreifen ...
    Hallo Fabian,

    kannst du mir den Satz bitte mal ins Deutsche übersetzen ?

    Ganz allgemein :
    Wenn du dein Array of Struct im Variablen-Bereich deines Bausteins deklarierst dann kennt der Baustein die Struktur, deren Aufbau und alle ihrer Einzel-Elemente darin.
    Du kannst sie also voll-symbolisch ansprechen - ganz besonders schön in SCL ...

    Gruß
    Larry

  9. #19
    Registriert seit
    01.10.2012
    Beiträge
    203
    Danke
    12
    Erhielt 56 Danke für 36 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Irgendwie ist das ein Fall von wasch mich, aber mach mich nicht nass.
    Solche Konstrukte wie Arrays und UDTs sind ja genau für sowas gedacht, wenn das aus irgendwelchen Gründen nicht gewollt ist muß man sich was einfallen lassen.
    Man könnte mit Offsets hantieren, sich quasi ein Unterprogramm schreiben das beim Aufruf der Motornummer den entsprechenden Offset im DB ermittelt wo dieser Datensatz anfängt und dann sich von da weiterhangeln, da ist man allerdings bei absoluter Adressierung und das ist ja irgendwie pfui.
    Ansonsten könnteste dir so eine Art Parser schreiben, der Symbolik der Motoren eine Zahl macht die du als Index benutzen kannst. Wobei ich das Array für die sauberste Lösung halte und sich mir nicht wirklich erschließt warum das nicht gehen soll. Array[1] ist eben Motor 1 usw. aber das muß jeder selber wissen.
    Nüchtern betrachtet war es besoffen besser.

Ähnliche Themen

  1. Step 7 Bitmusterüberprüfung mittels Schleife in AWL
    Von Rune17 im Forum Simatic
    Antworten: 37
    Letzter Beitrag: 29.04.2015, 15:32
  2. Step 7 Unterschied zwischen IF- Schleife und While-Schleife
    Von Vokal12 im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 29.10.2013, 22:52
  3. Antworten: 4
    Letzter Beitrag: 17.11.2011, 10:38
  4. Adressen durchlaufen
    Von djp im Forum Programmierstrategien
    Antworten: 1
    Letzter Beitrag: 02.09.2011, 11:36
  5. Schrittkette mehrmals durchlaufen lassen
    Von anfänger2006 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 15.04.2006, 08:51

Lesezeichen

Berechtigungen

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