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
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 )
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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: POINTERTOWORD;dwBitOffs: DWORD;dwWordOffs: DWORD;usiBitNr: USINT;xValueToSet: BOOL;xxxAT%IX24.3: BOOL; (*Variable to set for example*)
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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 )
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
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
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
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^
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
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
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
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.
´
Hallo auch mal,
jetzt hab ich die Logik auch kapiert
Alles klar, danke!
Gruß
Michael Hulsch