CoDeSys Zeitsteuerung mittels Taskkonfiguration

Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Frage habe ich jedoch noch. Ich haabe ja in meinem Task eingegeben, dass er eine Zykluszeit von 50ms haben soll.

In dem letzten Bild was ich euch geschickt habe, sieht man ja die Überwachung. Mich wundert es, dass dort eine durchschnittliche Zykluszeit von 5microsekunden steht. Oder hat dieser Wert ncihts mit meiner ein gestellten Zeit zu tun?
Das ist zugegebenermaßen etwas missverständlich. Damit ist gemeint, wie lange die Task gebraucht hat um komplett durchzulaufen. Anhand dieses Wertes kannst Du sich anbahnende Probleme erkennen, sprich eine mögliche Zykluszeitüberschreitung. Nähert sich dieser Wert der Zykluszeit müsstest Du diese erhöhen oder, soweit mehrere Programme aufgerufen werden diese auf mehrere Tasks verteilen.
Hat das mit dem Prellen zu tun?
Nein, dafür gibt es entweder I/Os mit entsprechenden Filtern oder das löst Du im Programm. Je kürzer eine Zykluszeit ist umso stärker steigt die Auslastung der CPU durch verschiedene Zykluszeiten kannst Du dies steuern. Eine Kommunikation soll ja meist relativ flott erfolgen, daher nimmt man dafür eine Task mit einer kurzen Zykluszeit, vom Benutzer zu bedienende Schalter müssen dagegen nicht so schnell ausgewertet werden, da kann dann eine längere Zykluszeit benutzt werden.
 
Wo eine Schnelle Zykluszeit noch Sinn macht, ist z.B. bei der Abfrage von Tastern. Wenn du hier den Zyklus auf 500ms stellst, wird dein Taster nicht mehr immer funktionieren.
Hat das mit dem Prellen zu tun?
Nein.
Je länger die Zykluszeit eingestellt ist, desto länger muß ein Signal (z.B. Tastendruck) anstehen, damit es sicher erkannt und verarbeitet wird. Wenn die Task nur alle 500ms auf den Eingang vom Taster schaut, dann wird der nur dann sicher erkannt, wenn mindestens 500ms lang gedrückt wird. Kürzere Tastendrücke werden nur erkannt, wenn die Task da zufällig gerade in dem Moment den Eingang liest.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke euch. Jetzt habe ich es verstanden.

Ich habe auch noch eine weitere Aufgabe, bei der ich etwas Hilfe benötigen könnte.

Ich soll ein Lauflicht entwickeln. Ebenfalls wieder komplett über FUP. Schade, in ST wäre das irgendwie schöner. Naja.....

Am Ende sollen das 32 Lampen sein die von links nach rechts als Lauflicht einmal durchlaufen. Also ein DWORD.
Ich habe mir folgendes überlegt: Ich mache erste Versuche mit 8 Lampen, also einem BYTE, da dies als Visualisierung etwas entspannter ist, als 32 Lampen einzufügen.

Als Lösung wollte ich dies mit einem ROR-Glied realisieren, wobei ein Execute-Baustein ( enthält eine IF-ELSE Bedingung) das Shiften hochzählt.

Hier habe ich auch mal ein kleines Bild:
Unbenannt.JPG

Meine Frage ist nun, ob ihr eine elegantere Lösung kennt, wie man dieses Lauflicht in FUP realisieren kann, sodaß es auch schön aussieht. Mir fällt nur der Rotation-Operator ein. Aber ich lerne auch gerne dazu.
 
Soweit er nicht noch irgendwelche Kniffe haben will hast Du die Lösung doch schon geschrieben, Rotation.
Die Frage wäre jetzt, ob das Licht bei jedem Zyklus um 1 weiterlaufen soll, falls nein bräuchtest Du noch einen Timer.
Was soll übrigens der Execute bewirken?
 
Ach ja, bei drei Schaltern kannst Du kein XOR nehmen, allerdings ist das dann auch (meine ich) keine Wechselschaltung mehr.
:confused:
HardwareLösung:
- Bei 2 Schaltern: 2 WechselSchalter, Schaltung wird WechselSchaltung genannt.
- Bei mehr als 2 Schaltern: zwischen den 2 WechselSchaltern nur noch "KreuzSchalter" einfügen, Schaltung heisst jetzt KreuzSchaltung.
(Ein KreuzSchalter besteht aus zwei mechanisch gekoppelten WechselSchaltern (= "UmSchaltern"), die elektrisch so verdrahtet sind, dass die beiden "Eingänge" je nach SchalterStellung entweder vertauscht oder unvertauscht mit den beiden "Ausgängen" verbunden sind)

SoftwareLösung:
- Bei 2 .. n Schaltern: n-1 XOR Verknüpfungen.

PS:
Ein KreuzSchalter kann selbstverständlich auch verwendet werden, wenn "nur" ein WeschselSchalter gebraucht wird. Ist aber "überqualifiziert" und kostet mehr ;)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Oliver,

der Execute Baustein übernimmt genau diese Timer-Funktion.

An den Baustein ist eine Variable Rotieren geknüpft, die pro Zyklus um 1 erhöhr wird. Der Wert dieser variablen ist dann ist Anzahl der Rotationen im ROR-Operator.

Bei einem BYTE müsste ich 8 Mal Rotieren lassen, damit ich meine Bitanordnung wieder im Ausgangszustand habe. Als Beispiel 1000000. Lasse ich einmal rotieren habe ich als Ergebnis 01000000, zweimal 00100000 usw. Somit habe ich bei 8 Mal rotieren einmal alle Lampen als Lauflicht erfasst. Die Lampe leuchtet als Lauflicht von links nach rechts. Wenn ich nun die Zykluszeit auf 125ms setze dann dauert das Lauflicht genau 1s. wenn ich nun im Execute einfach statt 8, 80 eingebe, dann läuft das Lauflicht 10 Mal von Links nach Rechts.

Ich hoffe das ist verständlich.
 
Für Zeiten und Zeittakte die wesentlich länger als die Zykluszeit sind, nimmt man Timer-Bausteine, z.B. TON, TOF. Damit kannst Du auch spielend einfach einen Weiterrück-Takt von 500ms oder 1s oder ... erzeugen.

Harald
 
@Harald.

Da gebe ich dir vollkommen Recht. Ich hatte nur vergessen zu erwähnen, dass wir keine TIMER benutzen sollen. Ansonsten wäre dein Vorschlag natürlich der definitiv einfachere und effizientere.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht kann mir noch jemand helfen für ein anderes Thema.

Ich soll mittels FUP ( und auch nur FUP) einen Converter programmieren, der eine vierstellige Dezimalzahl in einen 8-4-2-1 BCD Code umwandelt.

Also wie die Umwandlung mathematisch funktioniert ist ja klar. Das ist auch ganz einfach. Aber wie zum Teufel mache ich das bitte in FUP?????????

Ich glaube der Prof denkt, man hat durch Corona zu viel Zeit.
 
Auf jeden Fall eine positive vierstellige Dezimalzahl. Als Beispiel soll man dies für 1234 zeigen. In BCD gibt das ja 0001 0010 0011 0100.
Soweit so klar. Nur wie programmiere ich das jetzt in FUP. Vor allem, wenn man auch noch andere Zahlen eingeben kann. Aber nur positive.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was ich biher gemacht habe, ist eine Wahrheitstabelle aufzustellen. Dabei habe ich gesehen, dass ich prinzipiell 9 Eingangsvariablen (1-9) habe. Es sollen ja nur vierstellige Zahlen dargestellt werden. Somit fällt die 0 raus.
Weiterhin habe ich insgesamt 4 Ausgangsvariablen. Jede Ziffer von 0 bis 9 kann ja durch 4 Bit dargestellt werden. BitA, BitB, BitC, BitD.

Möchte ich also die 1 als BCD darstellen, wäre die DNF dazu : nichtA ^nichtB ^nichtC ^ D. Das ^ bedeutet logisch AND.
Und so kann ich das für alle 9 Ziffern aufstellen.
Die Frage ist nur, wie ich das programmiere. Ich muss ja am Anfang irgendwie eine Zahl eingeben. Ich kann ja auch nicht einen Eingang mit 4 Ausgängen verknüpfen. Verfolge ich den falschen Ansatz?
 
Falscher Ansatz.
Jede DezimalStelle isolieren (Division und Mod) mit 10er Potenzen und mit entsprechender 16er Potenz multiplizieren (mal 16^3 entspricht nach links schieben um 12 Positionen; mal 16^2 entspricht nach links schieben um 8 Positionen; mal 16^1 entspricht nach links schieben um 4 Positionen). ZwischenErgebnisse zusammenODERn.
Sorry, ausführliche Antwort kann ich im Moment nicht so schnell geben. In FUP dauert's noch viel länger ...
 
Zuletzt bearbeitet:
Ich soll mittels FUP ( und auch nur FUP) einen Converter programmieren, der eine vierstellige Dezimalzahl in einen 8-4-2-1 BCD Code umwandelt.
Nur in 4 Ziffern zerlegen oder auch wieder zu 16 Bit Word im BCD-Code zusammenführen?
Das entspricht einer Umwandlung von 1234 dezimal ---> 16#1234
Code:
myInt muß im Bereich 0..9999 sein!

z1 := myInt / 1000;
z2 := (myInt / 100) MOD 10;
z3 := (myInt / 10) MOD 10;
z4 := myInt MOD 10;

OutBCD := z1 * 4096 + z2 * 256 + z3 * 16 + Z4;
Das kann man auch in FUP mit DIV MOD MUL ADD realisieren.
Die Prüfung/Beschränkung auf 0..9999 kann man mit Vergleichsoperatoren und LIMIT MIN MAX machen.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@PN/DP
Also die Aufgabe ist so gedacht, dass die Zahl 1234 dann als Binätzahl dargestellt wird. Also am Ende soll dann 0001 0010 0011 0100 dastehen. Wie würde man dies am Ende dann wieder als eine BCD Zahl darstellen?

Erstmal vielen Dank euch für die Antworten. Ich versuche es mal später in FUP zu realisieren. Ggffls. melde ich mich nochmal.
 
Wo sollen die Binärziffern "zu sehen" sein?
Du könntest das Word OutBCD als Binärzahl 2#... beobachten (geht das in Codesys?)
Oder einer 16fach-Digitalausgabebaugruppe zuweisen (z.B. AT %AW2), dann leuchten die LED der Baugruppe entsprechend den Binärziffern.
Oder den BCD-Wert als Text/String ausgeben mit jedes Bit ist ein Zeichen '0' oder '1'?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Ziffern Sollen meiner Meinung nach einfach irgendwo nachvollziehbar sein. So genau bin ich mit CoDeSys nicht vertraut. Ich könnte ja eine VISU erstellen mit 32 Lampen. allerdings sieht das bekloppt aus und nimmt viel Zeit in Anspruch.
Eherlich gesagt kenne ich das nur von TIA mit den Beobachtungstabellen. In Codesys wüsste nur, dass es per VISU geht.

Das mit der Baugruppe kann ich schlecht realisieren, da ich keine physische SPS zur Verfügung habe. Das müsste ich visuell machen.
 
Kann man in der Codesys-Visu nicht Zahlen (Word) als 2#... formatiert ausgeben? Ich kenne mich da nicht aus.
Und einmal 16 animierte Rechtecke in der Visu malen kann doch nicht so aufwendig sein, geht vermutlich schneller als hier 3 Beiträge zu schreiben... ;)

Harald
 
Entweder wie Harald vorgeschlagen hat (Mit %d für Dezimalzahl im Rechteck unter der Eigenschaft Text), ansonsten kannst Du, wenn Du Online bist auch Dein Programm beobachten und die Werte der Variablen sehen.

Von irgendwas mit Internetzugang gesendet.
 
Zurück
Oben