Hallo mk-soft,
Danke für dein Beispiel - aber dass ist mir im moment zu Fett - ich komme aus der Bascom Fraktion - habe bisher nur µC geproggt und versuche nun den Einstieg in PB.
Ich verstehe dein Beispiel nicht weil ich mich erst mit Structure befassen muss. - sorry ist nicht böse gemeint - ich ärgere mich nur über mich selbst weil ich auf der Stelle trete.
Ich stelle vieleich mal mein Projekt kurz vor:
Es soll eine Steuerung einer Komplexen Antennenanlage sein - bin Funkamateur.
Die Antennenanlage besteht aus einer Reihe von Busteilnehmern auf Basis RS485
Teilnehmer sind:
- Switchbox zum Schalten von Filter, Fernspeisungen und Empfänger
- zwei Antennenumschalter
- Antennentuner
- Antennenrotor
Diese Busteilnehmer sind vorhanden und werden derzeitig über einen Controller ATMega128 mit Touch-Display gesteuert.
Es ist alles in Bascom realisiert worden.
Es besteht eine permanente Verbindung zum RS485 Bus und es kann alles simultan bedient werden.
Realisiert wurde es über eine gemeinsame Mainloop.
Dieses Projekt (Controller) möchte ich nun in PB realisieren.
Ich hänge mal ein paar Programmschnipsel an.
Noch mal zu dem Steppmotoren.
Die haben ein RS485 Interface und können jederzeit mit Daten gefüttert werden - d.h. auch wenn er läuft kann ich ihm eine neue Pos mitteilen bzw die aktuelle pos jederzeit abfragen.
Motorantworten werden immer abgeholt so dass der Bus immer leer ist und sich nichts überschneiden kann.
Meine Idee war nun, da ich ja keinen ATMega mer habe sondern einen PC - so sollten prozesse auch im Hintergrund laufen können.
Mit einem TrackBar gebe ich die sollPosition vor - der Motor läuft. In einem TextGetgat soll dann die aktuellePos mitlaufen (momentan in der Console)
Während der Moter sich seiner Sollposition nähert möchte ich natürlich auch andere Busteilnehmer bedienen können.
Tja und nun habe ich nen Brett vorm Kopp und komme nicht weiter mit den Thread.
Ich hoffe ihr könnt mir weiterhelfen
Gruß Frank
Code: Alles auswählen
;##############################################################################################
;# ACB - Controller V0.1 #
;# Ansteuerung Fernspeisung, Outbox - Antennenumschalter, ATU - Vertical, Rotor - RX - Loop #
;##############################################################################################
OpenConsole("Serial-Monitor") ;Console zum Test der Proceduren
IncludeFile "ACB-Com.pb"
IncludeFile "ACB-GUI.pb"
IncludeFile "ACB-Rotor.pb"
IncludeFile "ACB-ATU.pb"
Rotor_Ref_Init() ;Initialisierung Rotor
ATU_Ref_Init() ;Initialisierung ATU
Set_GUI() ;Button setzen
Repeat
EventID.l = WaitWindowEvent() ;Event am Hauptfenster abwarten
Select EventID ;Event Button auswählen
Case #PB_Event_Gadget
Select EventGadget() ;Auswertung der Button und Aufruf der Unterprogramme
Case #Button_160
Select EventType()
Case #PB_EventType_LeftClick : Set_160m()
EndSelect
Case #Button_80
Select EventType()
Case #PB_EventType_LeftClick : Set_80m()
EndSelect
Case #Button_40
Select EventType()
Case #PB_EventType_LeftClick : Set_40m()
EndSelect
Case #Button_30
Select EventType()
Case #PB_EventType_LeftClick : Set_30m()
EndSelect
Case #TrackBar_0
Select EventType()
Case #PB_EventType_LeftClick : Turn_Rotor()
EndSelect
EndSelect ;Auswertung der Button und Aufruf der Unterprogramme
EndSelect ;Event Button auswählen
Until EventID = #PB_Event_CloseWindow
CloseSerialPort(1)
End
Code: Alles auswählen
;##############################################################################################
;# Proceduren GUI #
;##############################################################################################
Enumeration #PB_Compiler_EnumerationValue
#Main_window
#TrackBar_0
#Button_160
#Button_80
#Button_40
#Button_30
EndEnumeration
Procedure Set_GUI() ;Button setzen
OpenWindow(#Main_window, 200, 200, 600, 400, "ACB - Controller Test01", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget) ;Hauptfenster
ButtonGadget(#Button_160, 10, 50, 50, 50, "160 m") ;Button_160
ButtonGadget(#Button_80, 90, 50, 50, 50, "80 m") ;Button_80
ButtonGadget(#Button_40, 170, 50, 50, 50, "40 m") ;Button_40
ButtonGadget(#Button_30, 250, 50, 50, 50, "30 m") ;Button_30
TrackBarGadget(#TrackBar_0, 90, 150, 180, 25, 0, 180, #PB_TrackBar_Ticks)
EndProcedure
Code: Alles auswählen
;##############################################################################################
;# Proceduren zur Datenkommunikation ueber die serielle Schnittstelle #
;##############################################################################################
If OpenSerialPort(1, "COM1", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 64, 64) ;Serial Port öffnen
Else
MessageRequester("Achtung","Es wurde kein Com - Port gefunden") ;Fehlermeldung wenn kein Com - Port vorhanden
End
EndIf
Procedure Com_Out(Serial_Out.s) ;Datenausgabe auf Serial Port
WriteSerialPortString(1, Serial_Out + Chr(13))
Delay(50)
EndProcedure
Procedure.s Com_In() ;Daten lesen vom Serial Port mit Rückgabestring
Delay(50)
Antwort.s = Space(AvailableSerialPortInput(1))
ReadSerialPortData(1, @Antwort, AvailableSerialPortInput(1))
ProcedureReturn Antwort
EndProcedure
Code: Alles auswählen
;##############################################################################################
;# Proceduren zur Rotorsteuerung #
;##############################################################################################
Procedure Rotor_Ref_Init() ;Motoradresse Rotor = C
OpenWindow(Rotor_Init, 250, 250, 220, 70, "ACB - Controller")
TextGadget(Text, 50, 20, 170, 45, "Wait for Rotor Ref Init")
Repeat ;Warten auf Referenzpunkt
Com_Out("A GAP 3,0")
Motorantwort.s = Com_In()
Until Mid(Motorantwort,8,1) = "0"
Com_Out("A SAP 4,0,2047") ;Geschwindigkeit für Betrieb setzen
Com_In() ;Serial Buffer leeren
Com_Out("A SAP 204,0,200") ;Freeweeling - automatische Motorabschaltung
Com_In() ;Serial Buffer leeren
Delay(500)
CloseWindow(Rotor_Init)
EndProcedure
Procedure Read_Rotor(Posi_sol.l)
Repeat
Com_Out("A GAP 1,0,") ;Istposition abfragen
Posi_ist.l = Val(Mid(Com_In(),7,9))/6667 ;Rückantwort der Istposition
PrintN(Str(Posi_ist)) ;Kontrollausgabe Konsole
Until Posi_sol = Posi_ist ; abfragen bis die Istposition = Sollposition
EndProcedure
CreateThread(@Read_Rotor(),Posi_sol)
Procedure Turn_Rotor() ;Rotor bewegen
Com_Out("A MVP ABS,0,"+Str(6667 * GetGadgetState(#TrackBar_0))) ;gebe Sollposition vor
Posi_sol.l = Val(Mid(Com_In(),8,9))/6667 ;Rückantwort der Sollposition
PrintN(Str(Posi_sol)) ;Kontrollausgabe Konsole
Read_Rotor(Posi_sol)
EndProcedure
Code: Alles auswählen
;##############################################################################################
;# Proceduren zur Steuerung ATU Vertical #
;##############################################################################################
Procedure ATU_Ref_Init()
OpenWindow(Atu_Init, 250, 250, 220, 70, "ACB - Controller")
TextGadget(Text, 50, 20, 170, 45, "Wait for ATU Ref Init")
Delay(500)
CloseWindow(Atu_Init)
EndProcedure
Procedure Set_160m() ;Programmteildummy
PrintN("TUNED 160m")
EndProcedure
Procedure Set_80m() ;Programmteildummy
PrintN("TUNED 80m")
EndProcedure
Procedure Set_40m() ;Programmteildummy
PrintN("TUNED 40m")
EndProcedure
Procedure Set_30m() ;Programmteildummy
PrintN("TUNED 30m")
EndProcedure