OSCAT Forum

oscat.lib => Bestehende Module / Existing Modules => Thema gestartet von: franzhoepfinger in 18. Oktober 2024, 12:47:58

Titel: Streckenabhängige Bausteine
Beitrag von: franzhoepfinger in 18. Oktober 2024, 12:47:58
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



Titel: Re: Streckenabhängige Bausteine
Beitrag von: peewit in 21. Oktober 2024, 19:00:05
hallo

schau dir doch mal folgende bausteine an.

PWM_PW
PWM_DC
GEN_PULSE
Titel: Re: Streckenabhängige Bausteine
Beitrag von: hugo in 22. Oktober 2024, 11:10:32
Ich verstehe die Anforderung leider nicht ganz,
welche Eingänge / Ausgänge sollte der Baustein haben und welche mathematische Funktion?
Titel: Re: Streckenabhängige Bausteine
Beitrag von: hugo in 26. Oktober 2024, 11:55:49
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;

Titel: Re: Streckenabhängige Bausteine
Beitrag von: franzhoepfinger in 05. November 2024, 17:35:09


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
Titel: Re: Streckenabhängige Bausteine
Beitrag von: hugo in 06. November 2024, 14:42:24
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.
Titel: Re: Streckenabhängige Bausteine
Beitrag von: franzhoepfinger in 06. November 2024, 17:01:47
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
Titel: Aw: Streckenabhängige Bausteine
Beitrag von: hugo in 08. November 2024, 10:37:05
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