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 🙋