TwinCAT 3 Sensor-Signale zusammenfassen

End.y

Level-1
Beiträge
16
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin neu in der SPS-Welt, habe aber direkt eine größere Baustelle.

Ich möchte über TwinCAT 3 eine Steuerung schreiben, die mir ein die Signale von zwölf Hall-Sensoren, zwei Servomoteren von Nanotec und zwei Magnetventilen ansteuert.
Der Aufbau hat 145 Positionen, deren Bestimmung sich aus einer Kombination von maximal vier der zwölf Sensoren ergibt, die "gleichzeitig" auslösen sollen. Z.B. lösen bei Position1 die Sensoren 1,5,12 aus, bei Position2 die Sensoren 4,8,10 (unregelmäßiges Muster). Da ich von den Sensoren bool-Werte erhalte, würde ich diese pro Position gerne in einen Wert zusammenfassen und in ein Array schreiben, damit ich sie danach abgleichen kann, also so:
Sen 1234567...
Pos1: "100010000001"
Pos2: "000100010100"

Leider habe ich keine Ahnung, wie ich das Signal von bis zu vier Sensoren, die ja nie 100%ig gleichzeitig auslösen, in einen Wert bekomme.
Meine erste Idee war, die Position dann mit Strings zu vergleichen, allerdings denke ich, dass das zu ressourcenintensiv ist.

Ich hoffe das ganze war halbwegs verständlich ausgedrückt und jemand hat eine Anregung wie ich das angehen könnte.

Viele Grüße
Yannik
 
Bei zwölf Sensoren könntest Du Dir eine Variable vom Typ WORD definieren und die einzelnen Bits auf den Zustand des jeweiligen Sensors setzen. Angenommen Deine Word-Variable würde b16_Sensoren heißen und die Sensordaten würden in einem ARRAY OF BOOL (0-11) mit dem Namen ab_Sensor abgelegt werden, dann würde die Zuweisung so aussehen:
Code:
b16_Sensoren.0 := ab_Sensor[0];
b16_Sensoren.1 := ab_Sensor[1];
b16_Sensoren.2 := ab_Sensor[2];
usw.
Anschließend kannst Du über eine CASE-Anweisung die möglichen Kombinationen abfragen. Soll z.B. Sensor 0, 1 und 4 bei einer Position TRUE sein müsstest Du auf 19 abfragen, allerdings solltest Du Dir ein ENUM definieren, dann musst Du nicht mit nichts sagenden Zahlenwerten jonglieren.
Deine Bedenken bezüglich der Gleichzeitigkeit sind typisch für Leute, die noch nie mit SPSen zu tun hatten. Mal abgesehen von Siemens, wo man mit einem bestimmten Befehl direkt auf die Hardware zugreifen kann und so den aktuellen Status der Eingänge abfragen kann, ist dies bei den meisten anderen Steuerungen nicht möglich, zumindest soweit es mir bekannt ist. Bei einer SPS wird eigentlich immer alles zyklisch abgearbeitet. Zunächst werden die Zustände der Eingänge ausgelesen und in einem sogenannten Prozessabbild abgelegt, die Ausgänge werden entsprechend dem Prozessabbild gesetzt, oder erst die Ausgänge gesetzt und dann die Eingänge eingelesen, ich weiß das immer nicht so genau. Anschließend wird das SPS-Programm abgearbeitet und dann noch Routinen des Betriebssystems, danach beginnt alles von vorne, wobei dies, je nach Einstellung, sofort oder in einem bestimmten Zeitraster erfolgt. Ändert sich nachdem die Eingänge eingelesen wurden der Zustand eines Eingangs bleibt dessen Zustand im Prozessabbild jedoch bis zur nächsten Aktualisierung gleich, so das im Programm mit einheitlichen und nicht ständig schwankenden Werten gearbeitet wird. Auch wenn ein Ausgang im Programm gesetzt wird behält dieser zunächst seinen alten Zustand bei, bis zur nächsten Abarbeitung des Prozessabbildes. Soweit die Hallsensoren je Position nicht nur für einen kurzen Augenblick ihren Zustand ändern, würden irgendwann ja alle den richtigen Wert melden und Dein Programm dies erkennen, da es in jedem Zyklus komplett durchlaufen wird und nicht nur eine Zeile.

Von irgendwas mit Internetzugang gesendet
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wunderbar, danke vielmals. Ungefähr so hatte ich mir das auch vorgestellt :p

Bzgl. dem zeitlichen Versatz, macht es logisch betrachtet natürlich auch Sinn, da ja irgendwann alle Sensoren einer Position auslösen (hoffentlich), so hatte ich das bisher nicht gesehen. Ich habe mich immer auf das erste Signal versteift.
 
@Oliver
Du hast natürlich Recht, dass die Übernahme der EingangsZustände ins ProzessAbbild im "Stroboskop-Verfahren" für ein gewisses Mass an Entprellung sorgen kann. Kann, nicht muss.

@Yannik & Oliver
Leider führen solche Sichtweisen aber dazu, dass das Problem von vorn herein als erledigt an die Seite geschoben wird. Das ist nicht gut, man sollte es zumindest im Hinterkopf behalten.
Oder besser noch: das zeitliche Verhalten der Signale betrachten, insbesondere in Hinblick auf mechanische Toleranzen, z.B. die Schieflage der abzutastenden Elemente, die vielleicht fein säuberlich in einer Reihe angeordnet sind, aber vielleicht nicht wirklich parallel zu der Reihe fein säuberlich ausgerichteter Sensoren. Bei immerhin 12
Sensoren in einer Reihe wäre dies schon ein nennenswerter Faktor.
Gehört ihr noch zu denen, die wissen, wie ein Lochstreifen aussieht?
Da gibt es eine Spur von kleinen "TransportLöchern" und 5 oder 8 Spuren mit grösseren Löchern, die den eigentlichen Code enthalten.
Beim optischen Lesen wird das kleine TransportLoch als StrobeBit "missbraucht", das sagt "jetzt die Löcher der anderen Spuren auswerten".
D.h., wann genau die CodeBits kommen oder gehen, interessiert nicht. Ausgewertet werden sie zu einem Zeitpunkt, wenn alle, die melden sollen, auch mit Sicherheit melden.

12 Bit also und davon jeweils bis zu 4 "gleichzeitig" mit 1-Signal. Und bis zu (maximal?) 145 gültige Kombinationen.
Weil 12 Bit für 145 Kombinationen zunächst "überdimensioniert" scheinen, wäre interessant, was dahinter steckt.
Da scheint sich also schon jemand ernsthafte Gedanken gemacht zu haben. Aber welche??? Ich würde unbedingt den "Schöpfer" oder die Doku fragen, welche Überlegungen zu diesem System geführt haben.
Gibt es verschiedene "Gruppierungen", die man leicht unterscheiden/zuordnen will?
Ist eine "fehlererkennbare" Codierung angedacht?
Gibt es ein Bit, das man als StrobeBit verwenden kann/sollte?

Die 12 Bit würde ich in jedem Zyklus in ein Wort packen und das Wort mit dem Zustand des Wortes im vorherigen Zyklus vergleichen und nur auswerten, wenn der aktuelle Zustand dem vorherigen gleicht.

Ein schönes WE wünscht Heinileini

Stunden später:
Habe mal die 4096 BitKombinationen der 12 Bit aufgemalt und gezählt (keine Panik - mit Excel ;o) ... Es gibt:
Anzahl Kombinationen mit ...
Code:
 ... genau ...        
       
   1 x 1-Bit:   12  
   2 x 1-Bit:   66  
   3 x 1-Bit:  220   
   4 x 1-Bit:  495
   
 ... 1 bis maximal ... 
                
   1 x 1-Bit:   12 
   2 x 1-Bit:   78 
   3 x 1-Bit:  298
   4 x 1-Bit:  793
Aus den beiden Beispielen mit genau 3 gesetzten Bits extrapoliere ich mal ganz mutig, dass nur Codes mit genau 3 gesetzten von 12 Bits verwendet werden und ignoriere mal, dass Du bis zu 4 gesetzte von 12 Bits zulassen willst.
Dafür gibt es 220 verschiedene Kombination und die geplanten 145 lassen noch 75 an Reserve.
Wenn es so sein sollte, dass nur die Codierungen mit genau 3 gesetzten Bits gültig sein sollen, dann bietet sich an, den eingelesen Code zu prüfen, ob tatsächlich auch 3 Bit gesetzt sind ("fehlererkennbarer Code").

Anhang anzeigen genau3von12.pdf

Anbei die Tabelle zum Thema "genau 3 von 12".

Für ein zügiges Suchen (pardon, Finden) des gesuchten Codes im Array, wäre es natürlich sinnvoll, die Codes in einer sortierten Reihenfolge (egal, ob aufsteigend oder absteigend) der laufenden Zählung (1 bis 145 bzw. max. 220) zuzuordnen, damit binär gesucht werden kann (ZyklusZeit!).
 
Zuletzt bearbeitet:
Meine Lösung war ja auch nur ein erster Anzatz. Natürlich muss darauf geachtet werden, dass, wenn die Sensorsignale sich nicht gleichzeitig ändern (was warscheinlich ist), die Kombinationen sich in Teilen nicht ähneln.

Von irgendwas mit Internetzugang gesendet
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie Heinileini schon vermutet hat, gestaltet es sich doch nicht so einfach. Um das ganze zu verdeutlichen, möchte ich kurz den Aufbau erklären.
Es soll die Position eines "geschlitzten" Rotors in Ringform bestimmt werden. An diesem Rotor sollen die Dauermagnete in unten folgendem Muster angeordnet werden. Am zugehörigen Stator gleicher Form sind die 12 Sensoren platziert. Die Sensoren haben einen Abstand von 20 Grad, da die Form eine Öffnung von 80 Grad hat und drei Plätze nicht besetzt sind ergab sich folgendes Muster. Die roten Punkte markieren die Position der Magnete (weitere lassen sich noch hinzufügen zwecks Genauigkeit oder um doppeltes Auftreten bestimmter Kombinationen zu vermeiden).
Sensoren-Magnete.jpg
Desweiteren habe ich hier noch eine Excel-Tabelle angehängt, um zu zeigen, dass manche Positionen nur durch einen Sensor definiert sind, andere durch maximal 4. Bei Olivers Vorschlag bin ich mir nicht sicher, ob eine Position, an der nur ein Sensor z.B. Sensor 1 auslöst, gut von einer Position zu unterscheiden ist mit bspw. den Sensoren 1,5 und 9.

Anhang anzeigen Position.xlsx.zip

@Heinileini Leider konnte ich deinem Bit-Ansatz nicht ganz folgen. Ich bin mir auch nicht ganz sicher, ob ich durch die Restriktionen, die ich durch die Sensoren habe umsetzbar bzw. sinnvoll ist.
Bitte versteht mich nicht falsch, ich möchte von euch keine fertige Lösung, aber ich bin um jeden Rat dankbar, da das Projekt hier für einen Anfänger doch sehr anspruchsvoll zu sein scheint und ich gerade noch kein Licht am Ende des Tunnel sehen kann :roll:

Viele Grüße Yannik
 
Das sieht ja ganz viel anders aus, als ich mir vorgestellt hatte. Vergiss meinen "BitAnsatz"!
Fragen:
- an den Stellen, wo jeweils zwei Magneten direkt nebeneinander platziert sind, wie ist das Signal eines Sensors dazwischen? Kann der Sensor die "Pause" dazwischen als solche wahrnehmen?
- die Sensoren sind also im 20°Raster angebracht. In welchem Raster die Magnete? Werde mir die Bilder noch genauer ansehen und kann mir die Frage dann wohl selbst beantworten.
- das Raster, in dem die Magnete angebracht sind, ist auch das Raster, in dem die Scheibe positioniert werden soll?

Deine Aussage "weitere Magnete lassen sich noch hinzufügen zwecks Genauigkeit oder um doppeltes Auftreten bestimmter Kombinationen zu vermeiden" geniesse ich erstmal mit grosser Vorsicht … das klingt so, als könne man da später noch Grossartiges herauskitzeln … aber da bin ich im Moment eher vorsichtig als zuversichtlich ;o(

PS:
Hab's gefunden: 2,5° !!!
 
Zuletzt bearbeitet:
Zu Frage:
1: Momentan ist der Aufbau noch nicht abgeschlossen, deshalb weiß ich noch nicht, ob zwei Magnete nebeneinander zu zwei einzelnen Signalen führen, oder zu einem "langen".
2: Die Magnete lassen sich im 2,5 Grad Abstand anbringen. Bei der Öffnung angefangen im Uhrzeigersinn wird der Abstand von einem zum nächsten immer um 2,5 Grad kleiner. Dieses Muster kommt 4 Mal vor. Zusätzlich musste ich zwei Magnete zwischenrein setzen, da ich sonst Positionen gehabt hätte, an denen garkein Sensor ein Signal gibt.
3: Diese Frage verstehe ich nicht ganz. Die Sensoren sind fest am Stator, die Magnete fest am Rotor. Der Rotor dreht sich um die Mittelachse, angetrieben durch die zwei Motoren, die auch fest am Stator sind (zwei daher, da nur einer antreiben kann sobald sich die Öffnung des Rotors vorbei dreht).

Je mehr Magnete ich noch zwischen rein positionieren kann, desto seltener kommen gleiche Kombinationen an Sensorsignalen heraus. In der Excel Tabelle wird das aber recht schnell deutlich.

Viele Grüße Yannik
 
Ja das ist ausreichend. Genauer wäre tatsächlich auch nicht möglich, da Die Ausfräsungen für die Magnete im 2,5 Grad Abstand mir das so vorgeben.

Viele Grüße Yannik
 
Wäre es denn möglich Werte zu erwarten? Da die Reihenfolge der Positionen ja immer die gleiche ist, ließen sich so aus der Abfolge die Position ermitteln, selbst wenn Signale doppelt vorkommen.

Viele Grüße
Yannik
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Yannik!
Möglich schon, aber gar nicht schön!
Bin inzwichen darüber gestolpert, dass sehr viele Codes mehrfach vorkommen und sogar 0 (kein Sensor meldet) 3mal.
Ich kann noch nicht nachvollziehen, wie Du auf Deine Tabelle gekommen bist.
Kann mich leider nicht ununterbrochen damit beschäftigen ;o(

Anhang anzeigen 144PosWiederholungenA.pdf

Anhang anzeigen 144PosWiederholungenB.pdf <===<<< Sorry - pdf-Umsetzung misslungen … ersetzt durch:

Anhang anzeigen 144PosWiederholungenC.pdf

Gruss, Heinileini

PS:
rote Zeilen: kein SensorSignal
grüne Zeilen: Codes eindeutig
In Tabelle ...A: Es wird angezeigt, welcher Magnet von welchem Sensor bei welcher GradStellung "gesehen" wird.
Die Spalten von rechts nach links: habe den ersten 16 SensorPositionen (von achtzehn) den 16 Bit eines Wortes zugeordnet - auch die nicht "besetzten" Positionen 6, 8, 10 und 16) - in diesen Spalten sind die Zellen "ausge-X-t".
Die Sensor-Positionen und die Magnet-Positionen habe ich im UhrzeigerSinn "hochgezählt" (also in "mathematisch negativer Richtung").
Vielleicht dadurch andere Ergebnisse, als Du ermittelt hast?

Anhang anzeigen PositionExtended.xlsx.pdf

Hier die als pdf-Datei vermummte xlsx-Datei. Nach dem Runterladen ".pdf" entfernen!

PPS:
Dein Rotor hat "nur" 144 verschiedene Stellungen - nicht 145.
In dem Bild, das sich in Deiner XL-Datei befindet, hast zu 2 zusätzliche Magneten eingezeichnet (insgesamt 31).
Die bringen zwar eine kleine Verbesserung, aber letztlich keine Abhilfe ;o(
 
Zuletzt bearbeitet:
@Heinileini

Wow, zunächst einmal vielen Dank für deine Bemühungen!

Okay, ich habe schon vermutet, dass das keine schöne Art und Weise ist, ich würde versuchen dies zu umgehen. Die beste Möglichkeit wäre logischerweise ein eindeutiges Signal pro Position.
Wie du richtig festgestellt hast, blieben rein nach dem Muster mehrere Positionen unerkannt. Deshalb habe ich die zwei Magnete hinzugefügt, so erhalte ich zumindest an jeder Position ein Signal, wenn auch nicht eindeutig.

Stimmt, es sind nur 144 Positionen ich habe die Anfangs- und Endlage doppelt gezählt, mein Fehler.

Falls ich es nicht bereits erwähnt habe, die Magnetpositionen sind von mir frei auszuwählen. Das bisherige Muster habe ich nach meinem bisherigen besten Wissen erstellt. Eigentlich wäre es super, wenn man eine Art Simulation hätte, die ermittelt welches Muster eindeutige Kombinationen liefert, sofern dies überhaupt möglich ist. Bietet Excel eine Möglichkeit, Werte so zu variieren, bzw. in deinem Sheet die Spalte E so zu variieren, dass eine möglichst geringe "Fehlerzahl" heraus kommt?

Viele Grüße
Yannik
 
Eigentlich wäre es super, wenn man eine Art Simulation hätte, die ermittelt welches Muster eindeutige Kombinationen liefert, sofern dies überhaupt möglich ist. Bietet Excel eine Möglichkeit, Werte so zu variieren, bzw. in deinem Sheet die Spalte E so zu variieren, dass eine möglichst geringe "Fehlerzahl" heraus kommt?
Oh ja! Das wäre schön.
Aber Du hast immerhin 113 Ausfräsungen für 1 bis zu 56 (113/2 ... mehr als die Hälfte bringt nix) Magnete und darum bin ich seit 3 Tagen am grübeln, welche Überlegungen/Strategien für eine zielgerichtete[re] Anpeilung des Ergebnisses in Frage kommen könnten ...
In XL gibt's zwar was, aber wie man das auf diesen Fall ansetzen könnte ... habe auch dazu im Moment leider keinen Geistesblitz.
Ich werde "Ergebnis-offen" weiterbrüten. Zunächst wahrscheinlich versuchen, das bisherige irgendwie übersichtlicher darzustellen und die Ergebnisse irgendwie von XL bewerten zu lassen, damit man möglichst frühzeitig merkt, ob man sich auf dem Holzweg befindet.

Gruss, Heinileini
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich habe mittlerweile mit 39 Magneten ein Muster gefunden, mit dem ich bei jeder Position ein eindeutiges Signal erhalte. Bitte fragt lieber nicht, wie ich drauf gekommen bin. Es ergab sich mehr oder weniger aus Zufall. Ich habe die letzen paar Tage versucht es zu verstehen, bzw. weiter zu optimieren. Vorerst bin ich habe damit mal zufrieden.
Ich habe auch zusätzlich noch nach Ansätzen gesucht, mit denen sich von einer Position zur nächsten nur ein Bit verändert, damit ich zwischendrin keine Sprünge erhalte. Also quasi etwas Gray Code ähnliches. Durch die unregelmäßige Anordnung der Sensoren und dem "offenen" Ring, führte das auch zu keinem Ergebnis.

Ich werde es nun so machen, dass ich die Signale der Sensoren auslese, pro Position somit eine Binärzahl erhalte, diese in Dezimal umwandle und nur in der Positionsbestimmung berücksichtige, wenn sie länger als x msec. vorkommt. Sozusagen als drehzahlabhängiger Filter, damit die Sprünge zwischendrin rausfallen.

Meint ihr, dass das so erstmal umsetzbar ist?

Viele Grüße
Yannik
 
Und ich musste mich ein paar Tage ausklinken und habe ansonsten auch in die konventionelle Richtung GrayCode überlegt.
Ich wusste/weiss aber nicht, wie flexibel sich Deine Scheibe noch mechanisch "entstellen" lässt.

8-Bit-GrayCode (absolut) ginge, vorausgesetzt, Du könntest 8 Spuren mit Ausfräsungen auf dem Rotor realisieren.
Keine Magnete und keine HallSensoren, sondern 15 induktive Sensoren (8 an einer 20°-Raster-Position und 7 an einer anderen 20°-Raster-Position).

2-Bit-GrayCode plus einen SynchronisierBit (inkremental) ginge auch, vorausgesetzt, Du könntest 3 Spuren mit Ausfräsungen auf dem Rotor realisieren.
Keine Magnete und keine HallSensoren, sondern mit 5 induktiven Sensoren (3 an einer 20°-Raster-Position und 2 an einer anderen 20°-Raster-Position).

Den "offenen Ring" hätten wir durch die Sensoren an 2 20°-Positionen im Griff.

Das weicht jedoch schon ganz schön stark von dem ab, was Du vorhattest. Ich fürchte, die Mechanik wird uns diesen SpielRaum nicht lassen?
Warum scheidet ein "stinknormaler" absoluter DrehGeber aus?

Wärst Du denn bereit, die Positionen der 39 Magnete preiszugeben?
Mit 31 erreichen wir schon, dass in jeder Position mindestens 1 Bit meldet.
Die Anzahl der mehrfach auftretenden Codes wäre mir aber zu hoch.
Kann mir kaum vorstellen, dass diese Situation bei 39 Magneten wieder besser sein soll. Bin nach wie vor recht verwirrt und entsprechend skeptisch.

Gruss, Heinileini
 
Ich habe mich mal erkundigt, ob sich der Ring, wie du sagst, "entstellen" lassen würde, die Antwort lautet wie erwartet nein.
Ein normaler Drehgeber lässt sich nicht montieren, da ich die 80° Öffnung in Ausgangsstellung zu jeder Zeit benötige und die Mittelachse frei bleiben muss.

Ich werde nun den mit den 39 Magneten den im vorigen Post erklärten Ansatz weiter verfolgen. Das Muster habe ich mal in dein Excel File gepackt und hier angehängt.

Anhang anzeigen 39_Magnete.xlsx.pdf

Viele Grüße
Yannik
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Yannik,
Du hast es mit den 39 Magneten tatsächlich geschafft, für alle 144 Positionen je einen eindeutigen Code zu produzieren!!!
Gratulation! Ich habe schon nicht mehr daran geglaubt.
Anscheinend bist Du ein ausgesprochenes TüftelTalent - alle Achtung!

Ja, damit kann man doch die Angelegenheit in den Griff bekommen.
An dem "drehzahlabhängigen Filter" wirst Du wohl "am lebenden Objekt" noch herumoptimieren müssen, aber das grösste Problem hast Du erfolgreich geknackt.
Weiter so und viel Erfolg!

Gruss, Heinileini
 
Ich werde es nun so machen, dass ich die Signale der Sensoren auslese, pro Position somit eine Binärzahl erhalte, diese in Dezimal umwandle und nur in der Positionsbestimmung berücksichtige, wenn sie länger als x msec. vorkommt. Sozusagen als drehzahlabhängiger Filter, damit die Sprünge zwischendrin rausfallen.

Meint ihr, dass das so erstmal umsetzbar ist?

Kommt darauf an, wie schnell der Rotor drehen soll, d. h. wie lange eine Sensorsignalkombination ansteht und welcher zeitliche Versatz sich zwischen den Signalen einstellt.
Die Wandlung in einen Zahlenwert kannst Du recht einfach mit einer UNION erledigen:
Code:
TYPE strSensorSignals
STRUCT
   Sensor00:BIT;
   Sensor01:BIT;
          ...
   Sensor11:BIT;
END_STRUCT
END_TYPE

TYPE uniSensors
UNION
   Signals:strSensorSignals;
   Value:WORD;
END_UNION
END_TYPE

VAR
   MySensors AT %I*:uniSensors;
END_VAR

Für die Verknüpfung mit der Hardware verwendest Du dann MySensors.Signals.Sensor00 bis MySensors.Signals.Sensor11, im Programm kannst Du die Signalkombination mit MySensors.Value abfragen.
 
Zuletzt bearbeitet:
Zurück
Oben