Frage zu variablen symbolischen Adressierung

Hanserl84

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe jetzt schon lange gesucht und probiert und bin nicht auf die Lösung gekommen. Ich habe folgendes Problem:

Ich habe einen DB der über UDT erstellt wird. In diesem DB sind folgende Struct´s:
Adresse Name Type
0.0 DB_Var_1 UDT3
130.0 DB_Var_2 UDT3
260.0 DB_Var_3 UDT3
390.0 DB_Var_4 UDT3

Jetzt will ich mir einen Funktionsbaustein bauen, dem man eine Zahl (zB 2 ) übergibt und dann soll im Code der Struct DB_Var_2 benutzt werden.

Folgender massen soll so ein Zugriff aussehn:

temp:= DBXY.DB_Var_X.Speicherstelle1

also der DB bleibt ja immer gleich, aber wie kann ich DB_Var_X <--- Dort die Zahl ändern und dann damit auf den DB zugreifen? Geht das überhaupt?
Habe das mal mit ANY-Pointer ausprobiert, aber klappte nicht. Bin auch noch nicht so ein erfahrener S7 Programmierer^^
System: CPU 315
Step 7
SCL
Würde es auch gerne in SCL machen, aber wenn nur AWL geht, wäre dies auch nicht so dramatisch. Es ist beabsichtigt Symbolische Adressen zu benutzen, weil sonst müsste ich meinem ganzen Code die Adressen ändern.

Vielen Dank schonmal ;)
 
Leg ein Array of UDT3 an, dann kannst Du mit der Eingangsvariablen als Index auf die einzelne Strktur zugreifen.
Gruß
Erich
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
SCL wäre hierfür genau richtig - du mußt dabei dann voll symbolisch arbeiten - also etwa so :
Code:
myVar := "myDBName".Platz[myIndex].Teil_vorhanden[12] ;
... in diesem Fall sollte das SCL-Script den DB kennen (er muß also vorhanden sein) und du würdest hier myIndex übergeben.
Es geht allerdings keine Misch-Masch-Adressierung - also Teil symbolisch und ein Teil absolut ...

Gruß
Larry
 
Erstmal danke für die schnellen Antworten. Mit den Array´s hab ich noch nicht getestet, aber das von LL

da gibt mir der Compiler Fehler aus.

Code:
Var_temp
myIndex:INT;
temp3:byte;
var_end

temp3:="DB80_HAUPT_DB".DB_VAR_[myIndex].crc_temp;

das ist mein Code. Aber man kann ihn nicht compilieren. Folgende Fehler tauchen auf:
Fehlender oder ungültiger Bezeichner ( nach ...DB".)
Die komponente ist nicht vorhanden (nach ...VAR_)
ungültige Variable (nach ...VAR_)
Fehlerhafte Variable, der Punkt ist nicht zulässig (nach index]. )
Ungültiger Datentyp bei crc_temp. Obwohl temp3 und crc_temp beides Byte sind.
DB ist auch vorhanden.

Hoffe mir kann einer weiterhelfen und mir sagen wo ich den Fehler mache. Sehe den Wald vor lauter Bäumen nicht mehr :(
lg
 
Naja ...
Du hast myIndex ja im Temp-Bereich deklariert - damit hat der schon mal den Wert 0 - gibt es dieses Array-Element ? Du solltest hier auf jeden Fall erstmal etwas zuweisen ...
Dann ... sind temp3 und crc_Temp vom gleichen Typ (nämlich Byte) ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ha ... noch etwas übersehen ...
Das mit dem Index geht natürlich nur bei Array's - soweit ich das noch sehen konnte hast du ja kein Array_of_struct definiert sondern nur einzelne UDT's - die kannst du natürlich NICHT indexieren sondern nur per Namen ansprechen und den kannst du auch nicht zusammenbauen - Sorry. An der Stelle mußt du dir dann etwas anderes ausdenken ...

Gruß
Larry

Nachsatz :
Du kannst das aber (da ja alle Elemente vom typ UDT3 sind) als "DB_Var : array[1..4] - UDT3" in dem DB deklarieren - dann sollte es funktionieren, wie gewünscht ...
 
Zuletzt bearbeitet:
Naja ...
Du hast myIndex ja im Temp-Bereich deklariert - damit hat der schon mal den Wert 0 - gibt es dieses Array-Element ? Du solltest hier auf jeden Fall erstmal etwas zuweisen ...
Dann ... sind temp3 und crc_Temp vom gleichen Typ (nämlich Byte) ?

Gruß
Larry

Das mit 0 ist soweit nicht richtig, da kann irgendwas drinstehen. Temp-Variablen sind immer als erstes zu beschreiben.
 
So mit den Array´s hat es endlich geklappt. Die Notation im Nachsatz von Dir LL hat den Stein ins rollen gebracht ;)
Vielen Dank für die schnelle und kompetente Hilfe.

lg
 
Zurück
Oben