das wäre für mich jetzt noch zu kryptisch und zu unübersichtich, aber mal abwarten...
Das Prinzip kann man hier schon sehen. Es ändert sich natürlich der Textinhalt. Weil der hat jetzt nichts mit dem Projekt für das nodeMCU zu tun.
Bild hier
Diese Stapel funktionieren jetzt noch für die Benutzeroberfläche als solches. Ich werde diese Funktion aber raus nehmen, weil sie für dieses Projekt jetzt nicht benötigt wird. Statt dessen werde ich das Prinzip der Stapelverwaltung beibehalten, aber die Befehlsauswahl anpassen und am Ende muss das dann noch übersetzt werden, damit reine Codeblöcke für die Ablaufsteuerung auf einem µC entstehen, die übertragen werden können.
MfG
das wäre für mich jetzt noch zu kryptisch und zu unübersichtich, aber mal abwarten...
Ich habe mir Gedanken gemacht, zwei Mal drüber geschlafen und mich für diese Variante entschieden, die Schnittstellen, die meine Firmware hat, in der Benutzeroberfläche abzubilden.
Bild hier
Dazu gehören Variablen, die für Berechnungen usw. benötigt werden. Zusätzliche, spezielle Funktionen (Standardfunktionen, wie Variablen manipulieren, Rechenoperationen, Sprünge usw. müssen nicht extra aufgeführt werden). Die einfache Programmabarbeitung in Blöcken (Stapel). Und das Definieren von speziellen Sprungzielen, hier unter Prozeduren. Eine Prozedur soll hier so definiert werden, dass die Bezeichnung und der Stapel angegeben werden, der zur Ausführung gelangt.
Die einzelnen Geräte ( wie hier der ATmega328 ) bekommen eine eindeutige ID zugewiesen. Normalerweise spielt es keine Rolle, welcher Stapel für welches Gerät entworfen wurde, weil die benötigten Stapel zur Programmabarbeitung untereinander verkettet sind. Daher muss nur ein Stapel zu Anfang exakt zugeordnet und mit einer bestimmten Nummer versehen werden können.
Ich denke, damit habe ich alles abgedeckt, was ich benötige, um die Programmierung eines Gerätes in der Benutzeroberfläche vornehmen zu können.
Die Abbildung dient nur als Beispiel, um den Aufbau zu zeigen.
MfG
Sehr schön, das sieht jetzt schon viel überschtlicher aus!
Was ich immer noch nicht verstehe:
1) Was für ein Gerät baut diese Web-IDE auf einer Website auf?
2) Wie kommuniziert diese Web-IDE mit einem AVR? (mit einem ESP wäre klarer, eben als WiFi oder WEB client)
3) Was ist der Unterschied zwischen Funktionen und Prozeduren?
4) Wie bekommt man die Elemente der Rubriken (Variablen, Prozeduren, Funktionen) in eine Stapelverarbeitung?
per d+d ? Oder wird alles Buchstabe für Buchstabe auf einem PC oder über eine Konsolen-BT-Tastatur etc. eingetippt?
(PS, die Stapel sehen ja doch auch ähnlich aus wie die Blöcke bei Scratch, die man aus einer Auswahl herausziehen und per d+d untereinander gruppieren kann)
Webserver auf einem nodeMCU 1.0, bei mir. Ich habe noch mehrere davon.
Die Webseite ist als Browseranwendung konzipiert und wird vom Webbrowser geladen. Danach ausgeführt, weil die ganze Seite überwiegend aus JavaScript besteht. So wird sie auch im Browser aufgebaut. Dazu habe ich eine Fensterverwaltung in JavaScript gebaut. So wird ein Fenster (eigentlich ein DIV-Container) geöffnet und darin Sachen eingebettet, die zur Laufzeit des JavaScript zusammengesetzt werden. Das Hauptfenster ist 100% breit und 100% hoch, damit füllt es den Webbrowser aus.
Kommuniziert wird ausschließlich mit dem Webserver. Von dort werden die Daten dann verteilt, auf einen AVR. Z.B. über serielle Schnittstelle.
"Variablen" ist ein Organisationsobjekt, weiter nichts. Die Unterobjekte ebenfalls. Sie folgen aber einem bestimmten Aufbau. Zuerst steht dort "variable" dann die Nummer, dann ein aussagekräftiger Text.
Am Ende muss das nicht von der einen Stelle an eine Andere. Es geht nur darum, dass ich das nachher beim Programmieren verwenden kann. Entspricht etwas einem "#define Strecke_1 0" in Arduino-C.
Mit den Funktionen ist es ähnlich. Es gibt einen Text dafür (kann man lesen und verstehen) und darunter noch mindestens ein Objekt "code", dem ein Wert zugeordnet wird. Die Stapelverarbeitung selbst befindet sich in der Firmware für das Gerät. Dort würde dann auf den Code 20 mit "Motoren aus" reagiert, weil entsprechend eine Funktion dafür hinterlegt ist. Wenn ich aber die Funktionen schon alle aufführe, kann ich sie auch in Menüs übernehmen, aus denen ich sie dann als eine Zeile im "Programmcode" übernehmen kann (anklicken und Button [OK] anklicken). Zum Debuggen später ist es auch gut, wenn das dann irgendwo als Klartext erscheint. Ich muss mir nur gründlich überlegen, wie die Informationen strukturiert sein sollen.
Die Stapel sind ja nichts weiter als einfache Programmabläufe. Eben wie in Stapelverarbeitungsdateien unter DOS. Ja, dort wird alles, Zeile für Zeile untereinander angeordnet. Das isz ja meistens so. In PHP, Javascript, Basic. Am ehesten würde ich das mit GW-Basic vergleichen oder BAsic auf dem C64. Dort gibt es einzelne, nummerierte Programmzeilen. Wenn es umgewandelt ist, ist es nur noch ein Zahlenblock, der durch die Firmware (z.B. auf einem AVR) abgearbeitet werden kann.
Um diese Stapel zu "befüllen", gehe ich auf das übergeordnete Objekt und wähle den Menüpunkt "Objekt hinzufügen". Je nach Objekt erhalte ich dann eine unterschiedliche Auswahl, was ich dem Objekt unterordnen kann. Zum Beispiel irgendwelche andern Objekte oder Scriptzeilen, die auch nur Objekte sind.
ok, danke, das klingt dann tatsächlich ähnlich wie Scratch (oder die Lego NXT/EV3-G Blöcke), das sind ja auch Bytecode-Interpreter mit Java o.ä.
Interessantes Konzept!
Eine CPU verwendet ebenso Byte-Code im RAM oder ROM (Maschinensprache), um sämtliche Funktionen, die integriert sind, variabel nutzen zu können. Dieser Ansatz ist sehr gebräuchlich. Bei CNC-Maschinen, 3D-Druckern z.B. nennt es sich G-Code. Verfolgt denselben Zweck: Programmierung / Steuerung, ohne die Firmware zu ändern.
MfG
nein, ich meinte nicht die Maschinensprache, sondern Bytecode, eine Art Zwischencode für virtuelle Maschinen (für Interpreter), wie z.B. von Java verwendet.
Dann weiß ich nicht, worauf Du Dich beziehst.
So etwas wie einen Zwischencode gibt es hier nicht. Es sind genau betrachtet eher Steuercodes.
Es gibt da noch so etwas, was man vielleicht als Zwischencode bezeichnen könnte. Damit habe ich mir die gesamte, kompliziertere Programmierung erleichtert. Ich habe dazu mal ein Auszug aus der Debugger-Ausgabe kopiert.
Hier wird dann noch mehr gemacht, als einfach nur Codes zu lesen und durch ein switch - case - Gebilde zu schicken. Zum Beispiel heraus finden, aus was Teilausdrücke bestehen (wird eine Variable oder ein String verglichen / zugewiesen, oder doch eine Zahl ...). Da werden die Parameter erst noch aufgearbeitet, bevor sie an Funktionen übergeben werden. Bei der Stapelverarbeitung die in einem AVR stattfinden soll, soll nichts weiter geschehen, außer die möglichst zügige Abarbeitung. Die gesamte Aufbereitung von Parametern, Werten usw. wird über die Benutzeroberfläche erledigt.Code:3: goto:100 100: goto:103:ost=100 101: xfind:roobject:id1:..zu:.id=id 102: goto:4 4: exec:ailib:4 5: goto:19:containerLength>0 19: init:ziel=i1:x-find-scope=i2:scope-frame=i3 20: exec:ailib:0
Vielleicht habe ich Dich auch einfach irgendwie missverstanden .. ?
MfG
naja, "Pinmodus festlegen 0: Output" wird ja nicht Buchstabe für Buchstabe gelesen, einer Syntaxanalyse unterzogen, ausgewertet, und dann übertragen, sondern von deinem Programm per komprimiertem Zwischencode gelesen und dann an die cpu übetragen (IIUC).
Vielleicht stimmt das mit deinem Steuercode überein oder vlt noch einen Schritt tiefer (reine Bytefolgen), jedenfalls ist dein interpretierter Code weder das, was in deiner Web-IDE steht, noch das, was die cpu tatsächlich als Binärcode ausführt:
sondern ein Zwischencode oder Bytecode, den dein Interpreter in deinen Stapeln schrittweise verarbeitet, und ähnlich macht es ja auch Scratch oder NXT-G per VM mit seinen Blöcken.
Lesezeichen