Wie findet man indirekte Zugriffe auf Variablen?
Ich mache das so:
Ich erzeuge aus allen Programm-Bausteinen eine einzige AWL-Quelle und durchsuche diese dann nach [, AR1 und AR2.
Wenn sehr viele direkte Zugriffe auf Arrays vorhanden sind, dann entferne ich die symbolischen Namen der DB aus
der Symboltabelle. Dann werden die DB-Zugriffe mit der absoluten Adresse ohne eckige Klammern dargestellt.
Beim Verdacht, daß eine Variable irgendwie benutzt wird, kann man auch im Simulator per Variablentabelle die
Variable beschreiben und schauen, ob der Schreibwert drin stehenbleibt. So kann man aber nur nachweisen, daß sie
benutzt wird, wenn sie sich ändert. Wenn sie sich nicht ändert, dann heißt das nicht, daß sie nicht benutzt wird!
Bei Knowhow-geschützten Bausteinen sollte man davon ausgehen können, daß tatsächlich nur auf die Variablen der
Aufrufschnittstelle und ggf. des Instanz-DB zugegriffen wird (zumindest, wenn der Baustein von Siemens ist). Aber
auch da hat man keine Sicherheit. Zum Glück gibt es aber Tools, die einem den Programmcode solcher Bausteine
zugänglich machen.
Am "schönsten" finde ich solche Universal-Kopierbausteine, wo die DB-Nummern und Offsets von Quell- und Ziel-DB
als INT an die Baustein-Eingänge geschrieben werden. Da darf man dann JEDEN Aufruf dieser Bausteine kontrollieren.
In meinen Programmen mache ich es fast genauso wie Paule. Wenn ich indirekt auf Datensätze, Arrays oder Variablen
zugreifen muß, dann mache ich zusätzlich einen programmtechnisch unnötigen Zugriff auf das erste Element des
betroffenen Bereiches. Nur, damit mein Zugriff in der Referenzliste erscheint und ich (und andere Programmierer)
diesen Zugriff später finden. Ich überspringe aber meistens den Referenz-Zugriff.
Mein Referenz-Zugriff ist dann auch in der Art des nachfolgenden indirekten Zugriffs eine Lese- oder Schreib-
Operation: L, T, U, S, R, =. Mein Kommentar beschränkt sich aber auf: "//nur für Referenzliste".
Code:
//Programmteil mit lesendem indirekten Zugriff
SPA M1
L DB100.DBW 10 //nur für Referenzliste
M1: L #Index
...
//Programmteil mit schreibendem indirekten Zugriff
SPA M2
T DB100.DBW 10 //nur für Referenzliste
M2: L #Index
...
//Programmteil mit schreibendem indirekten Bit-Zugriff
SPA M3
R DB100.DBX 8.0 //nur für Referenzliste
M3: L #Index
...
Auch auf das Taktmerker-Byte der CPU mache ich im OB1 einen lesenden Byte-Zugriff, damit das ganze Byte als
benutzt in der Referenzliste auftaucht.
Bei speicherindirekten Zugriffen wie "AUF DB[MW22]" oder "L MW[LW4]" oder "SE T[DBW8]" wird es schon schwieriger,
einen geeigneten Referenz-Zugriff zu formulieren. Solche Sachen werden aber eher selten benutzt und die Programme
sind dann meistens hinreichend kommentiert.
Man kann sich allerdings nicht darauf verlassen, daß fremde Programmierer freundlicherweise Referenz-Zugriffe in ihr
Programm eingebaut haben. Die meisten SPS-Programmierer, mit denen ich zu tun hatte, wissen garnicht von dieser
Problematik oder scheren sich einen Dreck drum, ob ihr Programm wartungsfreundlich ist. Sowas kostet ja Zeit und
macht zusätzliche "unbezahlte" Arbeit.
Um sich selbst die Arbeit zu erleichtern, sollte man aber die paar Sekunden investieren und sich angewöhnen, solche
Referenz-Zugriffe einzubauen. Man wird ja älter und hat irgendwann nicht mehr alle selbstgeschriebenen Programme im
Kopf.
Gruß
Harald