Seite 2 von 3

Verfasst: 28.05.2009 21:24
von Kaeru Gaman
COMate ist doch von srod ... :?:

Verfasst: 28.05.2009 23:58
von Falko
Kaeru Gaman hat geschrieben:COMate ist doch von srod ... :?:
Das wäre zu schön um wahr zu sein, wenn es von mir wäre :lol:

Das Einzigste, was ich damit gemacht habe, ist was für viele
Excelfunktionen, wovon leider kein große feedback zurück kam.

Nee, das war die MVCOM (Nicht von mir), die er meinte, die ich nur für
meine Projekte gebraucht habe. Übrigens, die USB2RS232, welche die
einfachste Lösung ist und ebenfalls für einen Lau bei www.pollin.de zu
erhalten ist, lässt sich genauso wie die Serielle Schnittstelle über virtuelle
COM-Ports nutzen, die bei neueren OS automatisch installiert werden. Bei
Win9x ist aber meistens eine CD dabei.

Hier nochmal zur Erinnerung mein alter Thread dazu:

http://www.purebasic.fr/german/viewtopi ... 581#187581

http://www.purebasic.fr/german/viewtopi ... 773#187773

Mit dem aktuellen PB ist leider die MVCOM überflüssig geworden, weil
man damit direkt Funktionen für "Serial Port" enthalten hat.

Gruß Falko

Verfasst: 29.05.2009 07:38
von H.Brill
Hallo,
Also das mit den USB->Seriell Konvertern kann
ich bestätigen. Hab da ein Vivanco Kabel und
die 8-fach Relaiskarte von Conrad. Den Treiber,
der dem Kabel beiliegt, installieren und gut ist.
Beim Einstecken des Kabels in den USB Port sieht
man dann in der Systemsteuerung, welcher Com
Port angelegt wurde (bei mir immer COM5).

Mein Programm hatte ich zwar damals in XProfan
geschrieben, denke aber, daß es mit den nativen
SerialPort - Befehlen von PB 4.30 genauso gut geht.

Verfasst: 30.05.2009 14:40
von HeX0R
H.Brill hat geschrieben:Hallo,
[...]
Beim Einstecken des Kabels in den USB Port sieht
man dann in der Systemsteuerung, welcher Com
Port angelegt wurde (bei mir immer COM5).
[...]
Naja, als Programmierer würde man das doch etwas komfortabler gestalten, einfach diesen Callback hier verwenden und das Programm bekommt mitgeteilt, wenn der Adapter gesteckt/entfernt wird:

Code: Alles auswählen

#DBT_DEVICEARRIVAL           = $8000
#DBT_DEVICEQUERYREMOVE       = $8001
#DBT_DEVICEQUERYREMOVEFAILED = $8002
#DBT_DEVICEREMOVEPENDING     = $8003
#DBT_DEVICEREMOVECOMPLETE    = $8004
#DBT_DEVICETYPESPECIFIC      = $8005
#DBT_DEVNODES_CHANGED        = $0007
#DBT_QUERYCHANGECONFIG       = $0017
#DBT_CONFIGCHANGED           = $0018
#DBT_CONFIGCHANGECANCELED    = $0019
#DBT_USERDEFINED             = $FFFF

#DBT_DEVTYP_OEM              = $0000
#DBT_DEVTYP_VOLUME           = $0002
#DBT_DEVTYP_PORT             = $0003
#DBT_DEVTYP_DEVICEINTERFACE  = $0005
#DBT_DEVTYP_HANDLE           = $0006

Procedure MyWindowCallback(WindowID, Message, wParam, lParam)
	Protected Result, a$, K
	Protected *db.DEV_BROADCAST_HDR

	Result = #PB_ProcessPureBasicEvents
	Select Message

		Case #WM_DEVICECHANGE
			If wParam = #DBT_DEVICEARRIVAL
				*db = lParam
				If *db\dbch_devicetype = #DBT_DEVTYP_PORT
						a$ = PeekS(*db + SizeOf(DEV_BROADCAST_HDR))
						K  = Val(RemoveString(a$, "COM", #PB_String_NoCase))
						Debug "COM-Port " + Str(K) + " eingesteckt"
					EndIf
			ElseIf wParam = #DBT_DEVICEREMOVECOMPLETE
				*db = lParam
				If *db\dbch_devicetype = #DBT_DEVTYP_PORT
					a$ = PeekS(*db + SizeOf(DEV_BROADCAST_HDR))
					K  = Val(RemoveString(a$, "COM", #PB_String_NoCase))
					Debug "COM-Port " + Str(K) + " ausgesteckt"
				EndIf
			EndIf

	EndSelect

	ProcedureReturn Result
EndProcedure

Verfasst: 30.05.2009 16:26
von HemSA
Hallole und Danke an alle für die Beiträge.
Ich werde mir dann erst mal einen USB<=>COM Adapter besorgen. Dann es mal mit der MVCOM-Lib versuchen. Ich habe ja 2 Aufgaben:
1.) Aus Excel Werte auslesen ( wo ich den DispHepler verwende - was schon fertig ist und in Anwendung, aber eben nicht in PB 4.30 funktoniert )
2.) Eine Erweiterung: Bei einem bestimmtem Ereignis in der Exceltabelle das nicht nur auf dem Bldschirm, sondern auch noch ausserhalb mit einer Lampe darstellen ( als Warnhinweis )

Verfasst: 30.05.2009 19:56
von HeX0R
Seit PB4.2(?) brauchst du keine MVCOM-Lib mehr, das kann PB mittlerweile selbst.

Verfasst: 30.05.2009 20:10
von Falko
>>> 1.) Aus Excel Werte auslesen ( wo ich den DispHepler verwende - was
>>>schon fertig ist und in Anwendung, aber eben nicht in PB 4.30 funktoniert )

Zu PB 4.3 und Excelfunktionen, da hätte ich noch einen Tip. Somit könnte man
die Excelfunktionen als auch die eigenen SerielPort - Funktionen nutzen.

http://www.purebasic.fr/german/viewtopi ... 466#239466

Gruß Falko

Verfasst: 01.06.2009 10:55
von H.Brill
Hallo,
Ich will mal die Conrad Relais Karte mit PB
ansteuern, komme aber irgendwie nicht weiter.
Die Schnittstellenparameter stimmen soweit.
Habs auch schon mit versch. Variablentypen usw.
probiert.
In XProfan sieht das so aus :

Code: Alles auswählen

Proc Senden
   ' 4 Byte - Rahmen zum Senden erstellen
   Pruefsumme% = XOR(XOR(kommando%, adresse%), daten%)
   send$ = Chr$(kommando%) + Chr$(adresse%) + Chr$(daten%) + Chr$(Pruefsumme%)
   WriteCom(f%, send$)
   ComError(f%)
   GetComInput(f%)
   Sleep 1000
EndProc
Ausprobieren ist zwar für euch nicht möglich, aber vielleicht sieht
ja jemand meinen Fehler. Stimmt das so mit der XOR-Verknüpfung ?

Hier mal der Code :

Code: Alles auswählen

Global comPort.l, comID.l, Daten.i, Adresse.i, Pruefsumme.i, Kommando.i, Send.s

Macro TestBit(value,bit) 
  (value>>bit&1) 
EndMacro 

Macro SetBit(value,bit) 
  (1 << bit | value) 
EndMacro 

Macro ClrBit(value,bit) 
  (~(1 << bit) & value) 
EndMacro 

Daten = 0
Kommando = 1
Adresse = 1

Procedure Senden()
Dim Buffer.b(4)
   Send = Space(4)
   Pruefsumme = (Kommando XOr Adresse) XOr Daten
   Send = Chr(Kommando) + Chr(Adresse) + Chr(Daten) + Chr(Pruefsumme)
   Buffer(0) = Kommando
   Buffer(1) = Adresse
   Buffer(2) = Daten 
   Buffer(3) = Pruefsumme
   WriteSerialPortData(comID, @Send, 4)
   
EndProcedure
 
If OpenWindow(0, 10, 10, 400, 400, "Schalt - Relais", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
   ButtonGadget(1,5, 10,100, 20, "Ende")
   ButtonGadget(2,120, 10, 100, 20, "Setze")
   CheckBoxGadget(10, 120,  100, 100, 20, "Relais 1")
   CheckBoxGadget(11, 120,  130, 100, 20, "Relais 2")
   CheckBoxGadget(12, 120,  160, 100, 20, "Relais 3")
   CheckBoxGadget(13, 120,  190, 100, 20, "Relais 4")
   CheckBoxGadget(14, 120,  220, 100, 20, "Relais 5")
   CheckBoxGadget(15, 120,  250, 100, 20, "Relais 6")
   CheckBoxGadget(16, 120,  280, 100, 20, "Relais 7")
   CheckBoxGadget(17, 120,  310, 100, 20, "Relais 8")
  
   Quit = 0
   comID = OpenSerialPort(#PB_Any, "COM5", 19200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
   If comID And IsSerialPort(comID)
      Senden()
     MessageRequester("Info", "COM5: verfügbar !", 0)
   Else
       MessageRequester("Fehler", "COM5: NICHT verfügbar !", 0) 
       End 
   EndIf    
   Repeat
   ; Hier kommt die Event - Schleife
    EventID.l = WaitWindowEvent()
    ; Event abwarten und auswerten
    Select EventID
       Case #PB_Event_CloseWindow
          ; X im rechts oben für Schließen gedrückt.
          Quit = 1
       Case #PB_Event_Gadget ; Event für Gadgets
         Select EventGadget()    
            Case 1
               ; Ende - Button gedrückt
               Quit = 1
            Case 2
             ; Setzen - Button gedrückt
             If GetGadgetState(10) = 1
                Daten = SetBit(Daten, 0)
             Else
                Daten = ClrBit(Daten, 0) 
             EndIf
             If GetGadgetState(11) = 1
                Daten = SetBit(Daten, 1)
             Else
                Daten = ClrBit(Daten, 1) 
             EndIf
             If GetGadgetState(12) = 1
                Daten = SetBit(Daten, 2)
             Else
                Daten = ClrBit(Daten, 2) 
             EndIf 
             If GetGadgetState(13) = 1
                Daten = SetBit(Daten, 3)
             Else
                Daten = ClrBit(Daten, 3) 
             EndIf 
             If GetGadgetState(14) = 1
                Daten = SetBit(Daten, 4)
             Else
                Daten = ClrBit(Daten, 4) 
             EndIf   
             If GetGadgetState(15) = 1
                Daten = SetBit(Daten, 5)
             Else
                Daten = ClrBit(Daten, 5) 
             EndIf
             If GetGadgetState(16) = 1
                Daten = SetBit(Daten, 6)
             Else
                Daten = ClrBit(Daten, 6) 
             EndIf
             If GetGadgetState(17) = 1
                Daten = SetBit(Daten, 7)
             Else
                Daten = ClrBit(Daten, 7) 
             EndIf
             Kommando = 3
             Adresse = 1
             Senden() 
               
       EndSelect
    EndSelect
   Until Quit = 1
EndIf
CloseSerialPort(comID)
End

Verfasst: 01.06.2009 11:10
von Kaeru Gaman
H.Brill hat geschrieben:Stimmt das so mit der XOR-Verknüpfung ?

Code: Alles auswählen

Pruefsumme = (Kommando XOr Adresse) XOr Daten
nope!

du musst schon eine bitweise Verknüpfung benutzen, keine logische.

du schreibst ja auch nicht

Code: Alles auswählen

(value >> bit And 1) 
oder

Code: Alles auswählen

(1 << bit Or value) 

Verfasst: 01.06.2009 11:47
von Falko
Genauer gesagt, das "XOR" durch ein "!" ersetzen