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!
im Rahmen meiner Bachlorarbeit beschäftige ich mich mit der Kommunikation zwischen der Platine einer zwei-achsigen-PV-Nachführeinheit und meinem PC mithilfe von Labview und Modbus (RS-485).
Meine Erfahrungen in dem Thema sind leider sehr beschränkt und ich stehe wie der Ochse von dem Berg, weil die Kommunikation (Abfrage der Inputregister) mit dem Gerät nicht so klappt wie gewohnt.
Meinen Aufbau habe ich schematisch mit an gehangen. Durch den Hersteller habe ich bereits erfahren, dass das Gerät wohl andere Funktionscodes nutzt (Liste der Befehle im Anhang). Inputregister scheint die Steuerplatine nicht zu bilden, bzw. der Befehl 0x04 (wenn ich mich nicht irre) scheint nicht belegt zu sein.
Nun ist meine Frage besteht die Möglichkeit die Funktionscode manuell zu setzten ? und wenn ja wie genau bekomme ich das hin ?
Oder fallen euch noch andere Fehler/Problemquellen auf ?
Über Vorschläge freue ich mich sehr.
Gruß
Max Klein
Anzeige
06.05.2020, 09:40 (Dieser Beitrag wurde zuletzt bearbeitet: 06.05.2020 09:42 von GerdW.)
Zitat:Nun ist meine Frage besteht die Möglichkeit die Funktionscode manuell zu setzten ? und wenn ja wie genau bekomme ich das hin ?
Ich würde bei diesem Gerät meinen eigenen Gerätetreiber programmieren.
Du benötigst:
- ein VI, um diese MODBUS-Messages zu generieren, mit den Eingängen Slave-Address (U8), FunctionCode (U8), Daten (U8-Array). Das VI berechnet dann noch die CRC und baut alles zur Message zusammen. Abschicken dann per VISAWrite.
- ein VI, um die Response per VISARead zu lesen und auszuwerten. Ausgänge: ACK/NACK und Response-Daten (U8-Array).
- diverse VIs für jeden benötigten Befehl, der die passenden Daten (Int, Float, etc.) verarbeitet
Ist eine schöne und überschaubare Übung, bei der man gut LabVIEW lernen kann!
(Ich habe etwas mit Modbus gearbeitet und es scheinen hier unübliche FunctionCodes verwendet zu werden. Die üblichen Modbus-Libraries sind darauf eher nicht ausgelegt - auch hier müsstest du einiges an Programmierarbeit reinstecken. Da ich aber auch hier auf eigene Bibliotheken statt welcher aus VIPM zurückgegriffen habe, ist meine Erfahrung damit sehr begrenzt…)
ganz von vorne musst du nicht anfangen, du hast ja schon die "gute alte" NI Modbus-Library installiert.
An deiner Stelle würde ich davon eine Kopie erstellen und das entsprechend anpassen.
Wenn du eines der polymorphen Master Read oder Write VIs öffnest, dann wird darin immer dasselbe VI verwendet: MB Serial Master Query.vi
Da der "Function Code" nur ein Ring-Control ist, kannst du ihn leicht mit anderen als den vordefinierten Werten überschreiben.
Damit wäre der "Request" (teilweise) erledigt.
Dann musst du dich aber noch um die Antwort kümmern, bei einem unbekannten Function Code wird nämlich im SubVI "MB Decode Data.vi" verworfen.
Das wäre aus meiner Sicht ein sinnvoller Einstieg, um diese seltsame Modbus-Umsetzung anzugehen.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Den Block "MB Serial Master Query.vi" habe ich gefunden. Dort habe ich dann in der Ring-Control einen neuen Befehl eingefügt. Ist das korrekt wenn ich den Funktionscode in Dezimalschreibweise eingebe (also 0x78 als 120 für die "general Infos")?
Das habe ich, glaube ich zumindest, hinbekommen (siehe Bild im Anhang).
Wenn ich nun in den Block "MB Serial Master Query.vi" reinschaue erhalte ich das Fenster was im Bild "MB Serial Master Query_BS" zu sehen ist. In diesem Block kann ich nicht mehr viel ändern. Jedoch muss ich ja den Decode-Block abändern, da er meinen Funktionscode nicht kennt.
Wie kann ich ich da nun vorgehen um dort etwas abzuändern?
Das Ringcontrol hättest du nicht ändern müssen. Einfach ein Numeric mit Wert 120 anschließen, fertig. Das ist das Schöne an einem Ring, dem kannst du auch zur Laufzeit einen anderen Wert verpassen.
Zur Antwort: Im Decode-VI wird im Default-Case die Antwort nicht zurückgegeben - das müsstest du ändern.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
ok, also ändere ich den Decodeblock so ab, dass er auf im Fall "Standard" die Daten umwandelt soll. Ich bekomme ja für meinen Befehl ein Paket aus 104 Bytes in unterschiedlichen Datenformaten (INT32 und float32). Kommen die Daten dann geordnet in Form eines Feldes im Decode-Block an oder sind diese als Bitfolge alle aneinandergereiht ?
Bin leider komplett unerfahren in diesem Bereich, daher schon mal eine Entschuldigung im voraus für ggf. dumme Fragen.
so ich habe jetzt mal versucht die Vorschläge umzusetzen. Dazu hab ich im Serial Master Query den neuen Funktionscode eingegeben (siehe Anhang) und anschließend den Decode-Block abgeändert. Jedoch erhalte ich jetzt einen Timeout Fehler (Fehlercode 6101). Muss ich bei dem Decode-Block den konkreten Reply-Code erstellen oder reicht es wenn ich einfach in den Standardfall meine Konvertierung reinpacke ?