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í:
portv 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,unitIdv 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=COM6 | jméno COM portu — upravte podle svého počítače |
baudRate=9600 | komunikační rychlost |
dataBits=8 | počet datových bitů |
parity=none | bez parity |
stopBits=1 | jeden stop bit |
handshake=none | bez řízení toku |
reconnectDelayMs=2000 | prodleva před znovuotevřením portu po chybě |
reconnectAttempts=5 | po 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=rtu | rámování RTU (CRC16) pro sériovou linku |
unitId=2 | adresa slave, se kterým master komunikuje |
requestTimeoutMs=2000 | timeout odpovědi na jeden dotaz |
requestRetries=8 | poč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á | Typ | Registr | Adresa | Směr | Událost | Prezentace |
|---|---|---|---|---|---|---|
EngTorque (Engine torque) | scalar ushort | holding | 0 | readWrite | Pool500ms | ModbusSImple (× 0,01, Nm) |
Torque (Torque) | scalar ushort | holding | 1 | read | Pool500ms | ModbusSImple (× 0,01, Nm) |
Drivability (Drivability) | matrix ushort, 3 × 2 | holding | 2 | readWrite | Pool500ms | ModbusSImple 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:
| Control | Proměnné | Poznámka |
|---|---|---|
| Graph | EngTorque (červená, levá osa), Torque (modrá, pravá osa) | okno 10 s, obě osy auto-scale |
| Signal | EngTorque | obnova 250 ms |
| Signal | Torque | obnova 250 ms |
| Matrix | Drivability | AutoRead, zápis buňky klávesou Enter (WriteOnEnter) |
| Watch Table | Torque, EngTorque | sloupce 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
- Č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.
- 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.Torqueje jenread, u ní zápis není k dispozici. Podrobně Zápis hodnot do zařízení. - 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.
- 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í nastavtereconnectAttempts=-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 — srequestTimeoutMs=2000arequestRetries=8čeká na jeden dotaz až 9 × 2 s.
Související kapitoly
- Reference — Serial Port (COM) a Obnova spojení.
- Reference — Modbus Master (RTU/TCP) včetně proměnných typu Matrix.
- Konverze a prezentace, Události, Proměnná Matrix.
- Watch Table, Matrix control, Zápis hodnot do zařízení.
- Logování dat — funkce zapnutého driveru Data Log Recorder.

