{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fswiss\fcharset0 Arial;}} {\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\f0\fs20 ' Ich ben\'f6tigte f\'fcr meine teuren Modellbauakkus ein zuverl\'e4ssiges Ladeger\'e4t, das mit folgenden Merkmalen versehen sei sollte:\par ' \tab - Ladefunktion mit DeltaPeak-Abschaltung\par '\tab - Messfunktion f\'fcr die Kapazit\'e4tsermittlung\par '\tab - Analysefunktion, um den Zustand der Akkus zu ermitteln\par '\tab - M\'f6glichkeit zur dauerhaften Speicherung der Ergebnisse\par \par ' In meiner Bastelkiste fand ich ein altes Datenerfassungssystem von Conrad (BestNr.: 190226). Leider war das Programmlisting\par ' nur f\'fcr DOS geeignet. Deshalb habe ich mir die M\'fche gemacht und das Listing an VisualBasic V5.0 angepasst. Jetzt kann das\par ' Interface auch unter Windows verwendet werden. Somit habe ich mir die Schnittstellen meines alten Computers f\'fcr die Aufgabe \par ' nutzbar gemacht. \'dcber die serielle Schnittstelle lese ich die Spannungswerte der 8 Kan\'e4le des Ladeger\'e4tes ein, \'fcber die parallele \par ' Schnittstelle steuere ich direkt Relais zum Abschalten der einzelnen Kan\'e4le. Zugegeben, nicht unbedingt "zeitgem\'e4ss", aber\par ' preiswert und zuverl\'e4ssig! Das Interface h\'e4tte ich wom\'f6glich entsorgt; - so erf\'fcllt es noch einen "guten Zweck"...\par '\par ' Vielleicht hat ja der Eine oder Andere \'e4hnliche Vorhaben und kann mit diesem Listing etwas anfangen. Hier ist nur die Funktionalit\'e4t\par ' des Interface enthalten, die sich nur auf die AD-Wandlung der 8 Kan\'e4le des Interface beschr\'e4nkt. Das Ergebnis der Wandlung wird\par ' in einem Array von 8 Single-Werten gebuffert und im Intervall (Timer1 -> 700 ms) aktualisiert.\par ' Auch die Anpassung an C++ oder C# d\'fcrfte damit v\'f6llig unproblematisch sein, da die Steuerelemente analog dazu funktionieren...\par ' Wenn ich etwas Zeit \'fcbrig habe, erstelle ich eine entsprechende dll, kann ich aber derzeit nicht versprechen. F\'fcr einen Prototypen\par ' gen\'fcgt mir dies hier v\'f6llig.\par \par ' F\'fcr R\'fcckfragen: Skype Presario62 oder norbert_gernand@gmx.de\par \par Private Type Slot\par Korrekt as Single\tab\tab\tab ' Korrekturwert f\'fcr Spannungsteiler (z.B. Toleranz in den Widerstandswerten)\par Verh\'e4ltnis as Single\tab\tab\tab ' Teilerverh\'e4ltnis z.B. 5.0 f\'fcr 1:5 (5 zu 25 Volt)\par End Type\par \par DIM Spannung (1 to 8) as Single\tab\tab ' Array f\'fcr die Messwerte\par DIM Ger\'e4t (1 to 8) as Slot\tab\tab ' Array mit den Einstellungen der Spannungsteiler\par DIM Uref as single\tab\tab\tab ' hier die Referenzspannung des Interface eintragen\par DIM warte as Integer\par \par Private Sub Form_Load()\par Uref = 5.0031\tab\tab\tab\tab ' exakter Wert der Referenzspannung des Interface (sollte pr\'e4zise gemessen werden!)\par \tab\tab\tab\tab\tab ' Ich habe hier den Wert meines Interface eingetragen -> ggf. anpassen!\par \par ' hier muss noch das Array Ger\'e4t() initialisiert werden. Ich lese dazu die vorher ermittelten Werte aus einer Datei ein...\par ' da diese Werte von Ihrer Hardware abh\'e4ngig sind, m\'fcssen Sie sich selbst darum k\'fcmmern.\par ' Damit "die Sache" funktioniert, habe ich unverbindlich die folgenden Zeilen eingef\'fcgt:\par For i = 1 To 8\par Ger\'e4t(i).Korrekt = 1.0\tab ' Korrekturfaktor = 1 (keine Korrektur!)\par Ger\'e4t(i).Verh\'e4ltnis = 1.0\tab ' Teilerverh\'e4ltnis = 1 (kein Spannungsteiler vorgeschaltet)\par Next i\par \par MSComm1.CommPort = 1 \tab ' COM1 einsetzen (hier den tats\'e4chlich verwendeten ComPort einstellen...)\par MSComm1.PortOpen = True \tab ' Anschlu\'df \'f6ffnen.\par Timer1.Interval = 700 \tab\tab ' Timerintervall auf 700 ms einstellen (nach eigenen Bed\'fcrfnissen anpassen...)\par Timer2.Enabled = False\tab\tab ' Timer 2 vorerst abschalten\par Timer2.Interval = 1 \tab\tab\tab ' Timerintervall auf 1 ms einstellen (Erkl\'e4rung folgt sp\'e4ter...)\par Timer1.Enabled = True \tab\tab ' Messintervall starten\par End Sub\par \par Private Sub getVolt()\par ' Dies ist die Umsetzung des (der Anleitung beiliegenden) TurboBasic-Skriptes f\'fcr VisualBasic V5.\par ' Diese Routine "wandelt" alle 8 Eing\'e4nge des Interface und gibt die Werte in ein Array aus.\par ' Damit diese Routine funktioniert m\'fcssen MSCOMM und zwei TIMER eingerichtet werden.\par ' MSCOMM wird f\'fcr die Datenkommunikation des Interface mit einer beliebigen seriellen Schnittstelle\par ' des Computers ben\'f6tigt, da wir unter Windows keinen direkten Zugriff auf die Hardware haben.\par ' Timer1 steuert das Messintervall, in diesem Fall 700 ms.\par ' Timer2 sorgt f\'fcr die Wandlungspause, die mindestens 175 Mikrosekunden dauern sollte (52 Takte bei 300 kHz)\par ' Wir verwenden hier mehr als 1000 Mikrosekunden (1 ms), dies f\'fchrt aber dazu, dass diese Routine\par ' auf allen Rechnern (egal ob extrem schnell oder langsam) funktioniert. \par ' Wer die Hardware optimal "ausreizen" will kann dieses Problem ja anders l\'f6sen...\par ' Die L\'f6sung mit einer For-Schleife gef\'e4llt mir nicht, da sie f\'fcr jeden Rechner angepasst werden muss und\par ' und nicht sehr elegant wirkt...\par \par Dim vout, b, i, j, mess As Integer\par Dim KanStr As String\par For j = 1 To 8 ' Schleife 8 x durchlaufen, ein Durchlauf f\'fcr jeden Kanal\par vout = 0\par b = 512\par Select Case j\par Case 1\par KanStr = "111101110011"\tab ' Adresse f\'fcr Folgekanal festlegen (hier: Adresse f\'fcr Kanal 2)\par Case 2\par KanStr = "111101111001"\par Case 3\par KanStr = "111101111011"\par Case 4\par KanStr = "111101110101"\par Case 5\par KanStr = "111101110111"\par Case 6\par KanStr = "111101111101"\par Case 7\par KanStr = "111101111111"\par Case 8\par KanStr = "111101110001"\par Case Else\par KanStr = "111101110001"\tab ' wird nicht unbedingt ben\'f6tigt\par End Select\par \par For i = 1 To 12\par MSComm1.DTREnable = False\par If Mid$(KanStr, 13 - i, 1) = "0" Then MSComm1.RTSEnable = False Else MSComm1.RTSEnable = True\par MSComm1.DTREnable = True\par If MSComm1.CTSHolding = True Then mess = 0 Else mess = 1\par vout = vout + (mess * b)\par b = b / 2\par Next i\par MSComm1.RTSEnable = False\par MSComm1.RTSEnable = True\par warte = 0\par Timer2.Enabled = True\par Do While warte = 0\tab\tab ' Wandlungspause f\'fcr das Interface (>1000 Mikrosekunden)\par DoEvents\par Loop\par Timer2.Enabled = False\par Spannung(j) = ((vout / 1023) * Ger\'e4t(j).Korrekt * Ger\'e4t(j).Verh\'e4ltnis * Uref) \par Next j\par End Sub\par \par Private Sub auswerten ()\par ' hier k\'f6nnen Sie die Messergebnisse "auswerten" (Anzeigen, Speichern, Verarbeiten, etc.)\par End Sub\par \par Private Sub Timer1_Timer()\par getVolt\tab ' Messung durchf\'fchren (alle Kan\'e4le)\par auswerten\tab ' z.B. Berechnungen, Anzeigen der Messergebnisse, etc.\par End Sub\par \par Private Sub Timer2_Timer()\par warte = 1\tab ' nach Ablauf des Intervalls wird "warte" auf 1 gesetzt, die Wandlungszeit ist damit mehr als 100%-ig abgelaufen... \par End Sub\par }