IO-Warrior - Ausgangsimpuls verlängern

Hallo Torben & Co.

ich schalte mit einer IO-Warrior ein Verkehrsfunksystem und möchte während der VF-Durchsage auch mein TA-Bit am RDS-Coder entsprechend setzen. Zum Ein- und Ausschalten brauche ich jeweils einen Impuls, nur ist der leider zu kurz um TA On/Off zuverlässig zu schalten. Wir dachten da an den ‘sleep’-Befehl aber beim mAirList Start kommt folgende Fehlermeldung: ‘…unknown identifier sleep…’

 IOWarriorRemote(0).SetPort(25, true);
 [b]Sleep(50)[/b];
 IOWarriorRemote(0).SetPort(25, false);  

Was mache ich da falsch? Oder gibt es eine Alternative (pause, for…next-Schleife)?

Schöne Grüsse aus dem sonnigen Süden :wink:
Detlef

Hallo Detlef,

Michel hatte mich wegen der Sache schon angesprochen - offenbar scheint der Sleep-Befehl in den Scripts nicht ohne weiteres zu funktionieren. Ich muss mir das genauer angucken. Leider sitze ich seit einigen Tagen nur an “Papierkram” und bin noch nicht dazu gekommen.

Als Workaround könnte man ein “busy wait” implementieren, also die Uhrzeit fortlaufend abfragen, bis die richtige Zeit vergangen ist. Das kostet zwar CPU, ist aber vielleicht zu verschmerzen bei 50ms. Etwa so:

var
  zeit: TDateTime;

begin
  ...
  zeit := now;
  repeat until now > zeit + 1/24/60/60/20; // 50ms
  ...
end.

Probier’s mal aus.

Hallo Torben

Danke für die megaschnelle Antwort!
Habe es folgendermaßen probiert… (Ist der Code so ok?)

[code]var iPort0: Integer;
var zeit: TDateTime;

function RDS_TA_FLAG(TA: boolean): boolean;
begin
// RDS TA (ON) Flag nur setzen, wenn RDS TA LED nicht aktiv
if ((TA = true) AND (IOWarriorRemote(0).GetPort(2) = false)) then
begin
SystemLog(‘VF: RDS TA einschalten (Port25 / +Impuls)’);
IOWarriorRemote(0).SetPort(25, true);
zeit := now;
repeat until now > zeit + 1/24/60/60/20; // 50ms

IOWarriorRemote(0).SetPort(25, false);
end;

// RDS TA (OFF) Flag nur setzen, wenn RDS TA LED aktiv
if ((TA = false) AND (IOWarriorRemote(0).GetPort(2) = true)) then
begin
SystemLog(‘VF: RDS TA ausschalten (Port25 / +Impuls)’);
IOWarriorRemote(0).SetPort(25, true);
zeit := now;
repeat until now > zeit + 1/24/60/60/20; // 50ms

IOWarriorRemote(0).SetPort(25, false);
end;
end;[/code]

Der erwünschte Effekt bleibt leider noch aus. Wie kann ich die zuaddierte Zeit vergrößern? Kenne mich mit dem TDateTime-Format nicht so aus!

Besten Dank und schöne Grüße
Detlef

a) die Hervorhebungen funktionieren im “Code” Block nicht :wink:

b) Die Zeit errechnet sich aus 1 geteilt durch 24 Stunden geteilt 60 Minuten geteilt durch 60 Sekunden geteilt durch 20. Abgekürzt käme heraus: 1 Sekunde geteilt durch 20 = 0,05 Sekunden = 50ms. Das heißt, der letzte Dividend bestimmt die Anzahl Millisekunden, wenn Du da anstatt durch 20 durch 10 teilst, hättest Du 100ms, also den Wert verdoppelt, indem der Dividend halbiert wird. Reine Mathematik :smiley:

LG

McCavity

Besten Dank für den Hinweis und die Erklärung.
Ist ja ganz logisch, wenn man weiß, wie’s funkt.

Schönes Wochenende
Detlef

Ich habe gerade einen neuen Snapshot von v2.2 hochgeladen (Build 548). Die Sleep-Funktion funktioniert nun ohne Absturz.

Falls es sonst keine Fehler mehr gibt, wird dieser Build dann zu Version 2.2.3.

Hallo Torben,

habe die ‘sleep’-Funktion nun einige Tage getestet. Funktioniert wunderbar :slight_smile:

Danke und Gruß
Detlef

Wie jetzt, so lange geschlafen? :slight_smile:

Na logisch!
Wir arbeiten hier eh nur halbtags :smiley: [size=8pt](und der Tag hat 24 Stunden)[/size].