UDT Array Input an einem FC

TagebauCoder

Level-1
Beiträge
56
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute!

Ich hätte da folgendes Problem:

Ein UDT1 mit einer Struktur (Dauer,Min,Max,etc..).
Ein UDT2 das aus einem array [1..10] of UDT1 besteht.
Einen DB mit 3 UDT2 (Var1,Var2,Var3).

Einen FC mit einem Formalparameter Input vom Typ UDT2.

Die Beschaltung erfolgt in der Form DB_NAME.Var2

Wie kann ich jetzt innerhalb der FC z.B. auf "DB_NAME.Var2[X].Dauer" zugreifen?

Wobei das Arrayfeld natürlich variabel (X) adressiert werden muss.

SCL IST VERBOTEN!

Gehe ich richtig in der Annahme das mir nur registerindirekte Adressierung übrig bleibt?

Aber wie behandele ich den Inputparameter UDT? So wie Any, oder eher wie Pointer, oder gibts da ein eigenes Format?:confused:
Wenn ja, wäre Toll wenn mir das jemand erklären könnte. Bin sozusagen UDT Greenhorn.
Step7 Doku hab ich zuhause nicht, und Internet nich am PG.
Grüße TC
 
Hallo,
der UDT wird dem FC wie ein ANY-Pointer übergeben.
Du könntest nun innerhalb des FC im TEMP-Bereich den UDT nachbilden und den Übergabe-UDT (z.B. via Blockmove) auf den TEMP-UDT kopieren und dann absolut auf die Einzel-Bestandteile zugreifen.
Wenn du inhaltlich etwas änderst, dann bleibt dir allerdings im Anschluß nur die Möglichkeit, die Daten wieder auf den externen Bereich zurück zu kopieren.

Für die ARRAY-Adressierung bleibt die (außer du arbeitest mit festen Indexen) dann nur die Möglichkeit, die über indirekte Adressierung zu lösen.

SCL wäre hier also schon eine feine Sache ... aber das hast du im Vorfeld ja ausgeschlossen ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Antwort.

Absolut auf den Temp bereich zuzugreifen halte ich für ganz furchtbar. Wenns irgendwie geht vermeide ich das.
Im Aspekt der Wiederverwendbarkeit werde ich den Any zerpflücken, und dann mit AR' arbeiten.
War da nich irgendwas mit AR1 in FC's? Wird irgendwie für Input-Parameter verwendet oder so. Oder beim zugriff auf zusammengesetzte Datentypen zerschossen?
Weiss nur noch das AR2 Problem bei FB's die als Multiinstanz laufen.
Muss ich mit AR1 irgendwas beachten?

mfg TC
 
Danke für die Antwort.

Absolut auf den Temp bereich zuzugreifen halte ich für ganz furchtbar. Wenns irgendwie geht vermeide ich das.

Da hast du Larry falsch verstanden, er wollte die Daten per Blockmove (Anyzeiger) in den Temp-Bereich kopieren, auf eine dort vorher erstellte Stucktur/UDT. Auf diese hätte man dann schön bequem über die Temp-Variablennamen zugreifen können. Aber auch da kann auf Arrays nicht per variablem Index zugreifen, das hat er ja auch geschrieben. Bleibt dir wirklich nur der weg über indir. Adressierung. Also mit dem AR1 wäre mir gerade nichts bedeutendes bekannt. Das AR2 enthält bei Multiinstanzen tatsächlich den Offset zu den Daten der Instanz. Wenn du mit ind. Adressierung arbeitest und einen Multiinstanzfähigen Baustein programmieren willst, brauchst du das zwingend! Sieh dich hier im Forum um, da gibt etliches zu dem Thema. Stichwort "Multiinstanz" würde ich zuerst mal probieren. Oder du sagst von vornherein, der Baustein wird nie als Instanz in einem anderen FB deklariert, dann geht es ohne den Offset im AR1, der ist dann eh Null.
 
Nicht das ich jetzt eine bessere Lösung hätte,
aber welcher Volltrottel verbietet für sowas SCL?

In SCL hat man bei sowas wenigstens die Aussicht das was halbwegs nachvollziehbares rauskommt,
in AWL ist das ein Zeiger-Pointer gewurschtel bei dem keine Sau jemals wieder so wirklich durchblickt.

Mfg
Manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Volltrottel der das verbietet ist Siemens. Details per PN.
Aber SCL habe ich wg. solchen Antworten von vornherein ausgeschlossen.

Gerade das AR1 Prob bei FC's in den S7-Pro3 unterlagen (K4,S13) gefunden:

"Bei Zugrffen auf Parameter in FC's wird das AR1 und das DB-Register überschrieben, wenn die Parameter vom zusammengesetzten Datentyp sind."
FETT MARKIERT IN DEN UNTERLAGEN

Und das ist verdammt bedeutend. Jetzt weiß ich warum sich ein Wert in einem völlig anderem DB änderte, der mit der Sache so gut wie nix zu Tun hatte, aber an einem Input Parameter verwendet wurde.


Also in ner FC nach möglichkeit AR2 verwenden.

Bei nem FB ist es umgekehrt, da ist Vorsicht mit AR2 und DI geboten. Außer bei INOUT Parametern, da is AR1 auch gefärdet, bzw. der INOUT Parameter, wenn er von z.g. Datentyp ist.

@Ralle Das AR2 Prob in FB's kenne ich genauestens. (TAR2 , L DINO blablabla). Danke für den Hinweis.

Danke

mfg TC
 
Zuletzt bearbeitet:
Gerade das AR1 Prob bei FC's in den S7-Pro3 unterlagen (K4,S13) gefunden:

"Bei Zugrffen auf Parameter in FC's wird das AR1 und das DB-Register überschrieben, wenn die Parameter vom zusammengesetzten Datentyp sind."
FETT MARKIERT IN DEN UNTERLAGEN

Und das ist verdammt bedeutend. Jetzt weiß ich warum sich ein Wert in einem völlig anderem DB änderte, der mit der Sache so gut wie nix zu Tun hatte, aber an einem Input Parameter verwendet wurde.

Könntest du das mal näher erläutern wann da was passieren soll?
Gibt es diese Unterlagen irgendwo bei Siemens zum Download?
 
"Bei Zugrffen auf Parameter in FC's wird das AR1 und das DB-Register überschrieben, wenn die Parameter vom zusammengesetzten Datentyp sind."
FETT MARKIERT IN DEN UNTERLAGEN

Und das ist verdammt bedeutend. Jetzt weiß ich warum sich ein Wert in einem völlig anderem DB änderte, der mit der Sache so gut wie nix zu Tun hatte, aber an einem Input Parameter verwendet wurde.

Ah, ich erinnere mich, danke für den Hinweis. Ich hatte das auch schon mehrfach und hab mir daher angwöhnt, vor Aufrufen von Variablen direkt aus einem DB diesen erstmal wieder zu öffnen. Das AR1 beschreibe ich vor Verwendung mit einem gespeicherten Wert, falls nötig. Aber ich finde das eigentlich erschreckend, ich mache das schon aus Routine und weiß schon gar nicht mehr warum. :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
[FONT=&quot]
[/FONT]
  • Zu AR1: Der STEP 7-Editor verwendet das Adressregister AR1, um auf zusammen*gesetzte Bausteinparameter zuzugreifen. Innerhalb von Funktionen werden bei allen symbolischen Zugriffen auf alle Bausteinparameter vom Typ ARRAY oder STRUCT die Register AR1 und DB überschrieben.Ebenso werden bei Zugriffen auf Durchgangsparameter vom Typ ARRAY oder STRUCT innerhalb eines FBs die Register AR1 und DB überschrieben.Symbolische Zugriffe auf temporäre Variable eines FBs oder einer FC über*schreiben weder das AR1 noch das DB-Register.

  • Zu AR2: Der STEP 7-Editor verwendet für den symbolischen Zugriff auf Instanzdaten, d.h. auf alle Parameter und auf die statischen Variablen eines FBs, die bereichsinterne, registerindirekte Adressierung. Das DI-Register enthält dabei die Nummer des Instanz-DBs und das Adressregister AR2 den Adressversatz des Instanz-Datenbereichs innerhalb des Multiinstanz-DBs.
Nach einem Überschreiben dieser Register DI und AR2 darf kein Zugriff auf die Instanzdaten erfolgen, wenn nicht die Inhalte dieser beiden Register wiederher*gestellt werden. Wenn Sie innerhalb eines FBs das Register AR2 oder DI für eigene Zwecke nutzen wollen, dann empfiehlt sich folgende Vorgehensweise:
1.Sichern Sie die Inhalte von D1 und AR2 in Variablen vom Typ DWORD:
TAR2 #AR2_REG // Speichern von AR2 in temp. Variable #AR2_REG
L DINO // Lade Inhalt von DI in AKKU1
T #DI_REG // Speichere in temp. Variable #DI_REG
2.Verwenden Sie das DI- und das AR2-Registers für eigene Zwecke. Während dieses Abschnitts darf kein Zugriff auf die Parameter oder die statischen Variablen des FBs erfolgen.
3.Stellen Sie den ursprünglichen Inhalt des DI- und des AR2-Registers her:
LAR2 #AR2_REG // Laden des AR2 mit Inhalt von #AR2_REG AUF DeDI_REG] // Wiederherstellen des 01-Registers
Jetzt kann wieder symbolisch auf die Parameter und stat. Variablen des FBs zugegriffen werden.



Gibts natürlich nicht zum Download, ist auch als gebundene Ausgabe, Scannen is also eher schlecht.

mfg TC
 
... um wieder zum eigentlichen Thema zurück zu kommen ...
Wenn die SCL-Variante gar nicht in Frage kommt und das Kopieren in den TEMP-Bereich des FC (wie schon von Ralle und mir ausgeführt) auch nicht die Lösung ist, das wirst du nicht um das AR-gewurschtel (wie von MSB so schön ausgeführt) herumkommen. Ob dabei dann aber ein handelbares Programm herauskommt (das man auch noch durchblicken kann) möchte ich dann dochh mal dahingestellt sein lassen ...

Aber ... mich würde auch interessieren, warum SCL tabu ist - ich verspreche auch, dass ich dann nicht mehr weiter darauf herum reite ... :rolleyes:

Gruß
LL
 
"Bei Zugrffen auf Parameter in FC's wird das AR1 und das DB-Register überschrieben, wenn die Parameter vom zusammengesetzten Datentyp sind."
FETT MARKIERT IN DEN UNTERLAGEN

Und das ist verdammt bedeutend. Jetzt weiß ich warum sich ein Wert in einem völlig anderem DB änderte, der mit der Sache so gut wie nix zu Tun hatte, aber an einem Input Parameter verwendet wurde.
Hallo TC,
also ich hatte da noch nie Probleme wenn man immer darauf achtet das AR1 und AR2 zu sichern und an der richtigen Stelle wieder zurück schreibt.
Es geht ja da um den Zugriff auf lokale Parameter zwischen dem Laden des Adressregisters und dem registerindirekten Zugriff.
(In den Unterlagen die Du erwähnst ganz oben).

Ralle:
Das AR2 enthält bei Multiinstanzen tatsächlich den Offset zu den Daten der Instanz. Wenn du mit ind. Adressierung arbeitest und einen Multiinstanzfähigen Baustein programmieren willst, brauchst du das zwingend!
Und was Ralle mit dem Problem bei Multiinstanzen meinte, hat ja erst mal nichts mit TAR und L DINO zu tun sondern mit dem Offset. Aber ich denke das ist Dir auch bekannt. Mich hat nur Deine Antwort überrascht.
@Ralle Das AR2 Prob in FB's kenne ich genauestens. (TAR2 , L DINO blablabla). Danke für den Hinweis.

Ansonsten kann ich nur sagen:
"Gut getippt" ;)
Sonst hätte ich es eingescannt da meine Unterlagen nicht gebunden sind.
Steht aber das gleich drin. :cool:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Paule

Du meinst das AR2 zum AR1 zu addieren?
Ich hatte da noch keine Probs. Aber heisst ja nix. Hast du vielleicht nen Link auf einen vernünftigen Betrag dazu?
Vielleicht kann ich ja was dazu lernen.

Ps: War ge-omnipaged, nix getippt. Eine Seite geht ja noch.

mfg TC
 
Zugriff auf übergebene DT-Parameter in einer FC

Innerhalb von Funktionen werden bei allen symbolischen Zugriffen auf alle Bausteinparameter vom Typ ARRAY oder STRUCT die Register AR1 und DB überschrieben.
Und es geht doch! :D

Im Falle eines Ein-, Aus- oder Durchgangsparameter vom zusammengesetzten Datentyp wird für die Parameterübergabe ein bereichsübergreifender Zeiger auf eine Pointer-Variable an die aufgerufene Funktion übergeben. Der Inhalt der Pointer-Variable zeigt auf den eigentlichen Aktualoperanden. Für den indirekten Zugriff wird zunächst ein bereichsübergreifender Zeiger auf diesen Pointer gebildet.
Im nächsten Schritt wird der Inhalt der Pointer-Variable ausgelesen und über diese Information auf den Aktualoperanden zugegriffen.

Code:
[COLOR=black][FONT=Verdana]FUNCTION FC1: VOID[/FONT][/COLOR]
 
[COLOR=black][FONT=Verdana]VAR_INPUT[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]IN_DT : DATE_AND_TIME;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]END_VAR[/FONT][/COLOR]
 
[COLOR=black][FONT=Verdana]VAR_OUTPUT[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]SEK : Byte;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]MIN : Byte;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]STD : Byte;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]END_VAR[/FONT][/COLOR]
 
[COLOR=black][FONT=Verdana]VAR_TEMP[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]DB_Num : Word;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]END_VAR[/FONT][/COLOR]
 
[COLOR=black][FONT=Verdana]BEGIN[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]L    P##IN_DT;        //Lade bereichsübergreifenden Zeiger auf Pointer in Akku 1[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]LAR1 ;                   //Lade Zeiger in AR1, AR1 zeigt jetzt auf den Pointer[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]L   W[AR1,P#0.0];   //Lade DB-Nummer aus Pointer in Akku 1[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]T   #DB_Num;         //DB-Nummer auf Temp Variable[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]AUF DB[#DB_Num];  //DB öffnen[/FONT][/COLOR]
[COLOR=black][FONT=Verdana][B]L   D[AR1,P#2.0];[/B]    //Lade bereichsübergreifenden Zeiger auf DT-Variable aus Pointer[/FONT][/COLOR]
[COLOR=black][FONT=Verdana][B]LAR1 ;[/B]                   // Lade Zeiger in AR1, AR1 zeigt auf DT-Variable[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]L   B[AR1,P#3.0];    //Lade Stundenanteil aus DT-Variable[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]T   #STD;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]L   B[AR1,P#4.0];    //Minuten[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]T   #MIN;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]L   B[AR1,P#5.0];[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]T   #SEK;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]END_FUNKTION[/FONT][/COLOR]
 
Parameterübergabe in Step-7 allgemein

Das angehängte PDF-File beschreibt die Parameterbeschaltung in Step-7.
 

Anhänge

  • Vorgaben Parameterübergabe in Step-7.pdf
    4,1 KB · Aufrufe: 70
Und es geht doch! :D

Im Falle eines Ein-, Aus- oder Durchgangsparameter vom zusammengesetzten Datentyp wird für die Parameterübergabe ein bereichsübergreifender Zeiger auf eine Pointer-Variable an die aufgerufene Funktion übergeben. Der Inhalt der Pointer-Variable zeigt auf den eigentlichen Aktualoperanden. Für den indirekten Zugriff wird zunächst ein bereichsübergreifender Zeiger auf diesen Pointer gebildet.
Im nächsten Schritt wird der Inhalt der Pointer-Variable ausgelesen und über diese Information auf den Aktualoperanden zugegriffen.

Code:
[COLOR=black][FONT=Verdana]FUNCTION FC1: VOID[/FONT][/COLOR]
 
[COLOR=black][FONT=Verdana]VAR_INPUT[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]IN_DT : DATE_AND_TIME;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]END_VAR[/FONT][/COLOR]
 
[COLOR=black][FONT=Verdana]VAR_OUTPUT[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]SEK : Byte;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]MIN : Byte;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]STD : Byte;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]END_VAR[/FONT][/COLOR]
 
[COLOR=black][FONT=Verdana]VAR_TEMP[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]DB_Num : Word;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]END_VAR[/FONT][/COLOR]
 
[COLOR=black][FONT=Verdana]BEGIN[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]L    P##IN_DT;        //Lade bereichsübergreifenden Zeiger auf Pointer in Akku 1[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]LAR1 ;                   //Lade Zeiger in AR1, AR1 zeigt jetzt auf den Pointer[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]L   W[AR1,P#0.0];   //Lade DB-Nummer aus Pointer in Akku 1[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]T   #DB_Num;         //DB-Nummer auf Temp Variable[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]AUF DB[#DB_Num];  //DB öffnen[/FONT][/COLOR]
[COLOR=black][FONT=Verdana][B]L   D[AR1,P#2.0];[/B]    //Lade bereichsübergreifenden Zeiger auf DT-Variable aus Pointer[/FONT][/COLOR]
[COLOR=black][FONT=Verdana][B]LAR1 ;[/B]                   // Lade Zeiger in AR1, AR1 zeigt auf DT-Variable[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]L   B[AR1,P#3.0];    //Lade Stundenanteil aus DT-Variable[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]T   #STD;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]L   B[AR1,P#4.0];    //Minuten[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]T   #MIN;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]L   B[AR1,P#5.0];[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]T   #SEK;[/FONT][/COLOR]
[COLOR=black][FONT=Verdana]END_FUNKTION[/FONT][/COLOR]

Was genau meinst du mit "Und es geht doch"?
Das was du da zeigst ist ja klar, es ging aber eigentlich um den direkten symbolischen Zugriff mit Arrayindex.
 
Ja Ralle,

Du hast schon Recht, mit dem ursprünglichen Thema hat es nicht mehr viel zu tun.
Doch wir sind im laufe der Beiträge auf das Problem der Übergabe von zusammengesetzten Datentypen bei einer FC gestoßen, wenn in dieser FC dann das AR1 benutzt wird.

Wenn Du aber meinst das passt nicht hier her oder verwirrt bloß, dann kannst den Beitrag auch löschen, ist auch OK.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja Ralle,

Du hast schon Recht, mit dem ursprünglichen Thema hat es nicht mehr viel zu tun.
Doch wir sind im laufe der Beiträge auf das Problem der Übergabe von zusammengesetzten Datentypen bei einer FC gestoßen, wenn in dieser FC dann das AR1 benutzt wird.

Wenn Du aber meinst das passt nicht hier her oder verwirrt bloß, dann kannst den Beitrag auch löschen, ist auch OK.

Nö, ist ja nun erklärt. :ROFLMAO:
 
Zurück
Oben