problem mit pointer

Janko12301
2008-03-04
2010-01-21
  • Janko12301 - 2008-03-04

    hier mal das wesentliche vom code, den man für meine frage braucht

    var
    geraet_1_cmd AT%QX0.0:BOOL;
    geraet1 : pointer to bool;
    geraet_status : array[1..8] of bool;
    end_var
    geraet1:=BITADR(geraet_1_cmd);
    geraet_status[1]:= geraet1^;
    

    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

  • Janko12301 - 2008-03-04

    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.

     
  • Erik Böhm - 2008-03-04

    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

  • Janko12301 - 2008-03-04

    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

  • Erik Böhm - 2008-03-04

    Das mit dem String usw.. geht nicht.

    Aber eine ArrayVariable kannst du doch auch hochzählen.

    Siehe voriges Beispiel.

    Gruss

    Erik

     
  • Janko12301 - 2008-03-04

    leider kommt anscheind nicht richtig rüber was ich will.

    Ich lasse doch natürlich die Array index variablen hochzählen.

     
  • Erik Böhm - 2008-03-04

    Kann sein, dass wir aneinander vorbeireden...

    Schick mir doch mal ne Mail, dann bekommst du meine Telefonnummer zurück...

     
  • 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

     
  • debug - 2010-01-19

    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

  • Erik Böhm - 2010-01-20

    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

     
  • debug - 2010-01-20

    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'

     
  • Erik Böhm - 2010-01-20

    Na ja, Tippfehler.

    bDigOut AT %IB0:    ARRAY[1..200] OF BOOL;
    

    So gehts.

     
  • debug - 2010-01-21

    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]

     
  • Erik Böhm - 2010-01-21

    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

     

Log in to post a comment.