Ich entwickele zurzeit eine Arduino Bibliothek um Steuerungsaufgaben und das Handling von Ein- und Ausgabe zu vereinfachen. Vielleicht habt Ihr ein paar Anregungen bevor ich das Teil bei github veröffentlichen werde.
Dadurch das die Programmlogik von den Ein- und Ausgabefunktionen durch die IO Controller strikt getrennt sind, läuft das untere Codebeispiel ohne Änderungen sowohl auf einem Arduino als auch auf dem PC (Visualstudio c++).
Aus diesem Grund habe ich z.B. Serial durch den Namen printStream ersetzt. Auf dem Arduino wird dann die UART Ein-/Ausgabe genutzt und auf dem Windows PC die Console. Die Bibliothek bildet auf dem Windows PC einige Arduino Funktionen(Streams,Print,String e.t.c.) nach, falls diese auf dem PC nicht verfügbar sind.
Das folgende Beispiel benutzt die Bibliothek:
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 |
|
71 |
|
72 |
|
73 |
|
74 |
|
75 |
|
76 |
|
77 |
|
78 |
|
79 |
|
80 |
|
81 |
|
Die Klasse Example macht folgendes:
Wenn ein Button gedrückt und losgelassen wird, wird die Zeit zuwichen den beiden Tastenzuständen gemessen und angezeigt (measured time=). Im Anschluss gibt ein periodischer Timer das gemessene Zeitinterval als High und Low Flanken aus (clock tick=1, clock tick=0 ..... siehe Screenshot).
Um die Zeitmessung zu starten wird auf dem Windows PC in der Konsole btn1=1 und btn1=0 hintereinander eingegeben, um den IO Port des Arduinos zu simulieren.
Zusätzlich kann mit den Kommandos run und stop die Ausgabe gestartet und beendet werden.
Wenn das Programm auf einem Arduino laufen soll, wird zusätzlich ein HardwareIO Conroler registriert, welcher das Prozessabild der ein- und Ausgänge auf die IO Pins abbildet. Das eigentliche Programm hat keine Kenntnis darüber welche IO Hardware existieren.
Die virtuelle Funktion onRegister bindet Variablen an beliebige IO Controller. Zudem wird gleichzeitig ein Name zugewiesen wie die Aus- und Eingabe erfolgen soll. Propertys wie z.B. ReadOnly sind auch möglich. Außerdem könne hier auch Kommandos registriert werden.
Zurzeit existieren IO Controller für die Kommandozeilenein-/ausgabe und die Hardware IO Pin Ein/Ausgabe. Es folgen noch weitere für ModBus, I2C und mqtt.
Die virtuelle Funktion onMessage reagiert auf Änderungen von gebunden Variablen und Kommandos.
Die virtuelle Funktion onTask bildet SPS/PLC Funktionalität ab. Es wird im Hintergrund das Prozessabbild der Ein/-Ausgänge ausgewertet und die daraus erfolgten Variablenänderungen an die registrierten IOController weitergeleitet.
Es sind folgende SPS/Plc Standardfunktionen implementiert.
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
Bei jedem Funktionsaufruf werden falls notwendig, im Hintergrund automatisch Merker zugewiesen und dessen Zustände beim nächsten Funktionsaufruf abgerufen. Es können z.B. beliebig viele clock Aufrufe mit unterschiedlichen Zeiten verwendet werden. Alles läuft asynchron und das Hauptprogramm wird nicht blockiert wie es z.B. bei delay Aufrufen der Fall wäre
die setup Funktion:
-
serial wird durch printStream ersetzt
-
der PLCStdIO Controller ist ein IOController der ein Ausgaben für die Kommandozeile bereitstellt. Jede gebundene Variable kann mit Variablenname=Wert zugewiesen werden und jede Werteänderung wird als Variablennam=Wert ausgegeben. Der PlcStdIO Controller kann beliebige Arduino Streams wie z.B. die Serials oder bei einem ESP32 über Wifi einen Telnet Dienst bedienen.
-
die Maschine kann beliebig viele Prozesse mit unterschiedlichen Prioritäten registrieren.
die loop Funktion: zyklicher Aufruf der Bibliothek
viele Grüße
