Hallo,
wir haben in OSCAT ja jede Menge Zeitabhängige Bausteine,
aber Streckenabhängige nicht oder ?
oder bin ich blind ?
Beispiel: ich will den Mittelstrich auf der Straße malen.
und zwar (nahezu) unabhängig von der Speed.
dann brauche ich ein Rechtecksignal mit einem Abstand von
https://de.m.wikipedia.org/wiki/Datei:L%C3%A4nge_und_Abstand_der_Fahrbahnmarkierung_auf_Autobahnen.png
12m Abstand und Länge 6m (also Lücke 6m)
Grüße,
Franz
hallo
schau dir doch mal folgende bausteine an.
PWM_PW
PWM_DC
GEN_PULSE
Ich verstehe die Anforderung leider nicht ganz,
welche Eingänge / Ausgänge sollte der Baustein haben und welche mathematische Funktion?
wenn ich das richtig verstehe benötigen wir folgendes:
Anschlüsse
Off: ist der Abstand der Linien
On: ist die markierte Länge der Linie
Run: ist die gefahrene Strecke
Out: wird True, wenn bemalt wird.
Damit hätte der Baustein lediglich folgende Funktion:
OUT := (Run mod (Off + On)) >= Off;
https://github.com/eclipse-4diac/4diac-ide/pull/644
https://github.com/eclipse-4diac/4diac-ide/blob/be33b38cf418a42cac9cf5fa24a215ba33243133/data/typelibrary/signalprocessing-1.0.0/typelib/distance/RangeBasedPulse%20.fbt#L40
ja, so hab ich es auch gemacht:
ALGORITHM REQ
DIST_REMAINDER := (DIST_IN + DIST_OFF) MOD (DIST_HIGH + DIST_LOW);
IF (DIST_REMAINDER >= DIST_HIGH) THEN
Q := TRUE;
ELSE
Q := FALSE;
END_IF;
END_ALGORITHM
franz, ich denke das if kannst du dir sparen
OUT := (Run mod (Off + On)) >= Off; dieser Baustein beginnt mit einer Lücke.
OUT := (Run mod (Off + On)) <= On; und der beginnt mit einem Strich.
für einen Kombibaustein würde ich Folgendes vorschlagen:
X: interne variable
Offset: Interne Variable // dient zum Kalibrieren um bei beliebigem Run anfangen zu können
Cal: Boolscher Eingang // setzt Offset auf Run wenn True
Start: Eingang Bool // wenn True starten mit Lücke, wenn 0 starten mit Strich
On, Off: Eingänge
Out: Booscher Ausgang
If Cal Offset := Run;
if (Off+On) > 0 then X := ((Run-Offset) mod (Off + On)); wir dürfen nicht durch 0 teilen!
If Start then OUT := X <= On; else OUT := X >= Off;
Mit dem Eingang Cal kann man zu Beginn die Logik Kalibrieren, damit man mit beliebigem Run starten kann.
du hast selbstverständlich recht.
ein IF, um dann einen Bool zu setzen ist immer nutzlos:
um bei meiner Implementierung zu bleiben wäre es so:
dein Code ist im Prinzip fast das gleiche.
Ob man mit Strich oder Lücke anfängt ist eine Frage ja.
eine andere wird dann: wenn der Baustein nur ein IEC 61499 Event für jeden Strich Anfang liefern soll. das muss ich noch austüfteln.
ALGORITHM REQ
DIST_REMAINDER := (DIST_IN + DIST_OFF) MOD (DIST_HIGH + DIST_LOW);
Q := (DIST_REMAINDER >= DIST_HIGH);
END_ALGORITHM
Ich schlage vor wir bauen einen Baustein wie folgt:
Eingänge:
Start: Eingang Bool, wenn aktiviert, startet mit einem Strich, indem intern ein Offset auf den Wert von Run gesetzt wird. Wir starten also immer mit dem Strich!
on: Strichlänge in Meter
off: Lücke in Meter
run: die Lauflänge in Meter
out: True, wenn der Strich aufgetragen wird.
Code:
if start and not active then // steigende Flanke am start erkannt
offset := run; // offset wird auf run gesetzt, damit wir bei 0 beginnen
endif
active := start; // active merkt sich den Zusatnd für die Flankenerkennung
if (active and ((off + on) >= 0)) then // wir müssen division durch 0 verhindern
out := ((run - offset) mod (off + on) <= on; // die eigentliche Funktion die den Ausgang steuert
else out := false;
endif