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$1B5847001Første nivå alarm verdi (Low alarm)
7002$1B5A47003Andre nivå alarm nivå (High Alarm)
7004$1B5C47005Måle område (maksimal verdi)
7006$1B5E47007Oppløsning (1.000=Resolution: 1, 0.100=Resolution: 0.1, 0.010=Resolution: 0.01)
7008$1B6047009Måle enhet (0.000=%vol, 1.000=ppm, 2.000=%LEL, 3.000=℃)
7010$1B6247011Gass type
7012$1B6447013Gass Konsentrasjon (i måle-enheten fra 7008)
7014$1B6647015Alarm 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$1B6847017Måleverdi fra AD-konverteren (kun til kalibrering)
7018$1B6A47019AD-konverter verdi ved 0-punkt (kun til kalibrering)
7020$1B6C47021AD-konverter verdi ved maks måleområde (kun til kalibrering)
7022$1B6E47023Enhets adresse

$1B6F47024LSW (least significant Word) til enhets adresse


47025Modbus Baudrate


47026LSW (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$1B5847001Første nivå alarm verdi (Low alarm)
7002$1B5A47003Andre nivå alarm nivå (High Alarm)
7018$1B6A470190-punkt verdi (kalibrering)
7020$1B6C47021Maks måleområde (kalibrering)
7022$1B6E47023Enhets adresse (se egen tabell lenger ned)


47025Modbus 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
$00003f8016256
2$40000000
$0000400016384
3$40400000
$0000404016448
4$40800000$0000408016512
5$40a00000
$000040a016544
6$40c00000
$000040c016576
7$40e00000
$000040e016608
8$41000000
$0000410016640
9$41100000
$0000411016656
10$41200000
$0000412016672


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$000040c016576
19200, 7$40e00000
7.000000$000040e016608
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: