Mehrfache AND Verknüpfung

MrChipsy

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich bin neu in der Programmierung und habe eine Frage bezüglich der Gestaltung von vielfachen and Verknüpfungen.:D

Folgendes Beispiel:

x = (a and b and c and d and e and f and g and h);
x darf wirklich nur true werden, wenn alle Bedingungen erfüllt sind.

Kann man so eine Syntax auch besser gestalten?

Danke für eure Hilfe
 
Nicht wirklich.

Wenn a bis h alle in einem Byte liegen, kann man hier in diesem Fall das Byte auf := 255 abfragen.
Wenn die Bits aber wild verstreut sind, hat man diese Möglichkeit nicht.
Man kann dann zwar diese einzelnen Bits wiederum irgendwo zusammenfassen, aber ob das so viel übersichtlicher ist, muss jeder für sich selbst entscheiden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich mache es bei langen und Verknüpfungen so

bOK : bool

bOK := FALSE;

bOK := diEingang1
bOK := bOK AND FrgMaschine1
bOK := bOK AND Merker

IF bOK THEN

Anweisung();

END_IF;

Beim debuggen kann man so zur not jede Abfrage durchtippen. Klappt aber bei einer SPS nur bedingt, weil die Anlage dann steht.
Aber bei Roboterprogrammen oder c# Anwendungen hilft mir das schon eher, weil da ein durch Tippen nicht wehtut.

Aber man kann den Code so auch besser lesen finde ich.
 
Ich mache es bei langen und Verknüpfungen so

bOK : bool

bOK := FALSE;

bOK := diEingang1
bOK := bOK AND FrgMaschine1
bOK := bOK AND Merker

IF bOK THEN

Anweisung();

END_IF;

Beim debuggen kann man so zur not jede Abfrage durchtippen. Klappt aber bei einer SPS nur bedingt, weil die Anlage dann steht.
Aber bei Roboterprogrammen oder c# Anwendungen hilft mir das schon eher, weil da ein durch Tippen nicht wehtut.

Aber man kann den Code so auch besser lesen finde ich.

Ich will dir nicht zu nahe treten und es muß eh jeder so programmieren wie er meint aber für mich gehört dein UND-Zusammengeschustere zur Kategorie "Irrer Ivan". Was soll denn daran besser sein als ein UND wie man es kennt?
 
Viele Zustandskombinationen lassen sich mit Hilfe der Booleschen Algebra und/oder einem Karnaugh-Veitch-Diagramm vereinfachen/verkürzen. Aber elementare Sachen wie reine UND-Verknüpfungen gehen nicht einfacher.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
x = (a and b and c and d and e and f and g and h);

Kann man so eine Syntax auch besser gestalten?
Ja - die Klammer weglassen ;)
Im Ernst: Deine Formulierung ist bereits maximal einfach.


Eigentlich wollte ich gestern schon impulsiv schreiben:
Der typische Home-ST-Programmierer würde etwa so schreiben:
Code:
x := 0;
IF a = 1 THEN
  IF b = 1 THEN
    IF c = 1 THEN
      IF d = 1 THEN
        IF e = 1 THEN
          IF f = 1 THEN
            IF g = 1 THEN
              IF h = 1 THEN
                x := 1;
              END_IF;
            END_IF;
          END_IF;
        END_IF;
      END_IF;
    END_IF;
  END_IF;
END_IF;
Da scheint wohl tatsächlich was Wahres dran zu sein...

Diese Art der Programmierung hat den "Vorteil", daß es im günstigen Fall schnell ist, ansonsten aber unkalkulierbar schwankende Zykluszeiten verursacht, und eventuell kaum lokalisierbare Probleme, wenn mal zuviele Bits TRUE sind...

Harald
 
Naja, wenn man das ganze auch noch modular machen möchte könnte man es auch über eine Rechenoperation machen. Dann könntest du auch noch auslesen wie viele und welche denn gerade aktiv sind. Hab ich schon mal gebraucht und mir nen Baustein davon gmacht. Dann einfach den Ausgang über Vergleicher laufen lassen und du kannst herausfiltern welche Eingänge aktiv sind. Da sieht dann so aus:

Code:
FUNCTION_BLOCK Testing
VAR_INPUT
    I1:        BOOL;
    I2:        BOOL;
    I3:        BOOL;
    I4:        BOOL;
    I5:        BOOL;
    I6:        BOOL;
    I7:        BOOL;
    I8:        BOOL;
END_VAR
VAR_OUTPUT
    Q1:        INT;
END_VAR
VAR
    a:        INT;
    b:        INT;
    c:        INT;
    d:        INT;
    e:        INT;
    f:        INT;
    g:        INT;
    h:        INT;
END_VAR


IF (I1 = TRUE) THEN
    a := 1;
ELSE
    a := 0;
END_IF;

IF (I2 = TRUE) THEN
    b := 2;
ELSE
    b := 0;
END_IF;


IF (I3 = TRUE) THEN
    c := 4;
ELSE
    c := 0;
END_IF;


IF (I4 = TRUE) THEN
    d := 8;
ELSE
    d := 0;
END_IF;


IF (I5 = TRUE) THEN
    e := 16;
ELSE
    e := 0;
END_IF;


IF (I6 = TRUE) THEN
    f := 32;
ELSE
    f := 0;
END_IF;


IF (I7 = TRUE) THEN
    g := 64;
ELSE
    g := 0;
END_IF;


IF (I8 = TRUE) THEN
    h := 128;
ELSE
    h := 0;
END_IF;


Q1 := a + b + c + d + e + f + g + h;

Nur so als kleinen (Offtopic- :rolleyes:)Einwurf. Wäre auch möglich und...hat auch schon Anwendung gefunden. :ROFLMAO:
 
Zuletzt bearbeitet:
@JanB1, mal abgesehen davon daß I1 nicht verschaltet ist, was hat dieser kuriose Block mit einem logischen UND zu tun? Wie wird dieser Block dem TS helfen seine UND Verknüpfungen zu vereinfachen? Und was hat das mit Modularität zu tun? Und was wo soll wer wann mit deinem Block auslesen was gerade aktiv ist? Reicht die Information "True" nicht um die Aktivität anzuzeigen? Was macht eine 2,4 in einem INT aktiver als eine Bool?

Fragen über Fragen...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
FUNCTION_BLOCK Testing
VAR_INPUT
    I1:        BOOL;
    I2:        BOOL;
    I3:        BOOL;
    I4:        BOOL;
    I5:        BOOL;
    I6:        BOOL;
    I7:        BOOL;
    I8:        BOOL;
END_VAR
VAR_OUTPUT
    Q1:        INT;
END_VAR
VAR
    a:        INT;
    b:        INT;
    c:        INT;
    d:        INT;
    e:        INT;
    f:        INT;
    g:        INT;
    h:        INT;
END_VAR


IF (I1 = TRUE) THEN
    a := 1;
ELSE
    a := 0;
END_IF;

IF (I2 = TRUE) THEN
    b := 2;
ELSE
    b := 0;
END_IF;


IF (I3 = TRUE) THEN
    c := 4;
ELSE
    c := 0;
END_IF;


IF (I4 = TRUE) THEN
    d := 8;
ELSE
    d := 0;
END_IF;


IF (I5 = TRUE) THEN
    e := 16;
ELSE
    e := 0;
END_IF;


IF (I6 = TRUE) THEN
    f := 32;
ELSE
    f := 0;
END_IF;


IF (I7 = TRUE) THEN
    g := 64;
ELSE
    g := 0;
END_IF;


IF (I8 = TRUE) THEN
    h := 128;
ELSE
    h := 0;
END_IF;


Q1 := a + b + c + d + e + f + g + h;
Das muß echt ein Depp gewesen sein, wer derart umständlich Bits in ein Byte kopiert ;) :ROFLMAO:

Harald
 
[Offtopic AN]

@PN/DP

Das war der TE selbst ;)
Das war nicht der TE sondern JanB1. Der bezeichnet andere Programmierer auch schnell als Depp, welche unverständlicherweise nicht so programmieren, wie er sich das vorstellt. Da muß er solche derbe Kritik-Äußerung auch selber abkönnen. :ROFLMAO:

[Offtopic AUS]

Harald
 
[Offtopic AN]


Das war nicht der TE sondern JanB1. Der bezeichnet andere Programmierer auch schnell als Depp, welche unverständlicherweise nicht so programmieren, wie er sich das vorstellt. Da muß er solche derbe Kritik-Äußerung auch selber abkönnen. :ROFLMAO:

[Offtopic AUS]

Harald

Bemerkt, zur Kenntiniss genommen. Aber halt, es braucht recht viel bis ich einen Programmierer als Depp betitle. Aber wenn die betreffende Person 2 Monate später keine Ahnung mehr hat wie ihr Programm funktioniert und mir auch nicht erkären kann wie er denn die Webvisu gemacht hat (er sagt die Webvisu sei bei Wago auf Servern abgelegt. Natürlich, deshalb kann ich die Visu auch aufrufen von einem Computer der nur mit der CPU verbunden ist und gar keinen Webzugriff hat...)

Ich bin wirklich nicht die Person die eine andere schnell verflucht oder als "Depp" bezeichnet. Aber wenn ich das denn doch tue, so hat das ganz sicher einen triftigen Grund. :p
 
Das muß echt ein Depp gewesen sein, wer derart umständlich Bits in ein Byte kopiert ;) :ROFLMAO:

Harald

Ich habs hier vereinfacht und aus dem Kopf gemacht, irgendwo hab ich das mal vor nem halben Jahrhundert gmacht.

Wie meinen? Wie hättest du denn so etwas gemacht? Bin offen für neues. :ROFLMAO:
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ungefähr so mach' ich das gewöhnlich. Allerdings erst seit ca. 35 Jahren ;)
Code:
FUNCTION Bits2INT : INT
VAR_INPUT
  I1 : BOOL ;
  I2 : BOOL ;
  I3 : BOOL ;
  I4 : BOOL ;
  I5 : BOOL ;
  I6 : BOOL ;
  I7 : BOOL ;
  I8 : BOOL ;
END_VAR

  Bits2INT := 0 ;
  Bits2INT.0 := I1 ;
  Bits2INT.1 := I2 ;
  Bits2INT.2 := I3 ;
  Bits2INT.3 := I4 ;
  Bits2INT.4 := I5 ;
  Bits2INT.5 := I6 ;
  Bits2INT.6 := I7 ;
  Bits2INT.7 := I8 ;

Variante ohne Bitzugriff
Code:
FUNCTION Bits2INT : INT
VAR_INPUT
  I1 : BOOL ;
  I2 : BOOL ;
  I3 : BOOL ;
  I4 : BOOL ;
  I5 : BOOL ;
  I6 : BOOL ;
  I7 : BOOL ;
  I8 : BOOL ;
END_VAR
VAR
  tempWord : WORD ;
END_VAR

  tempWord := 0 ;
  IF I1 THEN tempWord := tempWord OR 16#01 ; END_IF ;
  IF I2 THEN tempWord := tempWord OR 16#02 ; END_IF ;
  IF I3 THEN tempWord := tempWord OR 16#04 ; END_IF ;
  IF I4 THEN tempWord := tempWord OR 16#08 ; END_IF ;
  IF I5 THEN tempWord := tempWord OR 16#10 ; END_IF ;
  IF I6 THEN tempWord := tempWord OR 16#20 ; END_IF ;
  IF I7 THEN tempWord := tempWord OR 16#40 ; END_IF ;
  IF I8 THEN tempWord := tempWord OR 16#80 ; END_IF ;

  Bits2INT := tempWord ;

Varianten mit absoluten Speicherzugriffen laß ich jetzt mal weg.

Harald
 
Funktioniert deine Lösung bei CoDeSys?

Oder einfach die Funktion "PACK" der "Util.lib" bei CoDeSys. Okayokay, ich hab da nicht wirklich nachgedacht, ich hab das mal bei Excel gebraucht, natürlich geht es hier VIEL einfacher. ^^
 
Und wenn man schon unbedingt einzelne INT-Werte haben möchte, würde ich das machen, was eh hinter den Bits in einem INT-Wert steckt:
Code:
[FONT=Courier New]    a:= BOOL_TO_INT( I1 ) *   1;
    b:= BOOL_TO_INT( I2 ) *   2;
    c:= BOOL_TO_INT( I3 ) *   4;
    d:= BOOL_TO_INT( I4 ) *   8;
    e:= BOOL_TO_INT( I5 ) *  16;
    f:= BOOL_TO_INT( I6 ) *  32;
    g:= BOOL_TO_INT( I7 ) *  64;
    h:= BOOL_TO_INT( I8 ) * 128;[/FONT]

Aber letztendlich ist m.M.n. so ziemlich alles übersichtlicher als dieses ständige IF...THEN...ELSE-Gewurschtel über zig Zeilen.
Selbst wenn man die IFs nur durch eine SEL-Zeile ersetzt, was ja eigentlich auch nichts anderes als ein Wenn...dann...sonst ist:
Code:
[FONT=Courier New]    a:= SEL (G:= I1, IN0:= 0, IN1:=   1);
    b:= SEL (G:= I2, IN0:= 0, IN1:=   2);
    c:= SEL (G:= I3, IN0:= 0, IN1:=   4);
    d:= SEL (G:= I4, IN0:= 0, IN1:=   8);
    e:= SEL (G:= I5, IN0:= 0, IN1:=  16);
    f:= SEL (G:= I6, IN0:= 0, IN1:=  32);
    g:= SEL (G:= I7, IN0:= 0, IN1:=  64);
    h:= SEL (G:= I8, IN0:= 0, IN1:= 128);[/FONT]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, doch, sieht super aus. Sehr übersichtlich. Das erste gefällt mir, deutlich schlanker als meines wobei es auf dem gleichen Prinzip basiert.

Das zweite Beispiel ist natürlich auch sehr schick.

Ich muss zugeben (wie ich schon mal erwähnt habe) bin ich mal wieder um die einfachste Lösung herumgeschippert und habs ein wenig komplizierter gemacht als nötig. *facepalm*
 
Zurück
Oben