Jump to content

Recommended Posts

Geschrieben

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!
 

  • 2 weeks later...
Geschrieben (bearbeitet)

@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: 

RS485_2.png.ba7bb4f27be28b8cb52e25f4cf136896.png

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:

RS485_1.png.ae56559c1ef8dbf6331c94ce2ff32f52.png

 

Vielleicht kannst du mich aufklären, mir fehlt hier die Erfahrung mit modbus. 

 

bearbeitet von stefanwe
Geschrieben

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?

Geschrieben (bearbeitet)

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.

bearbeitet von MatzeTF
Korrektur zur Schirmung
Geschrieben

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.

Geschrieben

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.

Geschrieben (bearbeitet)

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.

bearbeitet von MatzeTF

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...