PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Velleman K8055 mit Excel Eingänge lesen



Nico99
13.02.2007, 13:11
Hallo!
Wie kann ich mit VBA die Eingänge des K8055 lesen und Zustand darstellen, z.B. mit CheckBox?

bis dann,
Nico

Benji
13.02.2007, 13:55
Hallo

Das könnte dich interessieren:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=27517

oder einfach mal die Suchfunktion benutzen. (Nach K8055 suchen...)

Nico99
13.02.2007, 15:07
Hallo!

Den Thread habe ich schon gesehn, nur leider werden im Beispiel nicht die Eingänge angesprochen...
Und die Suche habe ich auch schon benutzt, leider war nichts dabei...

bis dann,
Nico

SIGINT
13.02.2007, 16:20
Hi Nico99,
die Eingänge einzulesen ist aber genauso einfach wie das Ausgeben. Die Funktion die du suchst ist "ReadAllDigital()" ... die liefert den Status der Eingänge als Long. Auch die Funktion "ReadDigitalChannel(ByVal Channel As Long)" dürfte nützlich sein.
Ich hab mich aber nur kurz mit VB beschäfftigt, wesswegen ich nicht sagen kann, ob man die Eingänge nur im Pollingbetrieb einlesen kann oder auch irgendwie "interruptgesteuert".

Gruß,
SIGINT

torsten69
14.02.2007, 18:25
Kann ich nur bestätigen, man findet sich Leicht rein habe mit Timer Funktion (neu) eine Delay Time programmiert

torsten69
14.02.2007, 18:27
Du kannst sogar einen Analog Wert den Ausgängen zuordnen oder auf einen analogen Eingangswert reagieren

Danke nochmals
SIGINT

Nico99
14.02.2007, 18:34
Ja, ich habe mein Problemm etwas falsch beschrieben...
Ich weiss wie ich die Werte rauskriege, weiss aber nicht wie die Anweisung ausehen soll, damit ich zum Beispiel ReadAllDigital als Wert durch ein Label in VBA darstellen kann. Oder ReadDigitalChannel durch eien Checkbox.
Sprich: ich bin ein Neuling in VBA und habe Problemme mit Syntax... Wahrscheinlich gehört dieses Posting ins VBA-Forum irgendwo O:)

bis dann,
Nico

Carbolo
14.02.2007, 18:47
Achsooo,
dann kann dir einfach geholfen werden :-)
Schau dir mal die Userforms unter VBA an.

Checkbox: Einfach Ereignis abfangen, etwa so:

Private Sub CheckBox1_Click()
.................Dein Code hier.............
End Sub

Label: entweder als MsgBox("Text") ausgeben oder einen String-Variablen mit der Value-Eigenschaft einem Textbox zuweisen. Hilfreich sind dabei die Convert-Funktionen wie Cstr,Cdec o.ä.

Aber wenn du Dein Problem etwas genauer beschreibst, kann ich es auch mal schnell schreiben.

Gruß
Z

Nico99
14.02.2007, 19:35
So, ich schreibe folgendes:


Private Sub Label1_Click()
Label1.Caption = ReadAllDigital
End Sub

Dann wird der Wert als Label auch angezeigt, aber nicht permanent, sondern wird nur beim Klick mit Maus aktualisiert...

bis dann,
Nico

Carbolo
15.02.2007, 09:33
Ja, weil du ja auch d. _Click - Eigenschaft ansprichst. Wesentlich einfacher geht es mit einer quasi Endlosschleife, vergiss nur d. Abbruchbedingung nicht.Hier habe ich einfach i genommen, der dann hochzählt. Wird vermutlich nicht funktionieren, da dein Rechner zu schnell ist, es ging aber nur ums Verständnis.:

Dim i as integer

do while i<1000
Label1.caption=Cstr(ReadAllDigital)
i=i+1
loop

Eventuel müsste auch der _AfterUpdate Eigenschaft gehen, leider kann ich es gerade nicht prüfen,sitze grad vor einem Linux-Rechner.

Gruß
Z

torsten69
15.02.2007, 10:56
Du kannst auch den Wert der unter ReadAllDigital () kommt als Variable speichern diese dann einer Excel Zelle zuweisen. Habe ich auch probiert und funtioniert wunderbar. UpdateEigenschaften funtionieren auch, habe es getestet. Excel wird es nur mit einem Aufruf der Routine machen also du musst die Sub Routine erst ansprechen und dann wird auch der Code bearbeitet. Oder du versuchst es mit einer Schleife. Ich arbeite nicht gern mit Schleifen aber Excel lässt dir für dein Vorhaben keine andere Chance

Nico99
15.02.2007, 22:48
Irgendwie will es nicht...
So habe ich es drin (ohne Adress-Routinen und sonstiges):


Private Declare Function OpenDevice Lib "k8055d.dll" (ByVal CardAddress As Long) As Long
Private Declare Sub CloseDevice Lib "k8055d.dll" ()
Private Declare Function ReadAnalogChannel Lib "k8055d.dll" (ByVal Channel As Long) As Long
Private Declare Sub ReadAllAnalog Lib "k8055d.dll" (Data1 As Long, Data2 As Long)
Private Declare Sub OutputAnalogChannel Lib "k8055d.dll" (ByVal Channel As Long, ByVal Data As Long)
Private Declare Sub OutputAllAnalog Lib "k8055d.dll" (ByVal Data1 As Long, ByVal Data2 As Long)
Private Declare Sub ClearAnalogChannel Lib "k8055d.dll" (ByVal Channel As Long)
Private Declare Sub SetAllAnalog Lib "k8055d.dll" ()
Private Declare Sub ClearAllAnalog Lib "k8055d.dll" ()
Private Declare Sub SetAnalogChannel Lib "k8055d.dll" (ByVal Channel As Long)
Private Declare Sub WriteAllDigital Lib "k8055d.dll" (ByVal Data As Long)
Private Declare Sub ClearDigitalChannel Lib "k8055d.dll" (ByVal Channel As Long)
Private Declare Sub ClearAllDigital Lib "k8055d.dll" ()
Private Declare Sub SetDigitalChannel Lib "k8055d.dll" (ByVal Channel As Long)
Private Declare Sub SetAllDigital Lib "k8055d.dll" ()
Private Declare Function ReadDigitalChannel Lib "k8055d.dll" (ByVal Channel As Long) As Boolean
Private Declare Function ReadAllDigital Lib "k8055d.dll" () As Long
Private Declare Function ReadCounter Lib "k8055d.dll" (ByVal CounterNr As Long) As Long
Private Declare Sub ResetCounter Lib "k8055d.dll" (ByVal CounterNr As Long)
Private Declare Sub SetCounterDebounceTime Lib "k8055d.dll" (ByVal CounterNr As Long, ByVal DebounceTime As Long)

Dim CardAddress As Long
Dim connected As Boolean
Public TimerID As Long
Public TimerSeconds As Single

Private Sub CheckBox1_Click()
If (CheckBox1.Value) Then
SetDigitalChannel (1)
Else
ClearDigitalChannel (1)
End If
End Sub

Sub scan_DigitalAll()
Dim i As Integer
Do While i < 1000
Label1.Caption = CStr(ReadAllDigital)
i = i + 1
Loop
End Sub


Das erste Teil mit Ausgang setzen funktioniert, das zweite Teil mit Label zeigt nur "Label1" an und keine Werte

torsten69
16.02.2007, 11:38
Sub scan_DigitalAll()
Dim i As Integer
Dim a As long

a = ReadAllDigital

Do While i < 1000
.
.
.

probier es mal so!

Nico99
16.02.2007, 13:24
Ich habe folgendes eingegeben:

Sub scan_DigitalAll()
Dim i As Integer
Dim a As Long
a = ReadAllDigital
Do While i < 1000
Label1.Caption = a
i = i + 1
Loop
End Sub

Und es ändert sich nichts...
Es wird nur Label1 angezeigt.

Füge ich aber eine Schaltfläche hinzu und gebe es ein:

Private Sub CommandButton3_Click()
MsgBox ReadAllDigital
Label1.Caption = ReadAllDigital
End Sub
dann wird beim Klick eine MessageBox mit dem Wert angezeigt und Label1 zeigt auch den richtigen Wert an.
Nur es klappt nicht, dass Label1 ständig ohne irgendwelche Klicks immer den aktuellen Wert anzeigt...

Nico99
16.02.2007, 13:31
Kann es sein, dass die Sub
Sub scan_DigitalAll()
Dim i As Integer
Dim a As Long
a = ReadAllDigital
Do While i < 1000
Label1.Caption = a
i = i + 1
Loop
End Sub
in einer UserForm gar nicht verarbeitet wird?

torsten69
16.02.2007, 15:39
Soviel ich weiß ist es in Excel so. Du brauchst ein Ereignis um eine Sub zu starten.
Du möchtest also immer den aktuellen Wert angezeigt bekommen? das ist sehr schwer in Excel umzusetzten.
Du musst in einer vordefinierten Zeit ein Sub aufrufen welche dir dann eine Schleife nur einmal durchläuft um das Ergebnis in einer Box oder Zelle aktualisiert.
uuuuuuuuuhhhhhhhhhh

Nico99
16.02.2007, 19:37
so klappt es!!!


Private Sub UserForm_Activate()
While userform1.Visible
DoEvents
Label1.Caption = ReadAllDigital
DoEvents
Wend
End Sub

Vielen Dank für Eure Ideen und Anregungen!!!
Nico

torsten69
16.02.2007, 20:14
cool! ich wusste es nicht besser, aber du! Super!

ciao

Nico99
17.02.2007, 13:36
Hier ist fertiges VBA-Programm.
Als Vorlage diente die Excel-Datei von SIGINT, die er in diesem Forum gepostet hat.

bis dann,
Nico