stefanwe Posted July 27, 2023 at 08:59 AM Posted July 27, 2023 at 08:59 AM Hallo, ich bin neu im Thema Modbus und BrickletRS485. Ich frage mich gerade wie das ganze Funktioniert, hier mal folgendes Beispiel von mir: pcon.on(IPConnection.CALLBACK_CONNECTED, (connectReason: number) => { console.log(connectReason); ipcon.enumerate(); rs485.setRS485Configuration( 9600, BrickletRS485.PARITY_NONE, BrickletRS485.STOPBITS_1, BrickletRS485.WORDLENGTH_8, BrickletRS485.DUPLEX_HALF ); rs485.setMode(BrickletRS485.MODE_RS485); rs485.setModbusConfiguration(1, 1000); rs485.enableReadCallback(); const request = Buffer.from([ // address 0x02, // function code 0x03, // address 0x00, 0x01, // quantity 0x00, 0x06, // CRC 0x00, 0x00 ]); console.log(Utils.toHex(request.toString())); const crc = CRC.crc16modbus(request.slice(0, request.length - 2)); request.writeUInt16BE(crc, request.length - 2); const msg = request.toString('binary'); console.log(msg.split('')); console.log(Utils.toHex(msg)); //rs485.write(Utils.hex2a('0203FC000100035438').split('')); rs485.write(msg.split('')); }); let buffer = ''; rs485.on(BrickletRS485.CALLBACK_READ, (message: string[]) => { buffer += message.join(''); if (buffer.length >= 8) { console.log(`Message: "${Utils.toHex(buffer)}"\n`); buffer = ''; } }); Auf dem BrickletRS485.CALLBACK_READ event kommen auf message immer 1 Zeichen, die ich auf buffer sammel. Ich frage mich nun wie das Funktioniert um auf die Antwort von der Anfrage "0203000100063b94" zu warten, wenn dort auch andere Nachrichten kommen. Beispiel im Brick-Viewer sehe ich alle 3 Sekunden mehrere Nachrichten, je nachdem wie ich verbinde, komme ich bei der Nachricht versetzt an. Wann weiß ich, wann eine Nachricht komplett da ist? (crc16 ist mir bekannt, aber wo fängt man an bei Nachrichten an, wenn man versetzt die ersten bytes bekommen hat) Wie setzt ihr das ganze um? Gibt es mehr Beispiele, um zusehen, was ich machen kann :) Schonmal vielen Dank! Quote
rtrbt Posted July 28, 2023 at 11:30 AM Posted July 28, 2023 at 11:30 AM Anstatt dass du die Modbus-Pakete von Hand parst, kannst du das RS485-Bricklet im Modbus-Master-Modus benutzen. Ein Beispiel dafür gibts hier: https://www.tinkerforge.com/de/doc/Software/Bricklets/RS485_Bricklet_JavaScript.html#modbus-master-node-js (bzw. weiter unten in der nicht-NodeJS-Variante) Quote
stefanwe Posted July 29, 2023 at 09:37 AM Author Posted July 29, 2023 at 09:37 AM Ich werde es ausprobieren, in meinen Fall wäre es aber keines der Write Funktionen wie im Beispiel, sondern "modbusMasterReadHoldingRegisters" weil ich ja mit "code 3" etwas auslesen will? Quote
rtrbt Posted July 31, 2023 at 07:58 AM Posted July 31, 2023 at 07:58 AM Das funktioniert mehr oder weniger identisch: Du rufst modbusMasterReadHoldingRegisters und bekommst dann das entsprechende Callback mit der Antwort. Quote
stefanwe Posted August 14, 2023 at 09:07 AM Author Posted August 14, 2023 at 09:07 AM (edited) @rtrbt Ich wollte jetzt "modbusMasterReadHoldingRegisters" benutzen und bekam "BrickletRS485.EXCEPTION_CODE_TIMEOUT". const rs485 = new BrickletRS485('24RB', ipcon); .... let rs485requestId = 0; ipcon.on(IPConnection.CALLBACK_CONNECTED, (connectReason: number) => { rs485.setRS485Configuration( 9600, BrickletRS485.PARITY_NONE, BrickletRS485.STOPBITS_1, BrickletRS485.WORDLENGTH_8, BrickletRS485.DUPLEX_HALF ); rs485.setMode(BrickletRS485.MODE_MODBUS_MASTER_RTU); rs485.setModbusConfiguration(1, 1000); rs485.modbusMasterReadHoldingRegisters(2, 1, 6, (requestID: number) => { rs485requestId = requestID; }); }); ... rs485.on(BrickletRS485.CALLBACK_MODBUS_MASTER_READ_HOLDING_REGISTERS_RESPONSE, (requestID: number, exceptionCode: number, holdingRegisters: number[]) => { console.log(`CALLBACK_MODBUS_MASTER_READ_HOLDING_REGISTERS_RESPONSE: requestID: "${requestID}" exceptionCode: "${exceptionCode}" holdingRegisters: "${holdingRegisters}" \n`); }); Ich hab das ganze dann per Hand im Brick Viewer nachgeprüft: Dort ist es genau so. Eine Idee was ich falsch mache? Wenn ich den Modus umstelle, kommen in einer Dauerschleife immer 2 Nachrichten an, am Brick: Vielleicht kannst du mich aufklären, mir fehlt hier die Erfahrung mit modbus. Edited August 14, 2023 at 09:13 AM by stefanwe Quote
MatzeTF Posted August 14, 2023 at 09:24 AM Posted August 14, 2023 at 09:24 AM rtrb ist inzwischen im Urlaub. Wenn du regelmäßig Nachrichten empfängst, obwohl du keine Anfragen sendest, sollte das eigentlich bedeuten, dass ein anderes Gerät am Bus bereits ein Master ist. Zwei Master an einem Bus funktioniert üblicherweise nicht, weil sich die Anfragen gegenseitig stören. Regelmäßig zwei Nachrichten sieht so aus, als wäre ein Gerät am Bus ein Master, der ein anderes Gerät abfragt, das brav antwortet. Könnte das der Fall sein? Was für Geräte sind noch angeschlossen? Quote
stefanwe Posted August 14, 2023 at 09:42 AM Author Posted August 14, 2023 at 09:42 AM Hallo @MatzeTF, danke für deine Antwort. Hier sind Bilder von unserem experimentellen Aufbau. Das Gerät soll später dann raus an ein Windgenerator. Quote
MatzeTF Posted August 14, 2023 at 10:11 AM Posted August 14, 2023 at 10:11 AM (edited) Das, was im „RS485“-Modus ausgegeben wird, sieht für mich so aus aus, als würde ein Modbus Master die Geräte mit den IDs 3 und 4 abfragen und keine Antwort bekommen. Ich weiß nun leider nicht, was im Gerät mit dem blauen Deckel steckt. Möglicherweise ist das Gerät als Master konfiguriert oder enthält ein Modul, das als Master konfiguriert ist. Ich kann mir keinen anderen Grund vorstellen, warum du sonst diese Datenpakete empfängst, obwohl du nichts angefragt hast, da Slave-Geräte nicht ungefragt senden dürfen. Unabhängig davon ist es übrigens empfehlenswert, die Bus-Masse am Bricklet an GND anzuschließen, wenn sie schon vorhanden ist. Die Schirmung vom Kabel sollte dagegen nicht am Bricklet angeschlossen werden. Das kann aber nicht die Ursache für deine unangeforderten Datenpakete sein. Edited August 22, 2023 at 11:34 AM by MatzeTF Korrektur zur Schirmung Quote
stefanwe Posted August 15, 2023 at 12:47 PM Author Posted August 15, 2023 at 12:47 PM Hallo @MatzeTF, ich bin gerade die Anleitung durch, konnte aber keine Einstellungen finden dazu (außer die Modbus Adresse). Ich hab mal das Dokument angehangen zum Gerät. Meine Vermutung ist jetzt schon das es vielleicht nicht In Ordnung ist. Wenn du vielleicht Zeit hast, kannst du mal das Dokument mal überfliegen. user's manual 3kW.pdf Quote
MatzeTF Posted August 15, 2023 at 02:31 PM Posted August 15, 2023 at 02:31 PM In dem Dokument steht ja praktisch nichts zu RS485 drin. Wenn man das Gerät über RS485 bzw. Modbus abfragen bzw. konfigurieren können soll, dann muss irgendwo die Modbus-Adresse stehen und vor allem müssen alle Modbus-Register dokumentiert sein. So kann man mit der RS485-Schnittstelle doch gar nichts anfangen. Anders sieht es natürlich aus, wenn die Schnittstelle gar nicht dazu da ist, das Gerät abzufragen bzw. zu konfigurieren, sondern das Gerät tatsächlich als Modbus-Master agiert und über RS485 mit irgendwelchen herstellerspezifischen Erweiterungen verbunden werden kann. Quote
stefanwe Posted August 16, 2023 at 09:24 AM Author Posted August 16, 2023 at 09:24 AM @MatzeTF Ich hab eine Excelliste mit Registern bekommen, dort steht aber auch nicht weiter zur Schnittstelle. Nur eine Auflistung der Bytes und Beschreibung dazu. Ich werde mal jetzt weiter den Hersteller nerven. Danke so weit! Quote
MatzeTF Posted August 17, 2023 at 12:24 PM Posted August 17, 2023 at 12:24 PM Laut Anleitung kann man RS232, RS485, ein GPS-Modul und einen Windmesser anschließen, aber immer nur eins davon. Daher vermute ich, dass einige der 8 Pins der RS485-Buchse tatsächlich von einem internen Modbus-Master benutzt werden, der GPS und Windmesser abfragen will. Für die Nutzung als Modbus Slave wären dann andere Pins vorgesehen. Es würde mich nicht wundern, wenn das RS485-Kabel einfach die falschen Pins rausführt. Leider ist der RS485-Anschluss nicht dokumentiert. Ich finde es schon seltsam, dass die beiden Adern orange (bzw rot) und grün/weiß sind. Das ist offensichtlich ein durchgeschnittenes Ethernet-Kabel, und die beiden Aderfarben sind eigentlich kein Paar. Quote
MatzeTF Posted August 23, 2023 at 10:34 AM Posted August 23, 2023 at 10:34 AM (edited) Mir ging das gerade nochmal mit den Aderfarben durch den Kopf: Bei dem weit verbreiteten Standard TIA-568B wären orange + weiß/grün die Pins 2 und 3. Bei dem in den USA noch genutzten TIA-568A wären orange + weiß/grün die Pins 6 und 1. Beides finde ich sehr ungewöhnlich. Organisier dir doch mal ein Oszilloskop und lass dir mal ohne RS485-Bricklet anzeigen, was auf den beiden Leitungen los ist, und ob das nach einem sauberen differenziellen Signal aussieht, oder ob eine der beiden Leitungen einen konstanten Pegel hat oder sogar ein ganz anderes Signal drauf hat. Wenn du nicht weißt, wie ein differenzielles Signal aussehen sollte, hängt das Oszilloskop einfach an das RS485-Bricklet und sende irgendwas raus. Wie gesagt, würde mich nicht wundern, wenn das Kabel einfach die falschen Pins rausführt. Hier kannst du sehen, welche Aderfarben eigentlich Paare bilden. Falls die beiden aktuell rausgeführten Adern nicht zum selben differenziellen Signal gehören, könntest du mit dem Oszilloskop gucken, ob z.B. orange + weiß/orange oder grün + weiß/grün zum selben differenziellen Signal gehören. Das wäre dann der Ausgang von dem Gerät und du könntest einfach mal das jeweils andere Paar an das RS485-Bricklet anschließen (+ und - raten, ggf. tauschen). Sofern im Oszilloskop auf dem Paar keine Spannung über 12 V angezeigt wird, kann da eigentlich nichts kaputtgehen. Edited August 23, 2023 at 10:41 AM by MatzeTF Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.