CNC-Programm über seriellen Port übertragen

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

CNC-Programm über seriellen Port übertragen

Beitrag von Darie »

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
Repeat
PureBasic
ForEver
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: CNC-Programm über seriellen Port übertragen

Beitrag von Thorium »

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! Bild
Benutzeravatar
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

Beitrag von Falko »

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
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

Re: CNC-Programm über seriellen Port übertragen

Beitrag von Darie »

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
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

Re: CNC-Programm über seriellen Port übertragen

Beitrag von Darie »

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

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
Benutzeravatar
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

Beitrag von Falko »

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
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

Re: CNC-Programm über seriellen Port übertragen

Beitrag von Darie »

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...
Repeat
PureBasic
ForEver
Benutzeravatar
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

Beitrag von Falko »

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
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
Darie
Beiträge: 204
Registriert: 14.09.2004 21:51

Re: CNC-Programm über seriellen Port übertragen

Beitrag von Darie »

CNC-Programm erfolgreich übertragen :lurk:
Repeat
PureBasic
ForEver
Benutzeravatar
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

Beitrag von Falko »

Glückwunsch, das es funktioniert :allright:

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
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Antworten