Seite 1 von 1

Parameter einlesen

Verfasst: Montag 13. Dezember 2010, 12:16
von benji2010
Hallo zusammen,

bin zwar sonst nur C++-Nutzer, aber eine Problemstellung drängt mich zu Python.
Ich habe eine Textdatei, die ungefähr wie folgt aussieht:
N3070 MSG ( "TEST")
N3080 G95 S100 M3 f0.2
N3090 G0 Z200
N3100 X=0 Y=-630 C=DC(0)
N3110 M8
N3120 R12=30
N3121 R14=40
N3122 X=R12+R14
nach dem Einlesen sollen die R-Parameter (Zeilen: N3120 N3121)gespeichert werden. Diese sollen dann in Zeile N3122 verrechnet werden.
Nach dem Einlesen und speichern soll die Datei wie folgt aussehen:
N3070 MSG ( "TEST")
N3080 G95 S100 M3 f0.2
N3090 G0 Z200
N3100 X=0 Y=-630 C=DC(0)
N3110 M8
N3120 R12=30
N3121 R14=40
N3122 X=70
Kann man das "relativ einfach" umsetzen in Python ?

Benjamin

Re: Parameter einlesen

Verfasst: Montag 13. Dezember 2010, 12:32
von BlackJack
@benji2010: Definiere mal "relativ". :-)

Was muss denn alles erkannt werden? Also zum Beispiel die Variablenzuweisungen, was kann da alles passieren? Mit welchen Rechenoperationen muss man rechnen und wie komplex können die werden? Nur "<var> = <literal number>" und "<var> = <var> <op> <var>" oder können da auch kompliziertere Ausdrücke stehen? Können mehrere Zuweisungen in einer Zeile stehen wie bei N3100?

Man braucht wohl erst einmal eine Grammatik, welche die Zeilen beschreibt, die verarbeitet werden sollen. Wenn's "relativ" einfach ist, würden reguläre Ausdrücke ausreichen, sonst würde ich auf eine Parser-Bibliothek zurückgreifen. Da mag ich persönlich PyParsing, es gibt aber noch einen Haufen andere.

Re: Parameter einlesen

Verfasst: Montag 13. Dezember 2010, 13:30
von benji2010
es kann natürlich auch so aussehen:
N490 R53=800 R52=50
N500 X=R53 Y=-R52-40
Bei der Verrechnung kann es auch so aussehen:
N610 R24=R23/(R53*2)
Dies sind dann aber alle verwendeten Operationen...
Es gibt dazwischen auch Zeilen ohne "R", die würde ich mittels einer Abfrage "entsorgen".

Ist dies noch relativ einfach ? :) Und von einer Parser-Bibliothek habe ich leider noch nix gehört...

Re: Parameter einlesen

Verfasst: Montag 13. Dezember 2010, 14:03
von schorsch
Was ein Parser ist sagt dir Wikipedia und der wird hier wohl auch nötig sein. PyParsing ist eine Bibliothek mit der du dir selbst einen Parser bauen kannst. Das wird dir aber nicht viel bringen, wenn du nicht weißt die die Grammatik zu deiner Textdatei aussieht. Da kann dir aber bestimmt das Handbuch, oder der Hersteller der Steuerung helfen, das sieht mir nämlich sehr nach CNC aus, nur den Dialekt kenne ich nicht. Auf der PyParsing Website gibt es übrigens auch anschauliche Beispiele wenn ich mich richtig erinnere.

Und ja: Mit Python kann man das relativ einfach machen.

Re: Parameter einlesen

Verfasst: Montag 13. Dezember 2010, 14:24
von benji2010
Hallo Schorsch,

danke für die schnelle Hilfe..Habe das Modul PyParsing auch schon installiert.
Die Doku habe ich auch mal überflogen...Nur beim ablaufen der Testprogramme gibt er mir bei Print immer einen Fehler "invalid syntax"

Code: Alles auswählen

print formula, "->", formulaData, "(", mw, ")"
formula ist rot unterlegt...dies ist bei allen print-Anweisungen so.

Zurück zum Thema:
Nur das mit der Grammatik ist mir nicht ganz klar...Ja du hast Recht das ist CNC. Steuerung S840d... Anstatt der R-Parameter sollen
dann aber Wert stehen, damit die Steuerung das lesen kann. Also muss ich das File durch ein Programm schicken.
Aber wie im Beispiel darüber sieht es nicht immer gleich aus.

Kannst du mir oder jemand anderes ein einfaches Beispiel geben für diesen Fall:
N1 R30=50
N2 R20=10 R1=55.7
N3 X=R30 Y=R1+10
Ausgabe des Files dann:
N1 R30=50
N2 R20=10 R1=55.7
N3 X=50 Y=65.7

Dies müsste dann ja "nur" ausgebaut werden...Oder?

Re: Parameter einlesen

Verfasst: Montag 13. Dezember 2010, 15:07
von BlackJack
@benji2010: Du benutzt wahrscheinlich Python 3.x -- da ist ``print`` keine Anweisung mehr, sondern eine Funktion. Falls Du die Wahl hast, würde ich empfehlen stattdessen Python 2.7 zu verwenden.

Re: Parameter einlesen

Verfasst: Montag 13. Dezember 2010, 15:15
von syntor
Wenn du nicht eine ganze Grammatik ausformulieren möchtest, wäre es vieleicht einfacher, nur die Zuweisungen (alles mit = und wo \bR\d+ vorkommt) per RegEx heraus zu filtern. Das sollte sich relativ einfach bewerkstelligen lassen.

Dann musst du nur noch die Gleichungen parsen, oder lässt das gleich Python machen.