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!