nochmal ADU und Visual Basic

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
Franz Peter Zantis
Posts: 97
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

nochmal ADU und Visual Basic

Post by Franz Peter Zantis »

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
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: nochmal ADU und Visual Basic

Post by Christoph Jung »

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.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: nochmal ADU und Visual Basic

Post by Christoph Jung »

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.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Franz Peter Zantis
Posts: 97
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Re: nochmal ADU und Visual Basic

Post by Franz Peter Zantis »

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
Franz Peter Zantis
Posts: 97
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Re: nochmal ADU und Visual Basic

Post by Franz Peter Zantis »

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.
Franz Peter Zantis
Posts: 97
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Re: nochmal ADU und Visual Basic

Post by Franz Peter Zantis »

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.
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: nochmal ADU und Visual Basic

Post by Guido Körber »

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
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?
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: nochmal ADU und Visual Basic

Post by Christoph Jung »

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:

Code: Select all

iowrite(0) = 0
iowrite(1) = 255 'Port 0; ADU-Eingänge, PT1000
retint = IowKitWrite(iohandle, 0, iowrite(0), 8)
dann ist nicht denfiniert, was in iowrite(2) und folgend drin stehen soll.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Post Reply