msec genaue Impulse

klauserl

Level-2
Beiträge
246
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!
Zykluszeit der CPU wandert so zwischen 20 und 70 ms. Ich bräuchte aber einen ziemlich genauen Impuls von 35ms (5ms auf oder ab soll nicht das Problem sein)
Ist es möglich genaue Impulse zu erzeugen, die kürzer als die Zykluszeit sind.
L.G.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

der Organisationsbaustein "OB35" würde sich hierfür anbieten. In der Hardwarekonfig kann das Aufrufintervall eingestellt werden.

Der OB35 unterbricht dann das zyklische Programm "OB1" im eingestellten Zeitraster.

Gruss Daniel
 
Ich habe sowas im OB35 noch nicht gemacht, aber könnte es nicht folgendes Problem geben:

Mal angenommen er hat eine normale DO32 Ausgangsbaugruppe von A0.0 bis A3.7.
Damit im OB35 der Ausgang auch sofort gesetzt wird, müsste man direkt auf das Peripherieword/byte zugreifen. Also L B#16#01, T PAB 0 um A0.0 zu setzen.
Damit man die anderen Ausgänge noch verwenden kann, müsste man den zu schreibenden Wert noch mit dem Wert des Prozessabbildes verknüpfen.

Ich frage mich aber, welcher Wert wird am Ende des OB1 (bzw. am Anfang bei neueren CPUs) auf das PAB 0 geschrieben, wenn ich im Programm nicht auf A0.0 zugegriffen habe, sondern nur im OB35 über das PAB?

Oder denke ich gerade zu kompliziert...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe sowas im OB35 noch nicht gemacht, aber könnte es nicht folgendes Problem geben:

Mal angenommen er hat eine normale DO32 Ausgangsbaugruppe von A0.0 bis A3.7.
Damit im OB35 der Ausgang auch sofort gesetzt wird, müsste man direkt auf das Peripherieword/byte zugreifen. Also L B#16#01, T PAB 0 um A0.0 zu setzen.
Damit man die anderen Ausgänge noch verwenden kann, müsste man den zu schreibenden Wert noch mit dem Wert des Prozessabbildes verknüpfen.

Ich frage mich aber, welcher Wert wird am Ende des OB1 (bzw. am Anfang bei neueren CPUs) auf das PAB 0 geschrieben, wenn ich im Programm nicht auf A0.0 zugegriffen habe, sondern nur im OB35 über das PAB?

Oder denke ich gerade zu kompliziert...


das kannst du so machen für Ausgang A0.0:

Code:
L AW 0           // Zustand der Ausgänge laden
L W#16#0100     // Maske A0.0 (High und Lowbyte beachten
OW                  // mit OW Bits zusammenfassen
T AW 0           // auf die Ausgänge schreiben
T PAW 0          // sofort an die Peripherie schreiben

das kann man sich auch sparen glaub ich zumindest:
T AW 0 // auf die Ausgänge schreiben
 
Zuletzt bearbeitet:
das kannst du so machen für Ausgang A0.0:

Code:
L AW 0           // Zustand der Ausgänge laden
L W#16#0100     // Maske A0.0 (High und Lowbyte beachten
OW                  // mit OW Bits zusammenfassen
T AW 0           // auf die Ausgänge schreiben
T PAW 0          // sofort an die Peripherie schreiben
das kann man sich auch sparen glaub ich zumindest:
T AW 0 // auf die Ausgänge schreiben

ah, klar, einfach zusätzlich auf AW schreiben, dann wird der Wert aus dem letzten OB35 Aufruf einfach nochmal geschrieben.
Direkt AW 0 wird nicht gehen. Dann ist man ja wieder von der Zykluszeit abhängig.
 
ah, klar, einfach zusätzlich auf AW schreiben, dann wird der Wert aus dem letzten OB35 Aufruf einfach nochmal geschrieben.
Direkt AW 0 wird nicht gehen. Dann ist man ja wieder von der Zykluszeit abhängig.

Korrekt. Wichtig wäre auch noch nachzusehen, ob die DO dieser Baugruppe schnell genug sind. Bei 35 ms sollten sie es noch sein, aber nachschauen schützt vor bösen Überraschungen. :ROFLMAO:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi

Code:
L AW 0           // Zustand der Ausgänge laden
L W#16#0100     // Maske A0.0 (High und Lowbyte beachten
OW                  // mit OW Bits zusammenfassen
T AW 0           // auf die Ausgänge schreiben
T PAW 0          // sofort an die Peripherie schreiben

Retorische Frage.

Der OB35 wird gemäß obigen Code aufgerufen.
OB1 läuft schon z.b. 2 ms.
AW0 wird abgefragt und gesetzt. (OB35)
Im OB1 wird aufgrund einer Verknüpfung gelöscht.

Sodann sind AW0 von OB35 und OB1 unterschiedlich.
Kurzes flacker inbegriffen. ( PAW-Schreiben und PAA am Zyklusende)



Ich denke, das komplette AW sollte in diesem Fall nur von OB35 verwendet werden.

Oder habe ich hier einen Denkfehler.
 
Ich denke, das komplette AW sollte in diesem Fall nur von OB35 verwendet werden.

Das gilt doch generell für alle Ausgänge würde ich sagen. A0.0 darf in dem Fall an keiner anderen Stelle geschrieben werden. Das gesamte Byte/Wort genausowenig.

Ich sehe aber gerade dass es extra SFCs dafür gibt (SFC 79 / SFC 80):
Step 7 online Hilfe schrieb:
Beschreibung

Ein Aufruf der SFC 79 "SET" (set range of outputs) hat folgende Wirkung:

· Das über die Parameter N und SA selektierte Bitfeld im Peripheriebereich wird gesetzt.

· Die zugehörigen Bits im Prozeßabbild der Ausgänge werden ebenfalls gesetzt, unabhängig davon, ob sie in einem Teilprozeßabbild der Ausgänge liegen.
...
Hört sich so an als ob der das gleiche macht wie der Code-Schnipsel von Sarek. In die SFC kann man ja leider nicht reingucken.
 
Also, so wie Sarek das macht, hab ich es auch schon einmal verwirklicht und es hat funktioniert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Für das gezielte Setzen einzelner im Ausgangsabbild befindlicher Bits in asynchron laufenden OBs (wie eben z.B. OB35, OB40 ..) muss man sich nicht die Mühe machen selber auseinanderzunehmen, welches Bit jetzt wie maskiert werden muss.
Z.B. funktioniert das Setzen von A0.4:
Code:
SET        // VKE auf 1
S A 0.4    // Ausgang setzen
L AB 0     // Zustand der aktuellen Ausgangsabbilds laden, hier ist A 0.4 gesetzt
T PAB 0    // und in die Ausgänge schreiben
Und wenn z.B. das ganze Byte/Wort etc geschrieben werden soll, so ist ein zusätzliches Schreiben des Ausgangssabbilds nicht notwendig, das macht die CPU automatisch im Hintergrund.
Code:
L B#16#5A  // neuer Wert
T PAB 0    //Hiermit werden direkt die Ausgänge und das Ausgangsabbild (AB 0) beschrieben
 
Zurück
Oben