Forord:
Dette er en beskrivelse av hvordan man kommuniserer med ELDI sine gass sensorer som har RS485 Modbus/RTU grensesnitt.
I forsøkene som beskrives her er det brukt:
1 stk. CL2 Industriell gass detektor tilkoblet 24V DC: https://www.eldi.no/klorgass-detektor-cl2-industriell/
1 stk. EPRO USB->RS485 grensesnitt: https://www.eldi.no/usb-til-rs485-adapter-med-vern/
En Windows 11 PC med USB port.
Gratis programvaren CAS Modbus Scanner: https://store.chipkin.com/products/tools/cas-modbus-scanner
Oppsett:
Beskrivelse av hvordan man finner COM porten til USB-RS485 grensesnittet finner du på produktet i nettbutikken.
På min PC så har USB-RS485 grensesnittet fått adresse COM3.
Gass detektoren kommer fra fabrikken konfigurert med hastigheten 9600bps, N,8,1.
Den har også en forhånds konfigurert Modbus enhets adresse. Denne er ofte 1, 2, 3, eller 4. Eller at annet lavt tall.
Esken er merket med adressen. Enheten jeg bruker i testet er merket med 4:
Gass detektoren sin A tilkobling kobles med kabel til USB-RS485 porten sin A. Tilsvarende B til B.
I CAS Modbus programvaren kan man lete etter enheten med "Discover" funksjonen:
Jeg har lagt inn min COM port (COM3) og valgt 9600 Baud. Device står fra 0 til 254. Hvis jeg vet at min enhet har adresse høyere så trenger jeg ikke å starte søket på 0. Så trykker jeg "Start Scan".
Når programmet ikke får svar fra en enhet så kommer "Timeout". Når den får svar fra en enhet så kommer det noe annet.
Så jeg ser nå at enhet 4 svarer noe. Så da vet jeg at det er min sensor (som er tilkoblet RS485 BUS-en alene).
Jeg lager en ny connection (trykk høyre musetast i venstre kolonne og velg "Add connection":
Jeg velger COM3, 9600 baud og trykker "Add Serial Connection".
Så lager jeg en ny device (trykk høyre musetast på connection og velg "Add Device":
Jeg velger "Slave ID:" 4 og trykker "Add Device"
Så legger jeg til en ny task for å lese alle registerene til sensoren (trykk høyre musetast på Device 4 og velg "Add Task" i menyen):
Jeg velger "03 Read Holding registers (4xxxx) Offset adressen 7001 (fra manualen) og lengde 24 for å få med alle registrene til denne sensoren. Og trykker "Edit Request" for å lagre.
Nå ønsker jeg å kjøre det jeg har valgt. Jeg klikker på Task-en slik at den blir blå og klikker på knappen "Poll":
Hvordan er Modbus implementert på denne sensoren:
Denne fabrikken har valgt at alle Modbus registrerene er av data typen "Floating point (four-byte)" også kjent som IEEE-754 / float32 (MSW-LSW). Så derfor benyttes bare annenhver adresse.
Data blir levert i byte rekkefølgen DCBA. Også kalt for "Little Endian" eller MSB først og LSB sist.
Dette betyr også at registeret med enhets-adressen, som vi forventer skal være 4 = $0004, vises som 4.000000 og representeres med data $40800000
For å konverter mellom hexadesimal data og real32 tall så anbefaler jeg denne kalkulatoren:
https://www.h-schmidt.net/FloatConverter/IEEE754.html
Her er en tabell over alle registre som kan leses (03 Read Holding Register) i denne sensoren:
Register: | Adresse: | Register adresse: | Funksjon: |
7000 | $1B58 | 47001 | Første nivå alarm verdi (Low alarm) |
7002 | $1B5A | 47003 | Andre nivå alarm nivå (High Alarm) |
7004 | $1B5C | 47005 | Måle område (maksimal verdi) |
7006 | $1B5E | 47007 | Oppløsning (1.000=Resolution: 1, 0.100=Resolution: 0.1, 0.010=Resolution: 0.01) |
7008 | $1B60 | 47009 | Måle enhet (0.000=%vol, 1.000=ppm, 2.000=%LEL, 3.000=℃) |
7010 | $1B62 | 47011 | Gass type |
7012 | $1B64 | 47013 | Gass Konsentrasjon (i måle-enheten fra 7008) |
7014 | $1B66 | 47015 | Alarm status (0.000=Normal, 1.000=Ⅰ level alarm point (low alarm), 2.000=Ⅱ level alarm point (high alarm), 3.000=Malfunction, 4.000=Over range) |
7016 | $1B68 | 47017 | Måleverdi fra AD-konverteren (kun til kalibrering) |
7018 | $1B6A | 47019 | AD-konverter verdi ved 0-punkt (kun til kalibrering) |
7020 | $1B6C | 47021 | AD-konverter verdi ved maks måleområde (kun til kalibrering) |
7022 | $1B6E | 47023 | Enhets adresse |
$1B6F | 47024 | LSW (least significant Word) til enhets adresse | |
47025 | Modbus Baudrate | ||
47026 | LSW (least significant Word) til Modbus Baudrate |
Her er en tabell over alle registre som kan skrives (10 Force Mutiple Registers) i denne sensoren:
Register: | Adresse: | Register adresse: | Funksjon: |
7000 | $1B58 | 47001 | Første nivå alarm verdi (Low alarm) |
7002 | $1B5A | 47003 | Andre nivå alarm nivå (High Alarm) |
7018 | $1B6A | 47019 | 0-punkt verdi (kalibrering) |
7020 | $1B6C | 47021 | Maks måleområde (kalibrering) |
7022 | $1B6E | 47023 | Enhets adresse (se egen tabell lenger ned) |
47025 | Modbus Baudrate, 6.000000=9600bps, 7.000000=19200bps |
Hvordan bytte Modbus Baudrate til sensoren:
Når vi skal skrive til sensoren må vi bruke funksjonen $10 (16) for å skrive mer enn ett register. Dette er fordi produsenten har valgt å bruke real32 datatypen som går over 2 register.
I CAS Modbus Scanner;
Lag en ny skrive oppgave på enheten (trykk høyre musetast på Device 4 og velg "Add Write Task" i menyen):
Hvilken verdi skal du velge å skrive?
I programmet CAS Modbus Scanner så må man legge inn et desimal tall (hexadecimal fungerer ikke).
Her er en tabell over hvilke tall som brukes for de forskjellige Modbus adressene:
Modbus adresse: | Real32 hex verdi ABDC: | int32 hex verdi DCAB: | int32 desimal verdi for CAS: |
1 | $3f800000 | $00003f80 | 16256 |
2 | $40000000 | $00004000 | 16384 |
3 | $40400000 | $00004040 | 16448 |
4 | $40800000 | $00004080 | 16512 |
5 | $40a00000 | $000040a0 | 16544 |
6 | $40c00000 | $000040c0 | 16576 |
7 | $40e00000 | $000040e0 | 16608 |
8 | $41000000 | $00004100 | 16640 |
9 | $41100000 | $00004110 | 16656 |
10 | $41200000 | $00004120 | 16672 |
Man skulle kanske tro at desimal verdien til CAS for $3f800000 skal være 1065353216, men CAS programvaren skriver data med datatypen int32 med rekkefølgen CDAB så da blir hexadecimal tallet $00003f80 som er 16256 desimalt...
Hvordan bytte Modbus adressen til sensoren:
OBS! Gjør du dette feil så mister du kontakten med sensoren. Har den ikke display så må den tilbake til fabrikken for å rette det opp igjen.
Først vil vi lese den gamle verdien for å se at alt er i orden.
I CAS Modbus Scanner;
Lag en ny lese oppgave for å lese dagens hastighet.
Trykk høyre musetast på Device 4 og velg "Add Task" i menyen. Velg Offset=7025 og Length=2:
Resultatet er som følger:
(Valget 9600bps har verdien 6.000000 representert som real32, 16576 representert som int16).
Så skal vi bytte til 19200bps. Vi skal da skrive real32 verdien 7.000000 til register 7026. Eller 16608 som int16 til 7025.
Når vi skal skrive til sensoren må vi bruke funksjonen $10 (16) for å skrive mer enn ett register. Dette er fordi produsenten har valgt å bruke real32 datatypen som går over 2 register.
I CAS Modbus Scanner;
Lag en ny skrive oppgave på enheten (trykk høyre musetast på Device 4 og velg "Add Write Task" i menyen):
Hvilken verdi skal du velge å skrive?
I programmet CAS Modbus Scanner så må man legge inn et desimal tall (hexadecimal fungerer ikke).
Her er en tabell over hvilke verdier som brukes for de forskjellige Modbus Baudrate verdiene (som vi har testet):
Buadrate, valg: | Real32 hex verdi ABDC: | Desimal verdi: | int32 hex verdi DCAB: | int32 desimal verdi for CAS: |
4800, 5 | $40a00000 | 5.000000 | $40a00000 | 16544 |
9600, 6 | $40c00000 | 6.000000 | $000040c0 | 16576 |
19200, 7 | $40e00000 | 7.000000 | $000040e0 | 16608 |
38400, 8 | $41000000 | 8.000000 | $00004100 | 16640 |
57600, 9 | $41100000 | 9.000000 | $00004110 | 16656 |
115200,10 | $41200000 | 10.000000 | $00004120 | 16672 |
For å teste at dette fungerte så må vi lage en ny Connection med 19200bps. En ny Device og en ny Task som leser adresse 7025. Her er resultatet: