GCodeInterpreter
Überblick
ToDo
OOOOOO bei Fehler im Ablauf: Anhalten aller FSMs, totaler Abort!
Protocol lesen, speichern, visualisieren, löschen
Gui mit Frames für:
!!! ComPortsRefresh am Anfang dauert bei aktiviertem BT extrem lange !!!
Error: Exception beim Schliessen des Programms
GCodeInterpreter-Setup: SelectFileDialog für GCode-File
OOO Alle wichtigen Control-Attribute in Initdata laden / speichern!!!!
Latex-Dokumentation der G2/G3-Formeln
Auto-Aktivierung der Uart???
print('»> GCodeLines:') –> nach Editor auslagern?!
print(GCodeLines)
print('»> GCodeList:')
print(GCodeList.Text(), end='')
FrameUartDataflow mit Leben füllen RXD> und TXD>
Done
221130
X HLP.Error globalisieren - Callback!
X HLP.Protocol globalisieren - Callback!
X Protocol-Ausgaben vereinheitlichen
X OnError → modaler Dialog,
X Abbruch des Execute-Zyklus
221130
221130
X 'ok' nicht immer allein als Zeilen-Antwort → if ('ok' in RxLine): State…
X G3-GCodes verursachen sehr lange Hardware-Verzögerungen - Fehler???? (erst einmal kommentieren)
??? GCodeExecutor: while not(IsBusy) → while not(IsIdle) - aber warum?????
!!! auf jeden Fall KEINE Hänger mehr ???!!!
WICHTIG: bisher müssen die Feedrates im gcode-Text mit den Vorgaben vom Programm übereinstimmen!!!
221129
X Aktualisierung von GUIControls PA / PT bei Abarbeitung GCode (Fehler PA)
X ProtocolGlobal ← all comments / debugs
X Übergabe der (geladenen und konvertierten) GCodeList als DDS nach GCodeExecutor:
X Aufarbeiten / Verstehen des Setup-Window
|||||| bestehendes Problem: extreme Wartezeiten bei (manchen) G1-GCodes - warum????
221129
X Start GCodeExecutor: Löschen aller Grafiken (GCodeExecutor:GCodeSimulator.Clear())
X bei aktiven Plots werden Menu-Funktionen nicht ausgeführt
X aktive Plots werdenn bei ProgrammEnde nicht beendet
X FiFo mit Task und CGCode-Einträgen
X GCode-List wird als Fifo abgearbeitet und dabei vernichtet
XXX dort Fifo-Abarbeitung mit Task, Löschung jedes ausgeführten GCodes
X FiFo mit Task und CGCode-Einträgen
X Start: konsequentes Abarbeiten(Löschen) der einzelnen GCodes
X Abort: Abbruch der GCode-Abarbeitung, Löschen aller Resteinträge
X Start: konsequentes Abarbeiten(Löschen) der einzelnen GCodes, Löschen der Plots
X Abort: Abbruch der GCode-Abarbeitung, Löschen aller Resteinträge (GCodeExecutor/Simulator/…)
X Ende des Programms: Abort in GCodeExecutor
|| Laden eines GCode-File mit FileOpenDialog
|| Dynamische GCode-List bleibt NICHT im Speicher
XX Einbezug von Plot2D / Plot3D / GCodeProtocol in die Abarbeitungskette
221128
X GCodeHadware mit in GCodeExecutor einbeziehen,
X Vorlage (alte Version): 2210191701_GCodeInterpreter_01V44_g0123ijr
X korrekte AR.gcode-Datei mit allen M-Commands (vgl. Original) verarbeiten!
|| Hardware-Fehlerbehandlung bei “Error:xx” →
GUI
221128
221127
X ProtocolGlobal als erstes Tabsheet
X doppelter Aufruf: ReadInitdata
X Application-Protocol in ProtocolGlobal (GCodeSimulator)
X ExecutionGCodeList → ProtocolGlobal
221127
221126
X Wiederaufnahme der aktuellen GCodeInterpreter-Version
X (Asynchrone) Korrekturen an Plot2D, Plot3D
X Plot2D, Plot3D mit mehreren Kurven angepasst
neue Darstellung Plot2D, Plot3D
221125
X Idee: nochmaliger Versuch, Plot2D(hat bisher schon geklappt) und Plot3D(hat bisher nicht geklappt)
XXX einzeln als Module vom TimeSlotRefresh auf AsynchroneReplot umzustellen
221124
221123
Versionen jünger als 2211141929_GCodeInterpreter_02V002 sind fehlerhaft:
Problem bei Stoppen des Timers aus einem anderen Thread (???)
Idee: ab 2211141929_GCodeInterpreter_02V002 alle höheren Änderungen wieder stückweise einbauen…
221122
X btnLoadGCodeFile immer 'normal'
X btnStartExecution
X GCodeReport: Ausgabe GCodeList (nach Konvertierung aus GCodeFile)
X GCodeReport: WriteToFile und ClearAll (über Callback)
X Callback OnStart/AbortExecution
X Übergabe der (geladenen und konvertierten) GCodeList als DDS nach GCodeExecutor
221121
X Menu-Striche beseitigen mit 'filemenu = Menu(menubar, tearoff=0)'
X Eigenes Protocol-Fenster(Tabsheet) als letztes Tabsheet
X Menu-Punkte ProtocolWriteToFile und ProtocolClearAll über Callback (FrameApplication.tbsProtocol, Main)
X ProtocolUart ← UartDataFlow
X ProtocolGlobal ← Protocol
221120
221120
221114
221113
aus “altem” GCode-Interpreter Übernahme UartSetup-Frames:
Neuauflage der Gui:
Gui mit Frames für:
x Status-Controls(left)
x ViewControls(right) in Tabsheets: Protocol, Plot2D, Plot3D
x Command-Controls(bottom)
Gui mit place()-Manager
Protocol nicht an Gui-Bottom anfügen, sonder als eigenes Tabsheet vom View-Notebook
so könnte prinzipiell die Gui von GCodeInterpreter aussehen:
- links: States
- rechts oben:: Views
- rechts unten: Commands
(aus Zeitgründen wird das aktuelle Fenstermass fixiert, später dann freie Skalierung…)
221025
221024
FrameHierarchy als Basis-Gerüst für GCodeInterpreter
FrameHierarchy mit RealTimePlot2D
GcodeInterpreter: Menu
GcodeInterpreter: Read/WriteInitdata
221022
221021
Arzt bis 15:00 Uhr, jetzt Module-Task-Event
TaskEvent
221020
(Re)Einbau RealTimePlot-Funktionen
Timing-Fehler im DualTask-Betrieb lokalisiert und reproduzierbar sicher umgangen:
!!! eine Thread-Execute-Methode darf KEINE Leerzeilen enthalten - warum auch immer?! !!!
Morgen: Test auf Lösung im Plotverzug von GCodeInterpreter!
221020
[1666277036.9053943] *** RealTimePlot2DRefreshData: begin
...
[1666277036.9063644] ~~~ OnTask[TaskRefresh]-Execute: begin
---
---
[1666277038.9793437] ~~~ OnTask[TaskRefresh]-Execute: end
[1666277038.9953027] --- Task[TaskRefresh]-JOINed...
...
[1666277038.9953027] ~~~ OnTask[TaskRefresh]-Execute: begin
---
---
[1666277041.091677] ~~~ OnTask[TaskRefresh]-Execute: end
[1666277041.091677] --- Task[TaskRefresh]-JOINed...
[1666277041.091677] ### OnTask[TaskExecute]-AbortExecute:=True
[1666277041.091677] --- Task[TaskRefresh]-JOINed...
[1666277041.092278] --- Task[TaskExecute]-JOINed...
[1666277041.0971415] *** RealTimePlot2DRefreshData: end
221020
RealTimePlot2DTaskTask:
Task OHNE while-loop, while, falls benötigt in: OnTaskMainExecute
TaskExecute ruft periodisch TaskRefresh auf…
WICHTIG - flushen aller Ausgaben (base Main):
Abort mit join versehen, zuvor in OnAbort Main-Task beenden!
Einbau von join()
thread.daemon = False (default) : sonst kein Warten auf Thread-Ende!
WICHTIG - flushen aller Ausgaben (base Main):
import sys
sys.stdout.flush()
[1666275018.8945642] *** RealTimePlot2DRefreshData: begin
[1666275018.8945642] ### OnTask[TaskExecute]-waiting: begin
...
...
[1666275022.4725285] ### OnTask[TaskExecute]-AbortExecute:=True
[1666275022.4725285] --- Task[TaskExecute]-JOIN: begin
[1666275022.9286542] ### OnTask[TaskExecute]-waiting: end
[1666275022.9286542] --- Task[TaskExecute]-JOIN: end
[1666275022.9366367] *** RealTimePlot2DRefreshData: end
221020
leider Problem: Niedrige Darstellungs-Geschwindigkeits bei Plot2D im MultiTasking(GCodeInterpreter):
ThreadExecute - ThreadPlot - gca, draw
0. Sicherung: GCodeInterpreter
1. Idee: RealTimePlotTaskTask, vermutlich volle Geschwindigkeit
2. Idee: RealTimePlotTaskTask &rightarrow& GCodeInterpreter - hoffentlich volle Geschwindigkeit
3. Idee: Urversion GCodeInterpreter wieder mit voller Geschwindigkeit herstellen
221019
221018
X FindExtremaX/Y/Z für PlotRangeX/Y/Z
.. G00, G01 : Erzeugung von (Zwischen-)Punkten, welche in einem Extra-Task bei der CodeExecution sequentiell abgearbeitet werden… (vorher Sicherung GCodeInterpreter_514.zip)
X Plot aller (durch einen GCode) erzeugten Zwischenpunkte: keine weitere Abarbeitung von GCodes erlaubt $\Rightarrow$ Schleife in GCodePlot2D !!!
X jetzt endlich Moving in Arcs (based on I and J - R still missing!)
X G2 und G3 mit I,J (ohne R)
man beachte die Kreisbögen in der FreeCad-Vorlage (→ GCode) und Interpretation/Plot des GCodes!
2210181936_GCodeInterpreter_01V42.mp4
\\
221017
Generierung der korrekten Plot2D-Daten aus GCode-Folge:
Aktualiserung Field-Variablen (in EndDataTypes):
self.ParameterX = 0.0 # [mm]
self.ParameterY = 0.0 # [mm]
self.ParameterZ = 0.0 # [mm]
self.ParameterE = 0.0 # [mm]
self.ParameterF = 100.0 # [mm/s]
Zeichnen ausschliesslich von Geraden
221017
X Zusammenführung:
X Ziel: stückweises Zeichnen der GCode-Curve mit gezieltem programmtechnischen Refresh des Plot2D
X Ersetzen aller RTPlot2D-Elemente durch neue RealTimePlot2DRefreshData-Elemente
X Einführung WindowMain.IsActive(zuvor:WindowMain.IsBusy) zur Verhinderung von Exceptions bei deleted WindowMain
O WindowMain.py und MainWindow = CWindowMain(…)
.. Verschmelzung OnTaskRefreshData mit altem Plot2DRefresh
Ergebnis: GCodeInterpreter mit Verabeitung von GCodeProtocol, GCodeHardware, GCodePlot2D(noch Pseudodaten!):
221016
221015
221013
OOO Tabsheet Execution: Checkboxes für alle Arten der ExecuteMachines
zweitens: Darstellung von RealTimePlot3D-Frame in GCodeInterpreter
Globale Setup-Tabsheet(s)
Austausch: SetupUart vor Setup… vor SetupGlobal
Main / FrameSetup-FrameSetupGlobal : OnStartExecution
Main / FrameSetup-FrameSetupGlobal : OnAbortExecution
221012
221005
Reorder GCodeInterpreter
Entnahme Task aus GCodeHardware
GCodeHardware(Uart) mit zeilenweise Abarbeitung einer GCodeLine
GCodeReport mit zeilenweise Abarbeitung einer GCodeLine
GCodeReport : M/G-Code mit Comment-Ergänzung
221004
221003
GCodeFile $\rightarrow$ CGCodeConverter $\rightarrow$ GCodeLines
GCodeLines $\rightarrow$ CGCodeConverter $\rightarrow$ GCodeList
CGCodeConverter arbeitet GCodes in GCodeList ab
CGCodeConverter ruft über CB CGCodeHardware / CGCodeSimulator auf mit Software-HS
jetzt Versuch, GCodelist (als Ergebnis von Commandlist) in einem Thread abzuarbeiten
dabei werden die einzelnen GCodelines (typisch ein GCode-Command mit Parametern, Kommentar)
mit CB sequentiell zu den Interpreter-Modulen gereicht
221002
221001
Übernahme der Plot3D und Curve3D files aus '2208232227_Plot3DOrbitalProjection_01V01'
An alle Command-Classes wird die zuvor erzeugte GCodelist übergeben:
Umsortierung Command-Classes:
CommandExecutor → CommandConverter : GCommandFile → GCodelist
CommandConverter.BuildGCodeFromCommandlist(Commandlist)
KEINE Basis-Class mehr, nur noch parallele eigenständige Classes!
Wiederherstellung des Uno-Pinout-Led-Breadboards
220930
220929
220928
Einbau Task
Command-Module:
CommandExecutor
CommandCommon
CommandMachine
CommandPlotter
CommandSimulator
CommandViewer
220927