Modbus Input Read - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +---- Forum: Instrument IO & VISA (/Forum-Instrument-IO-VISA) +---- Thema: Modbus Input Read (/Thread-Modbus-Input-Read) |
Modbus Input Read - stromflo - 01.06.2010 09:21 Hallo, ich arbeite zur Zeit sehr viel mit LabVIEW im Zusammenhang mit Modbus. Mein Modbus arbeitet mit 9600 Baud. Es funktioniert auch sowohl das einlesen von Inputs u. Holdings als auch das Ausgeben von Coils oder Holdings. Ich versuche aber die Geschwindigkeit beim einlesen der Inputs zu verbessern. Ich hab mal ein kleines performance Tool gemacht, in dem ich die Zeiten für das einlesen von 41 und einem einzelnen Input darstelle. Der einzelne Input benötigt nach Messungen rund 157ms das lesen von einem Input 64ms. Die Problematik liegt, darin, dass die auszulesenden Datenpunkte nicht untereinander angeordnet sind, sondern durcheinander. So kann es vor kommen, dass ich Datenpunkt 1 und 10 brauche usw. Meine Frage wäre es, ob es eine Optimierungsmöglichkeit gibt, um einzelne Inputs bzw. eine bestimmte Anzahl bzw. bestimmte Datenpunkte einzulesen. Hat jemand eine Idee wo man da evtl. noch schrauben kann. Das eigentliche Ziel wäre ein einlesen von 8 Inputs in etwa 70 ms zu erreichen. Wenn ich mir so die Übertragung per Modbus anschaue habe ich in jedem Fall: 8-Bit Adresse, 8-Bit Funktion, Daten N x 8 Bits, 16-Bit CRC Gruß Florian Modbus Input Read - stromflo - 01.06.2010 09:39 Neue Erkenntnis: Wenn ich z.B. nur 10 inputs deren Datenpunkte hintereinander liegen einlese komme ich auf 86ms. Sprich ich müsste evtl. die Zielsoftware anpassen und die Datenpunkte für die Testzwecke verändern. Trotzdem wäre es natürlich interessant ob jemand noch einen anderen weg sieht oder kennt:)Man lernt ja nie aus. Gruß Flo Modbus Input Read - GerdW - 01.06.2010 09:44 Hallo Flo, bei der Baudrate braucht schon die (rein hardware-bezogene) Übertragung eines Bytes ca. 1ms. Und das ohne irgendwelche Zeiten für Treiber, Berechnungen etc. Viel zu optimieren gibt es da nicht - das Timing ist halt hardware-getrieben. Wenn du mehrere Bytes lesen willst, z.B. Index 1 und 10, würde es sich anbieten, den kompletten Bereich von Index 1 bis 10 zu lesen und die benötigten Werte zu indizieren. Dann brauchst du etwa 120ms (geschätzt aus deinen Angaben). Edit: Hast du ja nun schon selbst ausprobiert... Oder du guckst in diese (mir unbekannte) ModBus-Funktion hinein, um dort nach evtl. möglichen Optimierungen zu schauen. Aber wie schon erwähnt: aus einem 9600 Baud-Bus wirst du schwerlich größere Geschwindigkeiten zaubern können... Modbus Input Read - stromflo - 01.06.2010 09:50 Hallo Gerd, ja wie schon bei neuer Erkenntnis geschrieben, wäre das auslesen von Datenpunkten die hintereiander liegen im Moment aus meiner Sicht wohl die einzigste Optimierungsmöglichkeit. Dafür müsste ich praktisch die Software des Zielgerätes anpassen, was in diesem Fall aber nicht so aufwendig sein sollte. Wie im letzten Beitrag geschrieben bräuchte ich für 10 Messwerte 86ms. Die Messwerte landen hier bereits in einem Array. Ich müsste aber auch noch ein wenig filtern und die Werte im Signalverlauf wie gewünscht darzustellen. Ich werde einfach mal noch ein wenig rumprobieren. Ansonsten würde halt noch eine höhre Baudrate helfen. Zitat:Oder du guckst in diese (mir unbekannte) ModBus-Funktion hinein, um dort nach evtl. möglichen Optimierungen zu schauen. Aber wie schon erwähnt: aus einem 9600 Baud-Bus wirst du schwerlich größere Geschwindigkeiten zaubern können... Ich denke um hier was zu ändern bzw. optimieren fehlt mir noch einiges an LabVIEW Know How Aber danke! Gruß Flov Modbus Input Read - jg - 01.06.2010 09:56 ' schrieb:ja wie schon bei neuer Erkenntnis geschrieben, wäre das auslesen von Datenpunkten die hintereiander liegen im Moment aus meiner Sicht wohl die einzigste Optimierungsmöglichkeit. Dafür müsste ich praktisch die Software des Zielgerätes anpassen, was in diesem Fall aber nicht so aufwendig sein sollte.Ja, eine Array von hintereinanderliegenden Werten anfordern ist so ziemlich die einzige Optimierungsmöglichkeit. Hier sparst du dir dann den Overhead, da jede Anfrage einen Header hat, vom Empfänger verarbeitet werden muss, dir erst dann eine Antwort (wieder mit Header) schickt, die du dann verarbeiten musst. Das kostet natürlich alles. ' schrieb:Ansonsten würde halt noch eine höhre Baudrate helfen.Ob das wirklich so viel helfen würde, steht auf einem anderen Blatt. Ich würde auf jeden Fall bei z.B. 19,2 kBaud nicht die doppelte Performance erwarten. Der Overhead ist ja auch, dass deine Gegenstelle die Anfrage empfangen und verarbeiten muss, und dann erst die Antwort sendet. Gruß, Jens Modbus Input Read - stromflo - 02.06.2010 08:09 So, mit 250ms Zyklus geht alles so weit. Werd mich aber trotzdem noch dran versuchen den Zyklus noch etwas nach unten zu bekommen. Die Anwendung rennt in jedem Fall schon mal Und wirklich mal vielen Dank an alle hier! Ist ein wirklich sehr hilfsbereites Forum und man lernt hier echt eine Menge! Zudem macht es dann auch gleich viel mehr Spaß mit LabVIEW zu arbeiten. Gruß Flo |