INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Simpler Ablaufsteuerungs Interpreter
11.11.2018, 13:53
Beitrag #1
Simpler Ablaufsteuerungs Interpreter
Schönen Mittag alle Zusammen,

Ich arbeite nun seit etwa einem Jahr an einem Projekt, was es möglich macht, simple Ablaufsteuerungen für einen Arduino MEGA zu erstellen. Dabei läuft zum einen auf dem MEGA ein Interpreter, der die Ablaufliste interpretiert. Der Interpreter hat dabei nur einen simplen Befehlssatz, der aus folgenden Befehlen besteht:

[Bild: Comands.png]

Der ausführbare Code, der auf dem MEGA interpretiert wird, sieht z.B. folgendermaßen aus:

Code:
3#(E1&&E2)#1;8#1#1;0;6#0;

Da dies nicht sonderlich leicht ist, als normaler Mensch diesen Code zu verstehen, habe ich zusätzlich eine kleine Software in Visual Basic erstellt, die normalen, lesbaren Code in den Code für den MEGA "übersetzt". Der oben gezeigt Code sieht dann so aus:
Code:
#define S1 E.1;
#define S2 E.2;

#define L1 A.1;


:main;

    if (S1 AND S2);
    
        set L1 = true;

    endif;

:endmain;

Die Software sucht sich dabei eigenständig die für die If-Zuweisungen zugehörigen Jmp-Zeilen oder setzt automatisch anhand der Variablen-Namen die Variablenspeicher-Indexe.

Beispiel:
Code:
:init;

    var TestVar:BOOL = false;
    var TestVar2:INT = 55;

:endinit;

:main;

    set $TestVar = NOT $TestVar;
    set $TestVar2 = $TestVar + 5;

:endmain;
übersetzt die Software in:
Code:
3#*Z==0#4;1#0#2;2#0#0;1#1#1;2#1#55;0;2#0#!$0$;2#1#$0$+5;6#0;

Das Prinzip, wie eine Ablaufsteuerung aufgebaut ist, ist folgendes:
Im allerersten Zyklus wird der init-Funktionsblock aufgerufen. Daher eignet sich dieser besonders für die Deklaration von Variablen, da dieser während des gesamten Ablaufs nur ein einziges Mal aufgerufen wird.
Der Main-Funktionsblock hingegen, wird in jedem Zyklus abgearbeitet.
Diese zwei sind vordefinierte Blöcke, die von der Übersetzungssoftware in Sprunganweisungen übersetzt werden.
Es können beliebig viele eigenen Funktionen angelegt werden. Diese werden außerhalb eines anderen Blockes angelegt mit Layout
Code:
:Funktionsname;
und müssen angeschlossen werden mit
Code:
:endFunktionsname;
Diese werden nur abgearbeitet, wenn Sie in einem anderen Block aufgerufen werden. die geschieht mit
Code:
Funktionsname();

Von der Software wird dies wiederum in eine Sprunganweisung übersetzt. Aus
Code:
:main;

    checkSth();
    checkSth2();
    checkSth();    

:endmain;



:checkSth;

    print Check;

:endcheckSth;



:checkSth2;

    print Check2;

:endcheckSth2;

wird
Code:
7#4#5;7#7#8;7#4#5;6#0;0;5#Check;0;0;5#Check2;0;

In diesem Beispiel wird die Funktion checkSth also 2 mal in einem Zyklus aufgerufen.

Natürlich können auch Eingänge verarbeitet und Ausgänge gesetzt werden.

Folgende Anweisung
Code:
:main;

    set A.01 = (E.01 AND E.02) AND NOT E.03;

:endmain;
wird von der Software in
Code:
8#1#(E01&&E02)&&!E03;6#0;
übersetzt.


Auch ein weitere Bestandteil sind Timer. Diese können ausgelesen werden oder auf Null zurückgesetzt werden. Sie laufen immer und können nicht direkt angehalten werden.

Ein Beispiel für eine Blinklampe sieht folgendermaßen aus:
Code:
:init;

    var state:BOOL = false;

:endinit;


:main;

    if (timer.0 >= 2500);

        set A.1 = $state;
        set $state = NOT $state;
        timerReset 0;

    endif;

:endmain;
Nach der Übersetzung wird daraus
Code:
3#*Z==0#2;1#0#2;2#0#0;0;3#(T0>=2500)#7;8#1#$0$;2#0#!$0$;4#0;0;6#0;

Ich habe dabei bewusst keine delay-Funktion eingebaut, da diese den Ablauf blockieren würde. Durch Benutzung ders Timers durchläuft der Interpreter die Sprungliste weiter, auch wenn die Bedingung noch nicht erfüllt ist.

Man kann bis zu 10 Timer unabhängig voneinander nutzen.


Wie schon zuvor gezeigt, sind auch Mathematische Operationen und Logische Verknüpfungen möglich. Dies geschieht mithilfe der "Expression-Parser" Library von James Gregson.

Im Moment ist der übersetzte Code noch im Arduino-Sketch fest verankert, aber ich habe vor, diesen im EEPROM abzulegen und beim Start auszulesen. Somit könnte man auch automatisch aus der Software am PC gleich das Programm auf den MEGA laden, ohne vorher den gesamten Sketch neu zu kompilieren.

Nun danke ich euch, dass ihr meinen Beitrag durchgelesen habt und hoffe ihr zeigt Interesse. Gerne freue ich mich auch Fragen zu meinem Projekt zu beantworten.

Als aller letztes möchte ich noch sagen, dass ich weder Informatik in der Schule, noch irgendeine feste Grundlage im Interpreterbau habe. Ich habe mir das meiste in vielen Jahren selber angeeignet mithilfe des Internets. Ausßerdem habe ich noch nie etwas für eine richtige Ablaufsteuerung erstellt Big Grin. Ich wollte mit diesem Projekt einfach versuchen, was ich mit meinen Fähigkeiten kann und vorallem ob man dies mit dem Arduino MEGA auch umsetzten kann.

MfG
DavidS
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.11.2018, 19:10 (Dieser Beitrag wurde zuletzt bearbeitet: 11.11.2018 22:20 von Tommy56.)
Beitrag #2
RE: Simpler Ablaufsteuerungs Interpreter
Da steckt gewiß viel Arbeit drin und Du wirst auch viel dabei gelernt haben.

Ohne den Sketch und evtl. eine Dokumentation betrachte ich es erst mal nur als Werbung für Dein Projekt.

Was mir allerdings noch nicht klar ist: Welchen Vorteil soll mir ein interpretierter Ablauf einer Steuerung, gegenüber einer Steuerung, die ich in C++ schreibe, bringen?

Gruß Tommy

Wenn Dir Fragen gestellt werden, wäre es auch höflich, diese zu beantworten.
Ja, Du warst seit der Frage mehrfach im Forum.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.11.2018, 02:52
Beitrag #3
RE: Simpler Ablaufsteuerungs Interpreter
(11.11.2018 13:53)DavidS schrieb:  ......
Nun danke ich euch, dass ihr meinen Beitrag durchgelesen habt und hoffe ihr zeigt Interesse. Gerne freue ich mich auch Fragen zu meinem Projekt zu beantworten.

Als aller letztes möchte ich noch sagen, dass ich weder Informatik in der Schule, noch irgendeine feste Grundlage im Interpreterbau habe. Ich habe mir das meiste in vielen Jahren selber angeeignet mithilfe des Internets. Ausßerdem habe ich noch nie etwas für eine richtige Ablaufsteuerung erstellt Big Grin. Ich wollte mit diesem Projekt einfach versuchen, was ich mit meinen Fähigkeiten kann und vorallem ob man dies mit dem Arduino MEGA auch umsetzten kann.

MfG
DavidS

Hallo DavidS,
bei der Realisierung deines Projektes hast du sicherlich viel gelernt.
Aber da ein Interpreter langsamer ein Programm abarbeitet als ein compilierter C-Code dürfte wohl auch dir klar sein. Zudem werden in der Arduino Welt auch sehr viele Librarys eingebunden um z.B. Sensoren auszulesen, Displays anzusteuern oder gar die Kommunikation per Netzwerk zu betreiben.
Von daher glaube ich kaum das so ein Interpreter heutzutage noch Interesse weckt. Zudem gibt es unter github.com eine Vielzahl an Librarys zum Arduino und seiner IDE die du nie und nimmer ersetzen können wirst.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.11.2018, 23:05
Beitrag #4
RE: Simpler Ablaufsteuerungs Interpreter
Er hat es ja nicht einmal nötig, auf gestellte Fragen zu antworten.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.11.2018, 21:22
Beitrag #5
RE: Simpler Ablaufsteuerungs Interpreter
(12.11.2018 23:05)Tommy56 schrieb:  Er hat es ja nicht einmal nötig, auf gestellte Fragen zu antworten.

Gruß Tommy

...wir waren wohl einfach zu ernüchternd für ihn könnt ich mir vorstellen.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.11.2018, 16:50
Beitrag #6
Wink RE: Simpler Ablaufsteuerungs Interpreter
Hallo Tommy56 und Bitklopfer,

Ich habe mich natürlich sehr über eure Antworten gefreut. Nur habe ich mir ersteinmal durch den Kopf gehen lassen müssen, was ich antworte.

Das ich mit meinem Projekt nicht viel Interesse gewinne, war mir schon von Anfang an klar, da dies auch nicht wirklich der Grundidee von Arduino entspricht, da man doch viel auf Librarys setzt. Auch mit der Zeit hast du, Bitklopfer, natürlich vollkommen Recht. Der Interpretierte Ablauf ist um einiges langsamer, als ein kompilierten Code, was wahrscheinlich auch mit meinem Programmierstil zusammenhängt. Aus Unwissenheit setzte ich im Moment auch noch nahezu komplett auf die String Librarys, da mir einfach noch das Verständnis für die char-Array Funktionen fehlt.

Ich habe außerdem wirklich viel während des Projektes gelernt, trotzdem ist in meinem Sketch wahrscheinlich noch vieles verbesserungswürdig.

Welche Vorteile ein interpretierter gegenüber einem kompilierten Code bringt, ist mir auch klar, nämlich nicht viele. Ein Grundgedanke von mir war anfangs, dass wenn der Code aus dem EEPROM geladen wird, man nichtmehr die Arduino IDE benötigt, um den Code zu kompilieren, sondern es direkt aus meinem geschrieben Programm hochladen könnte. Außerdem hatte ich im Plan, eine Umgebung zu erstellen, in der man auch grafisch, ohne große Programmierkenntnisse, Code erstellen könnte.

Ich werde in den nächsten Tagen, nachdem ich meinen Code etwas kommentiert habe, diesen auch gerne hier hochladen, wobei ich das Gefühl habe, dass ihr beide euch die Hände vors Gesicht schlagen werdet Big Grin Wobei ich auch hoffe, dass ihr mir dann Tipps geben könntet, was ich ändern könnte.

Auch werde ich in Zukunft sofort antworten, es tut mir leid dass ich dies nicht gemacht habe.

Schönen Abend noch

MfG
DavidS
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.11.2018, 17:23
Beitrag #7
RE: Simpler Ablaufsteuerungs Interpreter
Ich kann mir schon vorstellen, dass in so einem Projekt eine ganze Menge Herzblut steckt und dann die nüchterne Betrachtungsweise erst mal etwas schockt.

Ein Interpreter ist schon vom Grundprinzip her immer langsamer, als compilierter Code. Deshalb gibt es ja auch die JIT (Just InTime Compiler), die für sonst interpretierende Sprachen erst mal binärcode erzeugen, der dann schneller abläuft.

Dass Du bei der Beschäftigung damit viel gelernt hast, ist doch ein positiver Effekt. Die Beschäftigung mit den char-Arrays wird Dir aber nicht erspart bleiben, da die Klasse String auf den AtMegas einige Nachteile hat. Evtl. hilft Dir dabei diese Übersicht, die ich mal zusammen geschrieben habe.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.11.2018, 17:50
Beitrag #8
RE: Simpler Ablaufsteuerungs Interpreter
Hallo,

Tommy war natürlich wieder schneller als ich... ;-)

Ich hatte den Thread gesehen und mein erster Gedanke ging in Richtung SPS. Ist allerdings ein Thema, mit dem ich nie wirklich Kontakt hatte.
Zum Thema Strings hat sich ja Tommy schon geäußert.
Obwohl mich Deine Bemerkung zu String/Char-Array verwirrt mich etwas: hast Du mit Deinem Projekt schon irgendwas reales in größerem Umfang auf dem MEGA gemacht? Eigentlich dürfte der doch mit seinen 8kB Ram mit komplexeren String-Geschichten recht schnell gegen die Wand laufen?

Die Frage nach dem Sinn und Zweck eines Hobby-Projektes muß ohnehin jeder für sich entscheiden.
Was hat jemand in einem anderen Forum mir geantwortet als ich von meinem ESP32 Stream/MP3-Player was geschieben habe?
"Wozu das? Heutzutage kommt doch MP3 schon aus dem Wasserhahn..."

Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste