![]() |
CANopen - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +---- Forum: Datenkommunikation (/Forum-Datenkommunikation) +---- Thema: CANopen (/Thread-CANopen--29760) |
CANopen - Hydrogencarbonat - 12.01.2017 16:52 Hi, ich benutze eine NI PXI-8461 auf einer NI PXI und habe ein Schreibe- und Lese-VI mit CANopen erstellt. Ich kann somit Daten auf den Bus senden und auch wieder abrufen. Ich mache dies über SDO. Wenn ich diese Vis abwechselnd voneinander ausführe, dann klappt auch alles wunderbar (Es wird fehlerfrei geschrieben oder gelesen). Jedoch möchte ich das Lese-Vi die ganze Zeit laufen lassen und in dieser Ausführungszeit auf den Bus mit dem Schreibe VI mehrmals schreiben,so das diese dann in dem Lese Vi während der Ausführungszeit gelesen werden können. Ich habe aber das Problem, dass wenn das Lese Vi ausgeführt wird und ich auf den Bus mit dem anderen VI schreibe eine Fehlermeldung (Fehler 5378:CANopen SDO Read Object.vi) im Lese Vi auftaucht. Irgendwie kollidieren die Telegramme.. Was kann ich dagegen tun? Gruß HCO RE: CAN Open - Hydrogencarbonat - 12.01.2017 17:15 Die einzige Möglichkeit, die mir einfällt , um dieses Problem zu umgehen ist mit Globalen Variablen. Wenn ich während der Ausführungszeit des Read VIs das Schreibe Vi aktiviere, dann könnte ich ein Delay am Anfang des Schreibe VIs einbauen, davor über eine boolsche globale Variable ein False ausgeben, dieses zum Read Vi während der Delay Zeit übergeben und dann das Read Vi über eine Case Struktur mit False deaktivieren. Jetzt stellt sich nur noch die Frage, ob die globale Variable bei laufenden Read VI ein Wert übergibt? Habt Ihr noch einen anderen Vorschlag ? Gruß HCO Nachtrag: Und nach dem Delay im Schreibe-VI dann wieder über die Globale Variable die Case Struktur im Read- Vi auf True setzen und mit " CAN Open SDO READ" die geschriebenen Werte einlesen. RE: CANopen - jg - 12.01.2017 17:26 Dafür gibt es eigentlich die Semaphore VIs. Alternative: Pack dein Lese- und dein Schreib-VI in ein VI mit einer Case-Struktur, mit der du entweder die Ausführung von Lesen oder Schreiben auswählst. Mit diesem "Globale" Lese/SchreibVI ersetzt du alle bisherigen Aufrufe. Da das Lese/SchreibVI immer nur 1x ausgeführt werden kann (solange es nicht auf Reentrant steht), kann auch nur entweder Lesen oder Schreiben ausgeführt werden. Gruß, Jens |