Seite 1 von 1

Der M3117 Befehl

Verfasst: Do 27. Apr 2017, 15:41
von Tom1972
Hallo zusammen,

Ich habe mal versucht, über den M3117 Meldungen auszugeben. Im Gegensatz zu M117, der zumindest gefühlt alles ausgibt, was in die 16 Zeichen passt, ist der M3117 zickiger.

Wenn die Ausgabe z. B. mit einem "F" oder "f" beginnt, gibt er nichts aus. Wenn Unterstriche (vllt. sogar Sonderzeichen allgemein) enthalten sind, gibt er ebenfalls nichts aus. Kennt jemand die Regel, die hier hinterlegt ist?

OT: Vielleicht noch eine Anregung fürs Wiki: Die Zeichenlänge für M3117 und M117 ist 16 Zeichen und nicht wie im Wiki beschrieben 17 Zeichen. Alles über 16 Zeichen wird hinten abgeschnitten. Beim G02/G03 könnte man ggf. noch anfügen, dass der Kreismittelpunkt (I, J) immer relativ zur Startposition angegeben werden muss. Unabhängig von G90, G91.

Viele Grüße
Tom

Re: Der M3117 Befehl

Verfasst: Fr 28. Apr 2017, 02:15
von Nibbels
Hallo Tom,

Das mit den Zeichen habe ich letzte oder vorletzte Woche entdeckt und an RF1000 gemeldet. In meiner Firmware ist das Problem bereits überarbeitet. Der RF2000 kann bei mir nun bei M117 20 Zeichen nutzen.
Zu deinem F-Problem: Immer wenn ein "Block" im Befehl mit z.B.

G
M
T

oder auch

S
P
F
X
Y
Z
...
beginnt, dann kann es sein, dass dieses Wort als "Zahleneingabe" erfasst werden will.

LG

Re: Der M3117 Befehl

Verfasst: Fr 5. Mai 2017, 10:27
von Tom1972
Vielen Dank Nibbels!

Kannst Du mir noch sagen, wo in der Firmware ich da was ändern kann? Ich habe da bisher nichts gefunden..... Soweit ich verstanden habe, gibt es ja seit dem M3117 den Befehl M3110 nicht mehr, mit dem man die M117 Meldung "einfrieren" konnte. Insofern bin ich auf den M3117 angewiesen. Beim Pausieren überschreibt er die M117 Ausgaben immmer mit "Miller ready" :dash:

Ich habe mir eine "ULP" zum Bohren von Platinen für Eagle geschrieben bzw. bin noch dabei. Dort soll er halt nach jedem Bohrdurchgang in eine "Werkzeugwechselposition" fahren und mir ausgeben, welchen Bohrer oder Fräser ich einspannen muss. Mit M117 überschreibt er das sofort.

VG Tom

Re: Der M3117 Befehl

Verfasst: Fr 5. Mai 2017, 10:50
von Nibbels
Ich habe das so gepatched:
https://github.com/RF1000community/Repe ... 8b9c0f8fb4
(Die Änderung in der ui.cpp sollte reichen)

So wie ich das im Quellcode verstehe
RF.cpp hat geschrieben:

Code: Alles auswählen

case 3117:  // M3117 - set a status text which is not overwritten by M117
            {
                if( pCommand->hasString() )
                {
                    if( !uid.locked )
                    {
                        // ensure that the current text won't be overwritten
                        uid.lock();

                        if( Printer::debugInfo() )
                        {
                            Com::printFLN( PSTR( "M3117: lock" ) );
                        }
                    }

                    uid.setStatus( pCommand->text, false, true );
                    uid.refreshPage();
                }
                else
                {
                    if( uid.locked )
                    {
                        // allow to overwrite the current string again
                        uid.unlock();
                        if( Printer::debugInfo() )
                        {
                            Com::printFLN( PSTR( "M3117: unlock" ) );
                        }

                        g_uStartOfIdle = HAL::timeInMilliseconds();
                    }
                }
                break;
            }
Setzt M3117 TEXT den Text und M3117 ohne Text entsperrt die Anzeige wieder.

Es gibt zwei Funktionen:
void UIDisplay::setStatusP(PGM_P txt,bool error)
void UIDisplay::setStatus(char *txt,bool error,bool force)

Und setStatus war bisher auf 16 begrenzt. Das wurde dort wohl einfach vergessen. Sowohl 117 als auch 3117 setzen den Text mit derselben Funktion.

Re: Der M3117 Befehl

Verfasst: Di 16. Mai 2017, 11:39
von Tom1972
Hallo Nibbels,

danke für die ausführliche Erklärung. Wenn ich das richtig verstehe, hast Du aber lediglich die Zeichenlänge verändert. An den Zeichen, die 3117 akzeptiert hast Du nichts geändert, oder?

Dann werde ich es wohl so lassen wie es ist. Bin mit Arduino auch nicht so vertaut. Habe zwar in C schon manches programmiert - quick and dirty für den Eigengebrauch - aber durch die Firmware steige ich nicht so richtig durch.... :wundern:

Würde z. B. auch gerne einen freien Pin für eine Zusatzfunktion benutzen und einen eigenen M-Befehl für eine "Helix"-Funktion integrieren. Aber die Latte liegt wohl zu hoch für mich :(

VG
Tom

Re: Der M3117 Befehl

Verfasst: Di 16. Mai 2017, 13:13
von Nibbels

Code: Alles auswählen

M3117 01234567890123456789 
ergibt bei mir:
Screenshot_1.png
Wenn du die roten Zeilen als gelöscht betrachtest und die grünen Zeilen als neu:
https://github.com/RF1000community/Repe ... 8b9c0f8fb4

Du müsstest nur in Repetier/ui.cpp die 16 zu der 20 ändern, dann hättest du schon diesen Effekt. Ich habe noch etwas weiter aufgeräumt, dass allgemein Ordnung entstand - wäre aber nicht notwendig gewesen.
UI_COLS ist beim RF1000 ein Platzhalter für die Zahl 16 und beim RF2000 die Zahl 20.
Darum habe ich nicht 16 und 20 reingeschrieben sondern UI_COLS.

LG

Re: Der M3117 Befehl

Verfasst: Di 16. Mai 2017, 14:09
von Tom1972
Ja das habe ich verstanden. Vielleicht nochmal als Erläuterung. Mir geht es eigentlich in erster Linie nicht um die Zeichenanzahl. Ich habe ja den RF1000. Ich würde die Funktion gerne dahin ändern, dass der 3117 alle Zeichen auch ausgibt. Bei einigen, die Du ja auch schon aufgezählt hast, gibt er dann einfach nichts aus, wie z. B. alles was mit "f" beginnt.

LG

Re: Der M3117 Befehl

Verfasst: Di 16. Mai 2017, 19:18
von Nibbels
Danke!

Das habe ich nicht mehr im Blick gehabt!
Ja. Kurz in den Code geschaut: Es existieren zwei Funktionen, die Gcode-Daten auswerten:

- parseBinary
- parseASCII

Die zweite Funktion hat die Unterscheidung drin, ob nach dem M-Code nur Text erwartet wird, die erste nicht. Und offensichtlich wird das über die erste eingelesen. Die erste Funktion ist die "neuere" weil man damit Daten spart, um die serielle Leitung zu entlasten.
[Ein Fix, der uns gefallen würde, ist in der originalen Repetier auch nicht drin.]

Ich habe noch nicht ganz verstanden, warum alle vor uns diesen Umstand komplett irgnoriert hatten.
-> Ich teste mal ob das einfach gefixt werden kann und keine Komplikationen bringt. Mein Drucker läuft nur leider aktuell.

LG

Re: Der M3117 Befehl

Verfasst: Di 16. Mai 2017, 22:12
von Nibbels
Diese Änderung bringt das gewünschte Ergebnis:
https://github.com/Nibbels/Repetier-Fir ... 70775dR794
(nur die unteren Änderungen in der gcode.cpp sind für M3117 wichtig.)

Das sieht im Github-commit etwas chaotisch aus, aber wenn man beide Dateien nebeneinander legt und etwas abgleicht, wird schnell klar, was ich gemacht habe:
- Ich prüfe erst ob M117 oder M3117 (etc.) vorliegt

Code: Alles auswählen

if(hasM() && (M == 23 || M == 28 || M == 29 || M == 30 || M == 32 || M == 117 || M == 3117))
- und behandle in diesen Fällen alles weitere als purer Text.
- ansonsten: so wie bisher.

Code: Alles auswählen

 else
      {

Das Vorgehen ist ganz grob aus parseASCII kopiert. Bei mir hat das anstandslos funktioniert. Ich werde das weiter testen. Sollte das jemand testen und einen Bug oder negative Effekte feststellen, meldet das mir bitte :)

LG

EDIT: Das ist jetzt auch hier geupdated (aktuell nur in der development):
https://github.com/RF1000community/Repe ... 96c4a6aa94

Re: Der M3117 Befehl

Verfasst: Mi 17. Mai 2017, 00:26
von Tom1972
Wow Du bist der Hammer..........
....kurz mal in den Code geschaut.....ich habe mich todgesucht und nix gefunden :scham:
Ich muss mich wohl jetzt doch mal mit Arduino beschäftigen. Hab bisher alles mit Atmel Studio gemacht.

Ich versuche das die nächsten Tage mal umzusetzen und auch zu verstehen was da genau passiert.

Erstmal vielen vielen Dank für Deine Mühe und Hilfe :danke: :danke: :danke: :danke: :danke:

LG