Modbus RTU master po sériové lince

Projekt Qenex_Serial_ModbusMaster_HoldingRegisters.qproj najdete ve složce Examples vedle QInsight.exe.

Co ukázka předvádí

QInsight tu vystupuje jako Modbus RTU master: driver Serial Port (COM) s protokolem Modbus Master v režimu rtu čte každou sekundu holding registry ze slave s adresou 2. Ukázka předvádí:

  • nastavení driveru i protokolu přesně tak, jak se zadává v Project Configuration,
  • skalární proměnné v holding registrech (ushort, jeden registr na proměnnou) s lineární konverzí a jednotkou,
  • proměnnou Matrix přenášenou jako souvislý blok registrů — osy i datové buňky mapy v jednom požadavku,
  • zápis do zařízení z Watch Table (skaláry) a z Matrix controlu (buňky mapy),
  • obnovu spojení driveru po odpojení převodníku a automatické pokračování masteru.

Co potřebujete

Protějškem je libovolný Modbus RTU slave s unit id 2, který nabízí holding registry na adresách 0–12. Bez hardwaru lze použít simulátor, např. pyModSlave: dvojici virtuálních COM portů (QInsight na jednom, simulátor na druhém) a v simulátoru RTU, slave id 2, 9600 Bd, 8N1, holding registry od adresy 0. S reálným zařízením stačí převodník USB/RS-485.

Před spuštěním upravte v Project Configuration to, co je specifické pro váš počítač a zařízení:

  • port v nastavení driveru — projekt má COM6; zadejte port, na kterém je převodník nebo váš konec virtuálního páru,
  • baudRate (a případně parity, stopBits) podle zařízení — projekt počítá s 9600 Bd, 8N1,
  • unitId v nastavení protokolu, pokud slave nemá adresu 2.

Projekt

Drivery a protokoly

Komunikaci obstarává jedna dvojice driver + protokol. Nastavení jsou uložená přesně takto:

Driver Serial Port (COM)Význam
port=COM6jméno COM portu — upravte podle svého počítače
baudRate=9600komunikační rychlost
dataBits=8počet datových bitů
parity=nonebez parity
stopBits=1jeden stop bit
handshake=nonebez řízení toku
reconnectDelayMs=2000prodleva před znovuotevřením portu po chybě
reconnectAttempts=5po pěti po sobě jdoucích neúspěšných pokusech se driver zastaví (výchozí je -1 = bez omezení počtu pokusů)
Protokol Modbus Master (RTU/TCP)Význam
mode=rturámování RTU (CRC16) pro sériovou linku
unitId=2adresa slave, se kterým master komunikuje
requestTimeoutMs=2000timeout odpovědi na jeden dotaz
requestRetries=8počet opakování dotazu po timeoutu, navíc k prvnímu pokusu (až 9 vysílání)

Projekt obsahuje ještě dva drivery, které pro ukázku Modbusu nejsou potřeba: Data Log Recorder (file=DataLogs;append=true;flushOnWrite=false;reorderBufferMs=500) je zapnutý a při každém běhu zapisuje EngTorque a Torque do souboru .qilog ve složce DataLogs vedle projektu (matice se neloguje); Data Log Replay (file=DataLogs\values.qilog;mode=realtime;speed=1;loop=false) je vypnutý. Pokud logování nechcete, driver Data Log Recorder vypněte.

Události

Projekt má jednu periodickou událost Pool500ms s periodou 1000 ms (název neodpovídá skutečné periodě, chování určuje hodnota Period). Na tuto událost jsou navázané všechny tři proměnné, master tedy každou sekundu pošle tři samostatné požadavky FC03 — jeden na každou proměnnou.

Proměnné

Všechny proměnné jsou ve jmenném prostoru /Modbus, typ ushort a sdílejí prezentaci ModbusSImple: konverze Pass-through je lineární s multiplier=0.01, offset=0 (inženýrská hodnota = raw × 0,01, tedy raw 12345 se zobrazí jako 123,450), jednotka Nm, formát {0:F3}, rozsah 0–65535.

ProměnnáTypRegistrAdresaSměrUdálostPrezentace
EngTorque (Engine torque)scalar ushortholding0readWritePool500msModbusSImple (× 0,01, Nm)
Torque (Torque)scalar ushortholding1readPool500msModbusSImple (× 0,01, Nm)
Drivability (Drivability)matrix ushort, 3 × 2holding2readWritePool500msModbusSImple na osách i datech

Comm params skalárů: registerType="holdingRegister";address="0";wordOrder="big";direction="readWrite";eventRef="Pool500ms" (u Torque address="1", direction="read"). wordOrder se u jednoregistrových hodnot neuplatní.

Drivability je proměnná Matrix — mapa s osou X Speed [RPM] (3 body), osou Y Temp. [K] (2 body) a 6 datovými buňkami, celkem 11 hodnot = 22 bajtů, Endianness be. Modbus Master ji přenáší jako souvislý blok 11 holding registrů od adresy 2 (adresy 2–12); čtení je jeden požadavek FC03, zápis posílá jen změněné buňky. Prezentace ModbusSImple je přiřazená i oběma osám, takže se hodnoty os zobrazují s jednotkou Nm.

Workspace

Jeden workspace (Workspace6904) s pěti controly:

ControlProměnnéPoznámka
GraphEngTorque (červená, levá osa), Torque (modrá, pravá osa)okno 10 s, obě osy auto-scale
SignalEngTorqueobnova 250 ms
SignalTorqueobnova 250 ms
MatrixDrivabilityAutoRead, zápis buňky klávesou Enter (WriteOnEnter)
Watch TableTorque, EngTorquesloupce Name, Value, Unit, Time, Write

Žádný control není uložený v write módu — zápis se zapíná až za běhu.

Co uvidíte a co vyzkoušet

  1. Čtení. Spusťte runtime (Start). Driver otevře COM port, master začne každou sekundu číst registry 0, 1 a blok 2–12. V simulátoru změňte holding registr 0 nebo 1 a sledujte, jak se hodnota během jedné sekundy objeví v grafu, Signal controlu i Watch Table — vydělená stem a s jednotkou Nm.
  2. Zápis skaláru. Ve Watch Table zapněte write mód řádku EngTorque (sloupec Write), zadejte inženýrskou hodnotu, např. 123.45, a potvrďte. Master pošle do registru 0 raw hodnotu 12345 a v simulátoru ji uvidíte. Torque je jen read, u ní zápis není k dispozici. Podrobně Zápis hodnot do zařízení.
  3. Zápis buňky mapy. V Matrix controlu zapněte write mód, přepište buňku nebo bod osy a potvrďte Enterem — do slave odejde jen dotčený registr z bloku 2–12.
  4. Výpadek spojení. Za běhu odpojte USB převodník (nebo zavřete virtuální port). Driver přejde do stavu Faulted, master dotazy pozastaví a driver se pokouší port znovu otevřít každé 2 s, nejvýše pětkrát. Znovu připojte převodník během těchto přibližně deseti sekund — driver port otevře, master automaticky pokračuje ve čtení a v grafu je vidět jen mezera. Po vyčerpání limitu driver skončí ve stavu Stopped s chybou gave up after 5 reconnect attempt(s) a spustíte ho znovu tlačítkem Start v jeho vlastnostech (viz Stavy driverů a tlačítko Start). Pro opakování bez omezení nastavte reconnectAttempts=-1. Pokud naopak neodpovídá slave (nesprávný unitId, vypnutý simulátor), port zůstává otevřený a chybu ohlásí až protokol po vypršení timeoutu — s requestTimeoutMs=2000 a requestRetries=8 čeká na jeden dotaz až 9 × 2 s.

Související kapitoly