TIA Tic-Tak-Toe Spiel mit S7?

Mareis

Level-2
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.

ich hoffe, es ist in Ordnung, wenn ich mich hier direkt an euch wende.
Das ist mein erster Beitrag in diesem Forum und ich könnte eure Hilfe wirklich gut gebrauchen.

Im Rahmen meiner Techniker-Ausbildung habe ich ein sehr interessantes Projekt bekommen,
das mich vor eine ziemliche Herausforderung stellt. Für eine Azubi-Messe soll ich ein Tic-Tac-Toe Spiel realisieren, bei dem die Besucher gegen einen Fanuc_Roboter (LR Mate 200ID,7L) antreten können. Kommunikation zwischen Besucher und Roboter (Spielfeld) wird über ein Panel PC
(z. B Spectra) ermöglicht. Das Spiel soll in 3 Schwierigkeitsstufen laufen.

Ich habe schon einiges recherchiert und bin auf den Min-Max-Max- Algorithmus gestoßen der sich wohl gut für die Spiellogik eignet. Allerdings bin ich mir unsicher ob dieser Algorithmus in SCL auf einer S7_SPS umsetzen lässt. Ich habe auch überlegt die Logik mit C# Programmieren, aber dann
wird kostenpflichtige DLL Bibliothek benötigt um Fanuc Robi zu steuern. (was die Projektkosten deutlich erhöhen lässt).

Da es mein erstes größeres -Projekt ist, würde ich mich sehr über jeden Tipp oder Ratschlag freuen,
wie ich dieses Tic-Tac-Toe- Projekt am besten mit SCL umsetzen kann. Vielleicht hat ja jemand von euch schon Erfahrung mit ähnlichen Projekten. und könnte mir ein paar Hinweise geben, wie ich das Ganze angehen sollte.

Vielen Dank schon mal für eure Hilfe, ich bin für jeden Rat wirklich sehr dankbar!

Viele Grüße
Mareis
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dankeschön Dominik für schnelle Antwort,

also heißt es dass es möglich ist ist mit SCL?
Mein Lehrer meinte es sei ziemlich schwierig
so etwas mit SPS zu realisieren...
Hast du so etwas schon ausprobiert?

Viele Grüße
Mareis
 
Hallo Mareis,

Um ehrlich zu sein war es eine sarkastisch Antwort auf deinen Beitrag. Da du keine Hinweise auf die verwendete SPS Hardware oder gar genutzte Software für die Projektierung der SPS angibst.

Ebenfalls hast du bisher nur eine grobe Idee in der Raum geworfen, was du möchtest. Du hast aber nicht präsentiert was du bisher schon umgesetzt hast oder probiert hast umzusetzen.

Um die Frage nun konkret zu beantworten, nein ich habe mich bisher mit dem Thema nicht beschäftigt.

Man möge mir dies bitte verzeihen. Die berühmt berüchtigte Glaskugel wurde leider einfach noch nicht gefunden.
 
Hallo Dominik,

da hast du mich erwischt – 1:0 für dich (y)Tija mit Microwin und 200er :ROFLMAO:...

Nun die Hardware für mein Projekt steht noch nicht fest, aber ich werde mit TIA Portal V15 arbeiten. Ich bin relativ neu im Bereich der Automatisierungstechnik und habe bisher in der Schule an einem Förderbandmodell programmiert sowie in der Informatik mit C#.

Momentan stehe ich vor der Entscheidung, ob ich das Tic-Tac-Toe-Spiel mit SCL in TIA umsetzen soll oder doch lieber auf C# setze. Allerdings kommen bei der C#-Variante zusätzliche Kosten auf mich zu, da ich eine kostenpflichtige DLL-Bibliothek für die Ansteuerung des Fanuc-Roboters benötige. Außerdem bevorzugt mein Vorgesetzter, dass das Projekt möglichst komplett mit SPS umgesetzt wird.

Deshalb suche ich hier im Forum nach Rat, um zumindest ein Gefühl dafür zu bekommen, ob dieses Projekt mit einer S7-1200 oder S7-1500 realisierbar ist, ohne dass der Aufwand übermäßig groß wird.

Ich würde mich sehr über eure Einschätzungen oder Erfahrungen freuen, da ich den besten Weg finden möchte, das Projekt erfolgreich umzusetzen.

Viele Grüße,
Mareis
 
Zuviel Werbung?
-> Hier kostenlos registrieren
soll ich ein Tic-Tac-Toe Spiel realisieren, bei dem die Besucher gegen einen Fanuc_Roboter (LR Mate 200ID,7L) antreten können. Kommunikation zwischen Besucher und Roboter (Spielfeld) wird über ein Panel PC
Warum soll da noch zusätzlich eine S7 SPS verwendet werden, wo doch der Besucher "gegen den Roboter" spielen soll?
Das Spiel könnte auch komplett auf dem Panel PC programmiert werden.
Welche Rolle soll der eigentlich unnötige Roboter bei dem Spiel spielen?
 
Warum soll da noch zusätzlich eine S7 SPS verwendet werden, wo doch der Besucher "gegen den Roboter" spielen soll?
Das Spiel könnte auch komplett auf dem Panel PC programmiert werden.
Welche Rolle soll der eigentlich unnötige Roboter bei dem Spiel spielen?
Hallo PN/DP,
danke für den Hinweis! Ja, natürlich könnte das Spiel komplett auf dem Computer ablaufen.

Allerdings ist der Roboter für diesen Projekt ein zentraler Punkt, um potenzielle Azubis anzulocken. In unseren Anlagen arbeiten sowohl SPS als auch Roboter zusammen, deshalb wird gewünscht (denke ich) dass das Spiel mit SPS realisiert wird. Diese Aufbau mit Robi wird später für interne Ausbildungszwecke genutzt.

Viele Grüße,
Mareis
 
Hallo Mareis,

scheibe dir die Aufgabenstellung noch einmal genau auf und notiere die Punkte, die noch unklar sind.
Dann überlege dir, in welche logischen Teilaufgaben du dieses Projekt zerlegen kannst.
Ich wäre sehr überrascht, wenn man Tic-Tac-Toe nur mit einer kostenpflichtigen Bibliothek lösen könnte… ;-)

LG
Cassandra
 
Zuletzt bearbeitet:
Es heißt Minmax-Algorithmus. Sorry, ein Tippfehler..
Schon wieder Tippfehler. Ich hoffe, beim Programmieren bist du mehr konzentriert...
Beachte: der Minimax-Algorithmus ist ein rekursiver Algorithmus. Echte Rekursion ist mit S7 normal nicht direkt realisierbar, wegen der begrenzten Schachtelungstiefe von Baustein-Aufrufen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich werde mit TIA Portal V15
Wenn jetzt noch 2017 und nicht 2024 wäre könntest du sogar noch Hardware dafür beziehen und Siemens hätte auch noch nicht V15 abgekündigt und durch V15.1 ersetzt.

Ich hoffe mal der Roboter ist nicht so alt wie dein Tia Portal, sonst lockst du höchstens damit Ebay Powerseller.

Es gibt auch 1500er Steuerungen welche Hochsprachen anwenden können, in wie weit du damit Algorithmen umsetzen kannst, müsstest du recherchieren
 
Ich habe für Zukunftstag auf Testboard mit Touch-Panel (kein Siemens, Easy4 von Eaton) ein "Schere-Stein-Papier" gemacht.
Tic-Tac-Toe Spiel ist genauso einfach, kann man Logik in SCL schreiben, als Beispiel kannst du diese Seite gucken.
 
ChatGPT:

Code:
FUNCTION_BLOCK FB_TicTacToe
    VAR
        board : ARRAY[1..9] OF CHAR := ' ';
        player : CHAR := 'X';
        robot : CHAR := 'O';
        gameWon : BOOL := FALSE;
    END_VAR

    VAR_TEMP
        bestMove : INT;
        move : INT;
        score : INT;
    END_VAR

    VAR_OUTPUT
        robotMove : INT;  // Ausgabe an den Roboter, um die Bewegung zu steuern
        gameOver : BOOL;
    END_VAR

    // Funktion zur Überprüfung eines Gewinns
    FUNCTION CheckWin : BOOL
        VAR
            i : INT;
        END_VAR
    BEGIN
        // Überprüfen der Gewinnbedingungen
        IF ((board[1] = board[2]) AND (board[2] = board[3]) AND (board[1] <> ' ')) OR
           ((board[4] = board[5]) AND (board[5] = board[6]) AND (board[4] <> ' ')) OR
           ((board[7] = board[8]) AND (board[8] = board[9]) AND (board[7] <> ' ')) OR
           ((board[1] = board[4]) AND (board[4] = board[7]) AND (board[1] <> ' ')) OR
           ((board[2] = board[5]) AND (board[5] = board[8]) AND (board[2] <> ' ')) OR
           ((board[3] = board[6]) AND (board[6] = board[9]) AND (board[3] <> ' ')) OR
           ((board[1] = board[5]) AND (board[5] = board[9]) AND (board[1] <> ' ')) OR
           ((board[3] = board[5]) AND (board[5] = board[7]) AND (board[3] <> ' '))
        THEN
            CheckWin := TRUE;
        ELSE
            CheckWin := FALSE;
        END_IF;
    END_FUNCTION

    // Funktion zur Überprüfung, ob das Spielfeld voll ist
    FUNCTION IsBoardFull : BOOL
        VAR
            i : INT;
        END_VAR
    BEGIN
        IsBoardFull := TRUE;
        FOR i := 1 TO 9 DO
            IF board[i] = ' ' THEN
                IsBoardFull := FALSE;
                EXIT;
            END_IF;
        END_FOR;
    END_FUNCTION

    // Minimax-Algorithmus in SCL
    FUNCTION Minimax : INT
        VAR_INPUT
            isMaximizing : BOOL;
        END_VAR
        VAR
            i : INT;
            bestScore : INT;
            currentScore : INT;
        END_VAR
    BEGIN
        // Überprüfen auf Gewinn oder volles Spielfeld
        IF CheckWin() THEN
            IF isMaximizing THEN
                Minimax := -1;
            ELSE
                Minimax := 1;
            END_IF;
            RETURN;
        END_IF;

        IF IsBoardFull() THEN
            Minimax := 0;
            RETURN;
        END_IF;

        // Maximierung des Scores für den Roboter
        IF isMaximizing THEN
            bestScore := -9999;
            FOR i := 1 TO 9 DO
                IF board[i] = ' ' THEN
                    board[i] := robot;
                    currentScore := Minimax(FALSE);
                    board[i] := ' ';
                    IF currentScore > bestScore THEN
                        bestScore := currentScore;
                    END_IF;
                END_IF;
            END_FOR;
            Minimax := bestScore;
        ELSE
            bestScore := 9999;
            FOR i := 1 TO 9 DO
                IF board[i] = ' ' THEN
                    board[i] := player;
                    currentScore := Minimax(TRUE);
                    board[i] := ' ';
                    IF currentScore < bestScore THEN
                        bestScore := currentScore;
                    END_IF;
                END_IF;
            END_FOR;
            Minimax := bestScore;
        END_IF;
    END_FUNCTION

    // Hauptlogik des Tic-Tac-Toe-Spiels
    BEGIN
        // Roboter macht seinen Zug
        IF player = robot THEN
            bestMove := -1;
            bestScore := -9999;

            FOR move := 1 TO 9 DO
                IF board[move] = ' ' THEN
                    board[move] := robot;
                    score := Minimax(FALSE);
                    board[move] := ' ';
                    IF score > bestScore THEN
                        bestScore := score;
                        bestMove := move;
                    END_IF;
                END_IF;
            END_FOR;

            IF bestMove <> -1 THEN
                board[bestMove] := robot;
                robotMove := bestMove;
                player := 'X';  // Nächster Zug des menschlichen Spielers
            END_IF;
        END_IF;

        // Überprüfen, ob das Spiel gewonnen ist oder das Spielfeld voll ist
        gameWon := CheckWin();
        IF gameWon OR IsBoardFull() THEN
            gameOver := TRUE;
        ELSE
            gameOver := FALSE;
        END_IF;
    END_FUNCTION_BLOCK


Erklärung der SCL-Implementierung:​

  • TicTacToe-Funktionsblock (FB_TicTacToe): Dieser Funktionsblock enthält die gesamte Spielmechanik, einschließlich des Minimax-Algorithmus, der Logik zur Überprüfung von Gewinnbedingungen und der Steuerung des Roboters.
  • CheckWin: Diese Funktion überprüft, ob eine Gewinnbedingung erfüllt ist.
  • IsBoardFull: Diese Funktion prüft, ob das Spielfeld vollständig besetzt ist, was ein Unentschieden bedeutet.
  • Minimax: Der Minimax-Algorithmus wird rekursiv implementiert, um den optimalen Zug für den Roboter zu finden. isMaximizing steuert, ob der Roboter (Maximierer) oder der Spieler (Minimierer) am Zug ist.
  • robotMove: Dieses Ausgangssignal sendet die Position, auf die der Roboter sein "O" setzen soll.
  • gameOver: Ein Boolesches Ausgangssignal, das anzeigt, ob das Spiel beendet ist.

Implementierungshinweise:​

  1. Robotersteuerung: Der robotMove-Wert kann verwendet werden, um den Roboter über die entsprechenden Ausgänge der SPS zu steuern. Diese Ausgabe könnte verwendet werden, um den Roboter zu einer bestimmten Position zu bewegen und ein "O" zu platzieren.
  2. Menschliche Eingabe: Die menschliche Eingabe sollte in einem separaten Funktionsblock verarbeitet werden, der den Wert in das board-Array einträgt und den Spielerwechsel (player := robot) vornimmt.
  3. Schnittstelle: Ein HMI oder eine andere Eingabemöglichkeit könnte verwendet werden, um die menschlichen Züge auf die SPS zu übertragen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schon wieder Tippfehler. Ich hoffe, beim Programmieren bist du mehr konzentriert...
Beachte: der Minimax-Algorithmus ist ein rekursiver Algorithmus. Echte Rekursion ist mit S7 normal nicht direkt realisierbar, wegen der begrenzten Schachtelungstiefe von Baustein-Aufrufen.
Vielen Dank PN/DP für deine Hinweise! Auch wenn es mein Problem nicht direkt löst, Ich werde das bei meiner weiteren Planung im Hinterkopf behalten.
 
Wenn jetzt noch 2017 und nicht 2024 wäre könntest du sogar noch Hardware dafür beziehen und Siemens hätte auch noch nicht V15 abgekündigt und durch V15.1 ersetzt.

Ich hoffe mal der Roboter ist nicht so alt wie dein Tia Portal, sonst lockst du höchstens damit Ebay Powerseller.

Es gibt auch 1500er Steuerungen welche Hochsprachen anwenden können, in wie weit du damit Algorithmen umsetzen kannst, müsstest du recherchieren
 
Vielen Dank PN/DP für deine Hinweise! Auch wenn es mein Problem nicht direkt löst, Ich werde das bei meiner weiteren Planung im Hinterkopf behalten.
Wenn man korrekt geschriebene Fachwörter benutzt, dann findet man viel besser Lösungen. Wenn man erst eine KI braucht, die enträtseln soll, was der Frage-Schreiber vielleicht meinen könnte, dann braucht man Zeit, und unter Umständen werden Lösungen nicht gefunden ...
 
ChatGPT:

Code:
FUNCTION_BLOCK FB_TicTacToe
    VAR
        board : ARRAY[1..9] OF CHAR := ' ';
        player : CHAR := 'X';
        robot : CHAR := 'O';
        gameWon : BOOL := FALSE;
    END_VAR

    VAR_TEMP
        bestMove : INT;
        move : INT;
        score : INT;
    END_VAR

    VAR_OUTPUT
        robotMove : INT;  // Ausgabe an den Roboter, um die Bewegung zu steuern
        gameOver : BOOL;
    END_VAR

    // Funktion zur Überprüfung eines Gewinns
    FUNCTION CheckWin : BOOL
        VAR
            i : INT;
        END_VAR
    BEGIN
        // Überprüfen der Gewinnbedingungen
        IF ((board[1] = board[2]) AND (board[2] = board[3]) AND (board[1] <> ' ')) OR
           ((board[4] = board[5]) AND (board[5] = board[6]) AND (board[4] <> ' ')) OR
           ((board[7] = board[8]) AND (board[8] = board[9]) AND (board[7] <> ' ')) OR
           ((board[1] = board[4]) AND (board[4] = board[7]) AND (board[1] <> ' ')) OR
           ((board[2] = board[5]) AND (board[5] = board[8]) AND (board[2] <> ' ')) OR
           ((board[3] = board[6]) AND (board[6] = board[9]) AND (board[3] <> ' ')) OR
           ((board[1] = board[5]) AND (board[5] = board[9]) AND (board[1] <> ' ')) OR
           ((board[3] = board[5]) AND (board[5] = board[7]) AND (board[3] <> ' '))
        THEN
            CheckWin := TRUE;
        ELSE
            CheckWin := FALSE;
        END_IF;
    END_FUNCTION

    // Funktion zur Überprüfung, ob das Spielfeld voll ist
    FUNCTION IsBoardFull : BOOL
        VAR
            i : INT;
        END_VAR
    BEGIN
        IsBoardFull := TRUE;
        FOR i := 1 TO 9 DO
            IF board[i] = ' ' THEN
                IsBoardFull := FALSE;
                EXIT;
            END_IF;
        END_FOR;
    END_FUNCTION

    // Minimax-Algorithmus in SCL
    FUNCTION Minimax : INT
        VAR_INPUT
            isMaximizing : BOOL;
        END_VAR
        VAR
            i : INT;
            bestScore : INT;
            currentScore : INT;
        END_VAR
    BEGIN
        // Überprüfen auf Gewinn oder volles Spielfeld
        IF CheckWin() THEN
            IF isMaximizing THEN
                Minimax := -1;
            ELSE
                Minimax := 1;
            END_IF;
            RETURN;
        END_IF;

        IF IsBoardFull() THEN
            Minimax := 0;
            RETURN;
        END_IF;

        // Maximierung des Scores für den Roboter
        IF isMaximizing THEN
            bestScore := -9999;
            FOR i := 1 TO 9 DO
                IF board[i] = ' ' THEN
                    board[i] := robot;
                    currentScore := Minimax(FALSE);
                    board[i] := ' ';
                    IF currentScore > bestScore THEN
                        bestScore := currentScore;
                    END_IF;
                END_IF;
            END_FOR;
            Minimax := bestScore;
        ELSE
            bestScore := 9999;
            FOR i := 1 TO 9 DO
                IF board[i] = ' ' THEN
                    board[i] := player;
                    currentScore := Minimax(TRUE);
                    board[i] := ' ';
                    IF currentScore < bestScore THEN
                        bestScore := currentScore;
                    END_IF;
                END_IF;
            END_FOR;
            Minimax := bestScore;
        END_IF;
    END_FUNCTION

    // Hauptlogik des Tic-Tac-Toe-Spiels
    BEGIN
        // Roboter macht seinen Zug
        IF player = robot THEN
            bestMove := -1;
            bestScore := -9999;

            FOR move := 1 TO 9 DO
                IF board[move] = ' ' THEN
                    board[move] := robot;
                    score := Minimax(FALSE);
                    board[move] := ' ';
                    IF score > bestScore THEN
                        bestScore := score;
                        bestMove := move;
                    END_IF;
                END_IF;
            END_FOR;

            IF bestMove <> -1 THEN
                board[bestMove] := robot;
                robotMove := bestMove;
                player := 'X';  // Nächster Zug des menschlichen Spielers
            END_IF;
        END_IF;

        // Überprüfen, ob das Spiel gewonnen ist oder das Spielfeld voll ist
        gameWon := CheckWin();
        IF gameWon OR IsBoardFull() THEN
            gameOver := TRUE;
        ELSE
            gameOver := FALSE;
        END_IF;
    END_FUNCTION_BLOCK


Erklärung der SCL-Implementierung:​

  • TicTacToe-Funktionsblock (FB_TicTacToe): Dieser Funktionsblock enthält die gesamte Spielmechanik, einschließlich des Minimax-Algorithmus, der Logik zur Überprüfung von Gewinnbedingungen und der Steuerung des Roboters.
  • CheckWin: Diese Funktion überprüft, ob eine Gewinnbedingung erfüllt ist.
  • IsBoardFull: Diese Funktion prüft, ob das Spielfeld vollständig besetzt ist, was ein Unentschieden bedeutet.
  • Minimax: Der Minimax-Algorithmus wird rekursiv implementiert, um den optimalen Zug für den Roboter zu finden. isMaximizing steuert, ob der Roboter (Maximierer) oder der Spieler (Minimierer) am Zug ist.
  • robotMove: Dieses Ausgangssignal sendet die Position, auf die der Roboter sein "O" setzen soll.
  • gameOver: Ein Boolesches Ausgangssignal, das anzeigt, ob das Spiel beendet ist.

Implementierungshinweise:​

  1. Robotersteuerung: Der robotMove-Wert kann verwendet werden, um den Roboter über die entsprechenden Ausgänge der SPS zu steuern. Diese Ausgabe könnte verwendet werden, um den Roboter zu einer bestimmten Position zu bewegen und ein "O" zu platzieren.
  2. Menschliche Eingabe: Die menschliche Eingabe sollte in einem separaten Funktionsblock verarbeitet werden, der den Wert in das board-Array einträgt und den Spielerwechsel (player := robot) vornimmt.
  3. Schnittstelle: Ein HMI oder eine andere Eingabemöglichkeit könnte verwendet werden, um die menschlichen Züge auf die SPS zu übertragen.
herzlichen Dank für deine Hilfe SPS newbie91! :).
 
Zurück
Oben