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

Wie 15 Variabeln per For-Next Schleife abfragen ??

Alex1971
2012-09-29
2012-10-20
  • Alex1971 - 2012-09-29

    Hallo,

    wer kann mir helfen, diesen Code zu optimieren ?? VIELEN DANK !!

    IF %MX0.0 THEN
    IF %QX0.0 THEN
    %QX0.0 := FALSE;
    ELSE
    %QX0.0 := TRUE;
    END_IF
    %MX0.0 := FALSE;
    END_IF

    IF %MX0.1 THEN
    IF %QX0.1 THEN
    %QX0.1 := FALSE;
    ELSE
    %QX0.1 := TRUE;
    END_IF
    %MX0.1 := FALSE;
    END_IF

    IF %MX0.2 THEN
    IF %QX0.2 THEN
    %QX0.2 := FALSE;
    ELSE
    %QX0.2 := TRUE;
    END_IF
    %MX0.2 := FALSE;
    END_IF

    IF %MX0.3 THEN
    IF %QX0.3 THEN
    %QX0.3 := FALSE;
    ELSE
    %QX0.3 := TRUE;
    END_IF
    %MX0.3 := FALSE;
    END_IF

    IF %MX0.4 THEN
    IF %QX0.4 THEN
    %QX0.4 := FALSE;
    ELSE
    %QX0.4 := TRUE;
    END_IF
    %MX0.4 := FALSE;
    END_IF

    .......

    IF %MX0.15 THEN
    IF %QX0.15 THEN
    %QX0.15 := FALSE;
    ELSE
    %QX0.15 := TRUE;
    END_IF
    %MX0.15 := FALSE;
    END_IF

    Also immer die gleiche Abfrage für %MX0.0 bis %MX0.15

    %MX0.value und value von 0 bis 15 hochzählen mag er wohl nicht....

    Das ganze ist Teil eines Programms (PRG) welche Werte Abfragt die eine HTML Webseite setzen kann.

    Das hier müsste also in brauchbare Syntax umgesetzt werden:

    For value= 0 to 15

    IF %MX0.value THEN
    IF %QX0.value THEN
    %QX0.value := FALSE;
    ELSE
    %QX0.value := TRUE;
    END_IF
    %MX0.value := FALSE;
    END_IF

    Next value

    sorry.... sehr laienhaft....

     
  • Freddy - 2012-09-29

    Hallo Alex,

    ich denke so sollte es funktionieren:

    Gruß
    Freddy

    IMG: Beispiel.JPG

     
  • Alex1971 - 2012-09-30

    Vielen Dank.. werde ich gleich mal testen !

     
  • Alex1971 - 2012-10-03

    Freddy hat geschrieben:
    Hallo Alex,
    ich denke so sollte es funktionieren:
    Gruß
    Freddy

    Hi ! Leider stimmt noch etwas nicht mit dem Code.
    Ich kann zwar jeden "schalter" einmal schalten, danach jedoch nicht mehr.

    Irgendwas wird da nicht zurückgesetzt....

    Der Merker (%MW0) wird zwar auf 0 gesetzt aber nicht der Wert

    z.B. wenn %MX0.3 der auf der HTML-Seite auf "TRUE" gesetzt wurde.

    Wäre schön wenn jemand den Fehler findet !

     
  • Alex1971 - 2012-10-03

    Abgefragt werden soll auch nicht nur

    MX0.0 bis MX0.15 sondern auch

    MX1.0 bis MX1.15

    So ganz verstehe ich den optimierten Code noch nicht...

    Habe das erstmal so gelöst in dem ich die Variabeln und Schleifen gedoppelt habe..

    PROGRAM Web
    VAR
    h0 : WORD;
    h1 : WORD;
    i : INT;
    Merker0 AT %MW0 : WORD;
    Merker1 AT %MW1 : WORD;
    Ausgang0 AT %QW0 : WORD;
    Ausgang1 AT %QW1 : WORD;
    END_VAR

    h0:=1;
    FOR i:=0 TO 15 DO
    IF (Merker0 AND h0) > 0 THEN
    Ausgang0:=Ausgang0 XOR h0;
    Merker0:=0;
    END_IF
    h0:=h0*2;
    END_FOR

    h1:=1;
    FOR i:=0 TO 15 DO
    IF (Merker1 AND h1) > 0 THEN
    Ausgang1:=Ausgang1 XOR h1;
    Merker1:=0;
    END_IF
    h1:=h1*2;
    END_FOR

    Trotzdem funktioniert nach Neuem Laden der HTML-Seite jeder Button genau 1x

    Der Code in meinem 1. Post funktionierte einwandfrei, war aber viel zu "lang"... keine Ahnung weshalb das mit dem neuen Code nicht will....

    EDIT:

    Totalabgedreht, der neue Code funktioniert nur 1x je Taste wenn man die Steuerseite mit CHROME aufruft.

    Habe nun Firefox genommen > Nun funktioniert es einwandfrei... jeder Taster auf der HTML-Seite funktioniert beliebig oft...

    Sehr merkwürdig...

    Witzig, dass der alte Code auch "CHROME-kompatibel" ist......

    Hauptsache es geht nun mit meinem Android 4.03 Tablet und dem Standardbrowser einwandfrei......

     
  • Freddy - 2012-10-03

    Hallo Alex,

    das Beispiel wurde leider nicht 1:1 umgesetzt.
    Die Befehlszeile "Merker0:=0;" muss außerhalb der FOR-Schleife aufgerufen werden.

    Ich kann mir nicht vorstellen, dass der verwendete Browser einen Einfluß auf die Funktion hat!?

    Gruß
    Freddy

     
  • Alex1971 - 2012-10-03

    Freddy hat geschrieben:
    Hallo Alex,
    das Beispiel wurde leider nicht 1:1 umgesetzt.
    Die Befehlszeile "Merker0:=0;" muss außerhalb der FOR-Schleife aufgerufen werden.
    Ich kann mir nicht vorstellen, dass der verwendete Browser einen Einfluß auf die Funktion hat!?
    Gruß
    Freddy

    Hatte ich zuerst so gemacht.. half auch nicht... dachte dann es wäre besser es in die Schleife zu bauen.

    Kein Unterschied.

    Wie gesagt es funktioniert so wie zuletzt geschrieben... aber eben nicht mit Chrome....

    Einwandfrei mit Firefox und OPERA unter Win7 64Bit und unter dem Standardbrowser von Android 4.03 !

    Habe auch noch keineAhnung woran das liegt... irgendwie wird die Schnittstelle per Chrome wohl nicht regelmäßig aktualisiert..

    Ein Button setztl %MX1.3=TRUE das landet bei ersten mal in %MW1 und somit in %QW1
    %MW1 wird dann auf 0 gesetzt und bekommt dann nichts mehr mit,
    egal wie oft ich per Buton auf der Webseite wieder %MX1.3=TRUE setzte.
    (Im alten Code wo %MX1.3=False gesetzt wurde lief es in Chrome problemlos...)

    Schließe ich die URL jedoch ganz und rufe sie per Chrome erneut auf, funktioniert jeder %MX1.x Wert wieder genau 1x. Eine Refresh (F5) reicht jedoch NICHT aus !

    Beim Firefox/OPERA muss ich dazu nichts schließen und neu aufrufen ! Es geht einfach so wie es soll..

     
  • Oberchefe - 2012-10-16

    viel zu kompliziert:

       Merkerwort AT %MW0: WORD;
       Ausgangwort AT %QW0: WORD;
    
    Ausgangwort:=Ausgangwort XOR Merkerwort;
    Merkerwort:=0;
    

    geht natürlich auch mit 32-Bit anstatt 16 Bit

     
  • Alex1971 - 2012-10-20

    Hmmm... so einfach ginge das ?....

    Werde das gleich mal testen.... vielen Dank !

     

Log in to post a comment.