none
Timer und Threading -Problem RRS feed

  • Frage

  • Hallo,

    ich habe ein Threading Problem.
    Folgende Ausgangssituation:
    Mit Tasten am Keybord will ich einen Werkzeugkopf an einer Maschine steuern, welche ich via ihrer SPS ansteuere.
    Um während eines langen Tastendrücken die Maschine in gleichmässigen Zeitinterwallen zu informieren, dass sie weiterfahren soll, habe ich einen Timer eingebaut, der so lange läuft, wie die Taste gedrückt ist.
    Der Befehl an die SPS aus meiner timer_Elapsed -Methode kommt aber aus einen anderen Thread und kann so von der SPS nicht verarbeitet werden. Der Befehl muss aus dem selben Thread kommen.
    Darum habe ich einen Delegate eingebaut. Aber auch hier wird (für mich nicht verständlich) aus einem anderen Thread gesendet.

    Wie kann ich die Befehle (GsPlcControl.Jog()) aus dem selben Thread senden, wie von wo aus ich den Timer aufrufe? (aus den "Hauptthread")

    /// <summary>Startet eine Achsen-Bewegung.</summary>
    public GsPlcControl.STError Move(int objId, KIND_OF_MOVE kindOfMove, DIMENSION_3D dimension3D, DIRECTION direction)
    {
        if (!isJogRunning && !isKeyPressed)
        {
            GsPlcControl.STError error;
            this.objectId = (ushort)objId;
            GsPlcControl.JogModes jogMode = getJogMode(kindOfMove);
            jogSpeed = getJogSpeed(kindOfMove);
            uint jogInchDistance = getJogInchingDistance(kindOfMove);
            jogDirection = getJogDirection(dimension3D, direction);
    
            error = GsPlcControl.Jog(objectId, jogMode, jogDirection, jogSpeed, jogInchDistance);
            writeProtokoll("GsPlcControl.Jog(" + objectId + ", " + jogMode + ", " + jogDirection + ", " + jogSpeed + ", " + jogInchDistance + ");");
            if (jogMode == GsPlcControl.JogModes.Continuous)
            {
                timer.Elapsed += timer_Elapsed;
                isJogRunning = true;
            }
            isKeyPressed = true;
            return error;
        }
        return new GsPlcControl.STError();
    }
    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        handler(objectId, jogDirection, jogSpeed);
        //GsPlcControl.Jog(objectId, GsPlcControl.JogModes.Continuous, jogDirection, jogSpeed, 0);
        //writeProtokoll("GsPlcControl.Jog(" + objectId + ", Continuous, " + jogDirection + ", " + jogSpeed + ", 0);");
    }
    public delegate void Del(ushort objectId, GsPlcControl.JogDirections jogDirection, uint jogSpeed);
    public static void DelegateMethod(ushort objectId, GsPlcControl.JogDirections jogDirection, uint jogSpeed)
    {
        GsPlcControl.Jog(objectId, GsPlcControl.JogModes.Continuous, jogDirection,  jogSpeed, 0);
        writeProtokoll("GsPlcControl.Jog(" + objectId + ", Continuous, " + jogDirection + ", " + jogSpeed + ", 0);");
    }
    Del handler = DelegateMethod;


    www.energiewende-mach-ich-selbst.de

    Mittwoch, 26. August 2015 07:20

Antworten

Alle Antworten