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?
Sagen wir mal einfach eine SPS in der nur bestimmte Funktionen freigegeben/lizensiert sind. Programmiersprache ist dann so etwas wie FUP.
Welche "Programmierumgebung" verwendest du? Sind bitweise Operationen erlaubt?
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.
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.
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
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.
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.
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.