Schick mir doch mal ne Mail, dann bekommst du meine Telefonnummer zurück...
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2008-03-05
Originally created by: Bernhard Werner
Hallo Janko,
BITADR macht etwas ganz anderes als Sie erwarten:
Online Hilfe hat geschrieben:
BITADR liefert den Bitoffset innerhalb des Segments in einem DWORD. Beachten Sie, dass der Offset davon abhängt, ob die Option Byteadressierung in den Zielsystemeinstellungen aktiviert ist oder nicht.
VAR
var1 AT %IX2.3:BOOL;
bitoffset: DWORD;
END_VAR
Beispiel in ST:
bitoffset:=BITADR(var1); ( Ergebnis bei Byteadressierung=TRUE: 19, bei Byteadressierung=FALSE: 35 )
Wenn wir mal beim obigen Beispiel bleiben: bitoffset ist mitnichten ein POINTER auf das Bit, sondern eben der Bitoffset im Eingangsabbild. Da DWORD leider voll kompatibel zu POINTER ist, kann man das einfach auch einem POINTER zuweisen. Dort steht aber dann als "Adresse" auch 19 (28 + 3) oder 35 (216 + 3) drin. Wenn man diesen Pointer derefenziert, kracht es natürlich.
Das Problem ist, dass es so etwas wie einen Bitpointer einfach nicht gibt.
Wenn Sie sich das BITADR in einer Struktur merken, gemeinsam mit der
ADR(%QB0) dann kann man sich aus diesen zwei Information mit ein bisschen Mühe und Bitshifterei den Wert des Bits ermitteln
Bernhard Werner
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
ich muss das Thema nochmals vorkramen. >Erik Böhm hat geschrieben:
Vielleicht sollte die letzte zeile einfach so aussehen:
geraet1 := geraet_status[1];
Ausserdem könntest du das ja auch gleich so machen:
A01 AT %QX0.0 : BOOL;
A02 AT %QX0.1 : BOOL;
A03 AT %QX0.2 : BOOL;
A01 := geraet_status[1]; A02 := geraet_status[2]; A03 := geraet_status[3];
Ich habe ein ähnliches Problem. Über eine Schnittstelle bekomme ich die Nr. des Ausgangs, der gesetzt oder gelöscht werden soll. Bei den Eingänge wird der Status abgefragt.
Bei 10 Ausgängen kein Problem. Bei mir sind es je 200 Eingänge und Ausgänge.
Hat hier für jemand eine einfach Idee, damit ich direkt den 123. Ausgang ändern kann?
Ich verwende 8-Bit Klemmen. Mit der Lösung wird immer nur jedes 8. Bit meiner 200 Ausgänge angesprochen. Verständlich, da BOOL intern immer 8 Bit Speicherplatz belegt.
Mit Byte oder Word geht das auch. Dann muss halt noch von Ausgang Nr. auf Word und Bit umgerechnet werden.
An Wago 750-841 und 750-530 getestetes Beispiel liegt bei.
hier mal das wesentliche vom code, den man für meine frage braucht
Also in dem Array sollte dann jeweils auf die adresse von meinem Ausgang stehen, so das wenn ich jetzt
geraet_status[1]:= true; der ausgang sich auch schaltet.
die arrays brauche ich weil ich diese in schleifen mit zählvariablen verwende. leider klappt es nicht so mit dem setzen der ausgänge über pointer.
kann mir jemand helfen?
Related
Talk.ru: 1
um es nochmal verständlich zu machen was ich machen will.
in dem array soll jeweils der status von einem ausgang stehen. true oder false.
wenn ich dann aber den status vom array veränder, soll dieser sich automatisch beim ausgang auch verändern.
Mahlzeit
Du kopierst den Status des Ausgangs AT QX0.0 ins Arrray. Wann wird das dann wieder zurückkopiert ?
Da beisst sich ja die Katze in den Schwanz...
Vielleicht sollte die letzte zeile einfach so aussehen:
geraet1 := geraet_status[1];
Ausserdem könntest du das ja auch gleich so machen:
A01 AT %QX0.0 : BOOL;
A02 AT %QX0.1 : BOOL;
A03 AT %QX0.2 : BOOL;
A04 AT %QX0.3 : BOOL;
A05 AT %QX0.4 : BOOL;
A06 AT %QX0.5 : BOOL;
A01 := geraet_status[1]; A02 := geraet_status[2]; A03 := geraet_status[3]; A04 := geraet_status[4]; A05 := geraet_status[5]; A06 := geraet_status[6];
Gruss
Erik
Related
Talk.ru: 1
Talk.ru: 2
Talk.ru: 3
Talk.ru: 5
habs auch schon gemerkt, dass es unsinn ist was ich geschrieben habe.
deine variante geraet1 := geraet_status[1];
geht leider auch nicht, da geraet_status[1] nicht zwangsläufig zu geraet1 gehört
Prinzip: es sollen geräte abgeschaltet werden.
es wird per schleife erst der status der geräte ausgelesen.
nur geräte die angeschaltet sind, können auch ausgeschaltet werden.
diese geräte die dann wirklich zur verfügung stehen stehen in dem array.
ich speicher mir auch die nr in einem array des gerätes.
wenn ich zum beispiel meine variable so zusammensetzen könnte würde ich es hinbekommen.
geraet+nr := geraet_status[1];
bloß dazu musste ich mir den variablen name zusammen basteln.
string:= concat('gereat', nr);
bloß wie sage ich dem das das auf einmal ein variablen name ist und kein string mehr ist?
Related
Talk.ru: 1
Das mit dem String usw.. geht nicht.
Aber eine ArrayVariable kannst du doch auch hochzählen.
Siehe voriges Beispiel.
Gruss
Erik
leider kommt anscheind nicht richtig rüber was ich will.
Ich lasse doch natürlich die Array index variablen hochzählen.
Kann sein, dass wir aneinander vorbeireden...
Schick mir doch mal ne Mail, dann bekommst du meine Telefonnummer zurück...
Originally created by: Bernhard Werner
Hallo Janko,
BITADR macht etwas ganz anderes als Sie erwarten:
Wenn wir mal beim obigen Beispiel bleiben: bitoffset ist mitnichten ein POINTER auf das Bit, sondern eben der Bitoffset im Eingangsabbild. Da DWORD leider voll kompatibel zu POINTER ist, kann man das einfach auch einem POINTER zuweisen. Dort steht aber dann als "Adresse" auch 19 (28 + 3) oder 35 (216 + 3) drin. Wenn man diesen Pointer derefenziert, kracht es natürlich.
Das Problem ist, dass es so etwas wie einen Bitpointer einfach nicht gibt.
Wenn Sie sich das BITADR in einer Struktur merken, gemeinsam mit der
ADR(%QB0) dann kann man sich aus diesen zwei Information mit ein bisschen Mühe und Bitshifterei den Wert des Bits ermitteln
Bernhard Werner
ich muss das Thema nochmals vorkramen. >Erik Böhm hat geschrieben:
Vielleicht sollte die letzte zeile einfach so aussehen:
geraet1 := geraet_status[1];
Ausserdem könntest du das ja auch gleich so machen:
A01 AT %QX0.0 : BOOL;
A02 AT %QX0.1 : BOOL;
A03 AT %QX0.2 : BOOL;
A01 := geraet_status[1]; A02 := geraet_status[2]; A03 := geraet_status[3];
Ich habe ein ähnliches Problem. Über eine Schnittstelle bekomme ich die Nr. des Ausgangs, der gesetzt oder gelöscht werden soll. Bei den Eingänge wird der Status abgefragt.
Bei 10 Ausgängen kein Problem. Bei mir sind es je 200 Eingänge und Ausgänge.
Hat hier für jemand eine einfach Idee, damit ich direkt den 123. Ausgang ändern kann?
Related
Talk.ru: 1
Talk.ru: 2
Talk.ru: 3
Mahlzeit
Warum ist das mit 200 Ausgängen schwieriger als mit 10 ?
DigOut: Array[1..200] of BOOL ab Adresse QX...
-> Index aus den Informationen aus der Schnittstelle in Index: INT;
-> DigOut[Index] := FALSE bzw TRUE
-> fertig
Oder seh ich das falsch ?
Gruß
Erik
Hallo Erik,
Danke für Deine Hilfe. auf die Idee bin ich noch nicht gekommen.
ABER ```
DOut : ARRAY[1..200] OF BOOL AT %QX1.0;
Wird abgewiesen mit:
Erwarte ';' oder ':=' vor 'AT'
denn:
Online Hilfe sagt:
DOut AT %QX1.0: BOOL;
Allerdings werden Arrays laut Doku definiert:
DOut : ARRAY [1..200] OF bool;
Umgekehrt mit:
Out : ARRAY[1..32] AT %QX1.0 OF BOOL;
```heißt es dann Erwarte OF vor 'AT'
Na ja, Tippfehler.
bDigOut AT %IB0: ARRAY[1..200] OF BOOL;
So gehts.
Ja, wir kommen dem Ziel schon näher.
Ich verwende 8-Bit Klemmen. Mit der Lösung wird immer nur jedes 8. Bit meiner 200 Ausgänge angesprochen. Verständlich, da BOOL intern immer 8 Bit Speicherplatz belegt.
Mit Byte oder Word geht das auch. Dann muss halt noch von Ausgang Nr. auf Word und Bit umgerechnet werden.
An Wago 750-841 und 750-530 getestetes Beispiel liegt bei.
Test_Lauflicht.pro [38.85 KiB]
Mahlzeit
Na also. Geht doch.
Es gibt auch Steuerungen, bzw Compiler wo ein Bit auch noch ein Bit ist...
Also 24 je Kiste
Gruß
Erik