easy-forum
Deutsch - Software => easySoft => Thema gestartet 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
-
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
-
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;
-
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
-
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.
-
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.
-
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ß
-
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:-) )....
Hallo Chrigu ;)
Ich gehe davon aus das bei Vorhanden 0 Signal und bei Ausgegeben 1 Signal am Eingang anliegt.
Nein, gerade umgekehrt....
Gruss Chrigu
-
Hallo Chrigu :)
(Ausser dass die Eingänge noch Invers sind:-)
bekommst du das selber hin?
-
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
-
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
-
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.
-
... 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ß
-
Hallo,
ich dachte ich hätte es halbwegs verstanden. dann kommt das
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.
-
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
-
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ß
-
alles klar, kein beinbruch, ich steh mir auch manchmal (öfters) im weg
zumal fremde programme zu dokumentieren eine herausforderung für sich sind ???
gruß
-
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