Geschwindigkeitsmessung

Messi90

Level-1
Beiträge
35
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
ich möchte für mein bestehendes Projekt eine Geschwindigkeitsmessung anhand von Inkrementalwerten durchführen. Ein Inkremental-Drehgeber gibt mir die Werte aus und diese rechne ich in meine Strecke um. Ich programmiere mit Codesys v3.5.5 und finde keine Lösung wie ich Weg/Zeit=Geschwindigkeit programmtechnisch realisieren kann.
Außerdem soll sich die Geschwindigkeit selbst regeln.
Heißt so viel wie: es gibt eine bestimmte Anzahl von Lampen. Fallen nun welche aus, soll die Geschwindigkeit, autom. in Relation zu der Anzahl der Lampen, geregelt werden.
Bsp.: 8 Lampen und 16 cm/min --> Ausfall 2 Lampen= 6 Lampen und 12 cm/min.
Kann mir hierbei jemand weiterhelfen?
Im übrigen programmiere ich mit FUP und bei miener Steuerung handelt es sich um eine XV 102 von EATON.
 
Die Zeit-Komponente (dt) erhältst Du, indem Du in (regelmäßigen) bekannten Zeitabständen den Zählerstand des Drehgebers abtastest, die Weg-Komponente (ds) erhältst Du aus der Differenz des neuen Zählerstands zum vorherigen.

Zu Deiner Regelung: sehr wahrscheinlich gibt es fertige Regelbausteine für Codesys 3.x, eine Internet-Recherche danach sollte nicht schwer sein. Den Sollwert kannst Du anscheinend einfach aus der Anzahl nicht ausgefallener Lampen berechnen. Die Stellgröße aus dem Regelbaustein wirst Du noch irgendwie zur Ansteuerung Deines Motors skalieren müssen. Näheres ergeben die Datenblätter Deiner Komponenten.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke schon mal Harald. Das hilft definitiv schon.
Also wie du das meinst verstehe ich, nur weiß ich leider im Moment noch nicht wie du das mit "abtasten" meinst. Kannst du mir das genauer erklären? Vor allem wie ich das ganze in Zeitabständen lösen kann.
Der Inkrementalzähler gibt 4096 Werte pro Umdrehung bis max 2^24 Werte aus.
Am besten/einfachsten wäre natürlich ein passender Baustein dafür, allerdings bezweifle ich, dass ich da einen finden werde. Bzw habe ich bisher noch nichts derartiges gefunden.
 
Zuletzt bearbeitet:
Hi Messi,

Deine Task läuft ja in einen bestimmten Zyklus. Z. B. 10ms, oder 100ms etc. Du kannst deinen neuenWert immer einlesen und ihn von deinen alten Wert abziehen. Die Differenz teilst du dann durch deine Zykluszeit. Leider hab ich gerade kein FUP hier, deshalb schreib ich dir das ganze mal in Pseudo-Code.

Code:
newIncrementValue : UINT;
oldIncrementValue : UINT;
TimeDiff :  REAL := 10.0; //Zeitdifferenz in ms
speed : REAL; // geschwindigkeit Einheit Inkremente/ms wenn du eine andrer Einheit brauchst musst du noch umnormieren
__________________________________________________

InkremntalgebausAusgang --------------- newIncrementValue

 
 newIncrementValue---|Sub|-------------------------|DIV|-------speed
oldIncrementValue ---|   |          TimeDiff  -----|   |


newIncrementValue --------------- oldIncrementValue

Ich hoffe das hilft dir weiter. Anschließend musst du das ganze eventuell noch auf eine andere Einheit umnormieren. Beim Geschwindigkeits"regler" machst du das am besten mit einem SEL. Im Beispiel zeig ich dir das mit zwei Lampen. Du kannst das dann sicher mit mehreren Lampen nachbilden:

Code:
setPointSpeed: REAL;
lamps : ARRAY[1..2] OF BOOL;
_____________________________________________

0--------------------setPointSpeed

                     lamps[1]---|   |---setPointSpeed
                setPointSpeed---|SEL|
            setPointSpeed +2 ---|   |



                     lamps[2]---|   |---setPointSpeed
                setPointSpeed---|SEL|
            setPointSpeed +2 ---|   |

So das wars. Ich hoffe das hilft dir.

Gruß wonderfulworld
 
Zuletzt bearbeitet:
Warum meinst Du, daß Du die Geschwindigkeit regeln musst? Reicht es nicht, die Geschwindigkeit nur zu steuern, d.h. einfach nur einen Geschwindigkeits-Sollwert an Deinen Antrieb auszugeben und der macht das dann schon? Dann bräuchtest Du keinen Regler-Baustein. Wobei es anscheinend in Codesys einen fertigen PID-Regler gibt, "schlimmstenfalls" ;) schaue Dich mal bei OSCAT um, falls Dir die vielen Fundstellen einer Google-Suche nach "codesys regler" nicht zusagen. (ich kenne Codesys nicht genug).

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

wenn das noch immer der CAN Encoder (RM9000) von letzter Woche ist (http://www.sps-forum.de/codesys-und-iec61131/77846-inkremental-drehgeber.html), hast Du keinen Inkremental- sondern einen Absolutgeber. Der gibt Dir jerweils Werte zwischen 0 und 4095 raus. Nach einer vollen Umdrehung hast Du wieder den gleichen Wert.

Wenn ich es richtig gesehen haben kann der Dir auch schon die Geschwindigkeit rausgeben, Du mußt nur das PDO richtig konfigurieren (Index 6030 nach 1A00 oder 1A01).

Sonst mußt Du Dir einen Zähler bauen mit dem Du arbeitest. Am besten besten die Unter-/Überläufe registrieren und zählen. Diesen Wert dann mit den max. Schritten mal und den aktuellen Wert dazuaddieren. Dann hast Du Deinen Zählwert. Da mußt Du dann aber auch auf den Über -/Unterlauf aufpassen und daß der Zähler groß genug ist.

Dazu kommt dann noch, daß Du einen Filter zur Glättung benötigst.

Gruß
 
Zuerst zu Thruser, da es wahrscheinlich die einfachste Lösung wäre...
Ja, es handelt sich hierbei immernoch um den RM9000.
Ich habe es bereits mit dem Speed PDO versucht, nur leider zeigt es mir lediglich Werte von 0 bis 255 an und ich weiß nicht wie ich diese für eine Geschwindigkeit nutzen kann, da die Werte genauso ansteigen wie die vom Positionsvalue. Nur halt nicht bis 2^24 sondern bis 2^8. Bei erreichen der 255 startet es wieder bei 0. Im Anhang ist meine Konfig dargestellt. Mit dem Subindex 1h werden mir keine Werte angezeigt.
 

Anhänge

  • speed_pdo2.png
    speed_pdo2.png
    44,3 KB · Aufrufe: 35
Zu Haralds Post:

Die Geschwindigkeit soll/muss sich automatisch regeln sobald eine oder mehrere Lampen ausfallen. Es geht hierbei um einen Vorgang bei dem es zwingend notwendig ist, dass sich die Anlage im Fehlerfall der Lampen selber reguliert. Also wenn weniger Lampen aktiv --> langsamere Geschwindigkeit. Wie der Antrieb dann die Geschwindigkeit regeln kann, weiß ich im Moment noch nicht aber theoretisch sollte er es können. Für den Moment will ich erstmal über meinen Drehgeber die Geschwindigkeit und Weg aufnehmen können.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zu wonderfulworld:
Erst mal danke ich dir für deine Mühe! Hoffe nur ich hab deinen "Pseudo-Code" richtig interpetriert :-D
Im Anhang habe ich mal meinen FUP hochgeladen.
Problem nun ist nur, dass es mir in negativer Drehrichtung (gegen Uhrzeigersinn) 2^32 als Wert anzeigt.
Desweiteren verstehe ich den zweiten Teil deines Codes nicht. Kannst du mir das etwas genauer erklären? Was genau soll der Selektor bewirken?
 
Wenn ich jedes PDO einzeln probiere zeigen mir:
Index 6030 sub 0 und 1 Werte von 0 bis 255 an
Index 3010 sub 0, 1 und 2 Werte von 0 bis 255 an
Index 3011 sub 0 keine Werte an

Wenn ich Index 3010 sub 0,1 und 2 zusammen einfüge zeigt es mir die Werte aufsteigend an. Also sobald sub0 die 255 übersteigt, steigt sub1 +1 an. Sobald sub 1 die 255 übersteigt, steigt sub2 um + 1 an bis 255.

Das selbe Bild bei Index 6030 mit sub 0 udn 1 eingefügt. Sub 0 stiegt bis 255 und bei Überschreitung steigt Sub1 um +1 bis auf 255.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

hast Du vielleicht einen CAN Dongle zur Verfügung? Um Mal die Werte anzusehen, die über den Bus gehen. Dann gibt es noch das Programm CANWizard, mit dem Du Einstellungen vornehmen kannst. Beides ein gute Hilfe, wenn man mal Probleme hat.

Du mußt nach Index 3010 Subindex einen Wert schreiben, um die Geschwindigkeitsmessung zu aktivieren. Wahrscheinlich die 1 (u8 ). Dann sollte sich auch der Wert in 3011 ändern (auch u8, also 0-255). Eventuell funktioniert dann auch erst Index 6030 Sub 1.

Hast Du sonst schon einmal beim Hersteller nachgefragt, ob die vielleicht helfen können? So sollte man da mal nach der EInheit der Geschwindigkeit fragen, die ist in den Unterlagen ja leider nicht angegeben.

Welche Werte hast Du da eigentlich? Wieviel Umdrehungen pro Minute hat der Sensor? Wie hast Du die Inhibit Time gesetzt? Wie oft läuft Dein Task? Das mußt Du ja alles mit berücksichtigen bei Deiner Messung, wenn Du es über den Positionswert machst. Die Werte müssen auch dazu passen. Je nach Geschwindigkeit mußt Du auch schauen wie Du berechnest. Entweder Du mißt die Zeit zwischen zwei Positionswerten (langsame Geschwindigkeit), so Du das überhaupt vernünftig machen kannst mit den Werten. Oder Du Du nimmst einen festen Zeitabstand, z.B. Zyklusszeit oder ein mehrfaches davon, und schaust nach um wieviel sich der Wert geändert hat (schnelle Geschwindigkeit).

Gruß
 
Hallo,

hast Du vielleicht einen CAN Dongle zur Verfügung? Um Mal die Werte anzusehen, die über den Bus gehen. Dann gibt es noch das Programm CANWizard, mit dem Du Einstellungen vornehmen kannst. Beides ein gute Hilfe, wenn man mal Probleme hat.

Du mußt nach Index 3010 Subindex einen Wert schreiben, um die Geschwindigkeitsmessung zu aktivieren. Wahrscheinlich die 1 (u8 ). Dann sollte sich auch der Wert in 3011 ändern (auch u8, also 0-255). Eventuell funktioniert dann auch erst Index 6030 Sub 1.

Hast Du sonst schon einmal beim Hersteller nachgefragt, ob die vielleicht helfen können? So sollte man da mal nach der EInheit der Geschwindigkeit fragen, die ist in den Unterlagen ja leider nicht angegeben.

Welche Werte hast Du da eigentlich? Wieviel Umdrehungen pro Minute hat der Sensor? Wie hast Du die Inhibit Time gesetzt? Wie oft läuft Dein Task? Das mußt Du ja alles mit berücksichtigen bei Deiner Messung, wenn Du es über den Positionswert machst. Die Werte müssen auch dazu passen. Je nach Geschwindigkeit mußt Du auch schauen wie Du berechnest. Entweder Du mißt die Zeit zwischen zwei Positionswerten (langsame Geschwindigkeit), so Du das überhaupt vernünftig machen kannst mit den Werten. Oder Du Du nimmst einen festen Zeitabstand, z.B. Zyklusszeit oder ein mehrfaches davon, und schaust nach um wieviel sich der Wert geändert hat (schnelle Geschwindigkeit).

Gruß

Nein, leider habe ich keinen Dongle.

Ich habe im Anhang mal meine PDO´s und SDO´s dargestellt. Vielleicht fällt dir ja der Fehler auf. Mit dem Index 3011 sub1 erhalte ich nun auch einen Wert, allerdings ist es genau der selbe Wert wie mein Postion value und das kann ja nicht richtig sein, oder?

Was meinst du mit wie viele U/min? der Sensor soll dieGeschwindigkeit eines Kabels beim aufrollen messen. Diese Geschwindigkeit wird bei sich etwa im Beriech von 0 bis 200 cm/min bewegen.
 

Anhänge

  • 4.png
    4.png
    20,3 KB · Aufrufe: 18
  • 3.jpg
    3.jpg
    90,3 KB · Aufrufe: 20
  • 2.jpg
    2.jpg
    94,9 KB · Aufrufe: 21
  • 1.jpg
    1.jpg
    38,5 KB · Aufrufe: 21
Hallo,

da stimmt etwas mit Deinem E/A Mapping unter CoDeSys nicht oder es hängt am 'Speed Modus'. Leider ist ja im Handbuch nicht erwähnt was man da auswählen kann.

Sonst wähle da doch noch einmal den Index 6030, Sub 1. Ich habe mal nachgesehen, nach Vorschrift muß dort die Geschwinddigkeit dort in measuring units/second angegeben werden.

Im Augenblick verwendest Du zwei PDOs (180+COB ID (Position)und 280+COB ID (Geschw.)) Man sollte das auch in ein PDO mappen können. Dazu muß der Subindex 0 von Index 1A00 auf zwei erhöht werden und das zweite Mapping in Index 1A00, Subindex 2 geschrieben werden. E/A Mapping muß entsprechend angepaßt werden.

Zur Drehzahl:
Was macht der Positionswert, wenn er einmal rum ist? Springt er dann wieder auf 0 oder erhöht sich der Wert auf 4096, 4097 etc.? Bei letzterem brauchst Du nur zu wissen wie groß der Abstand für den Wechsel des niederwertigsten Bit ist. Mit ersterem kannst Du nur die Drehzahl bestimmen in Umdrehungen pro Sekunde oder Minute. Du benötigst daher noch den Umfang zur Umrechnung.

Ist der Sensor an der Trommelachse befestigt oder mißt er direkt am Kabel? Bei ersterem mußt Du noch die Kabellage mit berücksichtigen, da sich dadurch der Umfang ändert. Dazu kannst Du hier im Forum diverse Beiträge finden.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

so ich habe das mal zuhause versucht zu konfigurieren. Habe hier CoDeSys V3.5 SP6, da scheint etwas mit dem Sende und Empfangs PDO geändert worden zu sein. Jedenfalls sollte das so aussehen:
attachment.php

beachte Speed ist 16bit

Das SDO sieht dann so aus:
attachment.php

Hier fehlt jetzt aber noch das setzen des Indes 3010 auf Speed.

So werden jedenfalls Position und Speed in einem PDO übertragen.

Vielleicht hilft das ja weiter.

Gruß
 

Anhänge

  • PDO.jpg
    PDO.jpg
    61,9 KB · Aufrufe: 59
  • SDO.jpg
    SDO.jpg
    71,4 KB · Aufrufe: 58
Die Geschwindigkeit soll/muss sich automatisch regeln sobald eine oder mehrere Lampen ausfallen. Es geht hierbei um einen Vorgang bei dem es zwingend notwendig ist, dass sich die Anlage im Fehlerfall der Lampen selber reguliert. Also wenn weniger Lampen aktiv --> langsamere Geschwindigkeit. Wie der Antrieb dann die Geschwindigkeit regeln kann, weiß ich im Moment noch nicht aber theoretisch sollte er es können. Für den Moment will ich erstmal über meinen Drehgeber die Geschwindigkeit und Weg aufnehmen können.

Das ist dann allerdings (wie schon von Harald angesprochen) KEIN Regeln sondern ein Steuern.
Abhängig von der Anzahl der verfügbaren Lampen gibst du einen anderen Geschwindigkeits-Sollwert vor - oder einen Faktor für eine generelle Geschwindigkeits-Vorgabe.
Der Regler kümmert sich dann darum, dass die Geschwindigkeit auch kommt ...

Gruß
Larry
 
Hallo,

da stimmt etwas mit Deinem E/A Mapping unter CoDeSys nicht oder es hängt am 'Speed Modus'. Leider ist ja im Handbuch nicht erwähnt was man da auswählen kann.

Sonst wähle da doch noch einmal den Index 6030, Sub 1. Ich habe mal nachgesehen, nach Vorschrift muß dort die Geschwinddigkeit dort in measuring units/second angegeben werden.

Im Augenblick verwendest Du zwei PDOs (180+COB ID (Position)und 280+COB ID (Geschw.)) Man sollte das auch in ein PDO mappen können. Dazu muß der Subindex 0 von Index 1A00 auf zwei erhöht werden und das zweite Mapping in Index 1A00, Subindex 2 geschrieben werden. E/A Mapping muß entsprechend angepaßt werden.

Zur Drehzahl:
Was macht der Positionswert, wenn er einmal rum ist? Springt er dann wieder auf 0 oder erhöht sich der Wert auf 4096, 4097 etc.? Bei letzterem brauchst Du nur zu wissen wie groß der Abstand für den Wechsel des niederwertigsten Bit ist. Mit ersterem kannst Du nur die Drehzahl bestimmen in Umdrehungen pro Sekunde oder Minute. Du benötigst daher noch den Umfang zur Umrechnung.

Ist der Sensor an der Trommelachse befestigt oder mißt er direkt am Kabel? Bei ersterem mußt Du noch die Kabellage mit berücksichtigen, da sich dadurch der Umfang ändert. Dazu kannst Du hier im Forum diverse Beiträge finden.

Gruß

Hi,

Habe nun Position value und Speed value channel 1 (6030 sub1) in ein PDO eingefügt und das zweite deaktiviert.

Deinen Satz: "Dazu muß der Subindex 0 von Index 1A00 auf zwei erhöht werden und das zweite Mapping in Index 1A00, Subindex 2 geschrieben werden. E/A Mapping muß entsprechend angepaßt werden." verstehe ich nicht so ganz. Du meinst ich soll ein SDO hinzufügen mit dem Index 1A00 und SubIndex 2? Dieses ist ja schon vorprogrammiert integriert oder?

Der Positionswert steigt bei Drehung der Welle von 0 bis 2^24. Bei 16777215 angekommen, beginnt er wieder bei 0. Was meinst du mit dem Abstand für den Wechsel des niederwertgsten Bit?

Der Sensor ist direkt am Kabel angebracht. Also wenigstens hier mal etwas Vereinfachung ;-)
 

Anhänge

  • 5.jpg
    5.jpg
    46,7 KB · Aufrufe: 7
  • 6.jpg
    6.jpg
    42 KB · Aufrufe: 8
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist dann allerdings (wie schon von Harald angesprochen) KEIN Regeln sondern ein Steuern.
Abhängig von der Anzahl der verfügbaren Lampen gibst du einen anderen Geschwindigkeits-Sollwert vor - oder einen Faktor für eine generelle Geschwindigkeits-Vorgabe.
Der Regler kümmert sich dann darum, dass die Geschwindigkeit auch kommt ...

Gruß
Larry

Sorry, dann war es ein Ausdrucksfehler meinerseits ;-)
 
Das ist dann allerdings (wie schon von Harald angesprochen) KEIN Regeln sondern ein Steuern.
Abhängig von der Anzahl der verfügbaren Lampen gibst du einen anderen Geschwindigkeits-Sollwert vor - oder einen Faktor für eine generelle Geschwindigkeits-Vorgabe.
Der Regler kümmert sich dann darum, dass die Geschwindigkeit auch kommt ...

Gruß
Larry

Sorry, dann war es ein Ausdrucksfehler meinerseits ;-)
 
Hallo,
Hi,

Habe nun Position value und Speed value channel 1 (6030 sub1) in ein PDO eingefügt und das zweite deaktiviert.

Deinen Satz: "Dazu muß der Subindex 0 von Index 1A00 auf zwei erhöht werden und das zweite Mapping in Index 1A00, Subindex 2 geschrieben werden. E/A Mapping muß entsprechend angepaßt werden." verstehe ich nicht so ganz. Du meinst ich soll ein SDO hinzufügen mit dem Index 1A00 und SubIndex 2? Dieses ist ja schon vorprogrammiert integriert oder?
da wußte ich noch nicht wie CoDeSys das macht, das konnte ich erst abends ausprobieren. Ich dachte Du hast das irgendwie von Hand eingetragen. Ja das wird in der Tat automatisch erzeugt. Siehe mein SDO in den Zeilen 10 bis 13. Dort erfolgen die zwei Mappings in den Index 1A00.

Der Positionswert steigt bei Drehung der Welle von 0 bis 2^24. Bei 16777215 angekommen, beginnt er wieder bei 0. Was meinst du mit dem Abstand für den Wechsel des niederwertgsten Bit?
Du kannst auch ein Zählerschritt sagen. Ich betrachte das immer bitcodiert, keine Ahnung warum. Du hast da für eine Umdrehung 4096 Zählschritte. Sagen wir der Umfang beträgt 1 Meter, dann entspricht der Wechsel des niederwertigsten Bit bzw. die Änderung des Zählers um 1 die zurückgelegte Distanz 1/4096 Meter.

Da der Zähler im Sensor aber bis 2^24 hochzählt hast Du es ja ziemlich einfach, wenn Du die Geschwindigkeit darüber bestimmen willst. Du mußt nur noch den Über- bzw. Unterlauf berücksichtigen.

Und natürlich die Zykluszeit in Verbindung mit der Sperrzeit/Inhibit Time

Gruß
 
Zurück
Oben