Prozesse in IPS

Hallo.

Ich brauche ein Funktion die alle 300ms die RS232 pollt.

Über einen Timer ein Script anstossen ist (glaube ich) nicht die beste Lösung, bezüglich Performance.
Würde gerne eine Process starten der die RS232 über IPS_Sleep() pollt, allerdings sind die php Scripts von der laufzeit beschränkt (default 30sec).

Meine frage:
Gibt es in IPS eine Möglichkeit einen Process zu starten der auf der RS232 pollt und immer läuft?
Wie würdet Ihr das machen, damit wenig Performence vom PC verbraucht wird?

Danke.
BYE
Tomi.

Hi Tomi

Wie dein Nick vermuten lässt kommst du aus der Embedded- bzw µC-Ecke. Und so wie du es beschreibst würde man es dort sicher auch umsetzen. Ein Programm auf einem Atmel hat ja auch nichts anderes nebenher zu tun und zu berücksichtigen.

In der Windows-Welt muss man aber vorsichtiger vorgehen. Wenn man einer Windows-Maschine sagt sie soll so oft wie möglich eine furchtbar wichtige Aktion ausführen wird sie dies auch tun. Die flüssige Ausgabe auf dem Monitor oder das Abfragen der Maus stockt dann oder fällt ganz aus weil laut dieser Definition nur noch von zweitrangigem Interesse. Von den über 100 anderen Aufgaben, die zum Lauf eines Betriebsystems, auch im idle, gehören ganz zu schweigen. Nicht umsonst wurde von den IPS Entwicklern also all zu enthusiastischen Programmierern ein deutlicher Riegel vorgeschoben. Da steckt schon etwas mehr als nur Schikane oder Unvermögen dahinter.

Was kann man aber tun? Du kannst deinen relativ kurzen Poll abarbeiten lassen und dann die Prozesskontrolle so schnell wie Möglich wieder an IPS und somit letztlich an Windows selbst, zurückgeben. Nicht ohne Windows, bzw stellvertretend IPS, den Auftrag zur Wiederholung der Aktion in x Millisekunden mitzugeben. Deine Aktion wird also nicht, wie in Embedded-Kreisen üblich durch ein Sleep gebremst sondern im eingestellten Rythmus von Windows angestoßen. Und so könnte das aussehen:


  IPS_SetScriptTimer($_IPS['SELF'], 1); // Dieses Script jede Sekunde (1000ms) ausführen.
  // IPS_SetScriptTimer($_IPS['SELF'], 0); // Hör wieder auf damit - nur der Vollständigkeit halber ;)

  // hier dein Poll ausführen

Aber jetzt hast du nur eine 1000ms Dauer-Schleife. Um die Leistung eines modernen Quadcore auf über 100 Watt zu treiben braucht man in seinem Performancekiller-Script noch einen Trick.


  IPS_SetScriptTimer($_IPS['SELF'], 1); // Dieses Script jede Sekunde (1000ms) ausführen.
  // IPS_SetScriptTimer($_IPS['SELF'], 0); // Hör wieder auf damit - nur der Vollständigkeit halber ;)

  // hier dein Poll ausführen
  IPS_Sleep(300);
  // hier dein Poll ausführen
  IPS_Sleep(300);
  // hier dein Poll ausführen

Aber Achtung! Das Script startet nach 1000ms ein zweites mal unabhängig davon ob das Erste schon fertig war oder nicht. Man kann einen Mittelklasse Intel damit durchaus zur Verzweiflung bringen. :wink:

Für dauerhafte und/oder zeitkritische Synchronisation mit einer externen Hardware (interne auch) benötigt man nicht ohne Grund also einen Treiber.

Gruß,

Toni

Hallo.

Danke für die Auführliche Erklärung.

Leider muss ich die RS232 pollen, da das Geräte nicht von alleine eine Statusänderung versendet.

Aber ich dachte das ein „IPS_Sleep(300);“, denn Prozess für 300 ms schlafen legt so das andere Prozesse drankommen.
Ist das bei „IPS_Sleep(300);“ nicht so?

Für dauerhafte und/oder zeitkritische Synchronisation mit einer externen Hardware (interne auch) benötigt man nicht ohne Grund also einen Treiber.

Einen Treiber unter Visual C++ als Prozess bekomme ich noch hin. Wie bekomme ich aber die Werte von meinem Programm nach IPS?

Danke.
BYE
Tomi

Es laufen in IPS per dafault maximal 10 Threads parallel. Einer übernimmt dein Script und dieser Thread wird ständig lahm gelegt und friert regelmäßig ein. Die Anderen laufen weiter, richtig. Für Irgendwas muss so ein Quadcore ja gut sein ;). Übertreibst du es aber mit dem Sleep in deinen Scripten sind irgendwann alle Threads nur noch eingefrohren und dein IPS oder Windows steht still weil es nur noch darauf wartet dass irgend ein Sleep beendet wird.

Zum Beispiel per JSON Schnittstelle: Klick
Per SOAP-Wrapper: Klick mit c++ Beispiel
Oder über die Kommandozeile: Klick

Gruß,

Toni