easy-forum

Deutsch - Software => easySoft => Thema gestartet von: Fasi am Januar 09, 2020, 10:52:25 Vormittag

Titel: Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: Fasi am Januar 09, 2020, 10:52:25 Vormittag
Hallo zusammen

Vorweg mal allen ein gutes 2020!!

Irgendwie stehe ich noch auf dem Schlauch...ev. kann mir jemand einen Tipp geben.

Ich versuche mit einem Easy oder Easy E4 folgende Abfrage zu bauen:

Wir haben 6 Pager in Ladestationen welche je durch eine Lichtschranke auf Anwesenheit geprüft werden. Nun muss ich erkennen wenn von diesen 6 Pagern, 2 oder mehr entnommen wurden, um dann einen Ausgang zu schalten. Sprich damit zu erkennen dass genügend Personal einen Pager genommen hat um die Mindestanforderung zu erfüllen.

15 & Verknüpfungen führen zum Ziel, ist ja jetzt noch überschaubar....aber wenn die Eingänge sich verdoppeln und noch die Anforderung sich ändert ….. 1000 klicks später :-[   Da muss es doch eine einfachere Lösung geben???

Gruss Chrigu
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: Juergen am Januar 09, 2020, 14:04:01 Nachmittag
Hallo Chrigu  ;)
Ich gehe davon aus das bei Vorhanden 0 Signal und bei Ausgegeben 1 Signal am Eingang anliegt.

Erweiterbar mit weiteren Anwender Bausteinen zum Erhöhen der Stückzahl

Anzeige im Display der E4 welche Anzahl entnommen wurde.
Kannst einfach noch einen Vergleicher auf MB 511 > 1 zum Schalten der Meldung ergänzen
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: weiss_nix am Januar 09, 2020, 14:33:54 Nachmittag
Hallo allesamt, ich würde einen anderen Ansatz wählen  ;)
mit dem md101 kann man weiterarbeiten.
Gruß


mb100 := 0;
FOR MD01 := 1 TO 6 BY +1 DO
if i[MD01] then
  mb100 := mb100 +1;
end_if;
END_FOR;
mb101 := mb100;
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: Juergen am Januar 09, 2020, 14:43:05 Nachmittag
Hallo weiss_nix,

sieht sehr kurz aus, nur ich verstehe es nicht.

Ich bin eben an Fup gewohnt

Hier die Version mit 16 Eingängen und Meldung Q1  in FUP
Anzeige der entnommenen  Geräte im Display
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: weiss_nix am Januar 09, 2020, 22:36:19 Nachmittag
Hi Jürgen, hi Chrigu,
... aus Spass an der Sache habe ich mal eine modulare Lösung um bis zu 32 Bit zu zählen, lässt sich fast beliebig erweitern (solange die Easy mitspielt)
mit BitPacker lassen sich bis zu 8 Bool in ein Byte (z. B. Merkerbyte) packen, 4 x BitPacker passen auf ein MD (z.B. MB01+MB02+MB03+MB04 = MD01)
Der BitZaehler zählt die Bit eines Doppelwort (z.B. MD01) und der Code im BitZaehler ist optimiert und macht nur so viele Schleifen wie Bit's tatsächlich gesetzt sind.   
Die Bausteine sind offen, den Code im BitZaehler habe ich nur abgewandelt, und ist unter https://graphics.stanford.edu/~seander/bithacks.html (https://graphics.stanford.edu/~seander/bithacks.html) nachzulesen.

Gruß

PS: Ist mein erstes EasySoft7 Projekt, bitte nicht gleich prügeln
@Admin: Falls der Doppelpost stört, bitte hier löschen.
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: Juergen am Januar 09, 2020, 23:03:30 Nachmittag
Hallo  weiss_nix, :)

Danke für dein sehr kleines Beispiel.
Es Funktioniert Super.
Nur verstehe ich immer noch nicht wie.
ST ist für mich nur Chinesisch.
Braucht der Anwender auch nicht wissen, was im Baustein selber passiert.
Ist bei den Herstellerbausteinen auch nicht ersichtlich.


Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: weiss_nix am Januar 09, 2020, 23:17:37 Nachmittag
Hi Jürgen, schön zu lesen dass es gefällt  :D

mb100 := 0;
FOR MD01 := 1 TO 6 BY +1 DO
if i[MD01] then
  mb100 := mb100 +1;
end_if;
END_FOR;
mb101 := mb100;

hier werden lediglich die Eingänge als Array in einer Schleife abgeklappert und die gesetzten gezählt.
Die UF BitZaehler ist nicht so einfach zu erklären - nachlesen und grübeln heisst hier die Lösung ....

Gruß
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: Fasi am Januar 10, 2020, 07:51:51 Vormittag
Guten Morgen zusammen!

Danke für die super Ideen und Tipps....Habe es jetzt noch mit einem Vergleich erweitert nun geht es so wie ich mir das vorstelle (Ausser dass die Eingänge noch Invers sind:-) )....

Zitat
Hallo Chrigu  ;)
Ich gehe davon aus das bei Vorhanden 0 Signal und bei Ausgegeben 1 Signal am Eingang anliegt.

Nein, gerade umgekehrt....

Gruss Chrigu
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: Juergen am Januar 10, 2020, 09:43:44 Vormittag
Hallo  Chrigu  :)

Zitat
(Ausser dass die Eingänge noch Invers sind:-)

bekommst du das selber hin?
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: Fasi am Januar 10, 2020, 10:01:06 Vormittag
Hallo Juergen

bekommst du das selber hin?

Ganz knapp geschafft  8) , bei mir ist halt noch das Problem dass ununterbrochen jemand was von mir will...da ist es mit der Konzentration der übrig gebliebenen Hirnzellen so eine Sache....

Gruss Chrigu
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: radar17892 am Januar 10, 2020, 16:59:38 Nachmittag
Hallo,
ich kann nur immer wieder an die Programmierer appelieren, ihren Code zu kommentieren. Dazu hatte ich mich schon mehrfach geäußert.
Da meiner Meinung nach ST die mächtigste Sprache der IEC61131 ist, sollten Anfänger und Interessierte nicht auch noch durch unkommentierten Code abgeschreckt werden.
Es steigert doch das Verständnis, wenn man direkt sieht was die Codezeile bewirkt.
Ich möchte daher mal den Code von weiss_nix erklären:
Ich gehe davon aus, das vorher I01-I06 auf die Merker M01-M06 kopiert wurden
mb100 := 0;      //Zählbyte auf 0 setzen
// eine FOR-Schleife mit der Laufvariable i von 1-6 in einerschrittweite durchlaufen
FOR MD01 := 1 TO 6 BY +1 DO
if i[MD01] then      // nur wenn BitNr i  in MD01 = 1 ist, dann
  mb100 := mb100 +1;      //Merkerbyte100 +1 Zählen
                                                 //sonst nichts machen
end_if;
END_FOR;   //ende FOR-Schleife
mb101 := mb100;     //Zählwert in das MB101 kopieren


Ich hoffe das ist zu verstehen

Gruß Thomas
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: Juergen am Januar 10, 2020, 18:04:40 Nachmittag
Danke Thomas ;) für die Erklärung.
Mit FUP verstehe ich das jedoch immer noch besser.
Das Beispiel in ST ist natürlich viel Kleiner.
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: weiss_nix am Januar 10, 2020, 18:44:53 Nachmittag
... wenn dem so sein soll gerne, aber wenn dann bitte richtig erklären ...
die Laufvariable ist nicht "I" sondern "MD01"
es werden die Eingänge "I" als Array angesprochen und nicht die "Bit's in MD01"
also wird MB100 um 1 erhöht wenn das angesprochene Arrayelement (E01 bis E06) TRUE ist

mb100 := 0;      //Zählbyte auf 0 setzen
// eine FOR-Schleife mit der Laufvariable i von 1-6 in einerschrittweite durchlaufen
FOR MD01 := 1 TO 6 BY +1 DO
if i[MD01] then      // nur wenn BitNr i  in MD01 = 1 ist, dann
  mb100 := mb100 +1;      //Merkerbyte100 +1 Zählen
                                                 //sonst nichts machen
end_if;
END_FOR;   //ende FOR-Schleife
mb101 := mb100;     //Zählwert in das MB101 kopieren


zumal der angegebene Code lediglich als Denkanstoss (und nicht als Lehrbuch) dienen sollte ;)

Gruß
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: Juergen am Januar 10, 2020, 18:52:07 Nachmittag
Hallo,
ich dachte ich hätte es halbwegs verstanden. dann kommt das
Zitat
die Laufvariable ist nicht "I" sondern "MD01"
es werden die Eingänge "I" als Array angesprochen und nicht die "Bit's in MD01"

Geht das auch für eine Handwerker ohne IT Ausbildung. ???

Ich dachte es werden die zuvor mit den Eingängen zugewiesenen Bit im DW Abgefragt.
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: radar17892 am Januar 10, 2020, 19:13:25 Nachmittag
Sorry weiss_nix,
da habe ich mich wohl leicht vertan mit der Laufvariable, wenn man zu schnell drüber liest (unter Codesys ist gewöhnlich "i" die Laufvariable).
also muss es korrekt heißen:
      if I[MD01] then      // wenn Eingang I [MD01] = 1 ist, dann
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: weiss_nix am Januar 10, 2020, 19:19:12 Nachmittag
hi jürgen, gerne versuche ich deine frage zu beantworten,

innerhalb der schleife nimmt MD01 bei jedem durchlauf einen anderen wert an, in diesem fall:
erster durchlauf "1", zweiter durchlauf "2", usw.

den "I01" kannst du als "I01" oder aber als ARRAY DIREKT "I[1]" oder ARRAY INDIREKT "I[MD01]" (wenn MD01=1) ansprechen.

der vorteil: man kann viele elemente mit wenig aufwand ansprechen. hier ist es recht einfach "DIE ARRAY's SIND EINDIMENSIONAL!"
in anderen entwicklungsumgebungen kannst du konstrukte generieren die ECHT undurchsichtig werden ;) z.B. myVar[idxA, idxB, idxC]

gruß
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: weiss_nix am Januar 10, 2020, 19:22:52 Nachmittag
alles klar, kein beinbruch, ich steh mir auch manchmal (öfters) im weg
zumal fremde programme zu dokumentieren eine herausforderung für sich sind  ???
gruß
Titel: Antw:Auswerten 2 von 6 Eingängen geschaltet
Beitrag von: Juergen am Januar 11, 2020, 23:33:02 Nachmittag
Hallo in die Runde,

ich habe mein Kleines FUP Programm im User Baustein jetzt in ST übertragen.
Da ist das wirklich klein geworden.
In diesem Fall macht ST Sinn.
Als Beispiel zum wiederfinden für alle Zental abgelegt
http://easy-forum.net/index.php?topic=8064.msg33829#msg33829