Servus LV'er und LV'erinnen,
an einer Anlage gibt es zwei Programme, eine Automatik und einen manuellen Betrieb. Beides .exe Programme die auf ein Delphin Messsystem zugreifen. Wenn jetzt beide Programme laufen, blockieren sie sich teils gegenseitig, z.Bsp.: Motorregelung oder Gerät lesen.
Im Forum habe ich jetzt schon einige Dinge gefunden: Shared Variable, diverse localhost, ..
Alles machbar, aber aufwendig und nicht unbedingt gegen Fehler abgesichert (Programmabsturz setzt den Wert nicht zurück)
Deswegen meine Suche nach einer einfachen Lösung, zB die Abfrage ob Programm xy läuft, oder gar eine integrierte Lösung in LabVIEW.
Meine Lösungsidee bis jetzt: Der Messkarte ein virtuellen Ausgang zu aktivieren, wenn eines der Programme startet und beim beenden zu deaktivieren. Beide Programme müssen beim Start diesen Ausgang lesen und sich evtl selbst beenden.
Was mir nicht gefällt, wenn das Programm nicht richtig beendet wird, bleibt der Wert und ich benötige eine Art Reset.
Hätte ich in der such und schreibzeit statdessen programmiert, währe ich wohl fertig. Dafür habe ich gelernt GVs funktionieren nicht zwischen .exe
Hallo T.N,
Zitat:Deswegen meine Suche nach einer einfachen Lösung, zB die Abfrage ob Programm xy läuft
Einfach mal den Taskmanager befragen, welche Programme gerade laufen und prüfen, ob die jeweils andere EXE im Speicher ist…
(Zum Abfragen des Taskmanagers einfach mal googlen, du findest Beispiel garantiert im NI-Forum und wahrscheinlich auch hier.)
Zitat:Dafür habe ich gelernt GVs funktionieren nicht zwischen .exe
Eine globale Variable funktioniert nur im Kontext der ausführenden EXE!
Wenn man zwischen zwei Programmen Daten austauschen will, verwendet man Netzwerkkommunikation aka SharedVariables…
Zitat:Alles machbar, aber aufwendig und nicht unbedingt gegen Fehler abgesichert (Programmabsturz setzt den Wert nicht zurück)
Ich sehe da einen Zielkonflikt zwischen den Anforderungen "nicht aufwendig" und "gegen Fehler abgesichert"!
Und wenn ein Programm abstürzt, dann sollte im Hinblick auf weitere störungsfreie Kommunikation mit der Hardware vielleicht besser der PC neu gestartet werden!?
Alternative Idee: Deine EXE öffnen eine Datei auf dem PC
exklusiv und schließen die Datei beim Beenden wieder. Der jeweils zweite erhält keinen Zugriff auf die Datei und muss sich sofort beenden. Zum Thema "Programmabsturz" siehe oben!
(02.02.2017 16:30 )TpunktN schrieb: [ -> ]Meine Lösungsidee bis jetzt: Der Messkarte ein virtuellen Ausgang zu aktivieren, wenn eines der Programme startet und beim beenden zu deaktivieren. Beide Programme müssen beim Start diesen Ausgang lesen und sich evtl selbst beenden.
Was mir nicht gefällt, wenn das Programm nicht richtig beendet wird, bleibt der Wert und ich benötige eine Art Reset.
Auf der Messkarte, dann hast du wieder von 2 Programmen den Zugriff auf dieselbe HW, und gerade das macht dir doch die Probleme...
Dann vielleicht lieber eine Shared Variable. Und damit man sieht, dass was passiert, schreibst du dauernd (z.B. jede Sekunde) einen anderen Wert rein.
Gruß, Jens
Du kannst auch einen Mutex machen.
Du brauchst dafür CreateMutex(), GetLastError() (183: Mutex existiert) und ReleaseMutex() (288: Release verboten), alles drei in Kernel32.dll. Leider hab ich gerade kein Muster- VI vorliegen ...
Dieses Verfahren geht natürlich nur, wenn du die Programme, die sich gegenseitig verriegeln sollen, selbst erstellst. Woher solltest du sonst den Mutex-Namen kennen?
Danke für die vielen Antworten.
(02.02.2017 16:58 )GerdW schrieb: [ -> ]...Einfach mal den Taskmanager befragen, welche Programme gerade laufen und prüfen, ob die jeweils andere EXE im Speicher ist…...
Die Programme sind offen, laufen aber nicht gleichzeitig, denke da unterscheidet der Taskmanager nicht. Unter Last schwanken sie zwischen 0 und 0,5% CPU Nutzung
Zitat:Alternative Idee: Deine EXE öffnen eine Datei auf dem PC exklusiv und schließen die Datei beim Beenden wieder. Der jeweils zweite erhält keinen Zugriff auf die Datei und muss sich sofort beenden. Zum Thema "Programmabsturz" siehe oben!
Das sieht mir nach einer einfachen Lösung aus und ich weis wie man Dateien öffnet
Shared Variables ist sicher besser, aber ich habe damit noch nicht gearbeitet, was wieder Zeit kostet die ich nicht habe.
IchSelbst schrieb:Du kannst auch einen Mutex machen.
Klingt einfach, werde ich mir mal anschauen, für alle Programme habe ich den Quellcode
(02.02.2017 16:30 )TpunktN schrieb: [ -> ]Servus LV'er und LV'erinnen,
an einer Anlage gibt es zwei Programme, eine Automatik und einen manuellen Betrieb. Beides .exe Programme die auf ein Delphin Messsystem zugreifen. Wenn jetzt beide Programme laufen, blockieren sie sich teils gegenseitig, z.Bsp.: Motorregelung oder Gerät lesen.
Im Forum habe ich jetzt schon einige Dinge gefunden: Shared Variable, diverse localhost, ..
Alles machbar, aber aufwendig und nicht unbedingt gegen Fehler abgesichert (Programmabsturz setzt den Wert nicht zurück)
Deswegen meine Suche nach einer einfachen Lösung, zB die Abfrage ob Programm xy läuft, oder gar eine integrierte Lösung in LabVIEW.
Meine Lösungsidee bis jetzt: Der Messkarte ein virtuellen Ausgang zu aktivieren, wenn eines der Programme startet und beim beenden zu deaktivieren. Beide Programme müssen beim Start diesen Ausgang lesen und sich evtl selbst beenden.
Was mir nicht gefällt, wenn das Programm nicht richtig beendet wird, bleibt der Wert und ich benötige eine Art Reset.
Hätte ich in der such und schreibzeit statdessen programmiert, währe ich wohl fertig. Dafür habe ich gelernt GVs funktionieren nicht zwischen .exe
Grundsätzlich ist die Idee mit einem Lock File gar nicht mal so schlecht. Jede Applikation probiert das File zu öffnen und setzt danach gleich die Sharingerlaubnis mit "Deny Access" so dass keine andere Applikation das noch öffnen darf. Danach lässt man das File offen bis man mit der Resource nichts mehr tun will und schliesst es dann. Wenn der Prozess abstürzt schliesst Windows das File automatisch und geht es doch noch gut.
Das folgende ist ziemlich rauh und würde ich so sicher nicht implementieren. Das Handling des Lockfiles würde ich in eine Intelligente Globale Variable verlegen mit den Methoden "Aquire Lock" und "Release Lock" für den Versuch das File zu öffnen (Acquire Lock) die den Status zurückgibt ob das auch gelungen ist und in dem Fall wird die FileRefnum im internen Shiftregister abgespeichert. Die zweite Method (Release Lock) schliesst die FileRefnum einfach.
[
attachment=57322]