Sida 1 av 1

Skillnad i ModBus-telegram

Postat: 11 december 2024, 11:39:38
av FormerMazda
Först ut: detta kanske är fel kategori, men den känns minst fel? :)
Sen: Jag är inte nere på denna nivå där jag kikar på vad som skickas när man pratar modbus med nåt. Men har lång vana av att kommunicera med ModBus på nivå HMI - pryl.

Det rör sig om kommunikation med en elmätare ORNO OR-WE-517.
Och jag har kontakt med den, så vi kan utesluta allt sånt, problemet är hur jag ska läsa den så den inte får panik.

Tillverkaren har en egen mjukvara, och den mjukvaran kan läsa alla register ett och ett. Även om man klickar i att läsa flera så läser den bara ett och ett.
Kör jag med nåt annat program, oavsett vad, så tycker jag mätaren beter sig på samma vis, den får lätt panik.
Men vi tar ett exempel: (alla variabler är 32bit float, så jag läser 2 register i stöten)

På register (i HEX) 000E (& 000F då) finns spänning för L1-N, läser jag endast det med ModScan32 kommer det svar. Ber jag modscan läsa det och säg 80 register framåt går det också bra.
Men försöker jag läsa 0010 så får jag en exception tillbaka. Trots att det svarar om jag läser en himla klump med start 000E.

Med deras egna mjukvara ser en fråga på 000E ut såhär:
1E 03 00 0E 00 02 A7 A7
Svar: 1E 03 04 43 6C 00 00 C1 6B

Och ModScan samma fråga:
1E 03 00 0D 00 02 57 A7
Svar: 1E 03 04 00 05 43 6B 74 2C

Så inte riktigt lika, men mätarn svarar iallafall.

Ok, då frågar vi på spänning L2-N på register 0010. Deras mjukvara:
1E 03 00 10 00 02 C7 A1
Svar: 1E 03 04 43 6B 33 33 24 4F

ModScan:
1E 03 00 0F 00 02 F6 67
Svar: 1E 83 02

Som sagt, detta är inte min nivå av kunskap, men jag vet att det finns djupare kunskaper här, så nån kanske ser nåt i detta?

Jag har mailat Orno också, men jag är för nyfiken för att inte kolla med EF samtidigt. :)

Re: Skillnad i ModBus-telegram

Postat: 11 december 2024, 12:00:21
av TomasL
Du har fel I konfigurationen i modscan
Offseten är fel, vilket får dig att läsa register 0x0d I stället för register 0x0e

Re: Skillnad i ModBus-telegram

Postat: 11 december 2024, 12:27:51
av Jan Almqvist
Det finns tyvärr olika konventioner för hur adresses anges i Modbus. I telegrammen är första adressen för varje typ av varibel alltid 0.
Men i både manualer och i program kan första "adressen" vara antingen 0 eller 1.
Ibland står det en siffra före t.ex. 4 som anger datatyp t.ex. 40001 för Holding register.
Tyvärr kan "adressen" 41 betyda adress 0, 1 eller 41.

Re: Skillnad i ModBus-telegram

Postat: 11 december 2024, 12:55:23
av FormerMazda
Där satt den! Tack!
Och det retar mig att det var en av de vanligare felen med, offset.
Men utöver offset den så var byte-order omvänd.
Så till "mitt försvar", detta hände: jag läste på fel offset, på låga värden fick jag ändå ett värde då jag antar byte-order hamnade "turligt" nog rätt för detta.
Men L1-N var alltid utan decimal, bara heltal. Följande värden kom med decimaler, men gissningsvis fel värde då.

Hoppade jag ett steg i adresseringen så lästes alla värden in utan exception, men gav helt tokiga värden. En justering av byte-order så kommer nu alla värden in utan problem. :)

Byte order:
0 - Byte order = 1 0 3 2
1 - Byte order = 3 2 1 0
2 - Byte order = 0 1 2 3
3 - Byte order = 2 3 0 1
Default Value: 0

Bytte till byte-order 1, alltså 3 2 1 0 så kommer floatarna rätt.

Re: Skillnad i ModBus-telegram

Postat: 11 december 2024, 13:08:39
av Jan Almqvist
Enligt specifikationen är Modbus big-endian men alla följer tyvärr inte detta.
"4.2 Data Encoding
 MODBUS uses a ‘big-Endian’ representation for addresses and data items. This means
that when a numerical quantity larger than a single byte is transmitted, the most significant
byte is sent first."

Källa: MODBUS APPLICATION PROTOCOL SPECIFICATION V1.1b3
Det finns ingen 32-bitars datatyp i specifikation så när t.ex. två Holding register i följd används kan ordningen för registren vara vilken som helst.
Dock tycker jag att högord:lågord är det mest logiska eftersom det är big-endian som gäller för 16-bitars variabler.

Re: Skillnad i ModBus-telegram

Postat: 11 december 2024, 13:26:51
av FormerMazda
Modbus är i kommunikationsvärlden ett av, om inte det, största protokollet. Och det är väl dokumenterat hur man ska göra.
Jag har jobbat med Citect/Plant scada i snart 20år och kopplat upp mycket grejer, mycket över modbus. Och jag tror inte den ena gör som den andra.. :D

Det finns i citect 11 olika varianter på modbus-protokollet.
Sen kan man styra varje protokollvariant med 30-talet parametrar. Mycket är förvisso för blockläsning och timeouts, men även styra i vilken byte-ordning det är och sånt.

Jag gillar modbus ändå, det är ju rätt känt och öppet, det är bara ibland man får vrida och vända lite på det.

Re: Skillnad i ModBus-telegram

Postat: 11 december 2024, 16:01:13
av Icecap
Har själv kört några projekt med MODBUS-kommunikation och ja, data kan vara kastat fel om μC använder "fel" endian.

Men jag anser att man likaväl dekoder varje värde på ett sätt som är endian-oberoende, då fungerar mjukvaran i alla fall.

Jag gjorde en byte-position -> värde konvertering (Big Endian -> ett värde i den gällande kommunikationsenhet), den kommer alltid att ge rätt värde oavsett systemets endian.

Re: Skillnad i ModBus-telegram

Postat: 11 december 2024, 17:30:34
av TomasL
Jan Almqvist skrev: 11 december 2024, 12:27:51 Det finns tyvärr olika konventioner för hur adresses anges i Modbus. I telegrammen är första adressen för varje typ av varibel alltid 0.
Men i både manualer och i program kan första "adressen" vara antingen 0 eller 1.
Ibland står det en siffra före t.ex. 4 som anger datatyp t.ex. 40001 för Holding register.
Tyvärr kan "adressen" 41 betyda adress 0, 1 eller 41.
Nja, egentligen inte.
Det enda som egentligen skiljer sig är om offsetten är 0 eller 1.
om adressen är 5-siffrig och börjar med en siffra kan man utgå ifrån att första siffran talar om vilken datatyp det är.
1xxxxx Read Coils
2xxxxx Read Discrete Inputs
3xxxxx Read Holding Registers
4xxxxx Read Input Registers
5xxxxx Write Single Coil
6xxxxx Write single register
..........
Coils är RW
DI är RO
HR är RW
IR är RO
På detta sätt behövde man inte hålla reda på vilken funktionskod man skulle skicka, det hanteras av Mastern hel och hållet och det tillåter 9999 positioner för varje funktion, dvs de kan överlappa

I dag så används nästan enbart funktion 0x03 och 0x06 (0x16) (samt eventuellt de koder som ger status), så det gamla schemat är mer eller mindre utdaterat.

Allting på linan skickas BE, så länge som man håller sig inom standarden för datastorleken, dvs 16 bitar .
Dock, börjar man som i dag blanda in flyttal, 32/64-bitars data så är man utanför standarden, då den inte täcker dessa datatyper, och då verkar det som att varje tillverkare har sina egna lösningar.
Så hela data paketet (om det är större än 1 register)/16 bitar kan vara en blandning av BE och LE, så om man har ett tal som är större än 16 bitar som kan de komma hur som helst, dock inom de 16 bitarna är det alltid BE.
Så orden kan komma LE, men inom varje ord är det BE

Re: Skillnad i ModBus-telegram

Postat: 11 december 2024, 20:57:54
av nifelheim
Jag kör OR-WE-516 (lite billigare men klarar inte flera tariffer)
den är kopplad till RUT955 "modbus gateway" och sedan läser jag "remote"

Provade nu, ser att jag ligger offset mot registerkartan, missade säkert någon parameter till mbpoll :humm:

Kod: Markera allt

mbpoll -m tcp -t4:float -r 15 -c 22 -a1  -1 $ip -p $port -B 

mbpoll 1.0-0 - FieldTalk(tm) Modbus(R) Master Simulator
Copyright © 2015-2019 Pascal JEAN, https://github.com/epsilonrt/mbpoll
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; type 'mbpoll -w' for details.

Protocol configuration: Modbus TCP
Slave configuration...: address = [1]
                        start reference = 15, count = 22
Communication.........: 2.65.83.82, port 502, t/o 1.00 s, poll rate 1000 ms
Data type.............: 32-bit float (big endian), output (holding) register table

-- Polling slave 1...
[15]: 	236.3
[17]: 	229.8
[19]: 	226.9
[21]: 	50.01
[23]: 	43.84
[25]: 	45.1
[27]: 	41.75
[29]: 	28.98
[31]: 	9.871
[33]: 	10.009
[35]: 	9.099
[37]: 	1.185
[39]: 	0.889
[41]: 	0.013
[43]: 	0.283
[45]: 	29.024
[47]: 	9.911
[49]: 	10.009
[51]: 	9.103
[53]: 	1
[55]: 	1
[57]: 	1

Screenshot from 2024-12-11 20-50-48.png

Re: Skillnad i ModBus-telegram

Postat: 11 december 2024, 23:32:20
av Jan Almqvist
TomasL skrev: 11 december 2024, 17:30:34 Nja, egentligen inte.
Det enda som egentligen skiljer sig är om offsetten är 0 eller 1.
om adressen är 5-siffrig och börjar med en siffra kan man utgå ifrån att första siffran talar om vilken datatyp det är.
1xxxxx Read Coils
2xxxxx Read Discrete Inputs
3xxxxx Read Holding Registers
4xxxxx Read Input Registers
5xxxxx Write Single Coil
6xxxxx Write single register
Jag tror att TomasL nog blandar ihop "Modbus function codes" med de prefix som används vid "Modbus 984 adressering" och där första siffran är 0, 1, 3 eller 4.
.
Modbus-984_Screenshot_2024-12-11_23-20-07.png