Auslesen von CNC Texten

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Auslesen von CNC Texten

    Hallo zusammen

    Wie schon in der Überschrift genannt möchte ich einen CNC Text Auslesen. Um genauer zu sein die Fräser darin.
    Es soll ein Programm werden das CNC Texte einliest und die Fräser anzeigt. Als weiteres Feature sollen die einzelnen Fräser als Button (oder anderes) Dargestellt werden um sie "wegklicken zu können".

    Da ich noch Anfänger (kein totaler) bin komm ich schon recht früh nicht mehr weiter. Als Anhang liegt ein CNC Text bei.
    Der CNC text liegt als .txt Datei vor.

    So nun zu meinem Problem. Wie kann ich nun die einzelnen Fräser Positionen die ja mit "WER" gegenzeichnet sind auslesen und diese Anzeigen.
    Wenn dies Funktioniert wie kann ich, wenn ein zweiter CNC text besteht, diese beiden vergleichen und alle Fräser anzeigen (also von beiden Texten) aber ohne das einer Doppelt genannt wird.
    Und als Dritte Frage wie kann ich nun für jede einzelne Werkzeugnummer ein Button (oder Anderes) erzeugen um sie "wegzuklicken"

    Danke schon mal für alle Antworten
    Dateien
    • CNCText.txt

      (321,35 kB, 313 mal heruntergeladen, zuletzt: )
    Hey

    zu 1) du kannst mit einem stringreader jede zeile leile durchspricnge und vergleiche ob diese "WER " enthält (auchtung das leerzeichen ist wichtig) und diese dann herausschneiden

    zu 2) du kannst erst die eine datei auslesen und dann die zewite und über brüfst ob in zb der list of Variable die werkzeugnummer schon existiert

    zu 3) Button zur laufzeit kannst du mit

    VB.NET-Quellcode

    1. Dim cmd As New Button
    2. cmd.name="cmd"
    3. Form1.controls.add(cmd)


    hinzufügen

    lg papst94
    Hey,

    was bedeutet denn die Zahl nach dem Wort "WER". Ist das die Position oder die Bezeichnung des Fräsers? Was willst Du genau damit bezwecken, wenn Du schreibst: "Ich will die Buttons wegklicken"....
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Danke schon mal für den Tipp. Das Auslesen funktioniert schon mal.

    Die Zahl nach dem Wort "WER" ist die Platzbelegung vom Fräser in der Fräsmaschine diesen möchte ich auslesen.
    Um das zu Verstehen muss ich noch was dazu sagen.
    Bevor ich das CNCProgramm "laufen lasse" muss ich alle Fräser anschauen ob diese noch in Ordnung sind.
    Dieses Programm soll mir ersparen jeden CNC text zu öffnen und die Fräser raus zuschreiben.
    Da ich ja schlecht die Fräser auf einem Bildschirm abstreichen kann dachte ich an Buttons die nach betätigen verschwinden.
    Natürlich bin ich für alles offen. Es müssen keine Buttons sein. Es muss einfach Irgendwie ersichtlich sein das der Fräser kontrolliert wurde.

    lg Pixxel
    Hey, finde Dein Vorhaben gut.

    Hier ein Codebeispiel, wie man es machen kann. Beachte die Kommentare im Code. Das Interpretieren der Zeile kann man optimieren, war nur auf die Schnelle. Bin auch nicht sonderlich achtsam, wenn es um sowas geht. Bei Fragen, meld Dich einfach.

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private _listFraesers As New List(Of Fraeser)
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Dim fileName As String = ""
    6. 'CNCText-Datei öffnen. Dies nur als Beispiel.
    7. Using oFD As New OpenFileDialog
    8. If oFD.ShowDialog() = Windows.Forms.DialogResult.OK Then
    9. fileName = oFD.FileName
    10. Else
    11. Application.Exit()
    12. End If
    13. End Using
    14. 'List, die die gesamte TextDatei aufnimmt.
    15. Dim input As New List(Of String)
    16. 'Text in Liste einlesen.
    17. input.AddRange(File.ReadAllLines(fileName))
    18. 'Jeden Eintrag in der Liste durchgehen.
    19. input.ForEach(Sub(s)
    20. 'Wenn eine Zeile, "(WER" enthält, dann..
    21. If s.Contains("(WER") Then
    22. 'Neuen Fräser erzeugen.
    23. Dim f As New Fraeser(s)
    24. 'Prüfen, ob der Fräser schon existiert.
    25. Dim result As Integer = _listFraesers.Where(Function(f1) f1.Position = f.Position).Count
    26. 'Wenn der Fräser nicht existiert, dann....
    27. If result = 0 Then
    28. 'Fräser in die Liste aufnehmen.
    29. _listFraesers.Add(f)
    30. 'Event abonieren, wenn der Button geklickt wurde...
    31. AddHandler f.FraeserChecked, AddressOf Fraeser_Checked
    32. End If
    33. End If
    34. End Sub)
    35. 'Liste von Fräser nach Position sortieren, falls erforderlich...
    36. _listFraesers.Sort(Function(f1, f2) f1.Position.CompareTo(f2.Position))
    37. 'Fräserbutton anzeigen. Hier im Flowlayoutpanel, so muss man sich nicht um die Positionierung kümmern.
    38. _listFraesers.ForEach(Sub(f1)
    39. FlowLayoutPanel1.Controls.Add(f1.FraeserButton)
    40. End Sub)
    41. End Sub
    42. 'Wird ausgeführt, wenn auf einen Fräserbutton geklickt wurde.
    43. Private Sub Fraeser_Checked(sender As Object, e As EventArgs)
    44. Dim f As Fraeser = DirectCast(sender, Fraeser)
    45. _listFraesers.Remove(f)
    46. FlowLayoutPanel1.Controls.Remove(f.FraeserButton)
    47. End Sub
    48. End Class
    49. Public Class Fraeser
    50. Public Property Position As Integer
    51. Public Property FraeserButton As Button
    52. Public Event FraeserChecked As EventHandler
    53. Public Sub New(ByVal line As String)
    54. 'Zeile interpretieren. Hier kann man viel optimieren, nur als schnelles Beispiel.
    55. Me.Position = Integer.Parse(line.Split(";"c)(1).Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)(1).Replace(")", ""))
    56. Me.FraeserButton = New Button With {.Text = Me.Position.ToString()}
    57. AddHandler Me.FraeserButton.Click, AddressOf FraeserButton_Click
    58. End Sub
    59. Protected Overridable Sub OnFraeserChecked()
    60. RaiseEvent FraeserChecked(Me, EventArgs.Empty)
    61. End Sub
    62. Private Sub FraeserButton_Click(sender As Object, e As EventArgs)
    63. OnFraeserChecked()
    64. End Sub
    65. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Hallo pixxel46,

    Hoppala, viele Linkskurven hier :D

    @SpaceyX: irgendwie beides. Beim Werkzeugwechsel wird das Werkzeug über den Index aufgerufen. Dabei werden am Anfang eventuelle Korrekturen (Radiusverringerungen durch z.B. Verschleiss) miteingegeben, damit der Verfahrweg neu berechnet werden kann.

    Ich habe mal 'ne Funktion dazu geschrieben:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim a As String = ""
    3. For Each i As Integer In GetTools("C:\Users\Raphael\Documents\CNCText.txt", "C:\Users\Raphael\Documents\CNCText.txt")
    4. 'Hab' aus Faulheit zweimal die gleiche Datei genommen :D
    5. a &= i & vbCr
    6. Next
    7. MsgBox(a)
    8. End Sub
    9. Private Function GetTools(PathA As String, PathB As String) As List(Of Integer)
    10. Dim ListA As New List(Of Integer)
    11. For Each Line As String In IO.File.ReadAllLines(PathA)
    12. If Line.Contains(" ;(WER ") Then
    13. ListA.Add(CInt(Line.Substring(Line.IndexOf(" ;(WER ") + " ;(WER ".Length, 2)))
    14. End If
    15. Next
    16. Dim ListB As New List(Of Integer)
    17. For Each Line As String In IO.File.ReadAllLines(PathB)
    18. If Line.Contains(" ;(WER ") Then
    19. ListB.Add(CInt(Line.Substring(Line.IndexOf(" ;(WER ") + " ;(WER ".Length, 2)))
    20. End If
    21. Next
    22. Return New List(Of Integer)(ListA.Distinct.Concat(ListB.Distinct.Except(ListA.Distinct)).ToArray)
    23. End Function


    Hat beim Test funktioniert :D

    Bei Fehlern bitte melden.

    EDIT: War ein bisschen zu langsam.. Ich poste's jetzt aber trotzdem...
    ich verstehe vom Text nur Bahnhof, und dasses sich um reichhaltige, komplexe und vlt. auch miteinander verknüpfte Informationen handelt.
    Imo muß mal wieder ein Datenmodell her, was die Realität einer Cnc-Maschine modelliert, und da muß das Zeugs eingelesen werden.

    Danach hat man mächtige Möglichkeiten, um die Daten zu präsentieren.
    Danke schon mal für die vielen Lösungen.

    @SpaceyX
    Fragen hab ich allemal. :P Da ich noch Anfänger bin in VB sieht das recht Kompliziert aus.
    Seh ich das Richtig. Du liest das komplette File ein und liest es Zeilenweise aus. Wenn dann in einer Zeile "WER" vorkommt Speichert er die komplette Zeile ab in Var. "f". Die Zeile wird überprüft ob sie schon vorhanden ist in "_listFräser". Wenn Ja dann macht er nix. Wenn Nein schreibt er es zu der Liste hinzu und generiert einen neuen Button in der Listbox.
    Ich hoff das war jetzt richtig so.

    Und jetzt noch zu einer spezifischen Frage. Wie kann man die Größe der Buttons änder die erstellt wurden.

    VB.NET-Quellcode

    1. Me.FraeserButton = New Button With {.Text = Me.Position.ToString()}

    Ich tipp mal drauf das man es dort dahinter schreiben kann. :)
    Jep, das ganze File wird wird in eine List(Of String) eingelesen. Das ist aber nicht unbedingt erforderlich. Du kannst hier auch mit einem StreamReader rangehen und das File Zeile für Zeile durchgehen. Ist das File eingelesen, so wird jede Zeile, durchgegangen und geprüft, ob sich "(WER" im Text befindet.

    Wird "(WER" gefunden, wird eine Instanz der Klasse Fraeser erzeugt. Diese soll ganz primitiv einen Fraeser darstellen. Die Sub New in der Fraeser-Klasse übernimmt die Zeile, in der "(WER" gefunden wurde und liest die geforderte Information (hier die Position, wenn ich Dich richtig verstanden habe) aus. Diese wird dann in einer Property gespeichert. Ebenfalls wird in der Sub New der Button generiert, den Du ja angezeigt haben willst. Dieser wird auch mit einem EventHandler verbunden (Click). Dieses Ereignis wird dann zur Form durchgereicht und der Button aus der Form entfernt (War ja Deine Anforderung). Durch die Property Position wird geprüft, ob sich dieser Fraeser schon in der Auflistung befindet. Wenn nein, wird er hinzugefügt, wenn ja einfach übergangen.

    VB.NET-Quellcode

    1. Me.FraeserButton = New Button With {.Text = Me.Position.ToString(), .Size = New Size(200, 20)}


    Die Size-Property kannst Du durch ein Komma getrennt, gefolgt von einem . setzen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    pixxel46 schrieb:

    Programm Funktioniert!!
    Hoffentlich länger als eine Woche.
    Diese Scripte werden doch von iwelchen CAD-Maschinen oder so generiert.
    Stelle sicher, dass das, was Du geändert hast, in der CAD-Maschine genau so ankommt, wie Du es Dir gedacht hast :!:
    Möglicherweise speichert die CAD-Maschine noch weitere Daten zu diesem File und dann sind sie ggf. nicht mehr kompatibel.
    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!
    Er will ja die Werkzeuge vor Inbetriebnahme nur prüfen und ggf. ersetzen. Darum das Ganze. Er liest den Quelltext aus, holt sich die Fräser, diese werden als Button dargestellt, er prüft sie, nach Überprüfung wird auf den Button geklickt, der Button verschwindet. Ist nur eine Hilfestellung für ihn, damit er weiß, welche Werkzeuge er schon geprüft hat. Da wird nichts zurückgeschrieben oder sonst was.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    SpaceyX schrieb:

    und ggf. ersetzen

    RodFromGermany schrieb:

    Möglicherweise speichert die CAD-Maschine noch weitere Daten zu diesem File
    Darum das Ganze.
    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!