IOWarrior - Script für 10er Cartwall

:woman_facepalming:

Manchmal sollte man wirklich eine Pause machen … IO-Worrior und Start/Stop, das geht ja in der Konfig selbst. Na dann hoffe ich mal dass das Script ansonsten so einigermaßen läuft :smiley:

1 Like

C’est moi … :smiley:

nun habe ich doch noch mal eine Frage … wen wundert es? … :smiley:

Ich habe ein Problem bei der Bestimmung eines Multidimensionalen Arrays.

Bei der folgenden Bestimmung:

var
    CwPorts: array [0..2, 0..9] of float;

bekomme ich die folgende Fehlermeldung:

Aber nach all meinem Wissen und den Recherchen sollte die Bestimmung so aber passen.

Ich schau mal irritiert in die Gegend :smiley:

Geht’s mit einem anderen Typ? Probiere mal Real. Oder Double.

Nein, die beiden wollen leider auch nicht, er will da unbedingt irgendwo eine Klammer.

Ich hatte es auch schon mit

... 2] , [0 ...

versucht, aber da schimpft er noch viel mehr. :slight_smile:

Ich frage mich inzwischen noch etwas anderes.

Innerhalb von mAirList wird der I/O Warrior entsprechend mit Ports von 0 bis 31 erkannt. Also nix mit 0.0 bis 0.7 usw.

  • Kann oder muß ich im Script selbst eventuell auch auf diese Nummerierung zurück greifen?
  • Wird das eventuell innerhalb von mAirList selbst schon umgestellt?

Dann könnte ich mir ja die multidimensionalen Arrays sparen :smiley:

Lasse mal das Leerzeichen zwischen array und [ weg.

Probier so:

CwPorts: array [0..2][0..9] of float;

Das hier kennst Du?

Dann bekomme ich folgende Meldung:
grafik

Kann es sein, dass ich in dem Fall

array of array ...

nehmen muß ?

Schau ich mir an, wenn ich wieder zurück bin :slight_smile:

Hasse Hinweis gesehen?

Leerzeichen sind egal, denke ich.

Es gibt in Delphi mehrere Möglichkeiten, ein mehrdimensionales Array zu deklarieren. Leider scheint Pascal Script (die Scripting-Engine) nicht alle davon zu verstehen.

CwPorts: array [0..2] of array[0..9] of float;

wäre noch eine Möglichkeit, die man ausprobieren könnte. Ansonsten müsste man evtl. Typen dafür definieren:

type
  TFloatArray10 = array[0..9] of float;

var
  CwPorts: array[0..2] ot TFloatArray10;

Irgendwie wird es sich schon überlisten lassen :wink:

1 Like

… oder Pascal Script stellt sich mal wieder an. Ich meine, ich hätte das erst letzte Woche mal ausprobiert, aber ich kann mich auch täuschen. (Jedenfalls hatte ich es schließlich nicht verwendet. Und dann vergesse ich sowas schnell wieder.)

1 Like

Sieht eher schlecht aus (auch wenn der Beitrag 10 Jahre alt): Multidimensioal arrays - Pascal Script - RemObjects Talk

Aber ohnehin denke ich, dass das Array hier vollkommen überflüssig ist. Wenn es nur darum geht, aus der Cartnummer eine Portnummer zu errechnen, kann man das sicher auch über eine einfach Formel machen.

1 Like

Hier bekomme ich jetzt zumindest eine neue Meldung :smiley: Das ist doch schon mal was wert :wink:

26.02.2021 16:01:27 Fehler Fehler beim Laden des Hintergrund-Scripts D:\mAirList\Scripts\MainScript_v.2.mls: [Error] (6:45): Unknown type ‘float’ [Error] (6:45): Unknown identifier ‘’ [Error] (6:45): Unknown identifier ‘’

Da hakt es wohl noch anderswie…

hmmm … das sollte ich mal überdenken. Scheint wenn der sichere Weg zu sein. mAirList selbst setzt die Ports vermutlich nicht in 0 bis 31 um?

Inwiefern denn “umsetzen”?

Ich hatte einen Denkfehler … sorry … Ich dachte, dass in der Einrichtung des IOWarriors in der mAirList Konfig die Ports ja schon irgendwie identifiziert werden und zugewiesen werden. Aber das ist ja der andere Weg :smiley:

Jetzt habe ich aber noch mal eine grundlegende Frage zu Scripten und deren Integration in mAirList.

nehme ich zum Beispiel die

prozedure OnCartwallPlayerStateChange(PlayerIndex: integer; OldState: TPlayerState; NewState: TPlayerState);

Ich gehe von der Logik her davon aus, dass diese “procedure” keinen Timer braucht sondern von sich aus ständig den Status überwacht?

Knapp daneben. Diese Prozeduren überwachen nichts, sondern werden von bestimmten Ereignissen innerhalb mAirLists getriggert. In Deinem Beispiel wird, wann immer was an der Cartwall verändert wird, eben diese Prozedur aufgerufen und gleich die ganzen Variablen (PlayerIndex, PlayerState, …) mitgeliefert. Schreibt man was zwischen begin und end;, dann wird eben dieser Code zum Ereigniszeitpunkt ausgeführt.

Nur bei bestimmten Funktionalitäten, beispielsweise bei der Encoderverbindungsüberwachung, gibt es diesen Trigger (noch, *hoff*) nicht. Dann muß man mittels OnTimer (oder OnTimerEx) eine Dauerabfrage einrichten.

1 Like

:woman_facepalming: - Klar das macht Sinn, ich sehe derzeit wohl den Wald vor lauter Bäumen nicht mehr.

Danke Dir für die ausführliche Erklärung, das macht es mir doch gerade deutlich einfacher. :smiley: