Hallo Kollegen der Programmiererzunft,
wir haben uns als digitale I/0-Schnittstelle für Kommunikation SPS<->PC mit dem IO-Warrior40-P V1.0.2.1R ein I/O-Modul mit 16E/16A (24V) entwickelt. Jetzt bin ich gerade daran, das Modul unter Delphi7 in ein Programm einzubinden. Vorerst habe ich mir hierfür das Beispielprogramm SimpleIO/LEDs DLL mit der Dll-Version 1.5 vorgenommen.
Funktioniert eigentlich alles ganz gut, aber mit dem lesen des aktuellen Status der Eingänge hab ich noch so mein Problem: Egal ob mit IowKitReadImmediate, mit IowKitRead und gesetztem Timout oder mit IowKitReadNonBlocking - ich schaffs nicht, den aktuellsten Status zu lesen. Ich bekomme immer nur den ersten Status nach dem letzten Lesevorgang zurück, gibts da eine Option, den Buffer zu umgehen?
Ich hab schon eine Weile im Forum gewühlt, das Thema scheint schon viele gestört zu haben. Aber bis jetzt hab ich noch keine Lösung gefunden, kann mir jemand auf die Sprünge helfen?
Gruß,
Jo
Problem mit Read-Befehlen
Moderator: Guido Körber
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
Wie schnell klimpert die SPS denn mit den Leitungen?
Der IOWarrior schickt ein Datenpaket (Report) sobald sich etwas an den IO-Pins aendert. Diese werden in der DLL gepuffert und man kann sie mit IowKitRead oder IowKitReadNonBlocking nacheinander auslesen. Die Pufferung ist mit 128 Reports grosszuegig.
Bei Delphi kann man auch alternativ die HID-Komponente verwenden (im SDK Zip enthalten oder als Teil der JVCL erhaeltlich). Die HID-Komponente ist anspruchsvoller als das Iowkit API, dafuer aber auch flexibler und eleganter.
Der IOWarrior schickt ein Datenpaket (Report) sobald sich etwas an den IO-Pins aendert. Diese werden in der DLL gepuffert und man kann sie mit IowKitRead oder IowKitReadNonBlocking nacheinander auslesen. Die Pufferung ist mit 128 Reports grosszuegig.
Bei Delphi kann man auch alternativ die HID-Komponente verwenden (im SDK Zip enthalten oder als Teil der JVCL erhaeltlich). Die HID-Komponente ist anspruchsvoller als das Iowkit API, dafuer aber auch flexibler und eleganter.
Hallo,
danke für die Antwort.
Die SPS klimpert nicht wirklich schnell, das ist auch nicht mein Problem, sondern: Wenn ich mein Programm öffne, muss ich den aktuellen Status lesen können, da kann ich nicht warten, bis sich am Eingangsport was ändert - und die Änderungen davor, die noch im Puffer hängen, interessieren mich dann auch nicht.
Ich hab nochmal etwas getüftelt, mit der Dll 1.5 (hab vorher mit 1.4 getestet, bin wohl etwas durcheinander geraten, sorry) scheint der ReadImmediate zu funktionieren, allerdings nicht beliebig oft. Nach ein paar Leseversuchen (die mir tatsächlich den aktuellen Status liefern) bleibt mir die Routine beim Lesen hängen. Soviel ich weiß, brauch ich für den Befehl kein Timeout oder ähnliches berücksichtigen. Oder handle ich mir da ein anderes mir unbekanntest Problem ein, wenn ich so ca. im 1s-Takt nacheinander den ReadImmediate absetze?
Unabhängig davon schau ich mir heute noch die HID-Variante an, danke für die Unterstützung.
Gruß,
Jo
danke für die Antwort.
Die SPS klimpert nicht wirklich schnell, das ist auch nicht mein Problem, sondern: Wenn ich mein Programm öffne, muss ich den aktuellen Status lesen können, da kann ich nicht warten, bis sich am Eingangsport was ändert - und die Änderungen davor, die noch im Puffer hängen, interessieren mich dann auch nicht.
Ich hab nochmal etwas getüftelt, mit der Dll 1.5 (hab vorher mit 1.4 getestet, bin wohl etwas durcheinander geraten, sorry) scheint der ReadImmediate zu funktionieren, allerdings nicht beliebig oft. Nach ein paar Leseversuchen (die mir tatsächlich den aktuellen Status liefern) bleibt mir die Routine beim Lesen hängen. Soviel ich weiß, brauch ich für den Befehl kein Timeout oder ähnliches berücksichtigen. Oder handle ich mir da ein anderes mir unbekanntest Problem ein, wenn ich so ca. im 1s-Takt nacheinander den ReadImmediate absetze?
Unabhängig davon schau ich mir heute noch die HID-Variante an, danke für die Unterstützung.
Gruß,
Jo
-
- Posts: 543
- Joined: Mon Dec 01, 2003 6:09 pm
IowKitReadImmediate sollte das eigentlich leisten. Den Fehler das es nach einiger Zeit haengenbleibt kann ich leider nicht nachstellen. Ich werde das nochmal versuchen.
Es gibt immer die Moeglichkeit den entsprechenden Special Mode "Get Current Pin Status" (IOWarriorDatasheet.pdf Seite 15 Kapitel 5.10.4) direkt zu implementieren. Einmal IowKitWrite gefolgt von IowKitRead und fertig.
Es gibt immer die Moeglichkeit den entsprechenden Special Mode "Get Current Pin Status" (IOWarriorDatasheet.pdf Seite 15 Kapitel 5.10.4) direkt zu implementieren. Einmal IowKitWrite gefolgt von IowKitRead und fertig.