Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Ich möchte mich an BUS-Kommunikation versuchen und habe hierfür (erst einmal) ein Heizgerät das ich über einen LIN-Eingang ansteuern möchte (erstmal einfach: "HEIZEN AN / HEIZEN AUS"). Ein 8476-Modul ist schon bestellt!
Die Beispiel-vi "LIN Master Send Full Frame and Receive" vom NI-CAN habe ich bereits gesehen. Wozu ich bisher keine Antwort finden konnte, wäre ob LIN-Geräte (i.d.F der Heizer) bereits eine ID haben, oder ob diese zuerst vergeben werden müssen. Wenn ersteres: kann ich die auslesen oder muss man da beim Hersteller nachhaken? Wenn zweiteres: wie?
Habe ich ausserdem richtig verstanden, dass die Befehle (wie zB "Heizen") vom Slave Task des Masters an den Bus gegeben werden?
Anscheinend habe ich mir nicht die einfachste Labview Aufgabe gestellt und meine Frage war zu wage/planlos als dass sie Interesse an Unterstützung hervor gerufen hätte. Vielleicht hat ja nun jemand einen Tipp, nachdem ich mein Problem konkretisieren konnte. :-)
Ich habe inzwischen eine ldf-Datei erhalten, in der der Befehl "Heizer AN" (idF: "Geraet_ein) zu finden ist.
Meine Hoffnung war, dass es ab jetzt nur noch plug&play ist mit der Beispiel-VI "LIN Master Send Full Frame and Receive". Den Receive-Teil habe ich erstmal gelöscht; somit sieht die VI jetzt aus wie im Anhang.
So wie ich die Beispiel-VI interpretiere, wird hier anhand der Eingaben "Arbitration ID" und "Data" der Frame erstellt und mit "Send Full Frame" verschickt.
Die "Arbitration ID" sollte dann doch "28" sein, wie in "Frames {..." definiert.
Als Eingabe für "Data" hätte ich dann "Geraet_ein" vermutet, aber hier kann ich ja keinen String eingeben, sondern nur zwischen 0 und 8 Hex-Werten. Und eine Id, für welche "Geraet_ein" steht habe ich auch nicht gefunden.
Ich wäre sehr dankbar, wenn mir hier jemand auf die Sprünge helfen könnte.
Im Beispiel ist eine Botschaft mit der ID 38 definiert, sie enthält die Signale Reg_Set_Voltage usw. Diese Signale sind in einem U32-Wort enthalten, die Zahl nach dem Signalnamen definiert die Bitposition in der Botschaft.
Weiter im Beispiel: Die Cut_Off_Speed ist so als Signal definiert:
Hier bedeutet die "4", dass das Signal mit 4 Bit Breite definiert ist.
Da eine Wertetabelle für dieses Signal existiert, steht diese auch in der ldf-Datei:
Wenn du jetzt also eine CutOffSpeed von 4000rpm setzen willst, musst du den Wert "8" in 4 Bit Breite kodieren und an Bitposition 12 in der Botschaft unterbringen…
Die LIN-Botschaften selbst werden nach einem festen Zeitschema versendet, auch dieses wird in der LDF-Datei definiert:
vielen Dank für deine Antwort! Ich denke ich verstehe die ldf jetzt schon etwas besser und hoffe es ist ok, dass ich sie leicht gekürzt einstelle.
Mir ist aufgefallen, dass es eventuell weniger umständlich ist die Kommunikation zu überprüfen, wenn ich erstmal nur einen Temperatursensor abfrage.
Dafür dachte ich müsste mit der Beispiel-VI "LIN Master Send Header Frame and Receive" die Arbitration-ID "48" versenden werden. Da erhalte ich aber den gescreenshotteten Fehler, der wohl bedeutet, dass der Slave noch eine Response erwartet. Die soll aber doch der Slave verschicken?
Zitat:Dafür dachte ich müsste mit der Beispiel-VI "LIN Master Send Header Frame and Receive" die Arbitration-ID "48" versenden werden. Da erhalte ich aber den gescreenshotteten Fehler, der wohl bedeutet, dass der Slave noch eine Response erwartet.
Ich selbst habe nicht mit den Low-Level-CAN-Funktionen direkt mit LIN gearbeitet, von daher nur wenig Erfahrung mit diesem Beispiel-VI.
Aber:
Im Screenshot sendest du keinen "Write Header Frame". Der Slave wartet aber auf die Aufforderung des Masters, eben diesen Frame 48 zu senden!
LIN funktioniert MASTER-gesteuert: Der Master hat die Oberhoheit und teilt den Slaves am Bus mit, welche Botschaft er jetzt gerne abfragen will. Der Slave hat dann auf genau die IDs zu antworten, die ihn betreffen. Genau deshalb gibt es die ScheduleTable im Master, die festlegt, welche ID wann (bzw. in welchem Abstand) gesendet wird!
Wenn ich das richtig verstehe, ist der automatische Ablauf nach "ldf" normalerweise der Fall, jedoch nicht wenn die Steuerung über Labview laufen soll:
"Allgemein ausgedrückt wird der LDF genutzt, um das Planungsverhalten des LIN-Clusters zu konfigurieren und festzulegen. So definiert er z. B. die Baudrate, die Reihenfolge und die Zeitverzögerungen bei der Übertragung der Header durch den Master-Task sowie das Verhalten jedes Slave-Tasks als Antwort darauf. Die Frame-API NI-CAN für LIN und LIN-Hardware von NI bieten keine volle native Unterstützung für LDFs, so dass das geplante Verhalten nicht auf die Hardware geladen werden kann. Jedoch steht eine Low-Level-Unterstützung für den Buszugriff (Schreiben der Header und Veröffentlichung oder Abfragen der Antworten) so zur Verfügung, dass der Nutzer das geplante Verhalten auf der Anwendungsebene erstellen kann"
[ni-Seite]
Dem entnehme ich, dass ich meinen Slave direkt mit den Low-Level Funktionen ansprechen kann/soll. Klappt nur leider nicht....
da ich selbst nur mit CAN und einem CAN2LIN-Umsetzer gearbeitet habe, kann ich zur direkten LIN-Unterstützung nichts beitragen.
Was sagt denn der NI-Support in München?