Pixelsumme ändert sich ständig

  • Hallo zusammen,

    ich hatte jetzt schon öfter Probleme mit der Pixelsumme (PixelCheksum):

    Ich nutze diese sehr oft, zum Beispiel wenn mein Skript warten soll, bis eine andere Software mit einem bestimmten Prozess fertig ist.

    Dabei nutze ich folgenden Code:

    Do

    $robo_ende = PixelChecksum(83, 234, 262, 266) ;Pixel Area die sich nach beenden des Prozesses ändert

    Until $robo_ende = 1798296657 ;Summe der Pixel am Ende des Prozess

    Die erwartete Pixelsumme lese ich vorher mit folgendem Skript aus:

    ;Wenn Pixelsummen gemessen werden müssen

    ;Koordinaten, die gemessen werden sollen

    $pix_sum = PixelChecksum(83, 234, 262, 266)

    ;Fenster, auf dem die Pixelsumme gemessen werden soll

    WinActivate("DobotStudio-//ad.fh-albsig.de/stud/home/ruppnico/profiles/Desktop/Praktikum.playback")

    WinWaitActive("DobotStudio-//ad.fh-albsig.de/stud/home/ruppnico/profiles/Desktop/Praktikum.playback")

    sleep(500)

    ;Ausgabe

    MsgBox(0, "Pixelsumme", $pix_sum)

    Wie gesagt habe ich jetzt schon oftmals Probleme damit gehabt, da die erwartete Pixelsumme mal erscheint und dann widerum nicht. Wenn ich mir die Pixelsumme dann neu ausgeben lasse, hat diese einen anderen Wert, das nächste mal dann wieder den alten Wert oder einen völlig neuen usw....

    In der Vergangenheit hab ich das Problem mit PixelGetColor gelöst, hier waren die Werte bisher konstant, allerdings hat dies heute auch nicht mehr funktioniert.

    Woran liegt das? Was machen ich falsch mit der Pixelsumme??

    Vielen Dank schonmal

    P.S.: ich bin absoluter AutoIt Anfänger und habe auch keinen IT-Background

  • Ich nutze diese sehr oft, zum Beispiel wenn mein Skript warten soll, bis eine andere Software mit einem bestimmten Prozess fertig ist.

    Ggf. gibt es andere (und zuverlässigere) Möglichkeiten diese Abfrage zu gestalten.

    Nebenbei : Startest Du den o.a. Prozess selbst ?

    Du könntest z.B. mit ProcessExists prüfen, ob der Prozess noch läuft.

    EDIT : niciolsi

    Hier ein Skript, um aktuelle Prozessinformationen zu erhalten. Das Original stammt von PsaltyDS (User im engl. Forum) - von mir etwas modifiziert (ist schon älter, sollte aber noch funktionieren) :

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (10. März 2020 um 18:11) aus folgendem Grund: erweitert


  • Hallo Musashi,

    vielen Dank für deine Antwort.

    Vielleicht sollte ich die Situation näher erläutern, denn ein richtiger "Prozess" ist es glaube ich nicht wirklich.

    Und zwar Startet mein Autoit Skript in einer Robotersoftware das Roboterskript über "Start" (siehe Bild).

    Der Roboter fährt dann die Zeilen in im Roboterskript ab, wobei immer die Zeile dunkel hinterlegt ist, die der Roboter gerade anfährt.

    Fährt der Roboter also seinen letzten Punkt an, ist die letzte Zeile dunkel hinterlegt (siehe Bild).

    AutoIt soll natürlich erst dann mit dem Sktipt fortfahren, wenn der Roboter fertig ist (= letzte Zeile dunkel markiert).

    Das überprüfe ich wie gesagt mit Pixelchecksum oder Pixelgecolor.

    Da steckt ja kein Prozess dahinter, der danach verschwindet. Die Robotersoftware wird danach nicht beendet.


    Viele Grüße

    Nicole

  • Der Roboter fährt dann die Zeilen in im Roboterskript ab, wobei immer die Zeile dunkel hinterlegt ist, die der Roboter gerade anfährt.

    Fährt der Roboter also seinen letzten Punkt an, ist die letzte Zeile dunkel hinterlegt (siehe Bild).

    Vorab :

    Automatisierung ist ein vielfältiges Thema, auch abhängig davon, mit welchem GUI-Framework die Anwendung erstellt wurde.

    Bleiben wir aber vorerst bei Pixelsearch/PixelChecksum. An folgenden Dingen können/müssen wir uns orientieren :

    • Der Prozessablauf (Punkte der Liste abarbeiten, die der Roboter anfährt) gilt als beendet, wenn die letzte Zeile erreicht, also dunkel hinterlegt ist.
    • Es gibt keine weiteren (Status-)Anzeigen in dem GUI, welche auf das Ende des Prozessen hinweisen (z.B. dass der START-Button deaktiviert wird usw.
    • Unterschiedliche Prozesse können eine unterschiedliche Anzahl von Schritten (Punkten) abarbeiten. Das bedeutet, dass die Koordinaten der "letzten Zeile" die mittels Pixelsearch/PixelChecksum geprüft werden sollen, variabel sind (also irgendwo hinterlegt werden).
    • ich setze mal voraus, dass Bildschirmauflösung und Skalierung (100%, 125% ...) gleich bleiben.

    Jetzt müsste es im Grunde ausreichen, einen einzelnen Bildpunkt mit Pixelsearch zu prüfen. Dieser sollte aber am Rand der Zeile liegen, damit der Text nicht ins Spiel kommt !

    Zudem würde ich neben dem gesuchten Farbwert eine Varianz (Abweichung) angeben, da der Kontrast zwischen hellen und der dunklen Zeile ausreichend groß ist.

    Der Vorschlag von Moombas , das Ende des Prozesses mittels einer softwareeigenen API abzufragen wäre, falls dort vorgesehen, ein deutlich besserer Ansatz !

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Moombas & Musashi

    Vielen Dank für euren Input, ich muss mich mal in dieses API einlesen.

    Musashi das mit der Varianz werde ich direkt ausprobieren, danke dafür!

    Ist dieses "Problem" mit der Pixelsumme eigentlich ein bekanntes?

    Ich bin in der Laborautomation tätig und nutze AutoIt um zwischen verschiedenen Softwares eine Verbindung herzustellen. Dafür nutze ich wie gesagt eigentlich ständig die Pixelsumme (was manchmal klappt und manchmal nicht)

    Oder gilt die Pixelsumme als relativ sicher, wenn eine Varianz möglich ist?

  • Oder gilt die Pixelsumme als relativ sicher, wenn eine Varianz möglich ist?

    Bei PixelChecksum gibt es den Parameter für Varianz gar nicht, hierfür musst Du PixelSearch verwenden (schaue Dir mal die jeweiligen Beschreibungen in der Hilfe an).

    Du möchtest ja eigentlich nur wissen, ob ein Pixel an den von Dir vorgegebenen Koordinaten einen bestimmten Farbwert hat. Dafür würde sogar PixelGetColor ausreichen (ohne Varianz).

    Das Problem ist halt, dass äußere Umstände wie :

    - Bildschirmauflösung (Stichwort : PixelCoordMode) und Skalierung

    - Fenster ist teilminimiert

    - innerhalb der Software können verschiedene Farbschemata gewählt werden

    usw. die Pixel*-Funktionen beeinträchtigen können (nur eine vereinfachte/verkürzte Beschreibung).

    Vielen Dank für euren Input, ich muss mich mal in dieses API einlesen.

    Guter Plan ;).

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."