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.
fatbeard
Honourable Member
Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
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.
Dat is een voorbeeld waarbij het adres van 01 naar 06 veranderd wordt. Je kan dus wel degelijk 55 kiezen.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
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.
buckfast_beekeeper
Van Lambiek wordt goede geuze gemaakt.
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.
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
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 
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
buckfast_beekeeper
Van Lambiek wordt goede geuze gemaakt.
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?