Het is een onderzoeksfaciliteit met 80 containers waarin agrarische produkten bewaard kunnnen worden onder verschillende gascondities, N2, CO2, O2 en C2H4.
De massflow controllers staan per 4 naast elkaar met een interface kaart direct op de connectoren gedrukt.
Hier een detail plaatje. Voeding en RS485 wordt gewoon doorgelust en zo staan er 300 van die flow controllers plus een 100 magneetkleppen en een Advantech ADC module op een enkele modbus. De hele bende wordt aangestuurd via de comport van een pc met besturing software, mysql database en website als user interface.
Protocol copy/paste uit de source:
GAS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| ;**********************************************************************
; Protocol discription
;
; Baudrate 19200, valid input characters are: (0-9,A-Z,@,<CR>)
;
; Command syntax:
; @AaCDataCs<CR>
; @ = start of command line marker
; Aa = device address in HEX, FF=broadcast (never reply with broadcast)
; C = Command code
; Data = any optional data for the command
; Cs = checksum over the the previous in HEX
;
;
; Reply syntax:
; +ResultCs<CR>
; -ErrorCs<CR>
; + = start of positive (ok) reply
; - = start of negative (error) reply
; Result= optional result of command
; Error = optional error string (Do not report checksum errors)
; Cs = checksum over the the previous in HEX
;
;---------------------------------------------------------------------- |
Voor de slave is het dus heel simpel:
- Buffer alleen karakters tussen start en stop char.
- als invalid input char, begin opnieuw
- na stop char, verwerk input
- als niet voor mij, checksum fout, of buffer overflow, begin opnieuw.
- voer commando uit en reply.
Voorbeelden:
cmd: @1FW021234DA<CR> #Aan device 1Fh, Write output 02h value 1234h, checksum is DAh.
Reply: +OK23<CR> #Checksum 23h, eventueel kun je ook nog afzender adres meesturen, maar heb ik niet gedaan
cmd: @1FR02B6<CR> #Aan device 1Fh, Read value 02h, checksum B6h
reply: +02044176<CR> #Waarde 02h is 0441h, checksum 76h
(checksums zijn gegok, heb dat niet uitgerekend

)
Voor analoge waardes gebruik ik altijd 16bit getallen, indien ADC of DAC minder bits heeft dan is het MSB aligned (kun je later probleemloos een ADC upgraden).
Digitale waardes (solenoids/relais etc) doe ik per 8 (byte), of bij een Write optioneel per bit, dat zie je dan aan de data lengte, een char van 0 of 1.
RS485 gebaseerde protocollen werken doorgaans met een enkele master en meerdere slaves, zo van stuur een opdracht naar slave A en wacht op aantwoord, stuur opdracht naar slave B, etc..... Als er meerdere apparaten tegelijk zouden zenden dan kun je collisions krijgen.
CAN is robuust omdat het collisions kan voorkomen en werkt dus goed met multi-master of peer-to-peer netwerkjes. Voor single-master voldoet RS485 prima.