Forum: Mikrocontroller und Digitale Elektronik Median berechnen mittels Logik


von median (Gast)


Lesenswert?

Ich habe in einem Sicherheitsmanager n Eingangswerte. Von diesen 
Eingangswerten muss ich den Median berechnen. In meinem Fall ist n=28, 
dass heißt ich müsste die Werte sortieren und den Mittelwert der beiden 
mittleren Werte bilden.

Als Programmcode ist das auch alles gar kein Problem - wären vielleicht 
5 Zeilen C-Code.
Leider ist in dem Safety-Manager kein C-Code o.ä. zugelassen. Das 
einzige, was erlaubt ist sind UND, ODER, NEG, Vergleichsoperatoren und 
Selektoren (daraus lassen sich natürlich auch Min und Max Blöcke bauen).

Bis dato habe ich nicht gerade einen vernünftigen Ansatz gefunden. Kann 
mir da jemand von den Profis weiterhelfen?

von Simon K. (simon) Benutzerseite


Lesenswert?

Was ist denn ein Safety Manager?

von median (Gast)


Lesenswert?

Sagen wir mal einfach eine SPS in der nur bestimmte Funktionen 
freigegeben/lizensiert sind. Programmiersprache ist dann so etwas wie 
FUP.

von Christian W. (chrisw84)


Lesenswert?

Welche "Programmierumgebung" verwendest du?
Sind bitweise Operationen erlaubt?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Wie wäre es mit VHDL? Gibt es einen Takt, Speicherelemente (Flipflops)? 
Wenn nicht, wird es so einige Logikelemente brauchen...
Und warum soll das so besonders "sicher" sein? Ist programmierbare Logik 
störsicherer als ein ganz einfacher Mikrocontroller, der das auch tun 
würde? Schriebe man es in Assembler, würde man den Compiler als (eher 
theoretische) Fehlerquelle auch ausschließen.

von median (Gast)


Lesenswert?

Da gibt es momentan keine richtige Programmierumgebung, da ich nur das 
Prinzip aufzeigen muss. Ich nutzte dazu LogiDoc, es könnte aber auch 
einfach Papier und Bleistift sein. Mir stehen also die oben genannten 
Bausteine zur Verfügng, um daraus einen Funktionsplan zu erstellen. Die 
eigentlicher Realisierung erfolgt dann von Honeywell.
Im Anhang stelle ich noch einmal die Software Referenz vom Safety 
Manager. Da sind alle Blöcke drin, welche genutzt werden können.
Etwas anderes steht nicht zur Verfügung, kein VHDL/Assambler o.ä. Das 
macht die Sache ja so kompliziert.

von Hugi (Gast)


Lesenswert?

Wie groß ist überhaupt ein Eingangswert?

von Detlef _. (detlef_a)


Lesenswert?

Ich kenne LogiDoc nicht, aber warum schmeist Du nicht 13 mal den größten 
Wert weg und dann 13 Maql den kleinsten. Das Mittel der verbleibenden 
zwei ist das Ergebnis.

Kann LogiDoc sowas nicht?

Cheers
Detlef

von median (Gast)


Lesenswert?

Hugi schrieb:
> Wie groß ist überhaupt ein Eingangswert?

Das sind Temperaturwerte von 12Bit, das ist dem Safety-Manager aber 
egeal. Der kennt Real, Int etc.
Ach ja, mit den Logikbausteinen können natürlich auch Flip-Flops 
realisiert werden. Das Problem ist eigentlich die Sortierung der 
Eingangswerte, da dies normalerweise rekursiv bzw. mittels Schleifen 
erfolgt. Bei Logik kommt mir da nicht gerade eine zündende Idee.

von median (Gast)


Lesenswert?

Detlef _a schrieb:
> Ich kenne LogiDoc nicht, aber warum schmeist Du nicht 13 mal den größten
>
> Wert weg und dann 13 Maql den kleinsten. Das Mittel der verbleibenden
>
> zwei ist das Ergebnis.
>
> Kann LogiDoc sowas nicht?


Lasst einfach mal LogiDoc weg und stellt euch vor ich muss das auf 
Papier mit Logikbausteinen "aufmalen".
Natürlich würde das Prinzip funktionieren, dass ich in den 
Eingangswerten den maximalen suche, den an das Ende meines 
"Ausgangsvektors" (z.B. 28 FF) schreibe, diesen wiederum in dem 
Eingangsvektor herausstreiche und dann das nächste Maximum suche. Das 
ganze 28 Mal gemacht und ich habe einen sortierten Ausgangsvektor. Der 
Rest ist nur noch Position finden.
Das Maximum finden ist mit Logik auch kein Problem, aber wie finde ich 
das 2. Maximum, das 3. Maximum etc. ohne wieder auf das erste zu stoßen
Werte wegstreichen geht ja nicht. Es bleiben ja immer 28.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Es gibt die Logikbauteile ab Seite 366 in der Doku, ja?
Du müsstest dir halt die üblichen Sortieralgorithmen anschauen und wie 
man sie in Logik übersetzt... Es wäre gut zu wissen, wie viele 
Logikbausteine in der Hardware zur Verfügung stehen...
Edit: Du musst eben in einem Register speichern, wie viele Maxima/Minima 
schon raus sind - bzw. um wie viel der Vektor schon "geschrumpft" ist

von median (Gast)


Lesenswert?

Niklas Gürtler schrieb:
> Du müsstest dir halt die üblichen Sortieralgorithmen anschauen und wie
> man sie in Logik übersetzt

Genau das ist das Problem. Normale Sortieralgorithmen arbeiten rekursiv 
mit unbestimmter Anzahl von Durchläufen. Die Anzahl der Logikbausteine 
ist erst einmal unbegrenzt. Das kann beliebeig erweitert werden.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

median schrieb:
> Die Anzahl der Logikbausteine
> ist erst einmal unbegrenzt. Das kann beliebeig erweitert werden.
Na das ist ja mal praktisch. Wie schon vorgeschlagen: Du machst ein 
Register N, welches speichert, das wivielte Maximum du gerade suchst, 
mit dem Anfangswert 0. Dann noch eines namens P (anfangswert 0), welches 
die Position im Vektor angibt, an der du gerade nach dem Maximum suchst, 
eines welches das aktuell gefundene Maximum enthält, F. In jedem Takt 
vergleichst du den Wert im Vektor an der stelle P mit dem in F - wenn 
der in P größer ist, schreibe ihn in F. Wenn am Ende des Vektors 
angekommen (P=27), erhöhst du N, und setzt P auf 0, und fängst wieder 
von vorne an. Das machst du solange, bis N=12 - dann hast du das 13. 
Maximum gefunden. Das gleiche nochmal oder gleichzeitig mit dem Minumum, 
und du hast die gewünschten Werte.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

median schrieb:
> Genau das ist das Problem. Normale Sortieralgorithmen arbeiten rekursiv
> mit unbestimmter Anzahl von Durchläufen.

Nur für beliebige n. Wenn n bekannt ist kann man ein Sortiernetz nutzen, 
das benötigt als Element nur einen Vergleicher:
http://en.wikipedia.org/wiki/Sorting_network
Damit kann man z.B. auch ein simples Bubblesort ausführen oder 
Bitonic-Sort wenns auf Geschwindigkeit ankommt: 
http://www.inf.fh-flensburg.de/lang/algorithmen/sortieren/bitonic/bitonic.htm

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.