Modbus RTU, pochopil jsme to?

Draček Fráček dracek.fracek na gmail.com
Pondělí Prosinec 20 22:29:33 CET 2010


 Pokousim se dat dohromady modbus po RS-485, jelikoz jsem neco
takoveho nikdy nedelal dovolim si
nastinit svou predstavu, mozna me opravite nebo nastinite lepsi reseni.

Predpokladejme jednoduche zarizeni, ktere umi zmerit dve teploty,
adresa zarizeni rekneme 20h, registry 30000 a 30001 pro T1 a T2.

MCU spi a posloucha na RS-485, pokud ne nejaka komunikace prijme prvni
byte, v preruseni od UART
pokud je prijaty byte 0 nebo hodnota = adrese jednotky, uloží přijatou
hodnotu na prvni pozici
v prijimacim bufferu, pokud je prijata hodnota prvniho byte jina neulozi nic
odpali se casovac merici cas rovnajici se prijmu 3.5 znaku, tento
casovac resetuje prijem kazdeho dalsiho znaku,
znaky se ukladaji do fronty.
Prijem telegramu konci naplnenim fronty nebo preteceni tohoto
casovace, tedy mezerou 3.5znaku.

Nyni mame prijatou celou zpravu , posledni dva znaky jsou CRC,
provedem overeni autenticity, pokud je OK

mela by zprava vypadat takto.
adresa zarizeni 20h, kod funkce 04h (Read Input Registers), adresa
registu, ktery se ma precist, 7530h,počet registru 0001h, CRC16
0x20h,0x4h,0x7530h,0x0001h,CRC16
CRC-16:s polynomem 0x8005=x16 + x15 + x2 + 1

odpoved bude
adresa 0x20h,0x04h,0x1234h (hodnota regstu obsahujícího teplotu,CRC16
nebo   0x20h,0x84h,kod chyby,CRC16


Je to hloupost?
Zcela jsem nepochopil jek je to s adresou (MODICON), pro vstupni
registry je vyclenen usek adres 30000÷39999,
Jaku zvolim adresu v tomto rozsahu je ciste na me?
Pokud zarizeni umi merit dve teploty, tedy ma dva registry, musi mit
adresy za sebou , tedy treba 30000 a 30001?
Musim implementovat i prikaz 0x04h,0x7530h,0x0002 tedy jednim dotazem
vratit obe teploty nebo vystacim s dvema prikazy,
kde kazdy bude cist jeden registr 0x04h,0x7530h,0x0001h a 0x04h,0x7531h,0x0001h?
K čemu se vyuziva broadcast režim, kdyz na v nem slave neodpovida?
Jsou nejake funkce, kterou by melo modbus zarizeni podporovat vzdy?
Je pripustne aby se komunikacni rychlost zarizeni nastavovala pomoci
0x06h Write Single Register, obsah registuru je rekneme default 9600,
ale lze ho prikazem 0x06,0x9c40,19200d prepsat a zarizeni pak prepne
na komunikacni rychlost 19200, tedy ulozi novou rychlost do EEPROM?


Predem dekuji za pomoc

Martin


Další informace o konferenci Hw-list