bestimmen, ob eine Variable Input, Output oder Merker ist

heiwil
2009-01-07
2009-01-15
  • heiwil - 2009-01-07

    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:

    VAR_GLOBAL
        bO_K60_1_2          AT %QX108.1  : BOOL;           (* Circular Cooling: valve *)
        bO_K60_1_3          AT %QX108.2  : BOOL;           (* Circular Cooling: lay-by valve *)
        bI_F60_1_4                       : BOOL;           (* Heating: prot. switch *)
    END_VAR
    
    bRet := isInput(bO_K60_1_2);  (* bRet sollte TRUE sein *)
    bRet := isInput(bO_F60_1_4);  (* bRet sollte FALSE sein *)
    

    Ich habe die oscat.lib durchforstet und auch im Forum gesucht, beides erfolglos.

    Hat von Euch jemand eine Idee?

    Heiko

     
  • Softwerker59 - 2009-01-07

    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

     
  • heiwil - 2009-01-07

    Hallo Klaus,

    Danke! Ich werde es probieren.

    Heiko

     
  • J Schohaus - 2009-01-08

    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

     
  • heiwil - 2009-01-09

    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

    IMG: Adresse.jpg

     
  • 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.

     
  • heiwil - 2009-01-15

    Danke für die Info.

    Heiko

     

Log in to post a comment.