Unten der Code für die Initialisierung (Form_Load) bei einem Regelungsprojekt.
Die IOs des IO-Warrior56 lassen sich nach dem Starten des Programms (also nach ausgeführtem Form_Load) nicht ansprechen.
Das erkennt man schon an zwei LEDs, die an den Pins P4.3 und P4.4 angeschlossen sind. Diese bleiben dunkel.
Wenn ich allerdings die Zeile
ioaduset(0) = &H1C 'Kennung für ADU-Betrieb
auskommentiere - dann kann ich erwartungsgemäß die IOs beliebig auf Low und High setzen.
Auch die beiden LEDs sind nach dem Starten des Programms eingeschaltet (wie geplant).
Ich finde den Fehler nicht.
Mit freundlichen Grüßen
Franz Peter Zantis
Option Explicit On
Option Strict On
Public Class Form1
Dim flagautomatic As Boolean
Dim iohandle As Integer
Dim retint As Integer
Dim iowrite(7) As Byte
Dim ioread(7) As Byte
Dim statustext(9) As String
Dim maxWasserTemp As Integer
Dim differenzTemp As Integer
Dim ioaduset(63) As Byte
Dim ioadudat(63) As Byte
Dim aduvalues(10) As UInt16
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
iohandle = IowKitOpenDevice()
If iohandle = 0 Then
MessageBox.Show("No Hardware found!!", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error)
Application.Exit()
End If
iowrite(0) = 0
iowrite(1) = 255 'Port 0; ADU-Eingänge, PT1000
iowrite(2) = 255 'Port 1; unbenutzt
iowrite(3) = 255 'Port 2; Schalteingänge
iowrite(4) = &HFC 'Port 3, Pumpe P3.1 und Hupe P3.0
iowrite(5) = &HE7 'Port 4, LEDs P4.3 und P4.4
iowrite(6) = 255
iowrite(7) = 255 'Port 6, PWM auf P6.7
retint = IowKitWrite(iohandle, 0, iowrite(0), 8)
ioaduset(0) = &H1C 'Kennung für ADU-Betrieb
ioaduset(1) = 0 'ADU not active
ioaduset(2) = 5 'Kanal
ioaduset(3) = 7 'Referenz (Gnd.. +4,16V)
ioaduset(4) = 0 'Bypass; in this case no external capacitor from P2.4 to AGND
retint = IowKitWrite(iohandle, 1, ioaduset(0), 64)
flagautomatic = False
Me.BtnAutomatik.Text = "aktuell" & vbCrLf & "Manuell"
Call ausgabe(0, "Manueller Betrieb")
Call ausgabe(1, "Pumpe ausgeschaltet")
Me.LblKollektoren.Text = "- °C"
Me.LblVorlauf.Text = "- °C"
Me.LblRuecklauf.Text = "- °C"
Me.LblSpeicheroben.Text = "- °C"
Me.LblSpeicherunten.Text = "- °C"
Me.LblFeuchte.Text = "- Ω"
Me.TrkBrTdiv.Minimum = 4
Me.TrkBrTdiv.Maximum = 20
Me.TrkBrTdiv.Value = 10
Call ausgabe(5, "min. Differenztemperatur: " & CStr(TrkBrTdiv.Value) & "°C")
Me.TrkBrTmaxWasser.Minimum = 30
Me.TrkBrTmaxWasser.Maximum = 90
Me.TrkBrTmaxWasser.Value = 75
Call ausgabe(4, " max. Wassertemperatur: " & CStr(TrkBrTmaxWasser.Value) & "°C")
Me.LblTdiv.Text = "minimale Temperaturdifferenz"
Me.LblTmax.Text = "maximale Wassertemperatur"
Me.Timer1.Enabled = False 'Timer for ADU-Measurement
Me.Timer1.Interval = 2000 'ms
'Me.Timer1.Enabled = True
End Sub
nochmal ADU und Visual Basic
Moderator: Guido Körber
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: nochmal ADU und Visual Basic
Also ich hab mir mal auf die Schnelle eine Consolenanwendung in C++ erstellt, der Ihren Code unten nachstellt.
Die LEDs werden gesetzt und der ADC rennt los.
Sie müssten mir mal das Projekt an june@codemercs.com schicken, dann kann ich da mal durchgehen.
Oder einen link per Mail, wo ich das runterladen könnte. Bitte ohne Exe und DLL, die mögen die Mailserver nicht.
Die LEDs werden gesetzt und der ADC rennt los.
Sie müssten mir mal das Projekt an june@codemercs.com schicken, dann kann ich da mal durchgehen.
Oder einen link per Mail, wo ich das runterladen könnte. Bitte ohne Exe und DLL, die mögen die Mailserver nicht.
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: nochmal ADU und Visual Basic
So ich hab mir das Projekt mal angeschaut und ausgeführt.
Ich habe den ADC eingeschalten, den PWM auch (mit 1kHz) und alles läuft wie es dort im Code beschrieben ist.
Die 2 LEDs gehen an, eine blinkt, der ADC sendet fleißig und die LED am PWM-Ausgang blinkt panisch vor sich hin.
Ich kann das Problem also nicht nachstellen hier.
Ich habe den ADC eingeschalten, den PWM auch (mit 1kHz) und alles läuft wie es dort im Code beschrieben ist.
Die 2 LEDs gehen an, eine blinkt, der ADC sendet fleißig und die LED am PWM-Ausgang blinkt panisch vor sich hin.
Ich kann das Problem also nicht nachstellen hier.
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: nochmal ADU und Visual Basic
Am Code liegt es also nicht.
Die Programmbibliothek iowkit.dll habe ich überprüft. Sie ist vom September 2019.
Außerdem verwende ich iowModul.vb aus dem Jahr 2015. Anhängen dieser Datei ging nicht - deshalb hier der Code:
'Stand: April 2015
Option Strict Off
Option Explicit On
Module iow
' Required kernel32 functions
Public Declare Function GetLastError Lib "kernel32" () As Integer
' IOW SDK V1.5
' IO-Warrior vendor & product IDs
Public Const IOWKIT_VENDOR_ID As Integer = &H7C0S
Public Const IOWKIT_VID As Integer = IOWKIT_VENDOR_ID
' IO-Warrior 40
Public Const IOWKIT_PRODUCT_ID_IOW40 As Integer = &H1500S
Public Const IOWKIT_PID_IOW40 As Integer = IOWKIT_PRODUCT_ID_IOW40
' IO-Warrior 24
Public Const IOWKIT_PRODUCT_ID_IOW24 As Integer = &H1501S
Public Const IOWKIT_PID_IOW24 As Integer = IOWKIT_PRODUCT_ID_IOW24
' IO-Warrior PowerVampire
Public Const IOWKIT_PRODUCT_ID_IOWPV1 As Integer = &H1511S
Public Const IOWKIT_PID_IOWPV1 As Integer = IOWKIT_PRODUCT_ID_IOWPV1
Public Const IOWKIT_PRODUCT_ID_IOWPV2 As Integer = &H1512S
Public Const IOWKIT_PID_IOWPV2 As Integer = IOWKIT_PRODUCT_ID_IOWPV2
' IO-Warrior 56
Public Const IOWKIT_PRODUCT_ID_IOW56 As Integer = &H1503S
Public Const IOWKIT_PID_IOW56 As Integer = IOWKIT_PRODUCT_ID_IOW56
' Max number of pipes per IOW device
Public Const IOWKIT_MAX_PIPES As Integer = 2
' pipe names
Public Const IOW_PIPE_IO_PINS As Integer = 0
Public Const IOW_PIPE_SPECIAL_MODE As Integer = 1
' Max number of IOW devices in system
Public Const IOWKIT_MAX_DEVICES As Integer = 16
' IOW Legacy devices open modes
Public Const IOW_OPEN_SIMPLE As Integer = 1
Public Const IOW_OPEN_COMPLEX As Integer = 2
' first IO-Warrior revision with serial numbers
Public Const IOW_NON_LEGACY_REVISION As Short = &H1010S
' IO-Warrior low-level library API functions
Public Declare Function IowKitOpenDevice Lib "iowkit" () As Integer
Public Declare Sub IowKitCloseDevice Lib "iowkit" (ByVal iowHandle As Integer)
Public Declare Function IowKitWrite Lib "iowkit" (ByVal iowHandle As Integer, ByVal numPipe As Integer, ByRef buffer As Byte, ByVal length As Integer) As Integer
Public Declare Function IowKitRead Lib "iowkit" (ByVal iowHandle As Integer, ByVal numPipe As Integer, ByRef buffer As Byte, ByVal length As Integer) As Integer
Public Declare Function IowKitReadNonBlocking Lib "iowkit" (ByVal iowHandle As Integer, ByVal numPipe As Integer, ByRef buffer As Byte, ByVal length As Integer) As Integer
Public Declare Function IowKitReadImmediate Lib "iowkit" (ByVal iowHandle As Integer, ByRef Value As Integer) As Integer
' Get number of IOW devices
Public Declare Function IowKitGetNumDevs Lib "iowkit" () As Integer
' Get Nth IOW device handle
Public Declare Function IowKitGetDeviceHandle Lib "iowkit" (ByVal numDevice As Integer) As Integer
Public Declare Function IowKitSetLegacyOpenMode Lib "iowkit" (ByVal openMode As Integer) As Integer
Public Declare Function IowKitGetProductId Lib "iowkit" (ByVal iowHandle As Integer) As Integer
Public Declare Function IowKitGetRevision Lib "iowkit" (ByVal iowHandle As Integer) As Integer
Public Declare Function IowKitGetThreadHandle Lib "iowkit" (ByVal iowHandle As Integer) As Integer
Public Declare Function IowKitGetSerialNumber Lib "iowkit" (ByVal iowHandle As Integer, ByRef serialNumber As Byte) As Integer
Public Declare Function IowKitSetTimeout Lib "iowkit" (ByVal iowHandle As Integer, ByVal TimeOut As Integer) As Integer
Public Declare Function IowKitSetWriteTimeout Lib "iowkit" (ByVal iowHandle As Integer, ByVal TimeOut As Integer) As Integer
Public Declare Function IowKitCancelIo Lib "iowkit" (ByVal iowHandle As Integer, ByVal numPipe As Integer) As Integer
End Module
Die Programmbibliothek iowkit.dll habe ich überprüft. Sie ist vom September 2019.
Außerdem verwende ich iowModul.vb aus dem Jahr 2015. Anhängen dieser Datei ging nicht - deshalb hier der Code:
'Stand: April 2015
Option Strict Off
Option Explicit On
Module iow
' Required kernel32 functions
Public Declare Function GetLastError Lib "kernel32" () As Integer
' IOW SDK V1.5
' IO-Warrior vendor & product IDs
Public Const IOWKIT_VENDOR_ID As Integer = &H7C0S
Public Const IOWKIT_VID As Integer = IOWKIT_VENDOR_ID
' IO-Warrior 40
Public Const IOWKIT_PRODUCT_ID_IOW40 As Integer = &H1500S
Public Const IOWKIT_PID_IOW40 As Integer = IOWKIT_PRODUCT_ID_IOW40
' IO-Warrior 24
Public Const IOWKIT_PRODUCT_ID_IOW24 As Integer = &H1501S
Public Const IOWKIT_PID_IOW24 As Integer = IOWKIT_PRODUCT_ID_IOW24
' IO-Warrior PowerVampire
Public Const IOWKIT_PRODUCT_ID_IOWPV1 As Integer = &H1511S
Public Const IOWKIT_PID_IOWPV1 As Integer = IOWKIT_PRODUCT_ID_IOWPV1
Public Const IOWKIT_PRODUCT_ID_IOWPV2 As Integer = &H1512S
Public Const IOWKIT_PID_IOWPV2 As Integer = IOWKIT_PRODUCT_ID_IOWPV2
' IO-Warrior 56
Public Const IOWKIT_PRODUCT_ID_IOW56 As Integer = &H1503S
Public Const IOWKIT_PID_IOW56 As Integer = IOWKIT_PRODUCT_ID_IOW56
' Max number of pipes per IOW device
Public Const IOWKIT_MAX_PIPES As Integer = 2
' pipe names
Public Const IOW_PIPE_IO_PINS As Integer = 0
Public Const IOW_PIPE_SPECIAL_MODE As Integer = 1
' Max number of IOW devices in system
Public Const IOWKIT_MAX_DEVICES As Integer = 16
' IOW Legacy devices open modes
Public Const IOW_OPEN_SIMPLE As Integer = 1
Public Const IOW_OPEN_COMPLEX As Integer = 2
' first IO-Warrior revision with serial numbers
Public Const IOW_NON_LEGACY_REVISION As Short = &H1010S
' IO-Warrior low-level library API functions
Public Declare Function IowKitOpenDevice Lib "iowkit" () As Integer
Public Declare Sub IowKitCloseDevice Lib "iowkit" (ByVal iowHandle As Integer)
Public Declare Function IowKitWrite Lib "iowkit" (ByVal iowHandle As Integer, ByVal numPipe As Integer, ByRef buffer As Byte, ByVal length As Integer) As Integer
Public Declare Function IowKitRead Lib "iowkit" (ByVal iowHandle As Integer, ByVal numPipe As Integer, ByRef buffer As Byte, ByVal length As Integer) As Integer
Public Declare Function IowKitReadNonBlocking Lib "iowkit" (ByVal iowHandle As Integer, ByVal numPipe As Integer, ByRef buffer As Byte, ByVal length As Integer) As Integer
Public Declare Function IowKitReadImmediate Lib "iowkit" (ByVal iowHandle As Integer, ByRef Value As Integer) As Integer
' Get number of IOW devices
Public Declare Function IowKitGetNumDevs Lib "iowkit" () As Integer
' Get Nth IOW device handle
Public Declare Function IowKitGetDeviceHandle Lib "iowkit" (ByVal numDevice As Integer) As Integer
Public Declare Function IowKitSetLegacyOpenMode Lib "iowkit" (ByVal openMode As Integer) As Integer
Public Declare Function IowKitGetProductId Lib "iowkit" (ByVal iowHandle As Integer) As Integer
Public Declare Function IowKitGetRevision Lib "iowkit" (ByVal iowHandle As Integer) As Integer
Public Declare Function IowKitGetThreadHandle Lib "iowkit" (ByVal iowHandle As Integer) As Integer
Public Declare Function IowKitGetSerialNumber Lib "iowkit" (ByVal iowHandle As Integer, ByRef serialNumber As Byte) As Integer
Public Declare Function IowKitSetTimeout Lib "iowkit" (ByVal iowHandle As Integer, ByVal TimeOut As Integer) As Integer
Public Declare Function IowKitSetWriteTimeout Lib "iowkit" (ByVal iowHandle As Integer, ByVal TimeOut As Integer) As Integer
Public Declare Function IowKitCancelIo Lib "iowkit" (ByVal iowHandle As Integer, ByVal numPipe As Integer) As Integer
End Module
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: nochmal ADU und Visual Basic
Noch etwas ist auffallend:
Nach jedem Timer-Event soll die an P4.4 angeschlossene LED ihren Zustand ändern (hell --> dunkel; dunkel --> hell)
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
iowrite(5) = ToggleBit(iowrite(5), 4) 'LED
retint = IowKitWrite(iohandle, 0, iowrite(0), 8)
End Sub
Das funktioniert nur, wenn vorher dieses ausgeführt wird:
iowrite(0) = 0
iowrite(1) = 255 'Port 0; ADU-Eingänge, PT1000
iowrite(2) = 255 'Port 1; unbenutzt
iowrite(3) = 255 'Port 2; Schalteingänge
iowrite(4) = &HFC 'Port 3, Pumpe P3.1 und Hupe P3.0
iowrite(5) = &HE7 'Port 4, LEDs P4.3 und P4.4
iowrite(6) = 255
iowrite(7) = 255 'Port 6, Puls-Ausgang
retint = IowKitWrite(iohandle, 0, iowrite(0), 8)
Wenn ich das auskommentiere funktioniert es nicht mehr. Genauso, wenn ich den ADU initialisiere - auch dann funktioniert es nicht mehr.
Nach jedem Timer-Event soll die an P4.4 angeschlossene LED ihren Zustand ändern (hell --> dunkel; dunkel --> hell)
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
iowrite(5) = ToggleBit(iowrite(5), 4) 'LED
retint = IowKitWrite(iohandle, 0, iowrite(0), 8)
End Sub
Das funktioniert nur, wenn vorher dieses ausgeführt wird:
iowrite(0) = 0
iowrite(1) = 255 'Port 0; ADU-Eingänge, PT1000
iowrite(2) = 255 'Port 1; unbenutzt
iowrite(3) = 255 'Port 2; Schalteingänge
iowrite(4) = &HFC 'Port 3, Pumpe P3.1 und Hupe P3.0
iowrite(5) = &HE7 'Port 4, LEDs P4.3 und P4.4
iowrite(6) = 255
iowrite(7) = 255 'Port 6, Puls-Ausgang
retint = IowKitWrite(iohandle, 0, iowrite(0), 8)
Wenn ich das auskommentiere funktioniert es nicht mehr. Genauso, wenn ich den ADU initialisiere - auch dann funktioniert es nicht mehr.
-
- Posts: 97
- Joined: Wed Aug 03, 2011 3:46 pm
- Contact:
Re: nochmal ADU und Visual Basic
Es reicht bereits wenn ich folgendes ausführe:
iowrite(0) = 0
iowrite(1) = 255 'Port 0; ADU-Eingänge, PT1000
retint = IowKitWrite(iohandle, 0, iowrite(0), 8)
Nur dann funktioniert die Umschaltung der LED.
iowrite(0) = 0
iowrite(1) = 255 'Port 0; ADU-Eingänge, PT1000
retint = IowKitWrite(iohandle, 0, iowrite(0), 8)
Nur dann funktioniert die Umschaltung der LED.
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: nochmal ADU und Visual Basic
Da stellt sich mir die Frage, ob das "iowrite" array denn die richtigen Initialwerte enthält? Und ist das das selbe Array im Definition-Scope der Timer-Funktion?Franz Peter Zantis wrote: ↑Fri Dec 13, 2019 1:18 pm Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
iowrite(5) = ToggleBit(iowrite(5), 4) 'LED
retint = IowKitWrite(iohandle, 0, iowrite(0), 8)
End Sub
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: nochmal ADU und Visual Basic
Wie gesagt ich habe das Projekt so ausgeführt wie ich ihn bekommen habe, mit dem Unterschied, dass ich den ADC eingeschalten habe. Und mein IOW56 Starterkit V2 macht all das, was dort gemacht werden soll soweit ich das überblicke.
Ich weiß nicht genau, wie VB.Net das handhabt, aber wenn ich einen Array in C/C++ anlege, dann steht dort irgendwas drin (meist 0xCC).
In Den Projektcode sehe ich nirgends einen Abschnitt, wo der Array mit definierten Werten initialisiert wird.
Wenn also sowas hier gemacht wird:
dann ist nicht denfiniert, was in iowrite(2) und folgend drin stehen soll.
Ich weiß nicht genau, wie VB.Net das handhabt, aber wenn ich einen Array in C/C++ anlege, dann steht dort irgendwas drin (meist 0xCC).
In Den Projektcode sehe ich nirgends einen Abschnitt, wo der Array mit definierten Werten initialisiert wird.
Wenn also sowas hier gemacht wird:
Code: Select all
iowrite(0) = 0
iowrite(1) = 255 'Port 0; ADU-Eingänge, PT1000
retint = IowKitWrite(iohandle, 0, iowrite(0), 8)