ADR(var) ermitteln, wenn ADS-Group/Offset bekannt

zabex

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Ein Funktionsbaustein erstellt bei mir zyklisch eine Liste mit bis zu 100 aktuellen Meßwerten.
Welche das sind, wird zur Laufzeit über eine Liste von Group/Offset Werten eingestellt, die von Außen (via ADS) in den Baustein geschrieben wird.
Momentan lese ich dann im Funktionsbaustein jeden Wert einzeln mit einem ADSREAD von meiner eigenen Net-ID. Das kostet aber enorm Rechenleistung.
Welche Variablen gelesen werden, wird nur selten verändert. Daher würde ich gerne die Adresse der Variablen ermitteln um mit einem Pointer statt ADS zuzugreifen.

Meine Frage:
Gibt es eine Möglichkeit, die Adresse der interessierenden Variable zu ermitteln, wenn ich nur die ADS-Group und Offset Angaben habe?

Der gesuchte Code könnte so aussehen:
varAdresse:=gesuchteTolleFunktion(Group, Index);
Und der Zugriff wäre ein simples:
varWert:=varAdresse^;


Hier der momentane Code (leider verschwindet die Einrückung):
---
Adressliste_Group: ARRAY[0..100]OF DWORD:=100(0);
Adressliste_Offset:ARRAY[0..100]OF DWORD:=100(0);
Istwertliste:ARRAY[0..100]OF REAL;
AdsRd:ARRAY[0..100] OF ADSREAD;
---
FOR i:=0 TO 100 DO
IF 0=Adressliste_Group THEN EXIT; END_IF
AdsRd(READ:=0);
IF NOT AdsRd.BUSY THEN
AdsRd(NETID:='172.16.17.100.1.1', (* Das bin ich selbst *)
PORT:=801,
IDXGRP:=Adressliste_Group,
IDXOFFS:=Adressliste_Offset,
LEN:=SIZEOF(Istwertliste[0]),
READ:=1,
DESTADDR:=ADR(Istwertliste)
);
END_IF
END_FOR
 
Für Variablen der Gruppe 16448 (16#4040) habe ich einen Workaround:
Ich lege eine Variable Adressreferenz:DWORD; an, die in dieser Gruppe enthalten ist und hole mir mit ADR(Adressreferenz)deren Adresse. Von außen lasse ich mir nun Group/Offset dieser Variable liefern (ermittelt aus der aus.tpy Datei), merke ihn mir in Referenzoffset und kann nun für alle anderen Offsets in der Gruppe die Speicheradresse ermitteln, da die Differenz der Offsets ja der Differenz der Speicheradressen ist.
varAdresse:=ADR(Adressreferenz) + (Referenzoffset-VarOffset);
Blöd ist halt, dass ich für alle möglichen Gruppen nun Referenzvariablen vorsehen muss.
 
Zurück
Oben