Mittwoch, 15. März 2023

  Copyright ©  Dipl.-Ing. Johannes Hofer 2022                                           

 

Ki2Plc

Die Möglichkeiten einer Programmierung im TIA-Portal, um diese am Geschehen der künstlichen Intelligenz zu beteiligen



 

Pico-EVB als mini-plc Teil-1

Diesesmal ist das Video auf meinem YouTube-Kanal zuerst fertig geworden 😉
Nun einige Worte zum Python-Programm auf dem Pico-EVB. Im ersten Teil ist die Initialisierung zum Pico-EVB zu sehen und soll somit den Einstieg mit der dort angegbenen Version (OS)  zeigen (Zeile 37 - 50). Ich habe den Pico so auf die Adresse '192.168.1.200' initialisiert ( Zeile 42)



Jeder Pico-Programmierer weiß, daß hier die entsprechenden Angaben des Herstellers studiert werden müssen. Ich hatte damit keine Probleme. Also bitte die Version in Zeile 2 beachten.



Darüber im Listing einige Angaben zur Version und den verwendeten imports, Konstanten und die verwendeten Ports für einen möglichen Zylinder, welcher hier und auch im Video simuliert wird. Nun benötigen wir noch einige globale Variablen, welche wir in den Funktionen benutzen. Hier die Initialisierungen im folgenden Bild und in den Funktionen später mit dem Zusatz global wieder zu erkennen sind.


Interessant, wenn überhaupt, wird sicherlich das nächste Bild, welches das main() beschreibt und zunächst anzeigt, was da so passiert. Übrigens, einfach eine Nachricht senden (Kontakt-Formular) und ich sende das Programm main.py zum Thonny, dann muss das keiner abtippen.


Eigentlich ganz einfach, da nur wenige Zeilen notwendig sind das Programm zu starten. Der _thread startet die Funktion _matrix() (Zeile 289) und benötigt zur Verriegelung den lock, welcher zuvor deklariert wird (Zeile 288). Somit starteten die Funktioneen _matrix() und server_loop() fast gleichzeitig ,  wenn die Zeile 292 bearbeitet wird.

Betrachten wir im nächsten Bild zuerst den server_loop():


Was komliziert aussieht, ist oft sehr einfach. In Zeile 225 wird der Socket mit der Funktion init_socket_pc() initialisiert. Der soll als Mini-Server arbeitet und wird später erklärt. Wenn das erfolgreich war, gehts in Zeile 226 mit einer weiteren while-Anweisung weiter. Nun erwartet der Socket einen Client in Zeile 230, welcher Requests an den Server senden soll. Hier ist es ein PC mit dem Programm KI2Plc, wei im Video gezeigt wird. Sollte das der Fall sein, wird der Request ausgewertet. In Zeile 233 erkennt der Server, dass eine neue Matrix gesendet wurde und ruft set_matrix(datas) auf, damit die neue Matrix gestartet werden kann.

Ansonsten kann der Request 4000 in Zeile 241 erkannt werden oder der Request 4002 in Zeile 244. Der erste sendet die Informationen der Pins für den Input-Layer (Zeile 242) mit rem_socket.send(set_neuron_ipl_str(set_neuron_ipl())) und der zweite den Status vom Input-Layer (Zeile 245) mit rem_socket.send(get_status_str()). Andernfalls wird in Zeile 247 gemeckert, was eigentlich nicht sein darf 😀

Sollte in der normalen Kommunikation was schieflaufen, werden durch die Exceptions die innere Schleife abgebrochen (Zeile 256) und die äussere Schleife neu gestartet (Zeilen 261-264) in der Hoffnung dass nach dem Schliessen des Sockets in Zeile 262 mit my_socket.close() alles wieder in die Reihe kommt.

Nun, wie es weiter geht, folgt im nächsten Beitrag diesmal sehr zügig 🙋