Koordinaten sollen aus einer Textdatei herausgefiltert werden!!!

  • VB6

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Eierlein.

    Koordinaten sollen aus einer Textdatei herausgefiltert werden!!!

    Hallo zusammen, wieder mal eine kleine Frage :)

    Ich möchte X,Y,Z Koordinaten aus einem CNC-Programm (Fräsmaschine) isolieren und davor jeweils ein G65 P9810 stehen haben.

    Das ist ein kleiner Ausschnitt aus einem CNC-Programm
    N190 X5.795 Y1.458 Z-0.410
    N200 X6.315 Y-4.765 Z-0.441
    N210 X5.837 Y0.345 Z-0.384
    N220 X8.345 Y9.456 Z0.564

    Und so sollte das fertige Programm aussehen
    G65 P9810 X5.795 Y1.458 Z-0.410
    G65 P9810 X6.315 Y-4.765 Z-0.441
    G65 P9810 X5.837 Y0.345 Z-0.384
    G65 P9810 X8.345 Y9.456 Z0.564

    Die X und Y Koordinaten werden so ausgegeben wie ich sie brauche aber die Z Koordinate wird nich mit reingeschrieben. Da bringt er mir immer eine Fehlermeldung....schon mal DANKE im vorraus ;)

    Mein derzeitiger Quellcode:

    Visual Basic-Quellcode

    1. Private Sub start_Click()
    2. ' aus Programm.ini datei nur X Y Z Befehle in programm1.text einlesen
    3. Dim t As String
    4. Dim DName As String
    5. Dim X As String
    6. Dim Y As String
    7. Dim p1 As Long, p2 As Long
    8. Dim xyText As String
    9. DName = "E:\Programm.ini"
    10. Open DName For Input As #1
    11. xyText = ""
    12. While Not EOF(1)
    13. Line Input #1, t
    14. If Len(t) Then
    15. If InStr(LCase$(t), "x") Then 'ganz wichtig das erste wort in der zeile mit einem Kleinbuchstaben definieren
    16. p1 = InStr(1, t, " ")
    17. p2 = InStr(p1 + 1, t, " ")
    18. X = "G65 P9810 X" & Format$(Val(Mid$(t, p1 + 2, p2 - p1 - 2)), "0.000")
    19. p1 = InStr(p2 + 0, t, " ")
    20. p2 = InStr(p1 + 1, t, " ")
    21. Y = " Y" & Format$(Val(Mid$(t, p1 + 2, p2 - p1 - 2)), "0.000")
    22. p1 = InStr(p2 + 0, t, " ")
    23. p2 = InStr(p1 + 1, t, " ")
    24. Z = " Z" & Format$(Val(Mid$(t, p1 + 2, p2 - p1 - 2)), "0.000")
    25. xyText = xyText & X & Y & vbCrLf
    26. End If
    27. p1 = InStr(1, xyText, ",")
    28. While p1 > 0
    29. xyText = Mid$(xyText, 1, p1 - 1) & "." + Mid$(xyText, p1 + 1)
    30. p1 = InStr(p1, xyText, ",")
    31. Wend
    32. End If
    33. Wend
    34. Close
    35. Programm2.Text = xyText
    36. End Sub
    Zeile 33

    maximus6666 schrieb:

    Visual Basic-Quellcode

    1. xyText = xyText & X & Y & vbCrLf
    fehlt da das Z oder ja :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    maximus6666 schrieb:

    Da bringt er mir immer eine Fehlermeldung

    VB oder die CNC?
    Wenn VB: Welche, in welcher Zeile?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    maximus6666 schrieb:

    VB meckert...
    Mecker Mecker
    oder
    Der String enthält keine darstellbare Zahl oder so?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ja könnte sein das der String keinen Wert enhält, weil wenn die Fehlermeldung kommt is die Zeile ja gelb markiert und wenn ich mit dem Mauszeiger über das erste "Z" gehe wird (Z = leer) eingeblendet !?!?! bei den anderen Koordinaten erscheint der richtige Wert!
    Nimm mal für Z nicht Mid$ sondern Right$ mit dem richtigen Startindex.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die right variante kann ich nicht hernehmen, weil da muss ich ja angeben wie viele zeichen ich von rechts nach links haben will, und es ist ja ziemliich warscheinlich dass die Z koordinate in einem anderen Programm auch mal größer wird z.B. Z129.458 und dann würde die Kommastelle falsch gesetzt!!!
    Ergreif doch mal die Initiative.
    Nimm Mid$ mit nur Startindex.
    Setz da einen Haltepunkt drauf, sieh Dir an, was in den Variablen drinsteht und in 30 Sekunden hast Du die Lösung gefunden. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich würde es anders machen,

    ich würde den string z.b. "N190 X5.795 Y1.458 Z-0.410" mit leerzeichen splitten (sagen wir mal in die variable t)

    dann kannst du folgendes machen:

    Visual Basic-Quellcode

    1. select case t(0)
    2. Case "N190"
    3. xyText = xyText & vbCrLf & "G65 P9810 " & t(1) & t(2) & t(3)
    4. 'und so weiter und so fort...
    5. end select
    Noch einfacher.
    Wieso ersetzt Du nicht einfach N190 durch G65 P9810 :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wieso ersetzt Du nicht einfach N190 durch G65 P9810
    ganz einfach, weil ich noch mit VB5 Programmier und die Replace funktion gibt es erst ab VB6 und sich solch eine anweisung in vb5 selber zusammenzubasteln übersteigt meine Kenntnisse :)

    und splitten ist auch keine elegante lösung, meiner Meihnung nach. Weil ein CNC-Programm von der länge variiert (es kann 100 oder auch 100.000) Zeilen haben :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „maximus6666“ ()

    Ich hab bewusst ersetz geschrieben.
    Mach Mid$ beim 1. Leerzeichen mit dem Rest sdes Strings und addiere den anderen davor.
    Das Rauspicken des x-Wertes hat doch auch geklappt. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Visual Basic-Quellcode

    1. Private Sub start_Click()
    2. Dim t As String
    3. Dim DName As String
    4. Dim xyText As String
    5. DName = "E:\Programm.ini"
    6. Open DName For Input As #1
    7. xyText = ""
    8. While Not EOF(1)
    9. Line Input #1, t
    10. If Len(t) Then
    11. xyText = xyText & "G65 P9810" & Mid$(t, 5) & VbCrLf
    12. End If
    13. Wend
    14. Close
    15. Programm2.Text = xyText
    16. End Sub
    Nur kannst du mir trotzdem sagen wo mein Fehler besteht????


    RodFromGermany hat dich schon drauf hingewiesen. (17.51).

    Visual Basic-Quellcode

    1. p1 = INSTR(p2 + 0, t, " ")
    2. 'p2 = INSTR(p1 + 1, t, " ") '<----- Es gibt am Ende kein Leerzeichen mehr
    3. Z = " Z" & FORMAT$(VAL(MID$(t, p1 + 2)), "0.000") '<----- Deswegen MID$ ohne Längenangabe.
    4. '<----- Bedeutet: Von p1+2 bis zum Zeilenende.
    5. xyText = xyText & X & Y & Z & VBCRLF