Dienstag, 21. 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



Simatic S7-1200 und Snap7 - Teil 1

Die uns bereits bekannte Kommunikation mit den Bausteinen TRCV_C und TSENDE_C aus dem TIA-Portal (Open user communication) habe ich zur allgemeinen Information im Projekt belassen, nutze diese hier aber nicht mehr

Wir verwenden jetzt python-snap7 um die Kommunikation nun unabhängig der angebotenen Bausteine aus der Open user communication umzusetzen und schaffen so eine kleine Grundlage für ein mögliches Ziel 😁

IEC-61131-3-Python oder Plc-Python zu schaffen

Bevor wir uns damit in der Zukunft beschäftigen können, müssen wir die Grundlage erarbeiten, diese Aufgabe richtig zu verstehen. Erst dann ist eine Lösung bzw. mehrere Teil-Lösungen machbar.




Wir benötigen python-snap7, wie im Link gezeigt und können nun gezielt in einem DB Informationen ablegen, welche in SCL direkt übersetzt werden und eine quasi hardcodierte Lösung anbietet.

Darüber muss man unbedingt nachdenken, denn jetzt kann eine quasi Hardcodierung aufgrund der Daten aus KI2Plc erfolgen, welche bei jedem Training eine neue Datei und somit einen neuen Ablauf ermöglicht.

Ich kannte snap7 noch aus meiner C/C++-Tätigkeit und freue mich sehr über diese neue integrierte Lösung in python-snap7, welche ausserordentlich gut funktioniert, wenn man diese richtig anwendet und dazu die Dinge in der SPS folgerichtig versteht 😎.


Der neue Baustein Cylinder_FB (Main[OB1]) beinhaltet nun alle Dinge welche notwendig sind unsere Matrix aus KI2Plc umzusetzen. Also IPL lesen, Matrix interpretieren und OPL setzen. Sozusagen wie ein Rezept in einem Kochbuch - all in one 😀

Diese Lösung funktioniert, wie im noch ausstehendem Video zu sehen und soll keine komplette Lösung darstellen, sondern den neuen Weg erklären. Schritt für Schritt kommen wir so dem grossen Ziel näher.


Zunächst werden wir einen kleinen Check vornehmen und die gelieferten Daten überprüfen und dann den Input-Layer (IPL) lesen. Danach überprüfen wir die Grundposition und schliesslich den Rest aus der Matrix mit error, no action und action. So entsteht der Ausgangs-Layer (OPL).

Wir verwenden dazu den uns bereits bekannten DB SendReceiveData und davon den Receive-Abschnitt. Dort schreibt unser python-snap7 die Daten der Matrix hin.



In Zeile 3 und 4 sehen wir z. B. die Anzahl der Bytes (84) welche die Matrix umfasst. Dann folgen die Matrix-Daten, welche nun hardcodiert übersetzt werden können. 

Das heisst: Die Indizes, wie beim Check zu sehen (Bild unten), werden jeweils speziell in einem DB abgelegt. Hier nicht, hier habe ich diese zur Vereinfachung der Erklärung in den DB unter Constant abgetippt - damit keine Mißverständnissse entstehen -. 

So lässt sich das am einfachsten erklären.


Eine Datenprüfung im Sinne einer Checksum ist das nicht und soll es auch nicht sein. Wir sind damit zufrieden und gehen davon aus, wenn Zeile 15 erreicht wird, dass wir im Baustein weiter verfahren können um den IPL einzulesen.


Auch hier kommen wir mit einer einfachen Auswertung zurecht und haben nun einen Wert in #ipl, welcher uns zum Vergleich in der Matrix dient. Wichtig ist, dass die Reihenfolge der Daten der Reihenfolge in KI2Plc entspricht. Also wie hier ist der erste Eingang der V1 für Zyl.-Vor-Zur.
Beginnen wir im nächsten Teil mit der Grundposition  🙋













 

Montag, 20. 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-3

Nun zur Matrix selbst. Ich denke dass auf einem Pico kein Programm im Sinne einer SPS zur Anwendung kommt. Projekte mit geringem Umfang sind sicherlich interessant und auch umsetzbar. Ich habe hier nun von der Matrix die action, no_action und den error aus der Matrix von KI2Plc verarbeitet. Die Grundposition fehlt hier im Beispielund macht wohl wenig Sinn, da der Zylinder ohnehin nur simuliert wird.


Hier wird _matrix() vom _thread aufgerufen und sollte ohne Unterbrechung über while True laufen. Diese Funktion ruft __matrix auf, wenn run eingeschaltet ist (True). Dazu wird auch die LED.on() verwendet, damit wir auch etwas sehen können. Der Ausgang V1_Od wird ebenfalls auf True gesetzt. Ist run False oder die Funktion __matrix() liefert False, dann schalten wir die LED ab und setzen den Ausgang zurück.



In der Funktion __matrix() erfolgt die Auswertung der Liste matrix_lst mit der Reihenfolge error (Zeile 135), no action (Zeile 140) und action (Zeile 144). 

Wie auch immer ist hier diese Funktion nur dann anwendbar, wenn die Daten aus KI2Plc vorhanden sind. Der status wird ja in Zeile 130 gelesen und mit den Werten aus der Liste verglichen. Fehlt also diese Liste, gibt es keine gültige Auswertung. Da wir hier im Pico lediglich ein Beispiel erklären, fehlt die Speicherung der Daten im Pico. Das wäre ohne Probleme möglich, müsste aber dann auch wieder gelesen werden. Dieser Aufwand ist nicht lohnenswert, da ohnehin keiner den Pico als Zylindersteuerung verwendet 😀

Im nächsten Bild sei noch einmal der Python-Abschnitt gezeigt, welcher in KI2Plc verwendet wird. Hier ist auch die Grundstellung berücksichtigt (Zeile 300).


Im nächsten Teil werde ich die Anwendung des Zylinders in einer Simatic S7-1200 mit Python und Snap7 zeigen 🙋














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-2

Nachdem der Loop läuft, benötigen wir einen Client und das erfolgt normalerweise mit dem ersten Kontakt über den Request 4000. In Zeile 241 im Teil-1 ersichtlich, wird die Funktion rem_socket.send(set_neuron_ipl_str(set_neuron_ipl())) aufgerufen, welche nun die Daten zum Client sendet. Das Programm KI2Plc benötigt eigentlich nur die Anzahl der Eingangsparameter und dessen Typ, also digital oder analog. Hier werden die Daten aus der Funktion set_neuron_ipl() zusammengesetzt, welche danach von set_neuron_ipl_str() als String zum Versenden zusammengesetzt wird.  


Hier wird ein Set (Array) mit jeweils einem Tupel bestehend aus den Daten des digitalen Eingang zusammengesetzt. Insgesamt sind das hier die drei digitalen Eingänge. Die Informationen sind jeweils mit einem Schlüssel (Key) und den Daten dazu beschrieben, welche KI2Plc auswertet. Was da so wichtig ist, ist nicht so exakt festgelegt. KI2Plc benötigt mindestens den Typ (Zeile 191) und die Quelle des Gerätes (Zeile 192). Der Rest ist zum Debuggen und zur Datenerhaltung wichtig, aber nicht zur Programmierung der Matrix. Dazu mehr Information, wenn die KI2Plc veröffentlicht wird.



In der Funktion set_neuron_ipl_str() wird diese Information als String zusammengesetzt und an die KI2Plc gesendet.

Der Request für die neue Matrix ist im Teil-1 in Zeile 233 ersichtlich. Dieser wird von der Funktion set_matrix(datas) umgesetzt. Die Daten werden als Dictionary von KI2Plc gesendet und müssen nun als Matrix-Daten aufgelöst werden. 


Wichtig dabei ist, dass dir globale Variable run auf 0 gesetzt wird, damit die Matrix im anderen _thread nicht mehr bearbeitet wird. Ansonsten ensteht eine Liste (Array), welche nur die Werte und nicht mehr den Schlüssel beinhaltet. Danach kann mit run = 1 die Bearbeitung wieder freigegeben werden. Funktioniert so wunderbar 👍

Der Request 4002 soll nun immer den aktuellen Zustand des Eingangs-Layer senden, welcher allerdings derzeit nur für die Anzeige zur Erklärung im Vidio dient. Dazu sind die Funktionen get_status() und get_status_str() zuständig. Wobei hier das return in Zeile 90 den Status aus der Funktion cylinder_simulation() erfolgt.


Diese ist nun für einen künstlichen Ablauf zuständig. Hier wird etappenweise ein Zustand ausgegeben, welcher einen fahrenden Cylinder simuliert. In Micropython gibt es noch keinen match, deswegen die Auflösung mit einem If-Grab 😀


Diese Zustände haben wir im Video gesehen. Und nun fehlt noch der dritte Teil zur Matrix selbst, der in Kürze folgt. 🙋










  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 🙋




















Sonntag, 5. 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

 

Neuronen und Synapsen für die KI-PLC

Was wir hier sehen, ist eine völlig andere Betrachtung der KI-PLC. Dieses mal nicht nur für das TIA-Portal, sondern auch für Geräte mit der Option, diese in Python als SPS zu betreiben.




In einem praktischen Modell-Versuch, wie im Bild dargestellt, werden Daten von einer SPS über den Pico-EVB an einen PC gesendet. Selbstverständlich geht das auch im dargestellten Netz direkt zum PC, ohne den Pico.

Der Vorteil die Daten über den Pico zu senden, besteht u. a. darin, dass diese Option auch nach der Inbetriebnahme zur weiteren Datenübertragung bestehen bleiben kann.
 

Was passiert hier?

Der SPS-Programmierer sorgt für die Daten zur Inbetriebnahme eines FB‘s und sendet diese an die KI2Plc. Das ist der sogenannte Input-Layer (IPL), welcher dann in eine Matrix mit künstlichen Neuronen und Synapsen übernommen werden. Eine Inbetriebnahme des FBs erfolgt danach in der KI2PLC-Software mittels Deep-Learning und dessen Training. Diese sendet dann das Ergebnis in Form einer Matrix an die SPS und kann nun dort im FB mittels einer Standard-Prozedur angewendet werden.

Geräte (SPS / IOT) mit integriertem Python-Interpreter erhalten eine Matrix in Python geschrieben, welche speziell aus dem Training als Datei.py abgeleitet wird.


Aufgabenstellung

Die Daten von der SPS oder Pico, werden im Eingangslayer aufgenommen und über Synapsen für das Deep-Learning zur Verfügung gestellt. Hier können die Synapsen mit zusätzlichen Eigenschaften versehen werden. Danach erfolgt die Übergabe in den Eingangslayer. 

Das Training sorgt nun dafür, dass die Hiddenlayer bearbeitet werden und diese dann am Ausgangslayer zur weiteren Bearbeitung zur Verfügung stehen. Diesen Vorgang schauen wir uns im folgen Video (ohne Ton) an:


Ergebnis

Ein Ergebnis aus einem Training, ist ein Ausgangslayer, welcher für die SPS als Daten oder ein Python-File zur weiteren Bearbeitung zur Verfügung steht. Insgesamt wurden bei diesem Durchlauf 920 Aufnahmen gemacht (Bild unten) und in den Layern ausgewertet. Daraus entsteht nun eine Matrix, welche hier den Zylinder interpretiert. Vergleichbar mit den Aufnahmen von Katzen, um diese von z. B. Hunden zu differenzieren.



Das funktioniert wunderbar auch für PLCs, nur mit anderen Gewichtungsmethoden für das Training, wie es üblicherweise für Erkennung von Katzen dokumentiert wird.

Natürlich werden mehrere Layers mit künstlichen Neuronen benötigt, wie hier im Video gezeigt wird. Das Video soll uns also nur einen möglichen Weg darstellen und die Fantasie anregen einmal darüber nachzudenken. 

Wie nun so eine Umsetzung der Matrix in der SPS oder in einem Pico praktisch aussieht, zeige ich bei meinem nächsten Blog-Beitrag 🙋


https://youtu.be/uzpAZC_Ag_4



Mein KI-Berater:



Freitag, 27. Januar 2023

 Copyright ©  Dipl.-Ing. Johannes Hofer 2022                                           

Die KI-SPS

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

Das Board W5100S-EVB-Pico und das

TIA-Portal V16



Einleitung

Ich habe mir das o.g. Board bei WIZnetGermany GmbH besorgt und war gespannt, wie das mit dem TIA-Portal V16 so funktioniert. Gespannt deswegen, da ich schon einen Versuch mit dem Pico und den Aufsatz ETH-CH9121 (Wiz) als Ethernet-Schnittstelle hinter mir habe. Hat gut funktioniert, allerdings natürlich nur mit einem Kanal (Socket). Der EVB-Pico soll ja bis zu 4 Sockets bedienen können.

Zunächst war der Einstieg mit den Vorgaben des Herstellers bzw. des Lieferanten sehr einfach und hat auf Anhieb mit zwei Sockets funktioniert😉 

Diese Anwendung wurde in "MicroPython" auf Thonny umgesetzt. Einige Links und Hinweise auf die Verwendung der hier gezeigten Software, weiter unten. Danke an die Authoren, welche durchaus ein Basiswissen vermitteln,  mit dem Board und deren angebotenen Software den Einstieg zu finden.

Die Grundlage dazu (ohne Fehlerbehandlung, wie z. B. Stecker ziehen usw.) möchte ich hier vorstellen und als Begleitmaterial zu meinem YouTube-Block "Tial-Expert Hofer" betrachten. 

Hier die wichtigsten Links zum Board:

Firmware rp2 welche bei mir funktioniert:
Ich verwende aktuell die Firmeware-Version  rp2_w5100s_20220421_v1.0.5.uf2

Nun zum Board und dessen Aufgabe im Verbund KI-SPS.

Aufgabenstellung

Das Board wird als Kommunikation zwischen einer S7-1200 und meinem PC (Windows 10) die aktuellen Daten von der SPS an das Programm KI2Plc leiten. Dort erfolgt über die Matrix PLM1  das Training für den Lernmechanismus, welcher nach einem abgeschlossenen Test als Interpreter-Datei wieder an die S7-1200 zurück gesendet wird. 

Die SPS hat also kein traditionelles Steuerungs-Programm mehr, sondern einen Interpreter, welche das Gelernte als Steuerungsprogramm umsetzt .

Es gibt somit einen deutlichen Unterschied zur traditionellen Programmierung einer SPS, welche ja die üblichen Sprachen aus der IEC 61131... für ein Programm benutzt. Hier besteht das SPS-Programm nur aus der Erfassung für die Ein- und Ausgangsdaten und einen Interpreter zur Programmsteuerung.

Dieser Abschnitt beschreibt vorerst den praktischen Einsatz an einer S7-1200 mit dem TIA-Portal V16. Da der Pico in MicroPython programmiert wird, könnte diese Datenverbindung auch über einen handelsüblichen PC und einem Python-Programm erfolgen. In der Praxis allerdings soll der Pico-EVB oder mehrere davon zum Einsatz kommen. Warum das so ist, wird erst viel später an einem praktischen Beispiel vorgestellt.

Das MicroPython-Programm zum Pico-EVB

Zunächst erfolgt die auch vom Hersteller angebotene Initialisierung zum Bord, wie im folgenden Listing gezeigt ist:


Ich habe das Board mit der Adresse '192.168.1.200 initialisiert (Zeile 13). Der PC und die SPS müssen also im gleichen Adressbereich eingestellt sein. Die Initialisierung erfolgt gemäss den Hersteller-Angaben und funktioniert ohne Probleme. Meine SPS S7-1200 hat die IP-Adresse 192.168.1.108 und wird mit Receive- und Sendblock (Port 2000 und 3000) jeweils als Client programmiert, deswegen der nächste Abschnitt als server-loop() im Pico:


Und zum Schluss das main() mit der Antwort der SPS in der Kommandozeile:


Das SPS-Programm zur Kommunikation zum Pico-EVB


Im NW1 sehen wir den Receiver mit dem Port 2000, welcher zunächst die Daten vom Pico empfängt. Diese werden dann aufgearbeitet (NW2 und NW3) und zum Pico entsprechend beantwortet (NW4):



Das Video in meinem YouTube-Kanal wird gerade vorbereitet: Dort werden auch die Links für den Download der Programme, wie hier gezeigt, angegeben. Also, noch ein wenig Geduld 😏 oder einfach hier anfragen.

APC2 anstatt PLC3

Warum soll das über einen Pico-EVB ablaufen? Nun - kann natürlich die Kommunikation von der SPS direkt zum PC erfolgen. Dies allerdings belastet die SPS, da die Daten für die SW im PC besonders vorbereitet sein muss. Im Bild können wir sehen, dass die Picos zusammen einen Eingangs-Layer bilden. Diese bereiten somit die Daten schon so auf, dass diese direkt als künstliche Neuronen mit den entsprechenden Synapsen im PC zur Verarbeitung kommen können. Ausserdem ist die Programmiersprache Python für diese Zwecke besser geeignet.



Ist das Steuerungsprogramm in der SPS nicht so umfangreich, dann kann der PC auch direkt die Daten entsprechend formatiert von der SPS erhalten. Das bedeutet aber auch, dass die spätere Kontrolle noch schnell genug sein muss, um sinnvolle Werte innerhalb einer akzeptablen Zeit zu transferieren um diese in die Input-Layer-Matrix zu übertragen. 

Die Picos sorgen also nicht nur für schnelle Daten, sondern ermöglichen auch eine entsprechende Kontrolle nach der quasi-Programmierung, welche nach jeder Inbetriebnahme zeitweise, notwendig ist. Zudem stellen sie eine kostengünstige Lösung dar.

Weiteres im nächsten Blog-Abschnitt 🙋


Hier noch die Links zum Python-Interpreter Thonny und pycharm-community




Abkürzungen:
1: PLM Process Logic Matrix
2: APC Aritificial Process Controll
3: PLC Programming Logic Control

Linkbeispiel zu meinem YouTube-Kanal und Udemy:
Mein KI-Berater:


Samstag, 26. November 2022

  Copyright ©  Dipl.-Ing. Johannes Hofer 2022                                           

Die KI-SPS

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


Machine-Learning für Prozesskrane TIA-V16

Teil - 5




Hier der 5. Teil zum Thema KI und Deep-Learning. Mein laufendes Projekt beschäftigt mich derzeit, so dass ich wenig Zeit habe zu diesem Thema etwas zu berichten. Das Positionieren mit Lernkurven wird derzeit bei einer Krananlage (Modernisierung) umgesetzt und zeigt richtig gute Ergebnisse. Mehr dazu später, wenn's die Zeit erlaubt ...

Danke für das Verständnis!


Mein KI-Berater und Automatisierer:

https://kran-automation.marcel-rosiak.de/