Event DigInputEvent


Einleitung

Dieses Event ermöglicht es, Signale beliebiger Eingänge an angeschlossener Cockpit-XP Hardware auszuwerten und darauf zu reagieren. Das kann ein IR-Empfänger sein, ein Taster, etc.


Syntax

Parameter Beschreibung
Cockpit.Slot Auslösender Slot oder Status des Eingang (0 = aus, 1 = ein)
Cockpit.Parameter <DeviceNummer>, z.B. USBBox 1-x
Cockpit.Station <EingangNummer>, z.B Eingänge an USBBox E1-E8


Codebeispiel

Werden die Sensoren an Eingang 6 und 7 (Cockpit.Station) der USB-Box Nummer 2 (Cockpit.Parameter) in der Liste im Geräte-Manager der Rennbahn ausgelöst, wird ein Relais für eine gewisse Zeit ein- und danach wieder ausgeschaltet.

Der Code ist in ein kritisches Event eingebettet. Das verhindert, dass ein weiteres Auslösen eines Sensors in den Ablauf eingreift. Es wird gewartet, bis die Befehlsfolge durchgelaufen ist. Erst danach beginnt die Ausführung erneut.

{ Pascal Script Engine }
{ Event: DigInputEvent }
{ Parameter: Cockpit.Slot=<SlotPlatz;0/1=Status Eingang;>,
             Cockpit.Station=<EingangNummer>,
             Cockpit.Parameter=<DeviceNummer>
}

begin

  if (Cockpit.Parameter = 2) and ((Cockpit.Station = 7) or (Cockpit.Station = 6)) then
  begin
    cpEnterCriticalSectionEvent;
    cpSetOutput('LichtRelais', true);
    cpsleep(2600);
    cpSetOutput('LichtRelais', false);
    cpsleep(100);
    cpLeaveCriticalSectionEvent;
  end;
  
end.


Optimierungen

Es hat sich gezeigt, dass man die Abfrage der Eingänge spürbar beschleunigen kann, wenn man die Abfrage im AddOn richtig setzt. So ist zum Beispiel ein

...
  if (Cockpit.Parameter = 1) and ((Cockpit.Station = 1) or (Cockpit.Station = 2)) then
  begin
    ...
  end;
...</code>

sowie ein

<Code:pascal linenums|>...
  if Cockpit.Parameter = 1 then
  begin
  
    case Cockpit.Station of
      1: ...;
      2: ...;
      else
         ...;
    end;
    
end;
...

deutlich langsamer als

...
  if (Cockpit.Parameter = 1) and (Cockpit.Station = 1) then
  begin
    ...
  end;
  
  if (Cockpit.Parameter = 1) and (Cockpit.Station = 2) then
  begin
    ...
  end;
...

Durch geschicktes Programmieren kann man hier evtl. noch die eine oder andere ms herauskitzeln.

Ein Performancenachteil bringt auch das Arbeiten mit Package-Variablen innerhalb einer if … then Abfrage.

Beispiel:

...
  if (Cockpit.Parameter = cpGetIntegerVar('USBBox')) and (Cockpit.Station = cpGetIntegerVar('Eingang')) then
  begin
    ...
  end;
...

Besser, hier zeitlich gesehen, ist die „harte“ Programmierung auf die richtige USBBox bzw. den Eingang.

Beispiel:

...
  if (Cockpit.Parameter = 1) and (Cockpit.Station = 6) then
  begin
    ...
  end;
...


Hinweise

Sucht man im Internet nach Antworten, ob die If … then oder die Case … of Anweisung schneller arbeitet, gelangt man regelmäßig und in sehr vielen Programmiersprachen zu dem Schluss, dass die Case … of Anweisung aufgrund spezieller Optimierungen im Compiler bei mehr als 5 Argumenten Geschwindigkeitsvorteile bietet.

Leider lässt sich das nicht konkret in der AddOn-Sprache messen, so dass die tatsächlich schnellere Methode wohl im Dunkeln bleiben wird.

Korrekt ist jedoch, dass der Einsatz von Package-Variablen Performance-Nachteile gegenüber festen Werten oder lokalen Varialben aufweist.



Start - FAQ - Glossar - Sitemap - Impressum

 
cockpit-xp/addon/ereignisse/diginputevent.txt · Zuletzt geändert: 2020/11/28 12:16 (Externe Bearbeitung)