28. april 2005 - 00:07Der 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 .
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 -----------------------------
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 -----------------------------
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 -----------------------------
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 ?
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??
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
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
Når.. okæææ trode du skulle lave et program til en rigtig cnc maskine :D
Synes godt om
Ny brugerNybegynder
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.