Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched. Close

ProMod-Pro von Deltalogic

sven1978
2006-05-27
2006-09-11
  • sven1978 - 2006-05-27

    Hallo

    Ich arbeite erst seit kurzem mit Codesys. Um nun ein wenig zu spielen benutze ich dafür von DeltaLogic ProMod-Pro. Jetzt habe ich aber dor Probleme mit Pointer auf Ausgänge.

    Kann das sein daß man mit ProMod Pro keine Pointer auf Ausgänge setzten kann ? ( Schreibener Zugriff )

    Var  AT %IX24.0 : BOOL;
    ....
    pt : POINTER TO BOOL;
    pt := BITADR(Var);
    pt^ := TRUE; <-- Fehler ? 
    
     
  • Anonymous - 2006-07-13

    Originally created by: Frank Hailer

    Hallo Sven

    Das ist von der CoDeSys Version unabhängig. Es gibt auf keine Zeiger auf Bits, der kleinste Zeiger zeigt auf ein Byte. BITADR liefert nur den Bit-Offset innerhalb eines DWord's. In Deinem Beispiel bekommt der Zeiger somit eine falsche Adresse und das führt zu einem Speicherüberschreiber.

    Grüsse, Frank Hailer

     
  • Michael Hulsch - 2006-09-05

    Frank Hailer hat geschrieben:
    Hallo Sven
    Das ist von der CoDeSys Version unabhängig. Es gibt auf keine Zeiger auf Bits, der kleinste Zeiger zeigt auf ein Byte. BITADR liefert nur den Bit-Offset innerhalb eines DWord's. In Deinem Beispiel bekommt der Zeiger somit eine falsche Adresse und das führt zu einem Speicherüberschreiber.
    Grüsse, Frank Hailer

    Ich stehe gerade in etwa vor dem gleichen Problem. Die Antwort beschreibt leider nur den Zustand, aber mir fehlt die Lösung, bzw. ich sehe den Sinn nicht von BITADR.

    Was möchte ich erreichen: ich will Eingänge der Peripherie mit einem Programm simulieren. Am bequemsten wäre es dazu einfach auf boolesche Eingänge schreibend zuzugreifen -> natürlich geht es auch anders, aber es wäre der bequemste Weg.

    Grüße

    Michael Hulsch

     
  • Ralph Holz - 2006-09-11

    Ich hatte genau das gleiche Problem bei einer Simulation auf Bit-Eingäge zu schreiben. Es lies sich mit den beiden Adressoperatoren (ADR + BITADR) und ein bischen Mathematik und Boolscher Logik lösen.

    Deklaration:

    VAR

    ptAdr: POINTER TO WORD;
    
    dwBitOffs: DWORD;
    
    dwWordOffs: DWORD;
    
    usiBitNr: USINT;
    
    xValueToSet: BOOL;
    
    xxx AT %IX24.3: BOOL; (*Variable to set for example*)
    

    END_VAR

    Code:

    ptAdr := ADR(%IW0); ( %IW0 --> xxx= Input ; %QW0 --> xxx= Output ; %MW0 --> xxx = Marker)

    dwBitOffs := BITADR(xxx);

    ptAdr := ptAdr + (dwBitOffs / 8);

    usiBitNr:= DWORD_TO_USINT(dwBitOffs MOD 16); ( 8 if Byte Adressing)

    ptAdr^:= ptAdr^

            AND (NOT SHL(1,usiBitNr))
    
            OR (SHL(BOOL_TO_WORD(xValueToSet),usiBitNr));
    

    Grüße

    Ralph

     
  • Michael Hulsch - 2006-09-11

    Ralph Holz hat geschrieben:
    Ich hatte genau das gleiche Problem bei einer Simulation auf Bit-Eingäge zu schreiben. Es lies sich mit den beiden Adressoperatoren (ADR + BITADR) und ein bischen Mathematik und Boolscher Logik lösen.
    .
    .
    Grüße
    Ralph

    Hallo Herr Holz,

    ihre Lösung sieht interessant aus, ist mir allerdings ein wenig zu kompliziert.

    Was spricht gegen die einfache, direkte Lösung auf den Pointer mittels Bitoperator zuzugreifen?

    Deklaration

    VAR

    ptrToInput : POINTER TO WORD;

    END_VAR

    Code:

    ptrToInput := ADR(%IW*)

    ptrToInput^.0 ... 15 := bSimulationswert;

    Grüße

    Michael Hulsch

     
  • Ralph Holz - 2006-09-11

    Michael Hulsch hat geschrieben:
    Hallo Herr Holz,
    ...
    Was spricht gegen die einfache, direkte Lösung auf den Pointer mittels Bitoperator zuzugreifen?
    ...
    ptrToInput := ADR(%IW*)
    ptrToInput^.0 ... 15 := bSimulationswert;
    ...

    Hallo Herr Hulsch,

    jetzt habe ich wieder etwas gelernt man darf auch hinter dereferenzierten Pointern ".0 ... 15" schreiben. Man traut sich manchmal das Einfache nicht!

    Meine Methode hat allerdings einen andere Ursache. Die Ein- und AugangsVariablen dürfen in meiner Simulation frei umverdrahtet werden. Also in dem geposteten Beispielcode dürfen Sie für %IX24.3 jede beliebige Eingangsadresse verwenden und die dazugehörige Simulation funktioniert weiterhin korrekt.

    Grüße

    Ralph

     
  • Michael Hulsch - 2006-09-11

    Ralph Holz hat geschrieben:
    Hallo Herr Hulsch,
    ..
    Meine Methode hat allerdings einen andere Ursache. Die Ein- und AugangsVariablen dürfen in meiner Simulation frei umverdrahtet werden. Also in dem geposteten Beispielcode dürfen Sie für %IX24.3 jede beliebige Eingangsadresse verwenden und die dazugehörige Simulation funktioniert weiterhin korrekt.
    Grüße
    Ralph

    Hallo auch noch mal,

    da sie ja trotzdem die Adresse des Eingangswortes benötigen relativiert sich der Vorteil allerdings ziemlich. Was ist wenn ihr namentlich bekannter Eingang, zu dem sie eine Simulation schreiben möchten, auf verschieden Eingangsworten, also zum Beispiel auf verschiedenen Busteilnehmern liegen könnte?

    Für mich hätte die Funktion BITADR Sinn gemacht, wenn ich damit die "richtige" Adresse gehabt hätte, bzw. mir in irgend einer Form auch noch die "allgemeine" Wordadresse hätte ableiten können, alleine vom Bezeichner her.

    Also:

    ptrWordAdresse := ADR (bEinEingangsBoolean)

    ptrBitAdresse := BITADR (bEinEingangsBoolean)

    Verstehen sie was ich meine?

    Mit freundlichem Gruß

    Michael Hulsch

     
  • Ralph Holz - 2006-09-11

    Hallo Herr Hulsch,

    ja ich hatte auch so meine Probleme mit der Bezeichnung BITADR und hätte hier auch etwas anderes erwartet.

    Meinem Code Brauchen Sie übrigens nicht die Wortadresse der Symbolischen Variable zu übergeben sonder er bezieht sich immer auf Wort 0 des Speicherbereichs - d.h. nur wenn Sie auf Merker zugreifen wollten müssen %IW0 in %MW0 änderen, ansonsten greifen Sie diese Adresse niemals an.

    Es liese sich daraus also relativ leicht eine universelle Funktion machen die als als Parameter nur die BITADR und den Wert übergeben bekommt den der Eingang annehmen soll. Die würde dann folgendermassen aufgerufen:

    SetInput(BITADR(xxx),TRUE) oder natürlich auch FALSE.

     
  • Michael Hulsch - 2006-09-11

    Ralph Holz hat geschrieben:
    Hallo Herr Hulsch,
    Meinem Code Brauchen Sie übrigens nicht die Wortadresse der Symbolischen Variable zu übergeben sonder er bezieht sich immer auf Wort 0 des Speicherbereichs - d.h. nur wenn Sie auf Merker zugreifen wollten müssen %IW0 in %MW0 änderen, ansonsten greifen Sie diese Adresse niemals an.

    ´

    Hallo auch mal,

    jetzt hab ich die Logik auch kapiert

    Alles klar, danke!

    Gruß

    Michael Hulsch

     

Log in to post a comment.