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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 29

Thema: [SCL] IN1, IN2, .., INX indirekt adressieren ?

  1. #1
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute,

    als IN-Parameter hat mein FB IN1, IN2, ... INX vom Typ MyUDT (Slave-Datensätze). Nun würde ich gerne in einer Schleife die Eingänge durchtakten.
    IN[Slave_No] würde nur bei Arrays funktionieren nehme ich an.
    Geht das zur Not iwie mit String-Operationen ?



    Grüße
    Flux
    We must all suffer from one of two pains: the pain of discipline or the pain of regret. The difference is discipline weighs ounces while regret weighs tons.
    Zitieren Zitieren [SCL] IN1, IN2, .., INX indirekt adressieren ?  

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

    Standard

    Hallo,
    nein ... das geht nicht.
    Du kannst zwar, wenn dir der UDT vom Aufbau her bekannt ist auf dessen Unterelemente zugreifen - du kannst aber nicht auf eine Gruppe von IN-Parametern (oder alle) eine AT-Sicht (o.ä.) legen, die das Ganze dann wie ein Array behandelt. Auch nicht wenn alle IN's vom Typ her gleich sind.
    Was aber geht ist, sie auf ein Baustein-internes Array umzukopieren und das dann weiter zu bearbeiten ...
    Oder eben ein Array of UDT übergeben ...

    Gruß
    Larry

  3. #3
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 182 Danke für 167 Beiträge

    Standard

    Ja, IN[Slave_No] funktioniert nur bei Arrays.
    Mit String? Hmm, glaube ich eher nicht das dies funktioniert.

    Was soll denn deine Schleife machen?
    Vielleicht gehts ja anders zum lösen, zb den Code der in der Schleife steht in einen eigenen FB/FC und dann diesen mehrmals aufrufen mit dem passenden Parameter.

  4. #4
    Avatar von Flux
    Flux ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard

    Guten Morgen Larry!

    Die UDTs, eigentlich INOUT, da beidseitig gelesen und geschrieben wird, dienen als Schnittstelle zwischen Slaves und Kopfbaustein.


    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Was aber geht ist, sie auf ein Baustein-internes Array umzukopieren
    Du meinst eine Art Prozessabbild zu schaffen, also am FB-Anfang und -Ende hardcoded zu hinterlegen:

    TempArray[1..MaxSlave] OF MyUDT

    TempArray[1] := INOUT1
    ...

    //Logik
    //TempArray[ID]
    //ID++

    INOUT1 := TempArray[1]
    ...

    Speicherfresser...


    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Oder eben ein Array of UDT übergeben ...
    Ok, dann könnte ich die UDTs nicht mehr einzeln verschalten, sondern müsste das "Prozessabbild" auf einen DB auslagern und diesen dem FB zuführen.

    Geht das indirekte Adressieren von Anschlüssen vllt. in AWL ?
    We must all suffer from one of two pains: the pain of discipline or the pain of regret. The difference is discipline weighs ounces while regret weighs tons.

  5. #5
    Avatar von Flux
    Flux ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard

    Hallo Godi

    Zitat Zitat von godi Beitrag anzeigen
    Was soll denn deine Schleife machen?
    Die Sollwerte aus dem Slave-UDT versenden und Messwerte empfangen und in den jew. Slave-UDT zurückschreiben. Es kann immer nur ein Slave gleichzeitig behandelt werden, deshalb die Schleife
    We must all suffer from one of two pains: the pain of discipline or the pain of regret. The difference is discipline weighs ounces while regret weighs tons.

  6. #6
    Registriert seit
    03.01.2006
    Ort
    Im sonnigen Süden von Österreich!
    Beiträge
    1.377
    Danke
    227
    Erhielt 182 Danke für 167 Beiträge

    Standard

    Zitat Zitat von Flux Beitrag anzeigen
    Die Sollwerte aus dem Slave-UDT versenden und Messwerte empfangen und in den jew. Slave-UDT zurückschreiben. Es kann immer nur ein Slave gleichzeitig behandelt werden, deshalb die Schleife
    Dann kannst du diesen Code eh perfekt in einen Baustein packen und diesen mehrmals aufrufen.

    Oder du übergibst die UDT's nicht einzeln sondern in einem Array. Dann kannst du dies mit einer Schleife lösen.

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

    Standard

    Zitat Zitat von Flux Beitrag anzeigen
    Geht das indirekte Adressieren von Anschlüssen vllt. in AWL ?
    Im Prinzip Ja ... und auch wieder Nein.
    Du könntest dir auf den ersten IN-Parameter einen Pointer bilden und einen auf den Zweiten. Dadurch kennst du die Breite des Datenbereichs und kannst dann über indirekte Adressierung darauf zugreifen. Es ist dann aber eben kein UDT mehr sondern nur noch irgendein Adressbereich - im Nachhinein schwer nachvollziehbar da es eben keinen direkten Bezug mehr zu den Ursprungsdaten gibt.

    Ich würde hier auf jeden Fall beim dem ursprünglichen Datenformat bleiben - wahrscheinlich auch bei SCL ...

    Wie wäre denn Folgendes :
    Du hast nur noch einen IN-Parameter vom Typ UDT und einen IN-Parameter vom Typ INT als Index.
    Du arbeitest mit einem FB und bildest in dem dein Array of UDT ab. Durch den Index bestimmst du nun wohin die eingehenden Daten sollen ...
    Dieser Vorschlag funktioniert natürlich nur dann sinnvoll wenn er in dein Konzept (das ich nicht kenne) so hineinpasst - denk mal drüber nach ...

    Gruß
    Larry

  8. #8
    Avatar von Flux
    Flux ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Im Prinzip Ja ... und auch wieder Nein.
    Du könntest dir auf den ersten IN-Parameter einen Pointer bilden und einen auf den Zweiten. Dadurch kennst du die Breite des Datenbereichs und kannst dann über indirekte Adressierung darauf zugreifen. Es ist dann aber eben kein UDT mehr sondern nur noch irgendein Adressbereich
    Hm, du meinst per Point auf dem eigenen IDB rumkratzen.. Symbolik ade

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    einen IN-Parameter vom Typ UDT und einen IN-Parameter vom Typ INT als Index.
    Du arbeitest mit einem FB und bildest in dem dein Array of UDT ab. Durch den Index bestimmst du nun wohin die eingehenden Daten sollen ...
    Hm, leider kann ich nicht mehrere Slaves auf einen Eingang des Kopf-Bst. verknüppeln..

    also doch zurück zum TempArray a la Prozessabbild.

    Danke für eure Antworten und Überstunden am Sonntag

    Gruß
    Flux
    We must all suffer from one of two pains: the pain of discipline or the pain of regret. The difference is discipline weighs ounces while regret weighs tons.

  9. #9
    Avatar von Flux
    Flux ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard

    Zitat Zitat von godi Beitrag anzeigen
    Dann kannst du diesen Code eh perfekt in einen Baustein packen und diesen mehrmals aufrufen.

    Oder du übergibst die UDT's nicht einzeln sondern in einem Array. Dann kannst du dies mit einer Schleife lösen.
    Der Kopf-Bst. quatscht mit nem Protokoll-Treiber, und der kann halt nur einen gleichzeitig, daher wird das Auflösen der Schleife in ParallelInstanzen nicht gehen
    We must all suffer from one of two pains: the pain of discipline or the pain of regret. The difference is discipline weighs ounces while regret weighs tons.

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Flux Beitrag anzeigen
    Der Kopf-Bst. quatscht mit nem Protokoll-Treiber, und der kann halt nur einen gleichzeitig, daher wird das Auflösen der Schleife in ParallelInstanzen nicht gehen
    Was sind ParallelInstanzen

    Du mußt den Baustein ja nicht in einer Schleife aufrufen. Du kannst ja auch nur einen Aufruf machen solange nötig, dann den Aufruf für die nächste Instanz..

    Beachte daß Du Deinen Code auch in einem halben Jahr noch verstehen mußt und daß man durch die indirekte Adressierung nicht die Programmausführung einer bestimmten Instanz beobachten kann falls mal eine Fehlersuche nötig wird.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Step 7 ANY-Pointer Indirekt Adressieren
    Von Heini im Forum Simatic
    Antworten: 21
    Letzter Beitrag: 25.09.2013, 15:35
  2. String indirekt adressieren
    Von The Dude im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 22.06.2011, 12:21
  3. SCL indirekt Adressieren
    Von Nafura im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 19.05.2011, 21:42
  4. DB-Pointer indirekt Adressieren
    Von Anonymous im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 19.03.2004, 16:59
  5. ANY-Pointer indirekt adressieren
    Von Anonymous im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 14.02.2004, 15:41

Lesezeichen

Berechtigungen

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