guidoBln Posted March 4, 2025 at 02:34 PM Posted March 4, 2025 at 02:34 PM Problem: Ich kann die Modbus Register weder auslesen noch setzen. Modbus ist Firmware: 2.7.5+67bf44a8 (erstellt 26.02.2025 17:43:20, von Tinkerforge GmbH) Der nachfolgende Code bei den liefert Adressen 1002 und 1004 immer <Buffer 00 00 00 00> zurück, egal ob geladen wird oder nicht. Auch kann ich auf keine anderen Register zugreifen ("IllegalDataAddress"). Was mache ich falsch? // typescript 4.9.5 import modbus, { TCPStream } from 'modbus-stream' modbus.tcp.connect( 502, '192.168.178.55', { debug: '_' }, ( err: any, connection: TCPStream | undefined ) => { if ( err ) { console.error( err ) } else if ( connection ) { connection.readHoldingRegisters( { address: 1002, quantity: 4, }, ( err: any, data: any ) => { if ( err ) { console.error( err ) } else { const test = Buffer.from( data.response.data ) console.log( test ) } } ) } } ) Quote
rtrbt Posted March 4, 2025 at 02:48 PM Posted March 4, 2025 at 02:48 PM An Holding Register 1002 und 1003 liegt der von Modbus erlaubte Ladestrom, an 1004 und 1005 das Front-LED-Blinkmuster. Wolltest du stattdessen die Input Register 1002 bis 1005 lesen? Dann würdest du den Ladestatus und die User-ID zurückbekommen. Quote
guidoBln Posted March 4, 2025 at 09:15 PM Author Posted March 4, 2025 at 09:15 PM Ja, genau das habe ich vor. Quote
rtrbt Posted March 5, 2025 at 07:01 AM Posted March 5, 2025 at 07:01 AM Nur um das offensichtliche auszuschließen: Du hast unter Schnittstellen -> Modbus TCP mindestens den Lesezugriff aktiviert und die WARP Charger-Registertabelle ausgewählt? Bekommst du im Ereignislog eine Ausgabe in der Art von "modbus_tcp_srvr | client connected: peer_address=123456789 port=47496"? On 3/4/2025 at 10:15 PM, guidoBln said: Ja, genau das habe ich vor. Sorry, ich bin verwirrt. Du hast vor die Holding oder die Input Register zu lesen? Quote
guidoBln Posted March 5, 2025 at 07:42 AM Author Posted March 5, 2025 at 07:42 AM Ich gestehe, ich bin noch ganz offfensichtlich nicht ausreichend vertraut mit modbus. Ich kenne die Unterschiede zwischen den Registerarten nicht. Quote
guidoBln Posted March 5, 2025 at 07:43 AM Author Posted March 5, 2025 at 07:43 AM Ich möchte die Input Register 1002 (Ladestatus), 1004 (User-ID) und 2002 (2002) auslesen. Quote
rtrbt Posted March 5, 2025 at 08:36 AM Posted March 5, 2025 at 08:36 AM Du benutzt connection.readHoldingRegisters versuch stattdessen mal connection.readInputRegisters Quote
guidoBln Posted March 5, 2025 at 12:08 PM Author Posted March 5, 2025 at 12:08 PM readInputRegisters( { address: address, quantity: numberOfRegisters, }, ( err: any, data: any ) => { const buf = Buffer.from( data.response.data ) console.log( buf ) } }) Quote
guidoBln Posted March 5, 2025 at 12:10 PM Author Posted March 5, 2025 at 12:10 PM (edited) ...liefert für die Adressen 1002 und 1004 immer nur "<Buffer 00 00 00 00>". Dabei läuft ein Ladevorgang. Edited March 5, 2025 at 12:10 PM by guidoBln Quote
rtrbt Posted March 5, 2025 at 12:33 PM Posted March 5, 2025 at 12:33 PM Versuch mal direkt console.log(data.response.data) anstatt von const test = Buffer.from( data.response.data ) console.log( test ) data.response.data ist schon ein Array von Buffern. Ich bekomme [ <Buffer 00 00>, <Buffer 00 01>, <Buffer ff ff>, <Buffer ff ff> ] wenn ein Auto angesteckt ist, also einen Buffer pro Register mit je 2 Byte drin. Du müsstest dann noch herausbekommen, wie man aus jeweils zwei Buffern eine 32-Bit-Zahl macht. Quote
guidoBln Posted March 5, 2025 at 02:38 PM Author Posted March 5, 2025 at 02:38 PM Ich hab's hinbekommen: Ladeleistung (Register 2002): connection.readInputRegisters({ address: 2002, quantity: 8 }, (err, data) => { return Buffer.concat(data.response.data).readFloatBE() }) 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.