Ich möchte zur Laufzeit in meiner Visualisierung Controls ein- bzw. ausblenden, abhängig davon, ob ein zugehöriger Ein- bzw. Ausgang physikalisch vorhanden ist.
Dafür benötige ich eine Funktion, die bestimmt, ob eine Variable ein Input bzw. ein Output ist, sprich mit AT auf eine Input oder Output Adresse verdrahtet wurde oder nicht.
Etwa so:
VAR_GLOBALÂ Â bO_K60_1_2Â Â Â Â Â AT%QX108.1Â :BOOL;Â Â Â Â Â Â (*CircularCooling:valve*)Â Â bO_K60_1_3Â Â Â Â Â AT%QX108.2Â :BOOL;Â Â Â Â Â Â (*CircularCooling:lay-byvalve*)Â Â bI_F60_1_4Â Â Â Â Â Â Â Â Â Â Â Â :BOOL;Â Â Â Â Â Â (*Heating:prot.switch*)END_VAR
falls Deine Steuerung die SysLibGetAddress.lib unterstützt, gibt es eine Möglichkeit. Du kannst mit Hilfe der Lib die Startadressen und Segmentlängen der einzelnen Bereiche (Input, Output, Merker usw.)ermitteln.
Die Adresse der jeweiligen Variable bekommt man mit der ADR()-Funktion. Jetzt brauchst Du nur noch zu überprüfen, in welchem Bereich die Adresse der Variable liegt.
Gruß
Klaus
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Klingt super und logisch geht aber leider so nicht.
Der ADR Befehl funktioniert nicht mit Bitadressen (also mit per AT zugewiesenen Adressen auf Variablen) sagt der Compiler, hier muß der BITADR Befehl verwendet werden.
Ich muß also schon VORHER wissen, mit welchem Befehl ich die Adresse des Bits erfahren will. Abgesehen davon liefert BITADR den Offset im Segment und nicht die absolute Adresse.
Idee 2 von Jochen:
Das geht!!!
Aber wie kommt man auf so etwas? Wäre mir nicht im Traum eingefallen, das zu versuchen.
Ich habe das Ergebnis der Tests angehängt.
Noch mal Danke
Heiko
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2009-01-14
Originally created by: Bernhard Werner
heiwil hat geschrieben:
Idee 2 von Jochen:
Das geht!!!
Aber wie kommt man auf so etwas? Wäre mir nicht im Traum eingefallen, das zu versuchen.
Das geht nur bei BITs. Liegt eine Variablen als Byte im Adressraum (%MB0)
dann ist die Länge auch 1. Hintergrund ist der, dass BOOL Variablen bei CoDeSys immer ein BYTE belegen, denn die Prozessoren können niemals auf einzelne Bits im Speicher zugreifen, sonst würde der Code ausgebremst.
Um das jetzt unterscheiden zu können mit dem Operator Sizeof, wird bei Bits im I/O-Abbild die Länge 0 und bei BOOL im Programm die Länge 1 zurückgeliefert.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo Zusammen,
Ich möchte zur Laufzeit in meiner Visualisierung Controls ein- bzw. ausblenden, abhängig davon, ob ein zugehöriger Ein- bzw. Ausgang physikalisch vorhanden ist.
Dafür benötige ich eine Funktion, die bestimmt, ob eine Variable ein Input bzw. ein Output ist, sprich mit AT auf eine Input oder Output Adresse verdrahtet wurde oder nicht.
Etwa so:
Ich habe die oscat.lib durchforstet und auch im Forum gesucht, beides erfolglos.
Hat von Euch jemand eine Idee?
Heiko
Hallo Heiko,
falls Deine Steuerung die SysLibGetAddress.lib unterstützt, gibt es eine Möglichkeit. Du kannst mit Hilfe der Lib die Startadressen und Segmentlängen der einzelnen Bereiche (Input, Output, Merker usw.)ermitteln.
Die Adresse der jeweiligen Variable bekommt man mit der ADR()-Funktion. Jetzt brauchst Du nur noch zu überprüfen, in welchem Bereich die Adresse der Variable liegt.
Gruß
Klaus
Hallo Klaus,
Danke! Ich werde es probieren.
Heiko
Hallo Heiko
Eine einfache lösung ist die läge von der Variable zu testen.
Bei ein Bit mit AT ergibt
SIZEOF ( MyVariable )
als rückgabe 0
Bei ein BOOL ergibt
SIZEOF ( MyVariable )
als rückgabe eine wert von 1
mfG Jochen
Hallo zusammen,
zuerst einmal Danke für die Hilfe!
Idee 1 von Klaus:
Klingt super und logisch geht aber leider so nicht.
Der ADR Befehl funktioniert nicht mit Bitadressen (also mit per AT zugewiesenen Adressen auf Variablen) sagt der Compiler, hier muß der BITADR Befehl verwendet werden.
Ich muß also schon VORHER wissen, mit welchem Befehl ich die Adresse des Bits erfahren will. Abgesehen davon liefert BITADR den Offset im Segment und nicht die absolute Adresse.
Idee 2 von Jochen:
Das geht!!!
Aber wie kommt man auf so etwas? Wäre mir nicht im Traum eingefallen, das zu versuchen.
Ich habe das Ergebnis der Tests angehängt.
Noch mal Danke
Heiko
Originally created by: Bernhard Werner
Das geht nur bei BITs. Liegt eine Variablen als Byte im Adressraum (%MB0)
dann ist die Länge auch 1. Hintergrund ist der, dass BOOL Variablen bei CoDeSys immer ein BYTE belegen, denn die Prozessoren können niemals auf einzelne Bits im Speicher zugreifen, sonst würde der Code ausgebremst.
Um das jetzt unterscheiden zu können mit dem Operator Sizeof, wird bei Bits im I/O-Abbild die Länge 0 und bei BOOL im Programm die Länge 1 zurückgeliefert.
Danke für die Info.
Heiko