Schrift
[thread]7393[/thread]

maschinenbefehler übersetzen: ...oder einfach strings zerlegen :)



<< >> 10 Einträge, 1 Seite
popcorn5
 2005-10-25 13:31
#59249 #59249
User since
2003-09-24
60 Artikel
BenutzerIn
[default_avatar]
Moin moin.

stehe vor folgendem problem:

ich muss diverse Maschinenbefehle übersetzen.
diese befehle können z.b. so aussehen.

1. +10510-2043
2. -3053-
3. +1732+10071

bei 1.-3. handelt es sich um relative fahrbefehle, das plus bedeutet positiv und das minus negativ jeweils für die x und die y achse. Bei 2. ist hinter dem Minus nichts mehr, das wird als "0" interpretiert. Also ein Fahrbefehl nur für die X-Achse.

jetzt gibts noch diverse andere befehle:

4. +++150- (Kreis linksherum mit 150mm durchmesser bei 12 Uhr start)
5. +++420+ (Kreis rechtsherum mit 430mm durchmesser bei 12 Uhr Start)
6. ++45+250- (Radius 45° linksherum bei 12 Uhr Start)

usw. es gibt noch mehr davon aber ich muss irgendwo mal anfangen.

Ich möchte jetzt folgendes realisieren:

1. ich will zwischen den verschiedenen Befehlsvarianten unterscheiden.
2. ich will alle Zahlen mit dem Wert 2,51 multiplizieren.
3. Das Minus und pluszeichen soll durch einen String ersetzt werden.

Also aus dem Befehl "+10510-2043" soll dieser Befehl werden:
"drive_rel_x(pos26380),drive_rel_y(neg5128)".

Und aus dem Befehl "-3053-" soll dieser werden:
"drive_rel_x(neg7663),drive_rel_x(not)".

Das ist jetzt ein ganz einfaches Beispiel. Schwieriger wird es da mit den Radien oder Kreisen und Elypsen kommen noch ;)

Wie kann ich folgenden text in einen sinnvollen Vergleich in Perl schreiben ?

Wenn 1. Zeichen ist "+" oder "-" gefolgt von einer zahl zwischen "0" und "99999" gefolgt von einem "+" oder "-" und wieder gefolgt von einer zahl zwischen "0" und "99999" dann mache...

Oder wenn 1. und 2. Zeichen ist "+" gefolgt von einer Zahl zwischen "0" und "99999" gefolgt von einem "-" oder "+" dann mache.

Ich habe mir da sowas vorgestellt:

if($test /[\+?\-][0-99999][\-?\+][0-99999]/)
{
#string zerlegen und umrechnen, wieder zusammensetzen.
}

Ich hoffe es hat jemdn verstanden :)

Danke für die mühe.\n\n

<!--EDIT|popcorn5|1130232828-->
Taulmarill
 2005-10-25 13:40
#59250 #59250
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
wo ist deine frage? du hast eine aufgabe und einen lösungsansatz. verfolge den doch erst einmal und schaue, wie weit du alleine kommst. die aufgabe wurde dir gestellt, nicht uns.

wenn du irgendwo nicht weiter kommst, dann helfe ich dir natürlich gerne.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
renee
 2005-10-25 13:41
#59251 #59251
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wie kommst Du von den Werten im String auf die Zahlen nach pos bzw. neg??

[0-99999] - im Gegensatz zu Deiner Hoffnung wird hier *nicht* von 0-99999 untersucht, sondern nur auf 0 oder '-' oder 9. Das [] beschreibt 1 Zeichen.

Mehr zu Regex siehe
perldoc perlre
perldoc perlretut
perldoc perlrequick

http://regenechsen.de
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2005-10-25 13:52
#59252 #59252
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
wie kommen bei den weiteren Befehlen die Gradzahlen zustande?? Hat das was mit der Anzahl der + bzw - zu tun??

Wie moechtest du die weiteren Befehle nach der Umformung darstellen??
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
popcorn5
 2005-10-25 15:11
#59253 #59253
User since
2003-09-24
60 Artikel
BenutzerIn
[default_avatar]
@renee:

++45+250- ist noch ziemlich einfach zu erklären:

++ kreisbefehl
45 Winkel in °
+ nichts besonderes nur trennzeichen
250 radius in mm
- negativ also linksherum

komplizierter wirds dann noch mal mit radien die nicht bei 12 Uhr starten:

++45+250-120+

bewirkt das selbe wie oben und das 120 am ende setzt den startpunkt um 120 grad rechtsherum (wegen dem +).

und noch komplizierter wird es bei einer elypse, denn dabei werden einzelne radien errechnet und das in 360 schritten unterteilt also immer 1 grad-weise.

habe da jetzt leider keine fertige platte, muss mir noch eine erstellen.

das dumme ist, die maschine für die ich das alles übersetzen will, kann keine kreise ! ich muss alles in einzelschritte umrechnen also aus einem 360° kreis soviele einzelne gerade strecken fahren dass das teil am ende wieder rund wird.

@all: ich wollte hier von niemandem ein fertiges script haben.
ich stehe vor nem haufen zu lösender probleme und wollte nur vorschläge "wie ihr das machen würdet". die ganzen befehle unterscheiden sich nur durch die anzahl von "+" und "-" die in ihnen vorkommen. Das ist das komplizierte daran.

ich habe jetzt mal angefangen indem ich den ganzen befehl in einzelne zeichen zerteile (split) und dann mit if-blöcken jedes zeichen nacheinander einem befehl zuordne. das ist vielleicht nicht sehr sauber, funktioniert aber, dauert aber sehr lange.
so eine ganze tafel besteht im schnitt aus 2500 solcher einzelnen befehlen und das dauert.

Ich bin ziemlich fit was Datenbanken und CGI angeht aber an dem Kram hier werde ich wohl noch verzweifeln.
renee
 2005-10-25 15:17
#59254 #59254
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich wuerde mit RegExen arbeiten

sowas in der Art von /([+-]+)(\d+)([+-]+)(\d+)?([+-]+)?(\d+)?([+-]+)?/

Dann kommt es darauf an, welche Elemente ($1,$2,...) gesetzt sind und welche nicht und natuerlich kommt es gerade beim ersten darauf an, wieviel Zeichen enthalten sind...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
murphy
 2005-10-25 15:44
#59255 #59255
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=renee,25.10.2005, 11:41][...]
[0-99999] - im Gegensatz zu Deiner Hoffnung wird hier *nicht* von 0-99999 untersucht, sondern nur auf 0 oder '-' oder 9. Das [] beschreibt 1 Zeichen.
[...][/quote]
Moment mal:
Code: (dl )
1
2
$ perl -le '$, = ", "; print ("149-" =~ /[0-99999]/g)'
1, 4, 9

[0-9] gibt einen Zeichenbereich an, nicht die drei Zeichen '0', '-', '9'!

Nichtsdestotrotz ist das natuerlich nicht der regulaere Ausdruck, den man braucht um das geforderte Format zu erkennen. Dafuer wuerde ich so etwas nehmen:
Code: (dl )
1
2
$ perl -le '$, = ", "; print ("+10510-2043" =~ /([-+])(\d{0,5})([-+])(\d{0,5})/)'
+, 10510, -, 2043
When C++ is your hammer, every problem looks like your thumb.
Gast Gast
 2005-10-25 23:00
#59256 #59256
Hi,
als "vor-Jahren-mal-nebenbei-PerlUser" und jetzt wieder Einsteiger kann ich Dir (hoffentlich nur momentan) nur wenige PerlTipps dazu geben, aber hier mal ein paar laienhafte Hinweise zur Struktur; ich nehme an, Du willst irgendeinen APT-Code nach CNC-Code konvertieren, oder ein Plotfile in ein anderes Format, o.ä. Ich habe sowas ähliches mal mit C# gemacht. Du kannst in Deinem Fall entweder alle Befehle iterativ durch eine Reihe von RegExp's durchlaufen lassen (wie das hier schon erwähnt wurde), oder Du baust Dir eine Tree-ähnliche Struktur, womit jeder Befehl Zeichen für Zeichen durch den Baum läuft, bis der entsprechende Endknoten erreicht ist, der dann bestimmt, um welchen Befehl es sich handelt. (z.B. beinhaltet der Wurzelknoten nur ein "+", die Childknoten dann Zahlen, weitere Zeichen, etc.) Anschliessend baust Du Dir eine abstrakte Klasse zur Befehlsverarbeitung und von dieser leitest Du für jedes zu verarbeitende Befehlswort eine neue Klasse ab, um diesen weiter zu verarbeiten (Ellipse neu berechnen, etc). In diese Klassen kannst Du dann auch direkt das neue Ausgabeformat sowie die Ausgabemethoden implementieren. Wichtig ist aber, dass Du Dir zuvor _alle_ Befehle ansiehst und ein passendes Auswahlverfahren entwickelst.

Viele Grüße
Wolfgang
renee
 2005-10-26 05:17
#59257 #59257
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@murphy: Du hast natuerlich recht...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
popcorn5
 2005-10-26 12:30
#59258 #59258
User since
2003-09-24
60 Artikel
BenutzerIn
[default_avatar]
@gansbachtaluser: genau daran habe ich bislang gearbeitet, nur die problematik besteht darin, dass sich manche befehle im aufbau sehr ähnlich sind und trotzdem etwas sehr unterschiedliches bewirken. ich muss deshalb auch noch die reihenfolge der befehle untersuchen damit die maschine auch was sinnvolles macht. ein beispiel bekomme ich einen befehl für einen kreis (++45+250-120+) dann sind die ersten zwei zeichen gleich einem befehl für eine gerade strecke wo auf der x-achse nicht gefahren wird (++100). hierbei wird nur auf der y-achse 100 mm gefahren.

Aber diesen Ansatz werde ich nun erstmal weiterverfolgen.

Danke
<< >> 10 Einträge, 1 Seite



View all threads created 2005-10-25 13:31.