CNC-Programm über seriellen Port übertragen
CNC-Programm über seriellen Port übertragen
Ich soll für einen Arbeitskollegen ein Programm schreiben, dass CNC-Programme über die serielle Schnittstelle an eine Drehmaschine überträgt. Bei der Maschine handelt es sich um eine Mori Seiki sl25 mit Fanuc 10t Steuerung. Die CNC-Programme sind Textdateien, die via RTS/CTS Handshaking und, wie mein Kollege mir sagte, Byte für Byte übertragen werden. Kennt sich hier im Forum jemand mit der Übertragung über die ser. Schnittstelle etwas besser aus und kann mir vielleicht sagen, worauf ich bei einem RTS/CTS Handshaking bei der Sendeschleife achten muss ?
So, wie ich das jetzt verstanden habe, kann der Sender munter Daten übermitteln, solange der Empfänger ein CTS-Signal (ClearToSend) zurückgibt. Ist das CTS dann 0 muss solange pausiert werden, bis wieder Daten losgeschickt werden dürfen. Ist das soweit richtig ?
Ich habe meinen Kollegen gebeten, mit dem Tool Serial-Monitor http://www.serialmon.com eine Übertragung zwischen PC und Maschine zu protokollieren, um zu sehen, wie und was gesendet wird. Dennoch möchte ich hier nochmal nachfragen, da ich keine Erfahrung damit habe. Zur Zeit benutzt er noch ein altes DOS-Programm namens NCTERM mit Dongle zum übertragen, welches er so langsam ausrangieren möchte...
Wäre dankbar für eure Unterstützung
Alex
So, wie ich das jetzt verstanden habe, kann der Sender munter Daten übermitteln, solange der Empfänger ein CTS-Signal (ClearToSend) zurückgibt. Ist das CTS dann 0 muss solange pausiert werden, bis wieder Daten losgeschickt werden dürfen. Ist das soweit richtig ?
Ich habe meinen Kollegen gebeten, mit dem Tool Serial-Monitor http://www.serialmon.com eine Übertragung zwischen PC und Maschine zu protokollieren, um zu sehen, wie und was gesendet wird. Dennoch möchte ich hier nochmal nachfragen, da ich keine Erfahrung damit habe. Zur Zeit benutzt er noch ein altes DOS-Programm namens NCTERM mit Dongle zum übertragen, welches er so langsam ausrangieren möchte...
Wäre dankbar für eure Unterstützung
Alex
Repeat
PureBasic
ForEver
PureBasic
ForEver
Re: CNC-Programm über seriellen Port übertragen
Programmiert hab ich das noch nicht aber ich hab an nem Fertigungszentrum mit Fanuc Steuerung ein paar Jahre lang gearbeitet. Wir hatten zum übertragen auch ein DOS Programm genutzt. Wobei das ganze auch nur funktioniert hat, wenn die Boudrate niedriger im Programm eingestellt war als in der Steuerung. Frag mich nicht warum. ^^
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
- Falko
- Admin
- Beiträge: 3531
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0 - Kontaktdaten:
Re: CNC-Programm über seriellen Port übertragen
Ich habe das zwar noch nicht probiert, aber beim OpenSerialPort gibst du
den Parameter #PB_SerialPort_RtsCtsHandshake : RTS/CTS
an und damit müsste das Handshake automatisch ablaufen, ohne das man sich darum kümmern
muss.
Um sicher zu gehen, das die Daten gesendet bzw. empfangen werden, sollte man
die Funktion AvailableSerialPortInput o. ...Output in Verbindung mit While/Wend benutzen.
Zu dieser Steuerung bzw. Parameter habe ich hier noch was gefunden.
Bin mir aber nicht sicher, ob das passt.
http://www.aggsoft.com/cnc-dnc/fanuc-10t.htm
Gruß Falko
den Parameter #PB_SerialPort_RtsCtsHandshake : RTS/CTS
an und damit müsste das Handshake automatisch ablaufen, ohne das man sich darum kümmern
muss.
Um sicher zu gehen, das die Daten gesendet bzw. empfangen werden, sollte man
die Funktion AvailableSerialPortInput o. ...Output in Verbindung mit While/Wend benutzen.
Zu dieser Steuerung bzw. Parameter habe ich hier noch was gefunden.
Bin mir aber nicht sicher, ob das passt.
http://www.aggsoft.com/cnc-dnc/fanuc-10t.htm
Gruß Falko
Re: CNC-Programm über seriellen Port übertragen
Ja, das hilft mir ein wenig weiter. Ich warte erstmal auf das Protokoll von SerialMon. Leider hat mein Kollege kein Handbuch von der Maschine/Steuerung, da müsste sowas ja drinstehen. Sind wohl nicht ganz billig diese Handbücher
Repeat
PureBasic
ForEver
PureBasic
ForEver
Re: CNC-Programm über seriellen Port übertragen
So, bin schon ein Stück weiter mit dem Datenprotokoll von meinem Arbeitskollegen. Ich würde nur gerne wissen, ob man vor jedem Zeichen, das man senden will, den CTS-Signalstatus abfragt oder sendet man nur zu Beginn der Übertragung ein RTS-Signal und wartet dann solange, bis das CTS-Signal anliegt.
Was muss ich sonst noch beim Senden beachten ? Wie sieht es mit dem AvailableSerialPortOutput(#SerialPort) Puffer aus ? Wenn ich den nach dem Senden eines Zeichens debugge, ist er immer leer...
Alex
Was muss ich sonst noch beim Senden beachten ? Wie sieht es mit dem AvailableSerialPortOutput(#SerialPort) Puffer aus ? Wenn ich den nach dem Senden eines Zeichens debugge, ist er immer leer...
Alex
Code: Alles auswählen
Enumeration
#PanelGadget
#Editor_88
#String_77
#Button_82
#Editor_73
#String_71
#String_51
#Frame3D_76
#Text_48
#Text_47
#Text_46
#Text_45
#Text_44
#Text_43
#Text_41
#Text_40
#Text_39
#Text_38
#Text_37
#Text_36
#Text_35
#Text_34
#Text_33
#Text_32
#Text_21
#Text_20
#Text_19
#Text_18
#Text_17
#Text_16
#Frame3D_27
#ComboBox_15
#ComboBox_22
#ComboBox_23
#ComboBox_24
#ComboBox_25
#ComboBox_28
#Frame3D_29
#Frame3D_30
#Frame3D_31
#String_52
#ComboBox_54
#String_55
#ComboBox_58
#ComboBox_61
#ComboBox_62
#ComboBox_63
#ComboBox_64
#ComboBox_65
#ComboBox_66
#ComboBox_67
#String_68
#String_69
#String_70
#Button_78
#Image_79
#Image_80
#ProgressBar_81
#ExplorerTree_83
#Frame3D_84
#Button_85
EndEnumeration
Enumeration
#Image_Image_79
#Image_Image_80
EndEnumeration
Enumeration
#Window
EndEnumeration
Enumeration
#StatusBar_Window
EndEnumeration
DataSection
Image_Image_79:
IncludeBinary "pc.ico"
Image_Image_80:
IncludeBinary "zahnrad.ico"
EndDataSection
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
#Preference = "ncmax.ini"
Global programdata.s
Procedure CreateWindow()
If OpenWindow(#Window, 498, 168, 678, 677, "NC-Max", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_TitleBar)
If CreateStatusBar(#StatusBar_Window, WindowID(#Window))
EndIf
ButtonGadget(#Button_78, 38, 577, 149, 38, "Übertragung starten")
ImageGadget(#Image_79, 218, 579, 32, 32, CatchImage(#Image_Image_79, ?Image_Image_79))
ImageGadget(#Image_80, 589, 579, 32, 32, CatchImage(#Image_Image_80, ?Image_Image_80))
ProgressBarGadget(#ProgressBar_81, 260, 583, 318, 22, 0, 100)
Frame3DGadget(#Frame3D_84, 17, 560, 638, 72, "", #PB_Frame3D_Double|#PB_Frame3D_Flat|#PB_Frame3D_Single)
PanelGadget(#PanelGadget, 17, 15, 639, 535)
AddGadgetItem(#PanelGadget, -1, "CNC-Programme")
EditorGadget(#Editor_88, 13, 384, 602, 98, #PB_Editor_ReadOnly)
StringGadget(#String_77, 194, 319, 366, 22, "", #PB_String_UpperCase|#WS_BORDER)
Frame3DGadget(#Frame3D_76, 11, 18, 602, 350, " Programm auswählen")
ExplorerTreeGadget(#ExplorerTree_83, 34, 52, 430, 242, "*.NC")
ButtonGadget(#Button_85, 33, 316, 147, 27, "Programm laden")
AddGadgetItem(#PanelGadget, -1, "COM1")
ButtonGadget(#Button_82, 474, 449, 139, 38, "Einstellungen speichern")
StringGadget(#String_71, 192, 251, 65, 20, "300", #PB_String_Numeric)
StringGadget(#String_51, 194, 43, 65, 21, "300", #PB_String_Numeric)
TextGadget(#Text_48, 297, 384, 182, 21, "Stringausgabe nach Zeilenende", #SS_CENTERIMAGE)
TextGadget(#Text_47, 297, 357, 182, 21, "Stringausgabe nach (M02/M30)", #SS_CENTERIMAGE)
TextGadget(#Text_46, 297, 330, 182, 21, "Stringausgabe nach Programmende", #SS_CENTERIMAGE)
TextGadget(#Text_45, 297, 302, 182, 21, "Stringausgabe vor Programmbeginn", #SS_CENTERIMAGE)
TextGadget(#Text_44, 297, 276, 182, 21, "Anzahl HEX(00) Zeichen als Nachlauf", #SS_CENTERIMAGE)
TextGadget(#Text_43, 297, 249, 182, 21, "Anzahl HEX(00) Zeichen als Vorlauf", #SS_CENTERIMAGE)
TextGadget(#Text_41, 29, 355, 154, 21, "[%] Zeichen ausfiltern", #SS_CENTERIMAGE)
TextGadget(#Text_40, 29, 329, 154, 21, "St.Zeichen Hex(00-1F) ausfiltern", #SS_CENTERIMAGE)
TextGadget(#Text_39, 29, 303, 154, 21, "Puffergrösse", #SS_CENTERIMAGE)
TextGadget(#Text_38, 29, 277, 154, 21, "Anzeigen von Sonderzeichen", #SS_CENTERIMAGE)
TextGadget(#Text_37, 29, 251, 154, 21, "TimeOut", #SS_CENTERIMAGE)
TextGadget(#Text_36, 30, 151, 154, 21, "St.ZeichenHex (00-1F) ausfiltern", #SS_CENTERIMAGE)
TextGadget(#Text_35, 30, 124, 154, 21, "Einlesen Beenden mit Zeichen", #SS_CENTERIMAGE)
TextGadget(#Text_34, 30, 97, 154, 21, "Puffergrösse", #SS_CENTERIMAGE)
TextGadget(#Text_33, 30, 70, 154, 21, "Anzeigen von Sonderzeichen", #SS_CENTERIMAGE)
TextGadget(#Text_32, 30, 43, 154, 21, "TimeOut", #SS_CENTERIMAGE)
TextGadget(#Text_21, 342, 178, 95, 21, "Handshake", #SS_CENTERIMAGE)
TextGadget(#Text_20, 342, 151, 95, 21, "Stopbits", #SS_CENTERIMAGE)
TextGadget(#Text_19, 342, 124, 95, 21, "Parität", #SS_CENTERIMAGE)
TextGadget(#Text_18, 342, 97, 95, 21, "Datenbits", #SS_CENTERIMAGE)
TextGadget(#Text_17, 342, 43, 95, 21, "Baudrate", #SS_CENTERIMAGE)
TextGadget(#Text_16, 342, 70, 95, 21, "COM-Nummer", #SS_CENTERIMAGE)
Frame3DGadget(#Frame3D_27, 322, 18, 288, 200, " Übertragung ")
ComboBoxGadget(#ComboBox_15, 456, 43, 123, 21)
ComboBoxGadget(#ComboBox_22, 456, 70, 123, 21)
ComboBoxGadget(#ComboBox_23, 456, 97, 123, 21)
ComboBoxGadget(#ComboBox_24, 194, 97, 65, 21)
ComboBoxGadget(#ComboBox_25, 456, 151, 123, 21)
ComboBoxGadget(#ComboBox_28, 456, 178, 123, 21)
Frame3DGadget(#Frame3D_29, 12, 18, 288, 200, " Einlesen ")
Frame3DGadget(#Frame3D_30, 14, 226, 598, 200, " Ausgeben ")
Frame3DGadget(#Frame3D_31, 15, 441, 441, 53, " Extra-Parameter ")
StringGadget(#String_52, 485, 302, 95, 21, "")
ComboBoxGadget(#ComboBox_54, 456, 124, 123, 21)
StringGadget(#String_55, 194, 124, 65, 21, "04")
ComboBoxGadget(#ComboBox_58, 192, 277, 65, 21)
ComboBoxGadget(#ComboBox_61, 194, 70, 65, 21)
ComboBoxGadget(#ComboBox_62, 194, 151, 65, 21)
ComboBoxGadget(#ComboBox_63, 485, 275, 95, 21)
ComboBoxGadget(#ComboBox_64, 485, 248, 95, 21)
ComboBoxGadget(#ComboBox_65, 192, 355, 65, 21)
ComboBoxGadget(#ComboBox_66, 192, 303, 65, 21)
ComboBoxGadget(#ComboBox_67, 192, 329, 65, 21)
StringGadget(#String_68, 485, 329, 95, 21, "")
StringGadget(#String_69, 485, 356, 95, 21, "")
StringGadget(#String_70, 485, 383, 95, 21, "")
AddGadgetItem(#PanelGadget, -1, "Protokoll")
EditorGadget(#Editor_73, 24, 22, 578, 466, #PB_Editor_ReadOnly)
CloseGadgetList()
EndIf
EndProcedure
Procedure FillComboBoxes()
;Baudrate
AddGadgetItem(#ComboBox_15, -1, "50")
AddGadgetItem(#ComboBox_15, -1, "75")
AddGadgetItem(#ComboBox_15, -1, "110")
AddGadgetItem(#ComboBox_15, -1, "150")
AddGadgetItem(#ComboBox_15, -1, "300")
AddGadgetItem(#ComboBox_15, -1, "600")
AddGadgetItem(#ComboBox_15, -1, "1200")
AddGadgetItem(#ComboBox_15, -1, "1800")
AddGadgetItem(#ComboBox_15, -1, "2400")
AddGadgetItem(#ComboBox_15, -1, "4800")
AddGadgetItem(#ComboBox_15, -1, "9600")
AddGadgetItem(#ComboBox_15, -1, "19200")
AddGadgetItem(#ComboBox_15, -1, "38400")
AddGadgetItem(#ComboBox_15, -1, "57600")
AddGadgetItem(#ComboBox_15, -1, "115200")
;COM-Name
AddGadgetItem(#ComboBox_22, -1, "COM1")
AddGadgetItem(#ComboBox_22, -1, "COM2")
AddGadgetItem(#ComboBox_22, -1, "COM3")
;Datenbits
AddGadgetItem(#ComboBox_23, -1, "7")
AddGadgetItem(#ComboBox_23, -1, "8")
;Parität
AddGadgetItem(#ComboBox_54, -1, "NOPARITY")
AddGadgetItem(#ComboBox_54, -1, "EVENPARITY")
AddGadgetItem(#ComboBox_54, -1, "MARKPARITY")
AddGadgetItem(#ComboBox_54, -1, "ODDPARITY")
AddGadgetItem(#ComboBox_54, -1, "SPACEPARITY")
;Stopbit
AddGadgetItem(#ComboBox_25, -1, "1")
AddGadgetItem(#ComboBox_25, -1, "2")
AddGadgetItem(#ComboBox_25, -1, "1.5")
;Protokoll
AddGadgetItem(#ComboBox_28, -1, "NOHANDSHAKE")
AddGadgetItem(#ComboBox_28, -1, "RTSHANDSHAKE")
AddGadgetItem(#ComboBox_28, -1, "RTS/CTS")
AddGadgetItem(#ComboBox_28, -1, "XON/XOFF")
;Einlesen Sonderzeichen
AddGadgetItem(#ComboBox_61, -1, "Ja")
AddGadgetItem(#ComboBox_61, -1, "Nein")
;Einlesen Puffergrösse
AddGadgetItem(#ComboBox_24, -1, "4096")
;Einlesen Hex ausfiltern
AddGadgetItem(#ComboBox_62, -1, "Ja")
AddGadgetItem(#ComboBox_62, -1, "Nein")
;Ausgeben Sonderzeichen
AddGadgetItem(#ComboBox_58, -1, "Ja")
AddGadgetItem(#ComboBox_58, -1, "Nein")
;Ausgeben Puffergrösse
AddGadgetItem(#ComboBox_66, -1, "4096")
;Ausgeben Prozentzeichen ausfiltern
AddGadgetItem(#ComboBox_67, -1, "Ja")
AddGadgetItem(#ComboBox_67, -1, "Nein")
;Ausgeben Hex ausfiltern
AddGadgetItem(#ComboBox_65, -1, "Ja")
AddGadgetItem(#ComboBox_65, -1, "Nein")
;Anzahl Hexzeichen Vorlauf
AddGadgetItem(#ComboBox_64, -1, "0")
AddGadgetItem(#ComboBox_64, -1, "1")
AddGadgetItem(#ComboBox_64, -1, "2")
AddGadgetItem(#ComboBox_64, -1, "3")
;Anzahl Hexzeichen Nachlauf
AddGadgetItem(#ComboBox_63, -1, "0")
AddGadgetItem(#ComboBox_63, -1, "1")
AddGadgetItem(#ComboBox_63, -1, "2")
AddGadgetItem(#ComboBox_63, -1, "3")
EndProcedure
Procedure WritePreference()
;CreatePreferences(#Preference)
OpenPreferences(#Preference)
WritePreferenceString("Baudrate", GetGadgetText(#ComboBox_15))
WritePreferenceString("COM-Nummer", GetGadgetText(#ComboBox_22))
WritePreferenceString("Datenbits", GetGadgetText(#ComboBox_23))
WritePreferenceString("Parität", GetGadgetText(#ComboBox_54))
WritePreferenceString("Stopbits", GetGadgetText(#ComboBox_25))
WritePreferenceString("Protokoll", GetGadgetText(#ComboBox_28))
WritePreferenceString("TimeOut_Einlesen", GetGadgetText(#String_51))
WritePreferenceString("Sonderzeichen_Einlesen", GetGadgetText(#ComboBox_61))
WritePreferenceString("Puffergrösse_Einlesen", GetGadgetText(#ComboBox_24))
WritePreferenceString("Einlesen_Beenden", GetGadgetText(#String_55))
WritePreferenceString("Hex_Ausfiltern_Einlesen", GetGadgetText(#ComboBox_62))
WritePreferenceString("TimeOut_Ausgeben", GetGadgetText(#String_71))
WritePreferenceString("Sonderzeichen_Ausgeben", GetGadgetText(#ComboBox_58))
WritePreferenceString("Puffergrösse_Ausgeben", GetGadgetText(#ComboBox_66))
WritePreferenceString("Prozent_Filtern_Ausgeben", GetGadgetText(#ComboBox_67))
WritePreferenceString("Hex_Ausfiltern_Ausgeben", GetGadgetText(#ComboBox_65))
WritePreferenceString("Anzahl_Hexzeichen_Vorlauf", GetGadgetText(#ComboBox_64))
WritePreferenceString("Anzahl_Hexzeichen_Nachlauf", GetGadgetText(#ComboBox_63))
WritePreferenceString("Stringausgabe_Beginn", GetGadgetText(#String_52))
WritePreferenceString("Stringausgabe_Ende", GetGadgetText(#String_68))
WritePreferenceString("Stringausgabe_(M02/M30)", GetGadgetText(#String_69))
WritePreferenceString("Stringausgabe_nach_Zeilenende", GetGadgetText(#String_70))
ClosePreferences()
EndProcedure
Procedure LoadPreferences()
OpenPreferences(#Preference)
SetGadgetText(#ComboBox_15, ReadPreferenceString("Baudrate", "4800"))
SetGadgetText(#ComboBox_22, ReadPreferenceString("COM-Nummer", "COM1"))
SetGadgetText(#ComboBox_23, ReadPreferenceString("Datenbits", "8"))
SetGadgetText(#ComboBox_54, ReadPreferenceString("Parität", "NOPARITY"))
SetGadgetText(#ComboBox_25, ReadPreferenceString("Stopbits", "1"))
SetGadgetText(#ComboBox_28, ReadPreferenceString("Protokoll", "NOHANDSHAKE"))
SetGadgetText(#String_51, ReadPreferenceString("TimeOut_Einlesen", "300"))
SetGadgetText(#ComboBox_61, ReadPreferenceString("Sonderzeichen_Einlesen", "Nein"))
SetGadgetText(#ComboBox_24, ReadPreferenceString("Puffergrösse_Einlesen", "4096"))
SetGadgetText(#String_55, ReadPreferenceString("Einlesen_Beenden", "04"))
SetGadgetText(#ComboBox_62, ReadPreferenceString("Hex_Ausfiltern_Einlesen", "Nein"))
SetGadgetText(#String_71, ReadPreferenceString("TimeOut_Ausgeben", "300"))
SetGadgetText(#ComboBox_58, ReadPreferenceString("Sonderzeichen_Ausgeben", "Nein"))
SetGadgetText(#ComboBox_66, ReadPreferenceString("Puffergrösse_Ausgeben", "4096"))
SetGadgetText(#ComboBox_67, ReadPreferenceString("Prozent_Filtern_Ausgeben", "Nein"))
SetGadgetText(#ComboBox_65, ReadPreferenceString("Hex_Ausfiltern_Ausgeben", "Nein"))
SetGadgetText(#ComboBox_64, ReadPreferenceString("Anzahl_Hexzeichen_Vorlauf", "0"))
SetGadgetText(#ComboBox_63, ReadPreferenceString("Anzahl_Hexzeichen_Nachlauf", "0"))
SetGadgetText(#String_52, ReadPreferenceString("Stringausgabe_Beginn", ""))
SetGadgetText(#String_68, ReadPreferenceString("Stringausgabe_Ende", ""))
SetGadgetText(#String_69, ReadPreferenceString("Stringausgabe_(M02/M30)", ""))
SetGadgetText(#String_70, ReadPreferenceString("Stringausgabe_nach_Zeilenende", ""))
SetGadgetText(#ExplorerTree_83, ReadPreferenceString("Path", "*.nc"))
ClosePreferences()
EndProcedure
Procedure SendToMachine()
If GetGadgetText(#String_77) = "" : ProcedureReturn : EndIf
Baud = Val(GetGadgetText(#ComboBox_15))
Com.s = GetGadgetText(#ComboBox_22)
DataBits = Val(GetGadgetText(#ComboBox_23))
StopBits = Val(GetGadgetText(#ComboBox_25))
InputBuffer = Val(GetGadgetText(#ComboBox_24))
OutputBuffer = Val(GetGadgetText(#ComboBox_66))
Select GetGadgetText(#ComboBox_54)
Case "NOPARITY"
Parity = #PB_SerialPort_NoParity
Case "EVENPARITY"
Parity = #PB_SerialPort_EvenParity
Case "MARKPARITY"
Parity = #PB_SerialPort_MarkParity
Case "ODDPARITY"
Parity = #PB_SerialPort_OddParity
Case "SPACEPARITY"
Parity = #PB_SerialPort_SpaceParity
EndSelect
Select GetGadgetText(#ComboBox_28)
Case "NOHANDSHAKE"
Handshake = #PB_SerialPort_NoHandshake
Case "RTSHANDSHAKE"
Handshake = #PB_SerialPort_RtsHandshake
Case "RTS/CTS"
Handshake = #PB_SerialPort_RtsCtsHandshake
Case "XON/XOFF"
Handshake = #PB_SerialPort_XonXoffHandshake
EndSelect
port = OpenSerialPort(#PB_Any, Com, Baud, Parity, DataBits, Stopbits, Handshake, InputBuffer, OutputBuffer)
ClearGadgetItems(#Editor_88)
;Prozentsatz = Anzahl / (Gesamtzahl/100)
datalen = Len(Programdata)
If Port <> 0
AddGadgetItem(#Editor_88, -1, "serielle Schnittstelle geöffnet ("+ Str(port)+")")
Else
AddGadgetItem(#Editor_88, -1, "Fehler! serielle Schnittstelle konnte nicht geöffnet werden.")
ProcedureReturn
EndIf
If Handshake = #PB_SerialPort_RtsCtsHandshake
SetSerialPortStatus(port, #PB_SerialPort_RTS, 1)
AddGadgetItem(#Editor_88, -1, "RTS an Maschine gesendet, warte auf Antwort...")
EndIf
SetGadgetText(#Button_78, "Abbrechen")
For i = 1 To Len(programdata)
If Handshake = #PB_SerialPort_RtsCtsHandshake
While GetSerialPortStatus(port, #PB_SerialPort_CTS) = 0
Ev = WaitWindowEvent(10)
If Ev = #PB_Event_Gadget
EventGadget = EventGadget()
EndIf
If EventGadget = #Button_78
Breakk = 1
Break
EndIf
Wend
If Breakk = 1
AddGadgetItem(#Editor_88, -1, "Übertragung vorzeitig abgebrochen.")
SetGadgetText(#Button_78, "Übertragung starten")
SetGadgetState(#ProgressBar_81, 0)
SetSerialPortStatus(port, #PB_SerialPort_RTS, 0)
CloseSerialPort(Port)
ProcedureReturn
EndIf
EndIf
If Handshake = #PB_SerialPort_RtsCtsHandshake
If CTS = 0 : AddGadgetItem(#Editor_88, -1, "CTS von Maschine erhalten. Daten werden übertragen...") : CTS = 1 : EndIf
EndIf
Tick = WriteSerialPortString(Port, Mid(programdata,i,1)) ;: Debug AvailableSerialPortOutput(port)
If Tick = 0
Error = SerialPortError(Port)
AddGadgetItem(#Editor_88, -1, "Übertragungsfehler !!! Error "+ Str(Error))
Else
Bytes + Tick
Prozent = Bytes / (datalen / 100)
SetGadgetState(#ProgressBar_81, Prozent)
EndIf
Ev = WindowEvent()
If Ev = #PB_Event_Gadget
EventGadget = EventGadget()
EndIf
If EventGadget = #Button_78
AddGadgetItem(#Editor_88, -1, "Übertragung vorzeitig abgebrochen.")
SetGadgetText(#Button_78, "Übertragung starten")
SetSerialPortStatus(port, #PB_SerialPort_RTS, 0)
SetGadgetState(#ProgressBar_81, 0)
CloseSerialPort(Port)
ProcedureReturn
EndIf
Next i
If Handshake = #PB_SerialPort_RtsCtsHandshake
SetSerialPortStatus(port, #PB_SerialPort_RTS, 0)
EndIf
CloseSerialPort(Port)
AddGadgetItem(#Editor_88, -1, "Übertragung beendet. " + Str(Bytes)+ " Bytes gesendet.")
SetGadgetText(#Button_78, "Übertragung starten")
SetGadgetText(#String_77, "")
EndProcedure
Procedure LoadProgram()
If GetGadgetState(#ExplorerTree_83) = #PB_Explorer_Directory : ProcedureReturn : EndIf
file.s = GetGadgetText(#ExplorerTree_83)
filepart.s = GetFilePart(file)
SetGadgetText(#String_77, filepart)
OpenPreferences(#Preference)
WritePreferenceString("Path", GetPathPart(file))
ClosePreferences()
ClearGadgetItems(#Editor_73)
programdata = ""
If ReadFile(0, file)
length = Lof(0)
*Mem = AllocateMemory(length)
If *Mem
bytes = ReadData(0, *Mem, length)
EndIf
CloseFile(0)
EndIf
programdata = PeekS(*Mem,length) : FreeMemory(*Mem)
; programdata = RemoveString(programdata, Chr(1))
; programdata = RemoveString(programdata, Chr(2))
; programdata = RemoveString(programdata, Chr(3))
; programdata = RemoveString(programdata, Chr(4))
; programdata = RemoveString(programdata, Chr(5))
; programdata = RemoveString(programdata, Chr(6))
; programdata = RemoveString(programdata, Chr(7))
; programdata = RemoveString(programdata, Chr(8))
; programdata = RemoveString(programdata, Chr(9))
; programdata = RemoveString(programdata, Chr(11))
; programdata = RemoveString(programdata, Chr(12))
; programdata = RemoveString(programdata, Chr(13))
; programdata = RemoveString(programdata, Chr(14))
; programdata = RemoveString(programdata, Chr(15))
; programdata = RemoveString(programdata, Chr(16))
; programdata = RemoveString(programdata, Chr(17))
; programdata = RemoveString(programdata, Chr(18))
; programdata = RemoveString(programdata, Chr(19))
; programdata = RemoveString(programdata, Chr(20))
; programdata = RemoveString(programdata, Chr(21))
; programdata = RemoveString(programdata, Chr(22))
; programdata = RemoveString(programdata, Chr(23))
; programdata = RemoveString(programdata, Chr(24))
; programdata = RemoveString(programdata, Chr(25))
; programdata = RemoveString(programdata, Chr(26))
; programdata = RemoveString(programdata, Chr(27))
; programdata = RemoveString(programdata, Chr(28))
; programdata = RemoveString(programdata, Chr(29))
; programdata = RemoveString(programdata, Chr(30))
; programdata = RemoveString(programdata, Chr(31))
; For i = 1 To Len(programdata)
; ;Debug Mid(programdata,i,1)
; Debug Asc(Mid(programdata,i,1))
; Next i
programdata = ReplaceString(programdata, Chr(10), (Chr(13)+Chr(10)))
SetGadgetText(#Editor_73, programdata)
SetGadgetState(#ProgressBar_81, 0)
ClearGadgetItems(#Editor_88)
EndProcedure
CreateWindow()
FillComboBoxes()
LoadPreferences()
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
EventGadget = EventGadget()
EventType = EventType()
If EventGadget = #PanelGadget
ElseIf EventGadget = #Editor_88
ElseIf EventGadget = #String_77
ElseIf EventGadget = #Button_82 : WritePreference()
ElseIf EventGadget = #Editor_73
ElseIf EventGadget = #String_71
ElseIf EventGadget = #String_51
ElseIf EventGadget = #Frame3D_76
ElseIf EventGadget = #Text_48
ElseIf EventGadget = #Text_47
ElseIf EventGadget = #Text_46
ElseIf EventGadget = #Text_45
ElseIf EventGadget = #Text_44
ElseIf EventGadget = #Text_43
ElseIf EventGadget = #Text_41
ElseIf EventGadget = #Text_40
ElseIf EventGadget = #Text_39
ElseIf EventGadget = #Text_38
ElseIf EventGadget = #Text_37
ElseIf EventGadget = #Text_36
ElseIf EventGadget = #Text_35
ElseIf EventGadget = #Text_34
ElseIf EventGadget = #Text_33
ElseIf EventGadget = #Text_32
ElseIf EventGadget = #Text_21
ElseIf EventGadget = #Text_20
ElseIf EventGadget = #Text_19
ElseIf EventGadget = #Text_18
ElseIf EventGadget = #Text_17
ElseIf EventGadget = #Text_16
ElseIf EventGadget = #Frame3D_27
ElseIf EventGadget = #ComboBox_15
ElseIf EventGadget = #ComboBox_22
ElseIf EventGadget = #ComboBox_23
ElseIf EventGadget = #ComboBox_24
ElseIf EventGadget = #ComboBox_25
ElseIf EventGadget = #ComboBox_28
ElseIf EventGadget = #Frame3D_29
ElseIf EventGadget = #Frame3D_30
ElseIf EventGadget = #Frame3D_31
ElseIf EventGadget = #String_52
ElseIf EventGadget = #ComboBox_54
ElseIf EventGadget = #String_55
ElseIf EventGadget = #ComboBox_58
ElseIf EventGadget = #ComboBox_61
ElseIf EventGadget = #ComboBox_62
ElseIf EventGadget = #ComboBox_63
ElseIf EventGadget = #ComboBox_64
ElseIf EventGadget = #ComboBox_65
ElseIf EventGadget = #ComboBox_66
ElseIf EventGadget = #ComboBox_67
ElseIf EventGadget = #String_68
ElseIf EventGadget = #String_69
ElseIf EventGadget = #String_70
ElseIf EventGadget = #Button_78 : SendToMachine()
ElseIf EventGadget = #Image_79
ElseIf EventGadget = #Image_80
ElseIf EventGadget = #ProgressBar_81
ElseIf EventGadget = #ExplorerTree_83
ElseIf EventGadget = #Frame3D_84
ElseIf EventGadget = #Button_85 : LoadProgram()
EndIf
Case #PB_Event_CloseWindow
EventWindow = EventWindow()
If EventWindow = #Window
CloseWindow(#Window)
Break
EndIf
EndSelect
ForEver
Repeat
PureBasic
ForEver
PureBasic
ForEver
- Falko
- Admin
- Beiträge: 3531
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0 - Kontaktdaten:
Re: CNC-Programm über seriellen Port übertragen
Zwar habe ich selbst noch nichts mit Handshake gemacht, aber hier,
denke ich, ist es sehr schön beschrieben.
Speziell zu CTS und RTS:
http://www.sprut.de/electronic/interfac ... /rs232.htm
Also müßte das CTS von der Gegenseite ständig überprüft werden ob man
Daten senden darf.
Ich habe nun dein Programm nicht ausprobiert, aber ich würde das
AvailableSerialPortOutput(port) gleich vor dem String senden mit einer While-Schleife
anfangen. Denn wenn der String schon gesendet wurde, wird man keine Anzahl der Bytes
mit dem Debug feststellen können.
Gruß Falko
denke ich, ist es sehr schön beschrieben.
Speziell zu CTS und RTS:
http://www.sprut.de/electronic/interfac ... /rs232.htm
Also müßte das CTS von der Gegenseite ständig überprüft werden ob man
Daten senden darf.
Ich habe nun dein Programm nicht ausprobiert, aber ich würde das
AvailableSerialPortOutput(port) gleich vor dem String senden mit einer While-Schleife
anfangen. Denn wenn der String schon gesendet wurde, wird man keine Anzahl der Bytes
mit dem Debug feststellen können.
Gruß Falko
Re: CNC-Programm über seriellen Port übertragen
So wie im Artikel beschrieben habe ich die Sendeschleife auch programmiert. Morgen berichtet mir mein Kollege, ob es reibungslos funktioniert hat.
AvailableSerialPortOutput(port) ist trotzdem 0, auch wenn ich es vor dem Senden abfrage, vielleicht liegts daran, dass ich bei mir zuhause keine Maschine habe, die die Daten auch in Empfang nimmt...
AvailableSerialPortOutput(port) ist trotzdem 0, auch wenn ich es vor dem Senden abfrage, vielleicht liegts daran, dass ich bei mir zuhause keine Maschine habe, die die Daten auch in Empfang nimmt...
Repeat
PureBasic
ForEver
PureBasic
ForEver
- Falko
- Admin
- Beiträge: 3531
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0 - Kontaktdaten:
Re: CNC-Programm über seriellen Port übertragen
Du könntest es hiermit testen. Hiermit kannst du viertuell alles testen.
http://www.heise.de/software/download/com0com/49731
Dazu müsstest du nur noch ein Empfängerprogramm schreiben, was ebenfalls auf Daten
wartet und die CTS / RTS - Signale auswertet.
Gruß, Falko
http://www.heise.de/software/download/com0com/49731
Dazu müsstest du nur noch ein Empfängerprogramm schreiben, was ebenfalls auf Daten
wartet und die CTS / RTS - Signale auswertet.
Gruß, Falko
Re: CNC-Programm über seriellen Port übertragen
CNC-Programm erfolgreich übertragen
Repeat
PureBasic
ForEver
PureBasic
ForEver
- Falko
- Admin
- Beiträge: 3531
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0 - Kontaktdaten:
Re: CNC-Programm über seriellen Port übertragen
Glückwunsch, das es funktioniert
Wenn ich wüsste, wie man an einer Walter Helitronic 50 CNC Daten übertragen könnte,
hatte ich mich auch damit beschäftigt. Das Problem ist nur, das es mal früher dafür
entweder DOS-Programme oder CPM-Programme wie Heliprog.com und Menü.com und
noch ein weiteres Programm mal gab, womit man diese Schleifmaschine selbst programmieren
kann. Zwar habe ich diese Programmdisketten ) 3,5" , welche die Programme selbst beinhalten,
nur kann ich diese nicht auf irgendein PC mit Diskettenlaufwerk einsehen, da das Diskettenformat
nicht erkannt wird. Ich nehme an, das man dazu ein CPM-Betriebssystem benötigt.
Wenn das geklappt hätte, hätte ich auch versucht ein eigenes Programm dafür zu schreiben.
Naja, vielleicht kennt hier jemand diese Walter CNC-Maschinen-Programme, und und könnte mir dazu
vielleicht einige Infos zu geben
Gruß Falko
Wenn ich wüsste, wie man an einer Walter Helitronic 50 CNC Daten übertragen könnte,
hatte ich mich auch damit beschäftigt. Das Problem ist nur, das es mal früher dafür
entweder DOS-Programme oder CPM-Programme wie Heliprog.com und Menü.com und
noch ein weiteres Programm mal gab, womit man diese Schleifmaschine selbst programmieren
kann. Zwar habe ich diese Programmdisketten ) 3,5" , welche die Programme selbst beinhalten,
nur kann ich diese nicht auf irgendein PC mit Diskettenlaufwerk einsehen, da das Diskettenformat
nicht erkannt wird. Ich nehme an, das man dazu ein CPM-Betriebssystem benötigt.
Wenn das geklappt hätte, hätte ich auch versucht ein eigenes Programm dafür zu schreiben.
Naja, vielleicht kennt hier jemand diese Walter CNC-Maschinen-Programme, und und könnte mir dazu
vielleicht einige Infos zu geben
Gruß Falko