Avatar billede Mr. Nybegynder
28. april 2005 - 00:07 Der er 10 kommentarer og
2 løsninger

Split af data fra TXT fil

Hej
Er der en der kan klare denne her
Jeg er ved at lave et program (VB6,0) til en cnc maskine med stepper motorer, dertil skal jeg bruge nogle data der kan styrer motorerne, G kode programmering, data filen kan ser således ud
G00 X0
G00 Z-0,5
G01 X4,028 Y0,186 Z-0,5
G01 X4,028 Y2,533 Z-0,5
G01 X0 Y2,533 Z-0,5
G01 X0 Y0,186 Z-0,5
G00 Z1
G00 X0,485 Y0,437
G00 Z-0,5
G01 X0,489 Y0,415 Z-0,5
G01 X0,501 Y0,398 Z-0,5
G01 X0,519 Y0,386 Z-0,5
Det er en alm. *.txt fil
Data vil altid fremkomme på denne måde, men de vil altid fremkomme i blokke af 2, 3 eller 4

Det jeg skal bruge er data som split
For eks.
G00  men kun 00 som værdi
G01  men kun 01 som værdi
X4,028 men kun 4,028 som værdi
Y0,186 men kun 0,186 som værdi
Z-0,5    men kun -0,5  som væedi

Der skal læses en linje af gangen, og ventes til kommandoen er udført, og så skal den næste linje læses og udføres .

Hilsen Pylle
Avatar billede sjh Nybegynder
28. april 2005 - 00:53 #1
' ----------------------------- Form1 -----------------------------
' Så skal du bare loppe alle dine linjer
Option Explicit

Private Sub Form_Load()
Dim strLine As String
Dim arrXYX() As Double

  Me.AutoRedraw = True

  strLine = "G01 X0,489 Y0,415 Z-0,5" '<- Linje
  arrXYX = GetXYZ(strLine)

  Print "X: " & arrXYX(0) ' X
  Print "Y: " & arrXYX(1) ' Y
  Print "Z: " & arrXYX(2) ' Z
End Sub

Public Function GetXYZ(strLine As String) As Double()
Dim i As Integer
Dim intSel As Integer
Dim strOne As String
Dim arrOut(2) As Double
Dim arrSave(2) As String
  intSel = -1
  For i = 1 To Len(strLine)
    strOne = Mid$(strLine, i, 1)
    Select Case UCase$(strOne)
          Case "0" To "9", ",", ".", "-"
            If intSel >= 0 Then
              arrSave(intSel) = (arrSave(intSel) & strOne)
            End If
          Case "X"
            intSel = 0
          Case "Y"
            intSel = 1
          Case "Z"
            intSel = 2
    End Select
  Next
  For i = 0 To 2
    If Len(arrSave(i)) > 0 Then
      arrOut(i) = CDbl(arrSave(i))
    End If
  Next
  GetXYZ = arrOut
End Function
' ----------------------------- Form1 -----------------------------
Avatar billede sjh Nybegynder
28. april 2005 - 00:58 #2
Glemte lige "G" :D

' ----------------------------- Form1 -----------------------------
' Så skal du bare loppe alle dine linjer
Option Explicit

Private Sub Form_Load()
Dim strLine As String
Dim arrXYX() As String

  Me.AutoRedraw = True

  strLine = "G01 X0,489 Y0,415 Z-0,5" '<- Linje
  arrXYX = GetXYZ(strLine)

  Print "G: " & arrXYX(0) ' G
  Print "X: " & arrXYX(1) ' X
  Print "Y: " & arrXYX(2) ' Y
  Print "Z: " & arrXYX(3) ' Z
End Sub

Public Function GetXYZ(strLine As String) As String()
Dim i As Integer
Dim intSel As Integer
Dim strOne As String
Dim arrOut(3) As String
  intSel = -1
  For i = 1 To Len(strLine)
    strOne = Mid$(strLine, i, 1)
    Select Case UCase$(strOne)
          Case "0" To "9", ",", ".", "-"
            If intSel >= 0 Then
              arrOut(intSel) = (arrOut(intSel) & strOne)
            End If
          Case "G"
            intSel = 0
          Case "X"
            intSel = 1
          Case "Y"
            intSel = 2
          Case "Z"
            intSel = 3
    End Select
  Next
  GetXYZ = arrOut
End Function
' ----------------------------- Form1 -----------------------------
Avatar billede sjh Nybegynder
28. april 2005 - 01:10 #3
Nu skulle den være som du ønsker.. ;)

' ----------------------------- Form1 -----------------------------
Option Explicit

Private Sub Form_Load()
Dim strFile As String
Dim strLine As String
Dim intFree As Integer
Dim arrXYX() As String

  Me.AutoRedraw = True

  strFile = "C:\cnc.txt" '<- Stig til din file.
  intFree = FreeFile
  Open strFile For Input As #intFree
    Do While Not EOF(intFree)
      Line Input #intFree, strLine
      If Len(strLine) > 0 Then
        arrXYX = GetXYZ(strLine)
        '--- Her kommer det ud. ---
        Print "G: " & arrXYX(0) ' G
        Print "X: " & arrXYX(1) ' X
        Print "Y: " & arrXYX(2) ' Y
        Print "Z: " & arrXYX(3) ' Z
        '--- Her kommer det ud. ---
      End If
    Loop
  Close #intFree
End Sub

Public Function GetXYZ(strLine As String) As String()
Dim i As Integer
Dim intSel As Integer
Dim strOne As String
Dim arrOut(3) As String
  intSel = -1
  For i = 1 To Len(strLine)
    strOne = Mid$(strLine, i, 1)
    Select Case UCase$(strOne)
          Case "0" To "9", ",", ".", "-"
            If intSel >= 0 Then
              arrOut(intSel) = (arrOut(intSel) & strOne)
            End If
          Case "G"
            intSel = 0
          Case "X"
            intSel = 1
          Case "Y"
            intSel = 2
          Case "Z"
            intSel = 3
    End Select
  Next
  GetXYZ = arrOut
End Function
' ----------------------------- Form1 -----------------------------
Avatar billede Mr. Nybegynder
28. april 2005 - 14:17 #4
Hej sjh fin løsning der virker (3.)

Jeg mangler funktionen der kan lave en tids forsinkelse, mellem print af hver data, da den skal bruges medens kommandoen udføres fysisk, jeg har prøvet med en Sleep funktion men kan ikke rigtig få det til at virke.
Har du en ide hertil ?

Hilsen
Pylle
Avatar billede sjh Nybegynder
28. april 2005 - 17:58 #5
Ja hvis det er en cnc maskine med stepper motorer.. så skal du have en tilbagemelding ellers kan du ikke vide hvor langt steppen er nået.. så duer det ikke med en timer

det print/driver som styrer motoren kan det ikke komme med en event når steppen har nået sit punkt??
Avatar billede sjh Nybegynder
28. april 2005 - 18:33 #6
Når du har fundet din event funktion så kan du gøre sådan..


Option Explicit

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private ControlEvent As Boolean

' OBS -- Dette er bare lavet med en timer for at teste -- OBS
Private Sub Timer1_Timer()
  'når steppen har nået sit punkt, kommer der en event her.
  ControlEvent = True
End Sub

Private Sub Form_Load()
Dim strFile As String
Dim strLine As String
Dim intFree As Integer
Dim arrXYX() As String

  Me.AutoRedraw = True
  Me.Show

  strFile = "C:\cnc.txt" '<- Stig til din file.
  intFree = FreeFile
  Open strFile For Input As #intFree
    Do While Not EOF(intFree)
      Line Input #intFree, strLine
      If Len(strLine) > 0 Then
        arrXYX = GetXYZ(strLine)
        '--- Her kommer det ud. ---
        Print "G: " & arrXYX(0) ' G
        Print "X: " & arrXYX(1) ' X
        Print "Y: " & arrXYX(2) ' Y
        Print "Z: " & arrXYX(3) ' Z
        'Print "----------------"
        '--- Her kommer det ud. ---

        '--- Her din Event pauese --
        ControlEvent = False
        Do Until ControlEvent
          DoEvents: Sleep 1
        Loop
        '--- Her din Event pauese --
      End If
    Loop
  Close #intFree
End Sub
Avatar billede Mr. Nybegynder
28. april 2005 - 23:16 #7
Hej shj det virker !!!!
Jeg vil arbejde vidre med mit projekt herfra  TT
100 point til dig
hilsen Pylle
Avatar billede sjh Nybegynder
28. april 2005 - 23:22 #8
fik du steppen til at give en event?? eller bruger du bare Timer1??

tak for point
Avatar billede Mr. Nybegynder
28. april 2005 - 23:33 #9
Har ikke besluttet om jeg vil bruge timer eller event
arbejder på sagen
Avatar billede sjh Nybegynder
28. april 2005 - 23:37 #10
hvis du kan få en tilbagemelding fra steppen om at den er nået til sit punkt, så er det helt klart det bedste ;)

Hvis du bruger Timer1 så kan du jo ikke vide om steppen er klar til næste G,X,Y,Z..
Avatar billede Mr. Nybegynder
28. april 2005 - 23:50 #11
Jo det ville være fint med en tilbagemelding fra steppen, men en encoder koster ca 1.000.000.- eller deromkring,så jeg vil se om jeg kan finde på en løsning ;)
mit projekt er på ren hobby basis
Avatar billede sjh Nybegynder
28. april 2005 - 23:59 #12
Når.. okæææ trode du skulle lave et program til en rigtig cnc maskine :D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester