Streckenabhängige Bausteine

Begonnen von franzhoepfinger, 18. Oktober 2024, 12:47:58

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 2 Gäste betrachten dieses Thema.

franzhoepfinger

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




peewit

hallo

schau dir doch mal folgende bausteine an.

PWM_PW
PWM_DC
GEN_PULSE

hugo

Ich verstehe die Anforderung leider nicht ganz,
welche Eingänge / Ausgänge sollte der Baustein haben und welche mathematische Funktion?

hugo

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;


franzhoepfinger



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

hugo

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.

franzhoepfinger

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

hugo

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