Ich habe eine 1500 CPU (1517-3 PN/DP)
Ich habe ein INT - z.B. Anzahl Motoren, diese möchte ich im Programm mehrfach verwenden und hier nicht jedesmal einen Vergleicher haben um zu wissen ob Motor vorhanden oder nicht.
Das klingt wie keine Lust, immer die lästigen Vergleiche einzutippen?
Warum willst Du in einem INT, in dem eine Anzahl steht, die einzelnen Bits ansprechen und dann auch noch indirekt?
Beispiel: Wenn Du wissen willst, ob die Zahl darin 8 oder größer ist, dann vergleicht man den INT-Wert auf >= 8 (>=I) - das geht prima symbolisch. Wenn Du stattdessen "vereinfacht" das Bit .3 prüfst, dann ist die Prüfung nicht korrekt, z.B. 17 ist >= 8, das Bit .3 ist aber 0.
In einer S7-1500 ist ein Vergleich eines symbolisch adressierten INT auf >= x hochwahrscheinlich vieeel performanter als eine indirekt adressierte Prüfung eines Bits. Wieviel oder wiewenig Schreibarbeit man als Programmierer hat sagt nichts über die Performance des erzeugten Maschinencodes. Und den Quellcode schreibt man nur einmal, der erzeugte mehr oder weniger performante Maschinencode wird aber Millionenfach ausgeführt.
Wenn es denn unbedingt mit einer Bool-Verknüpfung statt einem Vergleich sein soll: Am Anfang des Bausteins könntest Du den INT mittels 16 Vergleichen auf ein Bool-Array auspacken. Dies sollte insgesamt performanter sein als immer wieder indirekte Bit-Abfragen.
Code:
L #intern.AnzahlMotoren
L 1
>=I
= #temp.MotorVorhanden[1]
L #intern.AnzahlMotoren
L 2
>=I
= #temp.MotorVorhanden[2]
...
L #intern.AnzahlMotoren
L 16
>=I
= #temp.MotorVorhanden[16]
...
U #starte_Motor
U #temp.MotorVorhanden[2]
= #Motor2
Wenn der Kunde auf symbolischer Adressierung besteht, dann besteht er vielleicht auch darauf, daß die DB "optimierten" Zugriff haben sollen? Da gehen Adress-Rechnungen gar nicht. Da muß man konsequent symbolisch indizierbare Strukturen einsetzen statt in Speicheradressen 'rumzupeeken/-poken. Und wenn man alle Bits eines Bool-Arrays löschen will, dann muß man halt jedes Bit einzeln symbolisch ansprechen (z.B. in einer Schleife), oder dem Compiler erklären, daß er das Array auf ein Word legen möge, damit man den vom Array belegten Speicher als Word ansprechen kann. Dies ist sauber und unabhängig von Speicheradressen.
Man muß nicht alle möglichen Schweinereien aus der S5- und S7-300-Programmierung in die neue S7-1500-Welt mitnehmen. Man sollte die Umstellung nutzen, endlich symbolische Algorithmen anzuwenden. Rechenpower ist genug vorhanden.
Harald