Ähm, du hast das Script aber nicht von Hand gestartet, oder? Muss natürlich als Benachrichtungs-Script registriert werden.
OMG … ich dusslige Nuss …
Ich hatte das Script über “Aktionen” - “Nach dem Programmstart” eingebunden.
Jetzt läufts … DANKE EUCH
So, ich habe an dem Script nochmal gebastelt.
Zum einen wird bei bestehender Verbindung des entsprechenden Encoders der Hintergrund des Encoders “grün” eingefärbt.
Zum anderen wird dieser Hintergrund abwechselnd mit einem großen Schriftzug “Disconnected” rot eingefärbt. Der Schriftzug und der rote Hintergrund bei der Encoderanzeige blinken also abwechselnd rot. (Im abstand von 1 Sekunde wechselnd Bild2 und Bild 3)
Was mir hier aber noch fehlt ist die Abfrage ob der entsprechende Encoder überhaupt aktiviert wurde.
[code]procedure OnLoad;
begin
EnableTimer(1000);
end;
procedure OnTimer;
begin
if Encoder.GetConnections.GetItem(1).GetState = ecsConnected then begin
ExecuteCommand(‘ENCODER_ERROR FONTCOLOR #000000’); // Error Schrift schwarz
ExecuteCommand(‘AIRNET_01_CONECTED FONTCOLOR #000000’); // Encoder Schrift schwarz
ExecuteCommand(‘AIRNET_01_CONECTED BACKGROUNDCOLOR #00FF00’); // Encoder Hintergrund grün
end
else begin
ExecuteCommand(‘ENCODER_ERROR TEXT DISCONNECTED’); // Error-Meldung
ExecuteCommand(‘ENCODER_ERROR FONTCOLOR #000000’); // Error Schrift schwarz
ExecuteCommand(‘AIRNET_01_CONECTED FONTCOLOR #FFFFFF’); // Encoder Schrift weiß
ExecuteCommand(‘AIRNET_01_CONECTED BACKGROUNDCOLOR #FF0000’); // Encoder Hintergrung rot
sleep(1000); // Pause in milliseconds
ExecuteCommand(‘ENCODER_ERROR FONTCOLOR #FF0000’); // Error Schrift rot
ExecuteCommand(‘AIRNET_01_CONECTED FONTCOLOR #FFFFFF’); // Schrift weiß
ExecuteCommand(‘AIRNET_01_CONECTED BACKGROUNDCOLOR #000000’); // Hintergrund schwarz
end;
end;
begin
end.[/code]
Auch das Problem ob der Encoder überhaupt aktiv ist habe ich jetzt gelöst. Das Script mag sicher nicht sehr elegant sein, aber es funktioniert. Ich werde sehen ob ich es noch abspecken kann. Zu dem plane ich noch es eventuell so umzubauen, dass man parallel auch mehrere Encoder überwachen kann.
[code]procedure OnLoad;
begin
EnableTimer(1000);
end;
procedure OnTimer;
begin
if Encoder.GetConnections.GetItem(1).GetEnabled = true then begin
if Encoder.GetConnections.GetItem(1).GetState = ecsConnected then begin
ExecuteCommand(‘ENCODER_ERROR FONTCOLOR #000000’); // Error Schrift schwarz
ExecuteCommand(‘AIRNET_01_CONECTED FONTCOLOR #000000’); // Encoder Schrift schwarz
ExecuteCommand(‘AIRNET_01_CONECTED BACKGROUNDCOLOR #00FF00’); // Encoder Hintergrund grün
end
else begin
ExecuteCommand(‘ENCODER_ERROR TEXT DISCONNECTED’); // Error-Meldung
ExecuteCommand(‘ENCODER_ERROR FONTCOLOR #000000’); // Error Schrift schwarz
ExecuteCommand(‘AIRNET_01_CONECTED FONTCOLOR #FFFFFF’); // Encoder Schrift weiß
ExecuteCommand(‘AIRNET_01_CONECTED BACKGROUNDCOLOR #FF0000’); // Encoder Hintergrung rot
sleep(1000); // Pause in milliseconds
ExecuteCommand(‘ENCODER_ERROR FONTCOLOR #FF0000’); // Error Schrift rot
ExecuteCommand(‘AIRNET_01_CONECTED FONTCOLOR #FFFFFF’); // Schrift weiß
ExecuteCommand(‘AIRNET_01_CONECTED BACKGROUNDCOLOR #000000’); // Hintergrund schwarz
end;
end
else begin
ExecuteCommand(‘ENCODER_ERROR FONTCOLOR #000000’);
end;
end;
begin
end.
[/code]
Ich habe mal eine Frage zum spripten …
Von früher kenne ich noch den Goto-Befehl, allerdings weiß ich nicht mehr wie ich den einsetze und das was ich im Netz dazu gefunden habe ist unklar oder man liest sogar, dass das nicht gut ist?
In Pascal gibt es den goto-Befehl zwar, die Benutzung ist aber eher unüblich und wird als “schlechter Stil” angesehen; zumal man alles, was man mit goto machen könnte, auch mit if/then/else-Abfragen und Schleifen (for, while, repeat) realisieren kann. Und der Code bleibt in den meisten Fällen lesbarer, insbesondere für Außenstehende - oder sich selbst nach x Jahren
Ja, so äöhnlich habe ich das auch überall gelesen …
Also der einheitliche Tenor war - “Böses Goto - Pfui” - ;D
Und schlechten Stil möchte ich mir natürlich nicht nachsagen lassen …
Danke
Vieleicht kann mir jemand kurz helfen?
Zum einen finde ich nicht wirklich eine gute Seite auf der man das Scripten vermittelt bekommt zum anderen würde ich gerne folgendes wissen.
Kann ich bei (zum Beispiel: “GetItem(2)”) die ‘2’ auch als Variable angeben und wenn wie? Ich würde gern den Wert in einer Schleife um 1 erhöhen lassen.
Gruß
Anna
[code]procedure XY();
var
i: integer;
begin
for i := 0 to X do
…GetItem(i).instruction;
end;
end;
begin
end.[/code]
Gruss:
-Serge-
Vielen Dank Serge
Kann ich das identisch bei einem “ExecuteCommand” einsetzten?
Also anstatt
ExecuteCommand('ENCODER_1 FONTCOLOR #000000');
wie das hier
ExecuteCommand('ENCODER_',i,' FONTCOLOR #000000');
So dass auch dieses identisch durchnummeriert wird.
Ja, das geht auch, musst nur nach String konvertieren
ExecuteCommand('ENCODER_' + IntToStr(i) + ' FONTCOLOR #000000');
Gruss:
-Serge-
[EDIT] im Script hat das 2te Pluszeichen gefehlt.
Auch das klappt perfekt … Danke
Jetzt muß ich nur noch den Wert von “i” immer durchlaufend von 1 auf 6 erhöhen und dann sollte es fertig sein.
Allerdings habe ich hier wohl noch einen groben Denkfehler:
[code]var
i: integer;
procedure OnLoad;
begin
EnableTimer(1000);
i := 1;
end;
procedure OnTimer;
begin
if (Encoder.GetConnections.GetItem(i)…
…
…
end;
if (i = 6) then begin
i := 1;
end
else begin
i := i+1;
end;
end;
begin
end.[/code]
ExecuteCommand('ENCODER_' + IntToStr(i) + ' FONTCOLOR #000000');
Öhm … ist das nicht das gleiche wie Serge geschrieben hat?
Hat der Doktor wieder von mir abgeschrieben ;D
Ich hab’ mal versucht dein Script in etwa so zu formatieren, dass du es besser verstehst. Ohne jetzt zu wissen und zu testen was du machen willst.
Wenn du dein komplettes Script postest, kann man das dann entsprechend verbessern/anpassen.
So in etwa müsste das dann ausschauen. Aber ich denke wenn noch ein Fehler drin ist, den findest du jetzt auch selbst.
[code]procedure OnLoad;
begin
EnableTimer(1000);
end;
procedure OnTimer;
var
i: integer;
begin
for i := 1 to 6 do
begin
if Encoder.GetConnections.GetItem(i).GetEnabled = true
then
begin
if Encoder.GetConnections.GetItem(i).GetState = ecsConnected
then
begin
ExecuteCommand('ENCODER_' + IntToStr(i) + ' FONTCOLOR #000000'); // Error Schrift schwarz
ExecuteCommand('AIRNET_' + IntToStr(i) + '_CONNECTED FONTCOLOR #000000'); // Encoder Schrift schwarz
ExecuteCommand('AIRNET_' + IntToStr(i) + '_CONNECTED BACKGROUNDCOLOR #00FF00'); // Encoder Hintergrund grün
end
else
begin
ExecuteCommand('ENCODER_' + IntToStr(i) + '_ERROR TEXT DISCONNECTED'); // Error-Meldung
ExecuteCommand('ENCODER_' + IntToStr(i) + ' FONTCOLOR #000000'); // Error Schrift schwarz
ExecuteCommand('AIRNET_' + IntToStr(i) + '_CONNECTED FONTCOLOR #FFFFFF'); // Encoder Schrift weiß
ExecuteCommand('AIRNET_' + IntToStr(i) + '_CONNECTED BACKGROUNDCOLOR #FF0000'); // Encoder Hintergrund rot
sleep(1000); // Pause in milliseconds
ExecuteCommand('ENCODER_' + IntToStr(i) + '_ERROR FONTCOLOR #FF0000'); // Error Schrift rot
ExecuteCommand('AIRNET_' + IntToStr(i) + '_CONNECTED FONTCOLOR #FFFFFF'); // Schrift weiß
ExecuteCommand('AIRNET_' + IntToStr(i) + '_CONNECTED BACKGROUNDCOLOR #000000'); // Hintergrund schwarz
end;
else
begin
ExecuteCommand('ENCODER_' + IntToStr(i) + ' FONTCOLOR #000000');
end;
end;
end;
begin
end.[/code]
Gruss:
-s-
lach geschummelt … Setzen - Sechs
Ich hatte mein Script extra gekürzt, da es sonst zu unübersichtlich würde.
Zu Erklärung was ich erreichen möchte:
Ein gewisser Teil des Scriptes soll immer wieder durchlaufen werden und die einzelnen Encoder auf ihre Aktivität und den Verbindungsstatus abfragen und entsprechende Commandos ausführen.
Das heißt, beim ersten Durchaluf wird Encoder1 abgefragt (i=1) beim zweiten Durchlauf Encoder2 (i=2) usw…
Wenn dann der letzte Encoder (i=6) durchlaufen ist soll das ganze eben wieder von vorne beginnen.
Wenn ich das mit der For-Schleife jedoch richtig gelesen habe ist das Script ja beendet nach dem der maximale Wert erreicht wurde?
Also der Timer wird ja gestartet und läuft dann 1 mal ab. Beim nächsten Aufruf müsste die Variable i eigentlich wieder bei 1 initialisiert sein, da nicht als global deklariert.
Das kann der Doc aber als Experte genauer sagen. Ich bin in Delphi/Pascal eher ein Laie.
Alternativ, bei der Variabledeklaration von i diese auf 1 initialisieren. Dann müsste beim Timer Aufruf die For-Schleife auf jeden Fall wieder bei 1 anlaufen.
var
i: integer = 1;
Gruss:
-s-
Ich habe nochmal eine gane Menge an Variationen getestet, bleibe aber am Schluß immer wieder an irgendeinem Problem hängen. Darauf habe ich das Script nochmal minimalisiert um die Basis Optionen zu testen.
Zum einen bei der Deklaration von “i” mit der direkten Variante …
var
i: integer = 1;
… bekomme ich eine Error Meldung (…";" expectet)
Zum anderen habe ich schon beim minimalen Script ein Problem:
[code]procedure OnLoad;
begin
EnableTimer(1000);
end;
procedure OnTimer;
var
i: integer;
begin
i := 1;
// ########## ENCODER ABFAGE ##########
if (Encoder.GetConnections.GetItem(i).GetEnabled = true) and (Encoder.GetConnections.GetItem(i).GetState = ecsConnected) then begin
ExecuteCommand(‘ENCODER_’ + IntToStr(i) + ’ FONTCOLOR #000000’); // Encoder Schrift schwarz
ExecuteCommand(‘ENCODER_’ + IntToStr(i) + ’ BACKGROUNDCOLOR #00FF00’); // Encoder Hintergrund grün
end
else if (Encoder.GetConnections.GetItem(i).GetEnabled = true) and (Encoder.GetConnections.GetItem(i).GetState = ecsDisconnected) then begin
ExecuteCommand(‘ENCODER_’ + IntToStr(i) + ’ FONTCOLOR #FFFFFF’); // Encoder Schrift weiß
ExecuteCommand(‘ENCODER_’ + IntToStr(i) + ’ BACKGROUNDCOLOR #FF0000’); // Encoder Hintergrung rot
end
else if Encoder.GetConnections.GetItem(i).GetEnabled = false then begin
ExecuteCommand(‘ENCODER_’ + IntToStr(i) + ’ FONTCOLOR #FFFFFF’); // Encoder Schrift weiß
ExecuteCommand(‘ENCODER_’ + IntToStr(i) + ’ BACKGROUNDCOLOR #000000’); // Encoder Hintergrund schwarz
end;
end;
begin
end.[/code]
Das Script soll nun die drei Varianten des Encoders abfragen und entsprechende Kommandos ausführen.
- Encoder aktiv und verbunden
- Encoder aktiv und nicht verbunden
- Encoder deaktiviert
Nun taucht aber der folgende Fehler auf.
Ist der Encoder aktiv und noch nicht auf verbinden wird er korrekt rot eingefärbt und beim deaktivieren wieder entsprechend inaktiv angezeigt
Ist der Encoder aktiv und ich klicke auf verbinden, aber er kann noch nicht verbinden bleibt er solgane rot bis er die Verbindung hergestellt hat und schaltet dann auf grün.
Aber ist der Encoder inaktiv und ich schalte ihn erst nach dem ich “Verbinden” aktiviert habe aktiv, aber er kann noch nicht die Verbindung aufbauen, bleibt der Encoder unverändert als inaktiv angezeigt.
Ich hoffe ich konnte das Problem verständlich erklären?
Gruß
Anna
Delphi Sprache schwere Sprache…
Kann sein dass die direkte Zuweisung des Wertes bei der Deklaration der Variable in mAirList nicht geht, das ist aber schnell umgangen indem man die Variable beim Aufruf explizit initialisiert.
Für den Rest kann ich dir leider nicht weiterhelfen, da ich den mAirList Encoder überhaupt nicht benutze.
Ich kann mit der Info “Inaktiv/Aktiv” “Verbunden” leider nichts anfangen.
Hat bestimmt mit zu tun wenn mehrere Streams bedient werden sollen. Du müsstest mir dann schon die Seite im Manual angeben wo das beschrieben ist.
Das Problem liegt aber mit Sicherheit darin weil du ‘else if’ benutzt hast.
Die else if werden nähmlich nicht abgearbeitet wenn das ‘if’ nicht zutrifft.
Du solltest unbedingt 3 einfache ‘if’-statements benutzen welche für die einzelnen Zustände zutreffend sind.
[code] if (Encoder.GetConnections.GetItem(i).GetEnabled = true) and (Encoder.GetConnections.GetItem(i).GetState = ecsConnected) then begin
ExecuteCommand(‘ENCODER_’ + IntToStr(i) + ’ FONTCOLOR #000000’); // Encoder Schrift schwarz
ExecuteCommand(‘ENCODER_’ + IntToStr(i) + ’ BACKGROUNDCOLOR #00FF00’); // Encoder Hintergrund grün
end;
if (Encoder.GetConnections.GetItem(i).GetEnabled = true) and (Encoder.GetConnections.GetItem(i).GetState = ecsDisconnected) then begin
ExecuteCommand('ENCODER_' + IntToStr(i) + ' FONTCOLOR #FFFFFF'); // Encoder Schrift weiß
ExecuteCommand('ENCODER_' + IntToStr(i) + ' BACKGROUNDCOLOR #FF0000'); // Encoder Hintergrung rot
end;
if Encoder.GetConnections.GetItem(i).GetEnabled = false then begin
ExecuteCommand('ENCODER_' + IntToStr(i) + ' FONTCOLOR #FFFFFF'); // Encoder Schrift weiß
ExecuteCommand('ENCODER_' + IntToStr(i) + ' BACKGROUNDCOLOR #000000'); // Encoder Hintergrund schwarz
end;[/code]
Gruss:
-Serge-
Sorry, ich hatte wohl die Antworten auf Seite 3 übersehen und vorschnell geantwortet.