Sonntag, 30. April 2023

 

KI2Plc

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






Fragen zum Thema:

Beispiel der Lektionen?

Das Thema Python zur S7-1200 ist wohl sehr gefragt. Allerdings sind Geräte wie Raspberry, Arduino usw. öfter angefragt. Der Byte-Code erlaubt allerdings fast jedes beliebige Gerät bezüglich der Software als SPS einzusetzen. Um diesen zu demonstrieren, möchte ich zuerst einen Ausschnitt aus der Basis-Lexion-1 zeigen. Damit sind auch Fragen dazu ein wenig erklärt und zudem wird das mit dem Byte-Code (später) verständlicher 😊

Die Simulation erfolgt hier über einige kleine Beispiele zur Anwendung von Operanden. Es soll nicht das AND, OR oder A verstanden werden, sondern die Grundsätzliche Vorgehensweise einer Python-PLC zum Thema Operanden.

In der oberen Ebene der pyPlc_sim können digitale Eingänge simuliert werden, indem man mit der linken Maustaste diesen anklickt und damit den Eingang setzt oder wieder löscht (True, False).

Das Ergebnis der digitalen Ausgänge ist dann unten an den Ausgang-Flags zu sehen. Diese können nicht angeklickt werden 😊, denn das soll ja das Python-Programm erledigen. Im oberen Bild ist u. a. die Zeile 520 gerade wirksam:

 A('Q0.0', AND('I0.0', 'I0.1', 'I2.7'))

 

Dazu folgende Bemerkungen:

Wenn die UND-Bedingung der Eingänge I0.0 und I0.1 und I2.7 erfüllt sind, dann soll der Ausgang Q0.0 gesetzt werden.

Wie aus den grünen Punkten erkennbar, sind die digitalen Eingänge zur Bedingug alle auf True (grün) gesetzt, so ergibt sich die Anzeige im ersten roten Flag zu Q0.0 aus der Zuweisung mit dem Operand A.

Nun alles weitere dazu im Video (ohne Ton):



 Im nächsten Abschnitt dann das Video zum Byte-Code zur S7-1200 🙋

 

Sonntag, 23. April 2023

 

KI2Plc

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




Fragen zum Thema:

Was macht der Byte-Code?

Im oberen Titelbild ist das main.py zu dieser Frage dargestellt. Zunächst kann man schon erkennen, dass die Fragen zum Thema Byte-Code nicht so einfach beantwortet werden kann. Zudem bin ich gerade in der Testphase mit meiner S7- 1200 und da vergehen noch einige Tage, bis ich ein Video bereitstellen kann. Dieses wird wieder einmal in meinem YouTube-Kanal und natürlich auch hier noch veröffentlicht. Also bitte noch ein wenig Geduld.

Wie aus dem Code oben zu sehen, wird mit Snap7 eine Verbindung zur SPS aufgebaut und der Programmspeicher, hier die bcr (Byte_Code_Register) gelesen. So kann das alte Programm gespeichert werden – man weiß ja nie 😊

Der FC fc_test_bit_bcr wird in den Speicher der SPS übertragen und sieht so aus:

 


Eine einfache Verknüpfung (Zeile 518) einiger Merker, dessen Ergebnis in Merker M3.0 gespeichert wird (Zuweisung). Im FUP z. B. sieht das so aus:

 

Die Zeile 518 (oben) repräsentiert also das hier gezeigte FUP-Gebilde. Der Byte-Code beträgt dazu genau 23 Bytes und wird in Zeile 29 (Titelbild) in die SPS übertragen. Also was ganz Klitzekleines. In dem Code ist ebenfalls eine Error-Behandlung enthalten und natürlich ein Bezug zum plc_monitor, wie im Titelbild in Zeile 32 zu sehen ist. Hier kann die Python-Zeile getestet werden, denn nicht jeder hat schließlich eine SPS von Siemens 😊

Das SPS-Programm Main sieht für diesen Test so aus:


Welche Geräte können genutzt werden?

Und damit kommen wir automatisch über dieses Beispiel zur Antwort: Jedes Gerät, welches eine Byte-Programmierung wie hier in der Simatic mit SCL zulässt. Im Prinzip sind das alle Geräte, welche nach DIN IEC 61131 ausgeführt sind, da die Textsprache dort zur Verfügung stehen soll. Also auch Codesys!

Oder natürlich die Geräte, welche Python beherrschen und dann allerdings nicht unbedingt den Byte-Code benötigen. Die meisten allerdings doch, da der Byte-Code in z. B. Micropython auch programmierbar wird und viele Geräte wenig Speicher besitzen und da ist der Byte-Code vorteilhaft.. Zudem alles eine Frage der Sicherheit 😊.

Das beantwortet nicht unbedingt die Fragen zufriedenstellend, aber ist wenigsten schon mal eine Erklärung dazu. Der Bytecode hat zudem den Vorteil, dass Module, wie hier im Beispiel demonstriert,   (FC, FB) geladen werden können. So kann das Gerät gezielt mit dem Downoad der Byte-Datei überarbeitet werden, ohne immer das gesamte Programm zu laden. 

Die bereits im Einsatz befindlichen Bausteine sind somit abgesichert, sodass sich der Programmier immer auf sein neues Modul konzentrieren kann.

Also bitte das Video abarten und weitere Fragen stellen. 🙋


Donnerstag, 20. April 2023

 

KI2Plc

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




Fragen zum Thema:

Was soll das mit den Bits und Bytes?

Der Titel wurde geändert! Es stimmt, dass dieses Thema nicht nur für die Simatic und damit das TIA-Portal assoziiert. Deswegen die Änderung im Titel.

Das hat bei vielen Lesern zur Verwirrung geführt, denn Python-Programmierer suchen Python im TIA-Portal 😊 und TIA-Programmierer verstehen die Welt nicht mehr und fragen nach einer neuen TIA-Version.  Danke für die Hinweise und ich denke so ist es gut – zumindest vorerst.

Meine Antwort zur Frage der Zukunftsaussichten einer SPS nur mit Hochsprachen programmierbar:

Die SPS wird nach meiner Meinung in Python oder anderen Hochsprachen nicht so programmierbar sein, dass diese nur aus einer Komponente der Hochsprache besteht.

Frage zum Einsatz einer SPS mit pyPlc:

Hier soll eine Hardware, welche als SPS bezeichnet wird, über Python programmierbar werden. Die Übersetzung aus Python wird in eine Byte-Sequenz sein, so dass diese von einer SPS lesbar wird. Also kein integrierter Python-Interpreter.

So kann die SPS die Vorteile ihrer Bestimmung beibehalten und gleichzeitig der entsprechende SPS-Typ (Gerät) fast beliebig ausgewählt werden. Es wird eine pyPlc.py erstellt, welche die Programmierung in Richtung IEC 61131-3 lenkt und dieses überhaupt so möglich macht, dass in der SPS-Welt ein neuer Weg vorstellbar ist.

Warum die Schreibweise M0.0, MW0, usw.:

Und so kommen auch die Bits und Bytes in Spiel, denn die Peripherie einer SPS lässt sich in Bits und Bytes sehr gut interpretieren. Eingänge sind, so auch Ausgänge, meist in Gruppen organisiert. Das ist beispielhaft bei einem Arduino und auch bei einer S7-1200 so.

Dadurch entsteht automatisch der Eingang mir I0.0 und bedeutet, dass die Gruppe 0 mit der Bitadresse 0 angesprochen werden soll. Für den Ausgang Q0.0 ist es ebenso. In den meisten Programmen wird der Eingang in einen Bit-Merker kopiert und der Ausgang ebenfalls nicht direkt im Anwender-Programm, sondern über das Merker-Bit  M0.0 gesetzt. Die Umsetzung zum tatsächlichen Ausgang erfolgt dann ganz am Schluss nach der Anwendung (Treiberteil). 

Nur so kann eine Anwendung sehr gut getestet werden, ohne gleich etwas kaputt zu machen, da der Treiberteil in der Testphase nicht aufgerufen wird.

Deswegen wird das Bit als Input (I0.0), Merker (M0.0) und Output (Q0.0) in pyPlc.py bleiben.

Die Merker- und Doppelworte können auch zusätzlich über eine Variable bezeichnet werden. Das gilt auch für Bit-Variablen! So könnte der Python-Programmierer sich von den Bezeichnungen MW, MD usw. entfernen. Also alles im Lot 😊

Im Trainings-Video wird das alles sehr detaliert erklärt. Die Webseite ist in Arbeit und auch das erste Trainings-Video 😎. Zudem gibt es auf der Webseite einen Blog, welcher hoffentlich besser funktioniert wie dieser ...

Ich reagiere gerne auf weitere Fragen 🙋


Montag, 17. April 2023

   Copyright ©  Dipl.-Ing. Johannes Hofer 2022                                           

 

KI2Plc

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

 




Fragen zu float oder real: 

Dazu ein Test-Beispiel aus der Analog-Verarbeitung


Gerade die Analog-Verarbeitung bereitet in jeder Hochsprache Probleme, zumindest die korrekte Verarbeitung für den Analogein- und Analogausgang des jeweiligen Gerätes.

Die so spezifizierten Bausteine, wie NORM und SCALE helfen dabei sich vorerst auf einer neutralen Ebene zu bewegen. Danach erfolgt mit einem MOVE die Übertragung nach einem analogen Ein- oder Ausgang, welcher im Gerät spezifiziert wurde.

Die sogenannte Treiberschnittstelle erledigt dann den Rest.

Das Lesen eines analogen Wertes aus der Schnittstelle erolgt in ein MW, welches den digitalen Zustand des ausgesuchten Ports darstellt. Je nach Konfiguration ist dieser polar oder bipolar. In den meisten, praktischen Anwendungen handelt es sich um einen polaren Port, welcher keine negativen Werte zulässt. Im folgenden Video ist wieder ein Vergleich zu sehen, welcher das Prinzip bei einer S7-1200 in FUP zeigt.

Das Video ist ohne Ton:



Analoge Werte werden in MD gespeichert. Das Merker-Doppelwort hat hier in pyPlc immer einen float-Wert gespeichert.


Wie wird der Python-Code in einer Hardware (z. B. Simatic) angewendet?

Die Frage zur Anwendung in einem Gerät kann erst vorgestellt werden, wenn der Baustein dazu in Python fertig gestellt ist. Grundsätzlich funktionieren die bereits bestehenden Bausteine aus der pyPlc.py. Dafür ist kein Python-Interpreter, sondern eine byte-orientierte Verabeitung programmiert. Ähnlich, wie es bei Java der Fall ist.

Der Byte-Interpreter ist für den Programmierer zugänglich und kann direkt im PC vorab getestet werden. Das ermöglicht den kompletten Test am Arbeitstisch und sollte so nach dem Download in das Gerät ohne Probleme funktionieren.

Geräte, welche Python verarbeiten (Microphyton) müssen noch getestet werden. Hier fehlt mir noch eine passende und sinnvolle Hardware.

Bis auf weitere Fragen zum Thema pyPlc 🙋



Donnerstag, 13. April 2023

  Copyright ©  Dipl.-Ing. Johannes Hofer 2022                                           

 

KI2Plc

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




Beispiel Counter-Test iec-CTU

Vorab eine Klärung zu den Fragen, was das eigentlich mit den Blöcken UND, OR oder 'M0.0' usw.  soll? Mann kann doch auch in Python schreiben a and b usw. oder?

Wenn wir eine SPS (speicherprogrammierbare Steuerung) machen möchten, dann müssen wir mit Operanden arbeiten. Das gibt nicht nur Sicherheit, sondern erfüllt damit die Bedingungen einer SPS!

Ich könnte nun über das Thema Operanden und Daten einer SPS stundenlang referieren. Macht aber hier keinen Sinn, also wartet bitte, bis die Seminar-Folgen fertig sind (ca. noch ein Monat für Teil-1) oder beschafft euch zur Vorabinformation  das Buch von MHJ STEP7-Workbook (ind Deutsch). Hier kann sich jeder schon mal bestens über Operanden und Funktionen informieren. Hier der Link:




Bildquelle MHJ, siehe erster Link

Die Anwendung der Funktionsblöcke, wie im FUP gezeigt, dienen ebenfalls der besseren Lesbarkeit für ein SPS-Programm in Python.

Nun zum IEC-Counter. Hier gleich mal das Video (ohne Ton) dazu:


Auch hier sehen wir die Anwendung für den Test eines CTU im Vergleich zum FUP. Das bedeutet, dass wir das FUP in Python nachvollziehen. In den praktischen Beispielen werden wir das vereinfacht ausführen. Das heisst, dass die Zuweisungen für den Test nicht mehr explizit erfolgt (sie erfolgt ja auch im TIA-Portal), sondern als Programm tatsächlich abläuft. 

Wir haben also Eingänge, Merker (Speicherbereich) und Ausgänge und können dann so auch praktisch testen! So werden die SET- und RESET- Befehle nur dann angewendet, wenn diese zum Programmablauf gehören und nicht zum Testen

Neu hier ist die Verwendung eines internen Speichers, welcher zu jedem FB als DB angelegt wird. Dieser Speicher ist quasi global. Wie das genau gemeint ist, bitte erst später im Seminar.

Und noch zur Klärung der Frage Seminar? Das Seminar wird bei entsprechender Teilnahme, also Interesse in meinem YouTube-Kanal veröffentlicht. Ist also dort kostenfrei. 

Gibt es nicht genügend Interesse auf diesem Kanal, dann spare ich mir die Arbeit und suche eine Webseite, welche diese Seminar-Reihe anbietet (nicht in Udemy).

Insgesamt wird es drei Teile aus der Seminar-Reihe geben. Das zur Info 😊

Ich denke mal, dass die Python-SPS-Programmierung sehr  stark im professionellen Bereich angesagt ist. So zumindest die täglichen Reaktionen hier in meinem Blog.

Also werde ich weiter auf Fragen reagieren 🙋


Montag, 10. April 2023

   Copyright ©  Dipl.-Ing. Johannes Hofer 2022                                           

 

Ki2Plc

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




Beispiel IEC-Timer TON

Die Timer sind eine besondere Ausführung in Python, da die IEC-Timer und hier handelt es sich darum, ablaufen, während diese nur einmal gestartet wurden. Es spielt also keine Rolle ob diese nur einmal oder öfters im Python-Programm aufgerufen werden. Sie müssen korrekt ablaufen, wenn sie einmal gestartet worden sind. Als Beispiel möchte ich hier zuerst den TON-Timer, also die Zeitverzögerung (Timer ONvorstellen (Timer-on-delay).

Hier das Beispiel bei einer Simatic:


Mit den zwei Merkern M20.5 und M20.6 starten wir über einen UND-Block den Timer Nr. 10 und der Zeitverzögerung von 2000ms. Ist die Zeitverzögerung abgelaufen, dann soll der Merker M20.7 gesetzt werden. Ansonsten ist der Merker M20.7 auf False gesetzt. Genau das sieht nach IEC 61131-3 in Python in einem Testprogramm zum Baustein so aus:



Wir betrachten hier nicht das Netzwerk wie im Simatic-Beispiel gezeigt, sondern einen Test für den Timer in Python. Deswegen setzen wir die Merker selbst.

Wie so ein Netzwerk in Python umgesetzt werden kann, folgt später. D. h. die Merker am Ausgang und Eingang werden später in einem FB über Parameter festgelegt, den ich dann nur als Netzwerk aufrufe und so die Merker entsprechend automatisch gesetzt sind.

Vergesse wir nicht: PLC oder SPS, wie auch immer , müssen immer unter dem Aspekt Sicherheit programmiert werden. Dazu dann später im Kurs entsprechende Auflösungen.

Im nächsten Blogbeitrag betrachten wir den CTU-Zähler, auch nur zur Info unter dem Aspekt Testprogramm 🙋









Samstag, 8. April 2023

  Copyright ©  Dipl.-Ing. Johannes Hofer 2022                                           

 

Ki2Plc

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



Beispiel Bit-Operator im Vergleich Simatic-Pyton

Bis jetzt zeigt das Ergbenis der Fragen, dass das Interesse an diesem Thema mehr aus dem Bereich der Python-Programmiere kommt. Besser fast nur 😀


SPS-Programmierer aus der IEC 61131-3 dagegen, stellen oft die Frage ob Python eine sichere Programmiersprache für eine Anwendung als SPS ist. Ich kann mir dazu keine Meinung bilden, aber wenn RUST als sicher eingestuft wird, dann ist es aus meiner Sicht auch Python. Außerdem macht das keinen Sinn in Python zu arbeiten, wenn man davon nicht überzeugt ist.

Ich denke eher das Gerät und dessen Betriebssystem auf dem die Software läuft, ist wesentlich an der Sicherheit beteiligt. Zudem soll ja die KiPlc in der Python-Version enthalten sein. Und dass ist in IEC-61131-3 bis jetzt nicht nachvollziehbar.

Nun zur Bitte des Bit-Operator-Vergleich. Hier das Beuspiel in FUP:




SPS-Programmierer kommen mit diesem Beispiel gut zurecht. Allerdings ist das hier nach meiner Meinung schon schwierig, da sich hier ein Set- und ein Assignment-Block befindet. Nun wir wollen ja nicht kneifen. Bei den noch folgenden Timer (nächster Blog-Beitrag), sieht das noch viel komplizierter aus. Zumindest auf der Python-Ebene 😌😎

Als Lösung habe ich folgendes Video ohne Ton vorbereitet (nicht in meinemYouTube-Kanal):



Im nächsten Blogbeitrag zeige ich den Einsatz der Timer wieder abgeleitet von der Simatic nach Python 🙋







Dienstag, 4. April 2023

 Copyright ©  Dipl.-Ing. Johannes Hofer 2022                                           

 

Ki2Plc

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



Wie soll der Anwender sein Programm organisieren?

Ich habe nun den Pfad Project hinzugefügt, welches die Anwendungen beinhalten soll, also das main.py und project.py mit den FCs und FBs ( in PyCharm)

Die Zykluszeit der PLC wird hier auf 5 ms = MIN_CYCLE festgelegt. Diese Zeit darf nicht überschritten werden, sonst findet kein logging und auch keine info statt, falls diese mit True durch die Instanzierung der Klasse plc = c_pyPlc angelegt worden waren.

plc = c_pyPlc(info=True, logging=False, optimize=False, cycle=MIN_CYCLE)
Wird der Parameter weggelassen, dann beträgt diese Zeit den default von MIN_CYCLE == 5ms und dass ist schon recht knapp bemessen. So könnte man diesen Parameter auch mit weniger oder mehr Zeit versehen. 

Der grundsätzliche Aufbau zur Bibliothek ist in main.py zu sehen und das SPS-Programm in project.py. Beide befinden sich im Pfad Project.

Somit haben wir schon einmal eine sauber Trennung der Bibliothek und der Anwendung gefunden 👍.

Project/main.py
from pyPlc import *
from project import fc_tor_sued

if __name__ == '__main__':
plc = c_pyPlc(info=True, logging=False, optimize=False, cycle=MIN_CYCLE)
plc.create_fc(fc_tor_sued)
plc.run()
#
while plc.is_running():
time.sleep(0.1)
pass

print("plc exit")

Project/project.py
from info import *
import time


def fc_tor_sued(self):
res = self.fct.UND('M0.0', self.neg_bit('M0.1'), 'M0.2')
c_info.print_info(self, "result in fc_tor_sued: " + str(res))
time.sleep(0.001)

Der time.sleep(0.001) == 1ms hat hier nichts zu suchen, soll aber vorerst zur Erklärung angewendet werden. Der c_info.print_info(...) ist nur für Testzwecke gedacht und soll den SPS-Entwickler unterstützen. Mit der Instanzbildung kann der dann abgeschaltet werden oder wird automatisch verdrängt, wenn die vereinbarte Zykluszeit (hier 5ms) überschritten werden. Ist das mal der Fall, dann wird dieser print gespeichert und später, falls es die Zykluszeit erlaubt, ausgegeben.

Was sich da noch an Reserven (auf meinem PC) bilden könnten und wie sich der print in unserem kleinen Beispiel fc_tor_sued verhält, schauen wir uns im Video an:


Wir erkennen, dass die Zykluszeit im Projekt eine wichtige Rolle spielt. Deswegen hat in der SPS ein time.sleep(...)  nichts zu suchen. Der SPS-Programmierer kennt das auch nicht, es sei denn, es handelt sich um einen Timer der SPS (später mehr)

In der Hauptanwendung dagegen, kann ein time.sleep(..) angewendet werden. Der wirkt sich  auf unseren Thread nicht sooo wesendlich aus. Hier können wir  in Ruhe noch  weitere  Dinge tun, also  z. B. den Server, Visualisierung oder anderes. 

Wer mit VS-Code arbeitet, bringt das main.py im Hauptprojekt unter, falls das so nicht geht.

Vorerst mal abwarten, welche Fragen noch kommen. Ich melde mich dann wieder mit einem neuen Blog-Beitrag 🙋



Montag, 3. April 2023

  Copyright ©  Dipl.-Ing. Johannes Hofer 2022                                           

 

Ki2Plc

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

 




Vorab einige Antworten zu den Fragen

Im oben gezeigten Video wird der grundsätzliche Ablauf für Start, Stop und Programm-Ende gezeigt. Zusätzlich die Anwendung über einen FC und FB. Damit wir ordentliche Strukturen erhalten, sollten FCs und FBs als Programmbausteine in einer Anwendung verwendet werden. 

Natürlich reicht es auch aus, einfach drauf los zu legen. Dann allerdings wirde es mühsehlig, denn Funktionen sind teilweise "private" bzw. "protected" und das bedeutet, dass die so ohne weiteres nicht angewendet werden können, da der  Python-Übersetzter das nicht akzeptiert und meldet, dass er das eine oder andere nicht kennt. Zudem muss die bestehende Struktur angepasst werden, falls man das nicht möchte und bedeutet auch eine Menge Arbeit, welche sich nicht lohnt. 

Zudem werden FCs und FBs überwacht und kontrolliert im PLC-Thread angewendet. Das gibt Sicherheit und bei einer Plc (SPS) und sollte das auch so sein 😁

Sollte in der eigenen Anwendung eine Exception entstehen, dann kann diese unter Umständen nicht bemerkt werden und die PLC läuft weiter ohne in die Anwendung zurück zu kommen. Das heisst:

Der Anwender sollte in jedem Falle seine eigene Exception abfangen, wenn er selbst erstellten Code anwendet.

Hier ein Beispiel (nicht in You-Tube):
from pyPlc import *

plc = c_pyPlc(info=True, logging=False, optimize=False)


def fc_tor_sued():
res = plc.fct.UND('M0.0', plc.neg_bit('M0.1'), 'M0.2')
print("res in fc_tor_sued: ", res)


plc.create_fc(fc_tor_sued)
plc.run()
time.sleep(0.1)
erg = plc.fct.UND('M0.0', plc.neg_bit('M0.1'), 'M0.2')
print("\ngeht auch: ", erg)
plc.prog_exit()!

Die Funktion fc_tor_sued wird als FC mit plc.create_fc(fc_tor_sued) integriert und somit kontrolliert angewendet. Dann wird später das UND noch einmal, ohne in den FC einzubinden, angewendet. Macht in diesem Fall nichts, da kein Laufzeitfehler entsteht. Ist natürlich nicht logisch aber was soll's.

Hinweis: Das UND wird es in Zukunft nicht mehr geben. Alle Tokens in Englisch, also AND 😏

Hat allerdings die Zeile print("\n.. einen Fehler, wie z. B. wird nicht erg verwendet, sondern versehentlich res, was hier in der Zeile nicht bekannt ist, dann wird der error von der PLC ausgeschlossen und das Programm, also die PLC läuft ewig weiter und kommt nicht zum Ende. Hier im folgenden Film ohne Ton gezeigt und wie man das verhindert, indem man seine eigenen Zeilen (Anwenderprogramm) mit einem eigenen try-Blog versieht.:




Besser ist natürlich die Anwendung der Funktionen aus dem Projekt über FCs oder FBs 😏 



Fortsetzung folgt im nächsten Blog 🙋