Hallo allemaal,
ik ben op dit moment iemand aan het helpen met een opgeloste zuurstof meter.
Deze meter meet de hoeveelheid zuurstof in het water.
Het gaat hier om een Sensecap S-RJY-01 https://files.seeedstudio.com/wiki/Dissolved-Oxygen-Sensor/Datasheet-D…

Deze sensor heeft een RS485 Modbus RTU interface. De sensor heeft een spanning nodig tussen de 12 en 24V.
Ik heb deze sensor aangesloten met een MAX485 module aan een Arduino.
De spanning maak ik met een boost converter van 5 naar ongv. 18V.

Als ik het volgende pakket stuur vanaf de Arduino naar de sensor krijg ik echter niets terug:

(op kanaal 1 is de een van de differentiële uitgangen te zien van de MAX485, kanaal 2 is de DE en RE pin)
Volgens de handleiding is dit wel een geldig pakket.

Wat doe ik hier fout?
In de handleiding wordt ook het adres van de sensor omschreven als dec 55, maar ik zie dit gek genoeg niet terug in het voorbeeld pakket in de handleiding.

Specs zijn niet heel erg duidelijk.

Maar het lijkt erop dat het eerste byte het adres moet zijn. En bij een fout adres komt er natuurlijk geen reactie, want dan zou een andere sensor moeten reageren.

De voorbeeldjes gebruiken adres = 1, Dat klopt waarschijnlijk wel want het eerste voorbeeld betreft het zetten van dat adres.

Ik zou gewoon een loop gebruiken om alle mogelijke adressen af te gaan. Kijken wanneer er respons komt. Maar dan is het wel de vraag hoe de CRC berekend moet worden.

pagina 7 vd datasheet:

Default communication parameters:
Address 55(DEC), baud rate 9600bps, 1 start bit, 8 data bits, no parity, 1 stop bit

Lijkt een vrij standaard Modbus implementatie te zijn waarbij een aantal Holding registers via function code 03 gelezen kunnen worden of een enkele geschreven via function code 06.

Bedankt voor de vlotte reacties.
Het zetten van adres 55 heb ik ook geprobeerd, ook daar geen reactie op.
Ook heb ik al geprobeerd om alle adressen af te gaan, ook daar geen reactie op.

op het gevaar af een open deur in te trappen: A en B lijn verwisseld?

Je moet wel een correcte CRC16 berekenen voor je bericht, anders krijg je ook niet veel terug. Als je geluk hebt een error dat het bericht niet klopt. Dan weet je wel dat het adres klopt.

Verder, heb je de GND van je sensor ook aan je bord aangesloten? Want die heb je wel nodig.

A en B lijnen heb ik controleerd en voor de zekerheid doorgemeten.
CRC16 heb ik ook gecontroleerd.
Vreemde is dat bij het wijzigen van het slave adres commando er niet eens het adres 55 gekozen kan worden:

Dat is een voorbeeld waarbij het adres van 01 naar 06 veranderd wordt. Je kan dus wel degelijk 55 kiezen.

Oeps niet goed gelezen, je hebt helemaal gelijk.

Op zondag 9 maart 2025 21:05:07 schreef [steven]:
A en B lijnen heb ik controleerd en voor de zekerheid doorgemeten.

A en B benamingen kunnen omgekeerd zijn bij verschillende fabrikanten. Gewoon omgedraaid ook proberen.

Onderstaande link geeft je het officiële modbus protocol.
https://www.modbustools.com/modbus.html
Ik meen dat er (onofficieel) ook een broadcast adres is waarop elk aangesloten device moet antwoorden (mits het bericht het juiste formaat en een correcte CRC heeft). Staat me bij dat dat 255 (0FFH) of juist 0 (00H) is.
Modbus devices antwoorden alleen als het bericht een goed adres, de juiste lengte en een correcte CRC heeft. In alle andere gevallen krijg je geen antwoord.
Is aan deze voorwaarden voldaan dan krijg je altijd antwoord, eventueel met een foutmelding als je bijvoorbeeld om een register vraagt wat in dat device niet bestaat of een niet ondersteunde opdracht code geeft.
In jouw geval geldt het RTU protocol.

0 is het broadcast adres maar wordt amper gebruikt omdat je geen respons krijgt en je dus niet zeker weet dat het goed is aangekomen.

Wat een beetje vreemd is in de voorbeelden uit de spec van de sensor dat ze daar zeggen dat 01 het default adres is om vervolgens een voorbeeld te geven hoe dat in 06 te veranderen.
Maar heel duidelijk staat verderop dat het default adres van de sensor 55 (dec) = 37H is.
Als de sensor nieuw uit de doos is dan is die 55 het adres en 9600 nog steeds de baudrate. Het commando om bijv. de temperatuur uit te lezen wordt dan:

37 03 01 00 00 01 xx xx
37 = adres sensor
03 = commando om een register te lezen
01 00 = registeradres van de temperatuur
00 01 = aantal registers = 1 = 2 bytes !
xx xx = crc16 code, die moet je wel correct uitrekenen

Je moet dan terug krijgen:
37 03 02 00 xx yy yy waarbij:
37 = adres van de sensor
03 = het gegeven commando (register lezen)
02 = aantal databytes
xx yy de temperatuur is in 0.1 graden
zz zz de CRC16 van dit bericht die je dan hoort te controleren.

Er is Modbus testsoftware waar je dit kunt invullen en wat dan netjes de CRC voor je uitrekent. Had ik ooit wel maar is bij een nieuwe PC verdwenen.

XX XX = 80 60
Dus:
37 03 01 00 00 01 80 60

Zie:
https://crccalc.com/?crc=37%2003%2001%2000%2000%2001&method=CRC-16…

De CRC16 moet nog naar BIG endian geswapped worden, vooral in je programma niet vergeten.

[Bericht gewijzigd door henri62 op (23%)]

Ik heb ooit een Modbus (ASCII) implementatie geschreven en heb veel info gevonden op: https://www.lammertbies.nl/comm/info/modbus.

Ook iets om rekening mee te houden: soms moet je het gewenste register adres +1 of -1 doen om reden dat Amerikanen niet weten wat "0" is en Modicon van oorsprong natuurlijk een Amerikaans merk was.

Op dinsdag 11 maart 2025 09:15:54 schreef GJ_:
Ook iets om rekening mee te houden: soms moet je het gewenste register adres +1 of -1 doen om reden dat Amerikanen niet weten wat "0" is en Modicon van oorsprong natuurlijk een Amerikaans merk was.

Oh ja, dat klopt. En ooit een keer meegemaakt dat er een offset van, wat was het ook al weer, 4000H(?) bij geteld moest worden. Had iets met de geheugen indeling van Modicon PLC's...
Maar gezien de voorbeelden in het sensordocument verwacht ik niet dat dat hier het geval zal zijn. En zoja, dan hoort de sensor een foutcode terug te sturen met betekenis: ongeldig register adres.

Een offset van 40000 of 30000 kan ook nog ja. Of dus 40001 :-)
Daar zit dan de functiecode bij opgenomen.

Ik ken het vooral van sommige Amerikaanse servodrives van Emerson.

Op dinsdag 11 maart 2025 10:13:54 schreef GJ_:
Een offset van 40000 of 30000 kan ook nog ja. Of dus 40001 :-)
Daar zit dan de functiecode bij opgenomen.

Ik ken het vooral van sommige Amerikaanse servodrives van Emerson.

Allen bradley plc's hadden dat ook.
En verder ben ik ook ooit 8 bit met parity tegengekomen. En ik meen ook dat hi en lo CRC ooit ergens omgedraaid waren. Zoveel fabrikanten, zoveel variaties :-(

Officeel is modbus ook alleen met even parity. Maar ja, iedereen rommelt maar wat aan.

Volgens de "regels" van 2006 is even parity default, "no parity" en "odd" zijn optioneel.

Schakelt je MAX485 wel om naar receive/ontvangen?

Moet een MAX485 omschakelen? Hoe dat dan?

Op woensdag 12 maart 2025 08:30:49 schreef GJ_:
Moet een MAX485 omschakelen? Hoe dat dan?

Van die reactie verschiet ik wel even.

RS(3)485 is half duplex, dus is het heel normaal dat de MAX(3)485 (of gelijkaardig) moet schakelen tussen ontvangen, wat de standaard is, en zenden. Waar denk je dat de ReceiverOutput en ReceiverOutputEnable voor dienen?