Hallo zusammen habe folgendes Problem.
Ich will das Signal eines Durchflussmessers (PNP) messen.
Der Sensor(24v) ist über einen Optokoppler an Port 0 Pin 0 angeschlossen.
Ich arbeite mit einer IO Karte von Hoffmann auf Basis des IOW56.
Software technisch habe ich mit Hilfe des SDKs und C#
eine kleine Testsoftware geschrieben die den Port 0 überwacht.
Funktioniert auch gut bis zu eine Frequenz von ca 80 Impulsen pro Sekunde.
Der Sensor kann aber unter Volllast 505 Impulsen pro Sekunde liefern (Deshalb IOW56).
Mir würden ja schon ca 250 reichen aber ab 80 Hz scheinen mir Reports verloren zu gehen.
Vielleicht hat jemand Erfahrung und kann mit den entscheidenden Tipp geben.
Mit freundlichem Gruß
Tom
Durchflussmesser an IOW56
Moderator: Guido Körber
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: Durchflussmesser an IOW56
Also der IOW56 sollte so was locker mitmachen. Ich weiss nicht was für Optokoppler an den Eingängen verbaut sind, eventuell sind die zu langsam, oder kriegen nicht genügend Strom bei schnelleren Impulsen.
Re: Durchflussmesser an IOW56
Vielleicht liegt der Fehler ja im Code. Hier der Code den ich zum Messen benutze.
Hab ja schon fleißig im Forum gelesen. Liegt es vielleicht an der Thread Priorität?
Hab ja schon fleißig im Forum gelesen. Liegt es vielleicht an der Thread Priorität?
Code: Select all
static void Main(string[] args)
{
IntPtr handle = IntPtr.Zero; // Handler des IOW
byte[] report = new byte[IOWarrior.Defines.IOWKIT56_IO_REPORT_SIZE + 1]; // IOW Report
int max_Impulse = 1000; //
int impulse_Counter = 0;
handle = IOWarrior.Functions.IowKitOpenDevice(); // IOW öffnen
IOWarrior.Functions.IowKitSetTimeout(handle, 1000); // Timeout auf 1 Sekunde festgelegt
Console.WriteLine("Taste drücken um Messung zu starten");
Console.ReadKey();
DateTime startZeit = DateTime.Now; //StartZeit erfassen
//Schleife zum einlesen der Werte maximal 1000 Impulse
while (impulse_Counter < max_Impulse)
{
//Einlesen der Werte
uint res = IOWarrior.Functions.IowKitRead(handle, 0, report, IOWarrior.Defines.IOWKIT56_IO_REPORT_SIZE);
if (res != IOWarrior.Defines.IOWKIT56_IO_REPORT_SIZE)
Console.WriteLine("Fehler");
else
{
//Impuse Zählen Wenn Port 0.0 an Masse
if (report[1] == 0xFE)
{
impulse_Counter++;
Console.WriteLine("{0:0000} {1}", impulse_Counter, report[1].ToString());
}
}
}
DateTime endZeit = DateTime.Now; //EndZeit erfassen
double freq = impulse_Counter / endZeit.Subtract(startZeit).TotalSeconds; //Frequenz berechnen
Console.WriteLine("Dauer {0:0.000} Sekunden Frequenz {1:0.000}", endZeit.Subtract(startZeit).TotalSeconds, freq);
Console.ReadKey();
//Device Schließen
IOWarrior.Functions.IowKitCloseDevice(handle);
}
- Christoph Jung
- Posts: 670
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Re: Durchflussmesser an IOW56
Der Code an sich sieht soweit gut aus. Die Thread Priorität sollte kein Problem sein.
Vielleicht mal mit IowKitReadNonBlocking() schauen obs damit besser läuft.
Vielleicht mal mit IowKitReadNonBlocking() schauen obs damit besser läuft.
Re: Durchflussmesser an IOW56
Danke für die Antwort. Habe den Code nach IowKitReadNonBlocking() um gestellt mit gleichem Ergebnis.
Das Problem liegt bei Sensor, genauer gesagt an der Impulslänge. Ab 80 Hz liegt die länge ca bei 1 ms.
Und je größer die Frequenz um so kürzer der Impuls.
Laut Datenblatt bewege ich mich da wohl schon im Grenzbereich des IOW56.
Muss wohl über einen Frequenzteiler nachdenken
Das Problem liegt bei Sensor, genauer gesagt an der Impulslänge. Ab 80 Hz liegt die länge ca bei 1 ms.
Und je größer die Frequenz um so kürzer der Impuls.
Laut Datenblatt bewege ich mich da wohl schon im Grenzbereich des IOW56.
Muss wohl über einen Frequenzteiler nachdenken
-
- Site Admin
- Posts: 2856
- Joined: Tue Nov 25, 2003 10:25 pm
- Location: Germany/Berlin
- Contact:
Re: Durchflussmesser an IOW56
Ein einfaches Monoflop zum Verlängern des Impulses würde gehen.