[{"data":1,"prerenderedAt":1312},["ShallowReactive",2],{"docs-nav-docs_cs":3,"docs-page-\u002Fcs\u002Fexamples\u002Ftcp-server-modbus-slave":366,"docs-surround-\u002Fcs\u002Fexamples\u002Ftcp-server-modbus-slave":1309},[4],{"title":5,"path":6,"stem":7,"children":8},"Cs","\u002Fcs","cs",[9,13,41,58,76,103,157,171,190,211,238,282,302],{"title":10,"path":6,"stem":11,"navTitle":12},"Dokumentace QInsight","cs\u002Findex","Přehled",{"title":14,"navTitle":15,"path":16,"stem":17,"children":18,"page":40},"Začínáme",null,"\u002Fcs\u002Fgetting-started","cs\u002F01.getting-started",[19,23,27,31,36],{"title":20,"path":21,"stem":22,"navTitle":20},"Co je QENEX Suite","\u002Fcs\u002Fgetting-started\u002Fwhat-is-qenex-suite","cs\u002F01.getting-started\u002F1.what-is-qenex-suite",{"title":24,"path":25,"stem":26,"navTitle":24},"Co je QInsight","\u002Fcs\u002Fgetting-started\u002Fwhat-is-qinsight","cs\u002F01.getting-started\u002F2.what-is-qinsight",{"title":28,"path":29,"stem":30,"navTitle":28},"Instalace","\u002Fcs\u002Fgetting-started\u002Finstallation","cs\u002F01.getting-started\u002F3.installation",{"title":32,"path":33,"stem":34,"navTitle":35},"Uživatelské rozhraní QInsight","\u002Fcs\u002Fgetting-started\u002Fthe-qinsight-interface","cs\u002F01.getting-started\u002F4.the-qinsight-interface","Uživatelské rozhraní",{"title":37,"path":38,"stem":39,"navTitle":37},"Licencování","\u002Fcs\u002Fgetting-started\u002Flicensing","cs\u002F01.getting-started\u002F5.licensing",false,{"title":42,"navTitle":15,"path":43,"stem":44,"children":45,"page":40},"První projekt","\u002Fcs\u002Ffirst-project","cs\u002F02.first-project",[46,50,54],{"title":47,"path":48,"stem":49,"navTitle":47},"Založení projektu","\u002Fcs\u002Ffirst-project\u002Fcreate-a-project","cs\u002F02.first-project\u002F1.create-a-project",{"title":51,"path":52,"stem":53,"navTitle":51},"Struktura projektu","\u002Fcs\u002Ffirst-project\u002Fproject-structure","cs\u002F02.first-project\u002F2.project-structure",{"title":55,"path":56,"stem":57,"navTitle":55},"Heslo projektu","\u002Fcs\u002Ffirst-project\u002Fproject-password","cs\u002F02.first-project\u002F3.project-password",{"title":59,"navTitle":15,"path":60,"stem":61,"children":62,"page":40},"Připojení zařízení","\u002Fcs\u002Fconnecting-a-device","cs\u002F03.connecting-a-device",[63,67,71],{"title":64,"path":65,"stem":66,"navTitle":64},"Přidání driveru","\u002Fcs\u002Fconnecting-a-device\u002Fadd-a-driver","cs\u002F03.connecting-a-device\u002F1.add-a-driver",{"title":68,"path":69,"stem":70,"navTitle":68},"Přidání protokolu","\u002Fcs\u002Fconnecting-a-device\u002Fadd-a-protocol","cs\u002F03.connecting-a-device\u002F2.add-a-protocol",{"title":72,"path":73,"stem":74,"navTitle":75},"Propojení driveru a protokolu","\u002Fcs\u002Fconnecting-a-device\u002Flink-driver-and-protocol","cs\u002F03.connecting-a-device\u002F3.link-driver-and-protocol","Propojení",{"title":77,"navTitle":15,"path":78,"stem":79,"children":80,"page":40},"Proměnné","\u002Fcs\u002Fvariables","cs\u002F04.variables",[81,85,89,93,98],{"title":82,"path":83,"stem":84,"navTitle":82},"Co je proměnná","\u002Fcs\u002Fvariables\u002Fwhat-is-a-variable","cs\u002F04.variables\u002F1.what-is-a-variable",{"title":86,"path":87,"stem":88,"navTitle":86},"Konverze a prezentace","\u002Fcs\u002Fvariables\u002Fconversion-and-presentation","cs\u002F04.variables\u002F2.conversion-and-presentation",{"title":90,"path":91,"stem":92,"navTitle":90},"Přidání proměnné","\u002Fcs\u002Fvariables\u002Fadd-a-variable","cs\u002F04.variables\u002F3.add-a-variable",{"title":94,"path":95,"stem":96,"navTitle":97},"Proměnná Matrix (pole, křivka, mapa)","\u002Fcs\u002Fvariables\u002Fmatrix-variable","cs\u002F04.variables\u002F4.matrix-variable","Proměnná Matrix",{"title":99,"path":100,"stem":101,"navTitle":102},"Události (Events)","\u002Fcs\u002Fvariables\u002Fevents","cs\u002F04.variables\u002F5.events","Události",{"title":104,"navTitle":15,"path":105,"stem":106,"children":107,"page":40},"Vizualizace","\u002Fcs\u002Fvisualization","cs\u002F05.visualization",[108,113,118,122,127,132,137,142,147,152],{"title":109,"path":110,"stem":111,"navTitle":112},"Vytvoření pracovní plochy","\u002Fcs\u002Fvisualization\u002Fcreate-a-workspace","cs\u002F05.visualization\u002F1.create-a-workspace","Pracovní plocha",{"title":114,"path":115,"stem":116,"navTitle":117},"Zápis hodnot do zařízení","\u002Fcs\u002Fvisualization\u002Fwrite-to-device","cs\u002F05.visualization\u002F10.write-to-device","Zápis do zařízení",{"title":119,"path":120,"stem":121,"navTitle":119},"Přidání controlu","\u002Fcs\u002Fvisualization\u002Fadd-a-control","cs\u002F05.visualization\u002F2.add-a-control",{"title":123,"path":124,"stem":125,"navTitle":126},"Navázání controlu na proměnnou","\u002Fcs\u002Fvisualization\u002Fbind-a-control","cs\u002F05.visualization\u002F3.bind-a-control","Navázání controlu",{"title":128,"path":129,"stem":130,"navTitle":131},"Graph — časový průběh signálů","\u002Fcs\u002Fvisualization\u002Fgraph-control","cs\u002F05.visualization\u002F4.graph-control","Graph",{"title":133,"path":134,"stem":135,"navTitle":136},"XY Graph — signál proti signálu","\u002Fcs\u002Fvisualization\u002Fxy-graph-control","cs\u002F05.visualization\u002F5.xy-graph-control","XY Graph",{"title":138,"path":139,"stem":140,"navTitle":141},"Gauge — ukazatel okamžité hodnoty","\u002Fcs\u002Fvisualization\u002Fgauge-control","cs\u002F05.visualization\u002F6.gauge-control","Gauge",{"title":143,"path":144,"stem":145,"navTitle":146},"Single-Signal — hodnota s popiskem","\u002Fcs\u002Fvisualization\u002Fsignal-control","cs\u002F05.visualization\u002F7.signal-control","Single-Signal",{"title":148,"path":149,"stem":150,"navTitle":151},"Watch Table — tabulka proměnných","\u002Fcs\u002Fvisualization\u002Fwatch-table-control","cs\u002F05.visualization\u002F8.watch-table-control","Watch Table",{"title":153,"path":154,"stem":155,"navTitle":156},"Matrix control — mapy a kalibrace","\u002Fcs\u002Fvisualization\u002Fmatrix-control","cs\u002F05.visualization\u002F9.matrix-control","Matrix control",{"title":158,"navTitle":15,"path":159,"stem":160,"children":161,"page":40},"Běh a sledování","\u002Fcs\u002Frunning","cs\u002F06.running",[162,166],{"title":163,"path":164,"stem":165,"navTitle":163},"Spuštění a zastavení","\u002Fcs\u002Frunning\u002Fstart-and-stop","cs\u002F06.running\u002F1.start-and-stop",{"title":167,"path":168,"stem":169,"navTitle":170},"Sledování živých dat","\u002Fcs\u002Frunning\u002Fwatching-live-data","cs\u002F06.running\u002F2.watching-live-data","Živá data",{"title":172,"navTitle":15,"path":173,"stem":174,"children":175,"page":40},"Logování a přehrávání","\u002Fcs\u002Flogging-and-replay","cs\u002F07.logging-and-replay",[176,180,185],{"title":177,"path":178,"stem":179,"navTitle":177},"Logování dat","\u002Fcs\u002Flogging-and-replay\u002Flogging-data","cs\u002F07.logging-and-replay\u002F1.logging-data",{"title":181,"path":182,"stem":183,"navTitle":184},"Přehrávání logu","\u002Fcs\u002Flogging-and-replay\u002Freplaying-a-log","cs\u002F07.logging-and-replay\u002F2.replaying-a-log","Přehrávání",{"title":186,"path":187,"stem":188,"navTitle":189},"Export dat","\u002Fcs\u002Flogging-and-replay\u002Fexporting-data","cs\u002F07.logging-and-replay\u002F3.exporting-data","Export",{"title":191,"navTitle":15,"path":192,"stem":193,"children":194,"page":40},"Python skripty","\u002Fcs\u002Fpython-scripts","cs\u002F08.python-scripts",[195,199,203,207],{"title":196,"path":197,"stem":198,"navTitle":12},"Přehled skriptů","\u002Fcs\u002Fpython-scripts\u002Fscripts-overview","cs\u002F08.python-scripts\u002F1.scripts-overview",{"title":200,"path":201,"stem":202,"navTitle":200},"Přístup k proměnným","\u002Fcs\u002Fpython-scripts\u002Faccessing-variables","cs\u002F08.python-scripts\u002F2.accessing-variables",{"title":204,"path":205,"stem":206,"navTitle":204},"Příklad skriptu","\u002Fcs\u002Fpython-scripts\u002Fexample-script","cs\u002F08.python-scripts\u002F3.example-script",{"title":208,"path":209,"stem":210,"navTitle":208},"Post-processing CSV","\u002Fcs\u002Fpython-scripts\u002Fcsv-post-processing","cs\u002F08.python-scripts\u002F4.csv-post-processing",{"title":212,"navTitle":15,"path":213,"stem":214,"children":215,"page":40},"Vlastní rozšíření","\u002Fcs\u002Fcustom-extensions","cs\u002F09.custom-extensions",[216,220,224,228,233],{"title":217,"path":218,"stem":219,"navTitle":217},"Vlastní driver","\u002Fcs\u002Fcustom-extensions\u002Fcustom-driver","cs\u002F09.custom-extensions\u002F1.custom-driver",{"title":221,"path":222,"stem":223,"navTitle":221},"Vlastní protokol","\u002Fcs\u002Fcustom-extensions\u002Fcustom-protocol","cs\u002F09.custom-extensions\u002F2.custom-protocol",{"title":225,"path":226,"stem":227,"navTitle":225},"Vlastní Control","\u002Fcs\u002Fcustom-extensions\u002Fcustom-control","cs\u002F09.custom-extensions\u002F3.custom-control",{"title":229,"path":230,"stem":231,"navTitle":232},"Kompletní ukázka — poloha ISS","\u002Fcs\u002Fcustom-extensions\u002Fiss-example","cs\u002F09.custom-extensions\u002F4.iss-example","Ukázka ISS",{"title":234,"path":235,"stem":236,"navTitle":237},"Kompletní ukázka — teploměr","\u002Fcs\u002Fcustom-extensions\u002Ftemp-sensor-example","cs\u002F09.custom-extensions\u002F5.temp-sensor-example","Ukázka teploměr",{"title":239,"navTitle":15,"path":240,"stem":241,"children":242,"page":40},"QFW SDK","\u002Fcs\u002Fdevice-sdk","cs\u002F10.device-sdk",[243,248,253,258,263,268,272,277],{"title":244,"path":245,"stem":246,"navTitle":247},"QFW SDK — úvod","\u002Fcs\u002Fdevice-sdk\u002Fintroduction","cs\u002F10.device-sdk\u002F1.introduction","Úvod",{"title":249,"path":250,"stem":251,"navTitle":252},"XCP v QFW SDK","\u002Fcs\u002Fdevice-sdk\u002Fxcp","cs\u002F10.device-sdk\u002F2.xcp","XCP",{"title":254,"path":255,"stem":256,"navTitle":257},"Integrace krok za krokem: XCP on TCP s FreeRTOS + lwIP","\u002Fcs\u002Fdevice-sdk\u002Fintegration-tcp","cs\u002F10.device-sdk\u002F3.integration-tcp","Integrace: XCP on TCP",{"title":259,"path":260,"stem":261,"navTitle":262},"XCP on classic CAN — co se mění","\u002Fcs\u002Fdevice-sdk\u002Fcan","cs\u002F10.device-sdk\u002F4.can","XCP on classic CAN",{"title":264,"path":265,"stem":266,"navTitle":267},"Integrace bez RTOS: XCP on TCP z hlavní smyčky","\u002Fcs\u002Fdevice-sdk\u002Fbaremetal","cs\u002F10.device-sdk\u002F5.baremetal","Integrace bez RTOS",{"title":269,"path":270,"stem":271,"navTitle":269},"Kontrakt enginu","\u002Fcs\u002Fdevice-sdk\u002Fengine-contract","cs\u002F10.device-sdk\u002F6.engine-contract",{"title":273,"path":274,"stem":275,"navTitle":276},"Adresy proměnných pro QInsight","\u002Fcs\u002Fdevice-sdk\u002Fvariable-addresses","cs\u002F10.device-sdk\u002F7.variable-addresses","Adresy proměnných",{"title":278,"path":279,"stem":280,"navTitle":281},"Řešení potíží při integraci SDK","\u002Fcs\u002Fdevice-sdk\u002Ftroubleshooting","cs\u002F10.device-sdk\u002F8.troubleshooting","Řešení potíží",{"title":283,"navTitle":15,"path":284,"stem":285,"children":286,"page":40},"Reference","\u002Fcs\u002Freference","cs\u002F11.reference",[287,291,295,299],{"title":288,"path":289,"stem":290,"navTitle":288},"Drivery","\u002Fcs\u002Freference\u002Fdrivers","cs\u002F11.reference\u002F1.drivers",{"title":292,"path":293,"stem":294,"navTitle":292},"Protokoly","\u002Fcs\u002Freference\u002Fprotocols","cs\u002F11.reference\u002F2.protocols",{"title":296,"path":297,"stem":298,"navTitle":296},"Controls","\u002Fcs\u002Freference\u002Fcontrols","cs\u002F11.reference\u002F3.controls",{"title":281,"path":300,"stem":301,"navTitle":281},"\u002Fcs\u002Freference\u002Ftroubleshooting","cs\u002F11.reference\u002F4.troubleshooting",{"title":303,"navTitle":15,"path":304,"stem":305,"children":306,"page":40},"Příklady","\u002Fcs\u002Fexamples","cs\u002F12.examples",[307,311,316,321,326,330,334,338,342,346,351,356,361],{"title":308,"path":309,"stem":310,"navTitle":308},"Simulace: všechny signály","\u002Fcs\u002Fexamples\u002Fsimulation-all-signals","cs\u002F12.examples\u002F01.simulation-all-signals",{"title":312,"path":313,"stem":314,"navTitle":315},"Modbus RTU master po sériové lince","\u002Fcs\u002Fexamples\u002Fserial-modbus-master","cs\u002F12.examples\u002F02.serial-modbus-master","Modbus RTU master",{"title":317,"path":318,"stem":319,"navTitle":320},"Modbus RTU slave se simulovanými senzory","\u002Fcs\u002Fexamples\u002Fserial-modbus-slave","cs\u002F12.examples\u002F03.serial-modbus-slave","Modbus RTU slave",{"title":322,"path":323,"stem":324,"navTitle":325},"Modbus TCP master přes TCP klienta","\u002Fcs\u002Fexamples\u002Ftcp-client-modbus-master","cs\u002F12.examples\u002F04.tcp-client-modbus-master","Modbus TCP master",{"title":327,"path":328,"stem":329,"navTitle":327},"Modbus TCP slave na TCP serveru","\u002Fcs\u002Fexamples\u002Ftcp-server-modbus-slave","cs\u002F12.examples\u002F05.tcp-server-modbus-slave",{"title":331,"path":332,"stem":333,"navTitle":331},"Bitové pole a skript","\u002Fcs\u002Fexamples\u002Fbit-field-script","cs\u002F12.examples\u002F08.bit-field-script",{"title":335,"path":336,"stem":337,"navTitle":335},"Dvě ECU najednou","\u002Fcs\u002Fexamples\u002Ftwo-ecus","cs\u002F12.examples\u002F09.two-ecus",{"title":339,"path":340,"stem":341,"navTitle":339},"Poloha ISS naživo","\u002Fcs\u002Fexamples\u002Fiss-live-tracking","cs\u002F12.examples\u002F10.iss-live-tracking",{"title":343,"path":344,"stem":345,"navTitle":343},"Simulovaný teploměr","\u002Fcs\u002Fexamples\u002Fsimul-temp-measure","cs\u002F12.examples\u002F11.simul-temp-measure",{"title":347,"path":348,"stem":349,"navTitle":350},"JSON signály z Python generátoru","\u002Fcs\u002Fexamples\u002Fjson-signal-python","cs\u002F12.examples\u002F12.json-signal-python","JSON signály z Pythonu",{"title":352,"path":353,"stem":354,"navTitle":355},"Raw CAN rámce z Raspberry","\u002Fcs\u002Fexamples\u002Fraw-can-python","cs\u002F12.examples\u002F13.raw-can-python","Raw CAN z Raspberry",{"title":357,"path":358,"stem":359,"navTitle":360},"XCP on TCP na NUCLEO-H723ZG: měření, stimulace a kalibrační mapy","\u002Fcs\u002Fexamples\u002Ftcp-client-xcp-nucleo-maps","cs\u002F12.examples\u002F14.tcp-client-xcp-nucleo-maps","XCP on TCP na NUCLEO-H723ZG",{"title":362,"path":363,"stem":364,"navTitle":365},"XCP on CAN na NUCLEO-H723ZG: měření, stimulace a kalibrační mapy","\u002Fcs\u002Fexamples\u002Fcan-xcp-nucleo-maps","cs\u002F12.examples\u002F15.can-xcp-nucleo-maps","XCP on CAN na NUCLEO-H723ZG",{"id":367,"title":327,"body":368,"description":1304,"extension":1305,"meta":1306,"navTitle":327,"navigation":969,"path":328,"seo":1307,"stem":329,"__hash__":1308},"docs_cs\u002Fcs\u002F12.examples\u002F05.tcp-server-modbus-slave.md",{"type":369,"value":370,"toc":1292},"minimark",[371,375,384,389,417,430,434,506,510,515,518,531,627,638,692,709,712,839,877,885,889,892,917,1001,1014,1133,1150,1154,1161,1186,1190,1227,1231,1288],[372,373,327],"h1",{"id":374},"modbus-tcp-slave-na-tcp-serveru",[376,377,378,379,383],"p",{},"Projekt ",[380,381,382],"code",{},"Examples\\Qenex_TcpServer_ModbusSlave_HoldingRegisters.qproj"," najdete\nve složce Examples vedle QInsight.exe.",[385,386,388],"h2",{"id":387},"co-ukázka-předvádí","Co ukázka předvádí",[376,390,391,392,396,397,400,401,404,405,408,409,412,413,416],{},"QInsight tu ",[393,394,395],"strong",{},"není master, ale slave",": driver ",[393,398,399],{},"TCP Server"," naslouchá na\nportu 502 a protokol ",[393,402,403],{},"Modbus Slave (RTU\u002FTCP)"," v režimu ",[380,406,407],{},"tcp"," vystavuje dvě\nproměnné jako holding registry 0 a 1 pod unit adresou 2. Skutečné zařízení\nžádné není — hodnoty registrů generuje periodický Python skript, který\nkaždé 2 s posune simulovanou ",[393,410,411],{},"teplotu oleje"," (0–150 °C) a ",[393,414,415],{},"tlak oleje","\n(1000–2500 kPa) o krok nahoru nebo dolů. Externí Modbus TCP master, který\nse k QInsight připojí, čte pilovitě rostoucí a klesající hodnoty.",[376,418,419,420,423,424,429],{},"Druhá polovina ukázky je zobrazení: zápis skriptu do proměnné protokolu\nzařízení se v controlech neprojeví (nevzniká vzorek signálu). Skript proto\nkaždou hodnotu zapisuje ",[393,421,422],{},"dvakrát"," — do slave proměnné pro mastera a do\n",[425,426,428],"a",{"href":427},"\u002Fcs\u002Freference\u002Fprotocols#virtual-variables","virtuální proměnné",", kterou\nkreslí graf a signal controly. Na projektu je tak vidět i to, jak se\nTCP Server chová při výpadku klienta: odpojený kabel zjistí keepalive,\nserver se vrátí k naslouchání a master se po obnovení znovu připojí.",[385,431,433],{"id":432},"co-potřebujete","Co potřebujete",[435,436,437,449,481,491,498],"ul",{},[438,439,440,443,444,448],"li",{},[393,441,442],{},"QInsight s nastaveným Pythonem"," — skripty jsou jádrem ukázky, viz\n",[425,445,447],{"href":446},"\u002Fcs\u002Fpython-scripts\u002Fscripts-overview#nastaven%C3%AD-pythonu","Nastavení Pythonu",".",[438,450,451,453,454,457,458,461,462,465,466,469,470,473,474,476,477,480],{},[393,452,325],{}," jako protějšek, například ",[393,455,456],{},"qModMaster",". Připojte\nho na IP adresu počítače s QInsight, port ",[393,459,460],{},"502",", unit ",[393,463,464],{},"2",", a nechte\nho číst ",[393,467,468],{},"holding registry"," od adresy ",[393,471,472],{},"0",", počet ",[393,475,464],{},". Díky\n",[380,478,479],{},"respondToAnyUnit=true"," slave odpoví i na jinou unit adresu.",[438,482,483,484,487,488,448],{},"Master může běžet ",[393,485,486],{},"na stejném PC"," — pak se připojuje na ",[380,489,490],{},"127.0.0.1",[438,492,493,494,497],{},"Při masteru na jiném počítači musí ",[393,495,496],{},"firewall na PC s QInsight"," povolit\npříchozí spojení na port 502 (lokální strana QInsight, vzdálená master).\nObnovu spojení po výpadku vždy iniciuje master (klient), server jen\nnaslouchá.",[438,499,500,501,505],{},"Port 502 nesmí obsazovat jiný program; jinak se driver opakovaně pokouší\nport otevřít (viz ",[425,502,504],{"href":503},"\u002Fcs\u002Freference\u002Fdrivers#obnova-spojen%C3%AD","Obnova spojení",")\na spustí se, jakmile se port uvolní.",[385,507,509],{"id":508},"projekt","Projekt",[511,512,514],"h3",{"id":513},"drivery-a-protokoly","Drivery a protokoly",[376,516,517],{},"Projekt má dvě dvojice driver + protokol.",[376,519,520,522,523,526,527,530],{},[393,521,399],{}," (",[380,524,525],{},"TcpServerDriver",") s nastavením\n",[380,528,529],{},"bindAddress=0.0.0.0;port=502;reconnectDelayMs=1000;reconnectAttempts=-1;keepAliveMs=5000",":",[532,533,534,550],"table",{},[535,536,537],"thead",{},[538,539,540,544,547],"tr",{},[541,542,543],"th",{},"Parametr",[541,545,546],{},"Hodnota",[541,548,549],{},"Význam v ukázce",[551,552,553,569,581,597,610],"tbody",{},[538,554,555,561,564],{},[556,557,558],"td",{},[380,559,560],{},"bindAddress",[556,562,563],{},"0.0.0.0",[556,565,566,567],{},"naslouchá na všech rozhraních — master se připojí přes libovolnou IP adresu PC i přes ",[380,568,490],{},[538,570,571,576,578],{},[556,572,573],{},[380,574,575],{},"port",[556,577,460],{},[556,579,580],{},"standardní port Modbus TCP",[538,582,583,588,591],{},[556,584,585],{},[380,586,587],{},"reconnectDelayMs",[556,589,590],{},"1000",[556,592,593,594],{},"prodleva mezi pokusy o ",[393,595,596],{},"otevření naslouchacího portu",[538,598,599,604,607],{},[556,600,601],{},[380,602,603],{},"reconnectAttempts",[556,605,606],{},"-1",[556,608,609],{},"pokouší se port otevřít bez omezení počtu pokusů (obsazený port, chybějící adresa)",[538,611,612,617,620],{},[556,613,614],{},[380,615,616],{},"keepAliveMs",[556,618,619],{},"5000",[556,621,622,623,626],{},"keepalive na ",[393,624,625],{},"přijatém spojení",": po 5 s bez provozu spojení ověřuje, odpojený klient se zjistí během několika sekund",[376,628,629,630,522,632,526,635,530],{},"Pod ním ",[393,631,403],{},[380,633,634],{},"ModbusSlaveProtocol",[380,636,637],{},"mode=tcp;unitId=2;respondToAnyUnit=true",[532,639,640,650],{},[535,641,642],{},[538,643,644,646,648],{},[541,645,543],{},[541,647,546],{},[541,649,549],{},[551,651,652,664,676],{},[538,653,654,659,661],{},[556,655,656],{},[380,657,658],{},"mode",[556,660,407],{},[556,662,663],{},"rámování Modbus TCP (MBAP), odpovídá driveru TCP Server",[538,665,666,671,673],{},[556,667,668],{},[380,669,670],{},"unitId",[556,672,464],{},[556,674,675],{},"vlastní adresa slave",[538,677,678,683,686],{},[556,679,680],{},[380,681,682],{},"respondToAnyUnit",[556,684,685],{},"true",[556,687,688,689],{},"slave odpoví bez ohledu na unit adresu v dotazu — nastaveno výslovně, protože předvyplněná šablona obsahuje ",[380,690,691],{},"false",[376,693,694,695,522,698,701,702,522,705,708],{},"Druhá dvojice ",[393,696,697],{},"Virtual Variables Host",[380,699,700],{},"VirtualDataDriver",") +\n",[393,703,704],{},"Virtual Variables",[380,706,707],{},"VirtualDataProtocol",") nemá žádná nastavení; nese\nzobrazovací kopie obou registrů.",[511,710,77],{"id":711},"proměnné",[532,713,714,736],{},[535,715,716],{},[538,717,718,721,724,727,730,733],{},[541,719,720],{},"Proměnná",[541,722,723],{},"Namespace",[541,725,726],{},"Typ",[541,728,729],{},"Protokol",[541,731,732],{},"Comm params",[541,734,735],{},"Role",[551,737,738,767,792,818],{},[538,739,740,745,750,753,756,761],{},[556,741,742],{},[380,743,744],{},"OilTemp",[556,746,747],{},[380,748,749],{},"\u002FModbus",[556,751,752],{},"ushort",[556,754,755],{},"Modbus Slave",[556,757,758],{},[380,759,760],{},"registerType=\"holdingRegister\";address=\"0\";wordOrder=\"big\";direction=\"read\"",[556,762,763,766],{},[393,764,765],{},"holding registr 0"," čtený masterem",[538,768,769,774,778,780,782,787],{},[556,770,771],{},[380,772,773],{},"OilPressure",[556,775,776],{},[380,777,749],{},[556,779,752],{},[556,781,755],{},[556,783,784],{},[380,785,786],{},"registerType=\"holdingRegister\";address=\"1\";wordOrder=\"big\";direction=\"read\"",[556,788,789,766],{},[393,790,791],{},"holding registr 1",[538,793,794,799,804,807,809,812],{},[556,795,796],{},[380,797,798],{},"OilTempView",[556,800,801],{},[380,802,803],{},"\u002FVirtual",[556,805,806],{},"double",[556,808,704],{},[556,810,811],{},"—",[556,813,814,815,817],{},"zobrazovací kopie ",[380,816,744],{}," pro graf a signal control",[538,819,820,825,829,831,833,835],{},[556,821,822],{},[380,823,824],{},"OilPressureView",[556,826,827],{},[380,828,803],{},[556,830,806],{},[556,832,704],{},[556,834,811],{},[556,836,814,837,817],{},[380,838,773],{},[376,840,841,842,844,845,848,849,852,853,856,857,860,861,864,865,868,869,872,873,876],{},"Slave proměnné jsou ",[380,843,752],{}," — jeden 16bitový registr, do kterého se\nrozsahy 0–150 i 1000–2500 vejdou bez přepočtu. Prezentace ",[380,846,847],{},"Temperature","\n(0–150, ",[380,850,851],{},"°C",") a ",[380,854,855],{},"Pressure"," (1000–2500, ",[380,858,859],{},"kPa",") používají obě lineární\nkonverzi ",[380,862,863],{},"Raw"," s ",[380,866,867],{},"multiplier=1",", ",[380,870,871],{},"offset=0"," a formát ",[380,874,875],{},"{0:F0}","; inženýrská\nhodnota se rovná surové (raw) hodnotě, master tedy čte přímo stupně a kilopascaly.\nStejné prezentace mají i virtuální kopie, takže graf a signal controly\nukazují tytéž jednotky a rozsahy.",[376,878,879,880,884],{},"Žádná ze slave proměnných není navázaná na control — vzhledem k tomu, že\n",[425,881,883],{"href":882},"\u002Fcs\u002Fpython-scripts\u002Faccessing-variables#z%C3%A1pis-a-zobrazen%C3%AD-virtu%C3%A1ln%C3%AD-prom%C4%9Bnn%C3%A9","zápis skriptu na protokolu zařízení nevyvolá událost pro UI",",\nby v něm nic neukazovala.",[511,886,888],{"id":887},"skripty","Skripty",[376,890,891],{},"Projekt má dva skripty, oba jen pro runtime (ne pro replay), blokující,\nbez timeoutu.",[376,893,894,404,897,900,901,868,904,907,908,911,912,916],{},[380,895,896],{},"init.py",[393,898,899],{},"Startup"," nastaví výchozí stav simulace a hned zapíše\npočáteční hodnoty. Pythonovské globální proměnné ",[380,902,903],{},"oil_temp",[380,905,906],{},"oil_pressure","\na ",[380,909,910],{},"direction"," jsou uloženy ve ",[425,913,915],{"href":914},"\u002Fcs\u002Fpython-scripts\u002Faccessing-variables#sd%C3%ADlen%C3%BD-prostor-skript%C5%AF","sdíleném prostoru skriptů",",\ntakže jsou periodickému skriptu dostupné:",[918,919,924],"pre",{"className":920,"code":921,"language":922,"meta":923,"style":923},"language-python shiki shiki-themes github-light github-dark-default","# Startup script: initial state of the simulated sensors.\n# The periodic script (simulate.py) ramps the values from here; the globals persist\n# between script runs inside one runtime session.\noil_temp = 0.0          # degC, ramps 0 .. 150\noil_pressure = 1000.0   # kPa, ramps 1000 .. 2500\ndirection = 1           # +1 ramping up, -1 ramping down\n\n# Publish the initial values right away, both to the slave registers and to the display copies.\nOilTemp.EngValue = oil_temp\nOilPressure.EngValue = oil_pressure\nOilTempView.EngValue = oil_temp\nOilPressureView.EngValue = oil_pressure\n","python","",[380,925,926,934,940,946,952,958,964,971,977,983,989,995],{"__ignoreMap":923},[927,928,931],"span",{"class":929,"line":930},"line",1,[927,932,933],{},"# Startup script: initial state of the simulated sensors.\n",[927,935,937],{"class":929,"line":936},2,[927,938,939],{},"# The periodic script (simulate.py) ramps the values from here; the globals persist\n",[927,941,943],{"class":929,"line":942},3,[927,944,945],{},"# between script runs inside one runtime session.\n",[927,947,949],{"class":929,"line":948},4,[927,950,951],{},"oil_temp = 0.0          # degC, ramps 0 .. 150\n",[927,953,955],{"class":929,"line":954},5,[927,956,957],{},"oil_pressure = 1000.0   # kPa, ramps 1000 .. 2500\n",[927,959,961],{"class":929,"line":960},6,[927,962,963],{},"direction = 1           # +1 ramping up, -1 ramping down\n",[927,965,967],{"class":929,"line":966},7,[927,968,970],{"emptyLinePlaceholder":969},true,"\n",[927,972,974],{"class":929,"line":973},8,[927,975,976],{},"# Publish the initial values right away, both to the slave registers and to the display copies.\n",[927,978,980],{"class":929,"line":979},9,[927,981,982],{},"OilTemp.EngValue = oil_temp\n",[927,984,986],{"class":929,"line":985},10,[927,987,988],{},"OilPressure.EngValue = oil_pressure\n",[927,990,992],{"class":929,"line":991},11,[927,993,994],{},"OilTempView.EngValue = oil_temp\n",[927,996,998],{"class":929,"line":997},12,[927,999,1000],{},"OilPressureView.EngValue = oil_pressure\n",[376,1002,1003,404,1006,1009,1010,1013],{},[380,1004,1005],{},"simulate.py",[393,1007,1008],{},"Periodic"," s parametry ",[380,1011,1012],{},"period=2;unit=s"," posune\nkaždé 2 s teplotu o 1 °C a tlak o 10 kPa; na horní nebo dolní mezi obě\nveličiny nastaví na krajní hodnotu a otočí směr. Oba rozsahy mají 150\nkroků, jeden průběh nahoru trvá 5 minut:",[918,1015,1017],{"className":920,"code":1016,"language":922,"meta":923,"style":923},"# Periodic script (period=2;unit=s): saw-tooth ramp of the simulated sensors.\n# Temperature moves 1 degC per step between 0 and 150, pressure 10 kPa per step between\n# 1000 and 2500, so one sweep up takes 5 minutes; at either end the direction flips.\n#\n# Every value is written twice on purpose:\n#  - OilTemp \u002F OilPressure are the Modbus slave variables. The slave serves their current\n#    value to the master (holding registers 0 and 1). A script write never raises a UI event\n#    on a device protocol, so these two are not shown in any control.\n#  - OilTempView \u002F OilPressureView are virtual variables. The Virtual Data protocol publishes\n#    every script write to the UI, so the graph and signal controls follow them.\noil_temp += direction * 1.0\noil_pressure += direction * 10.0\n\nif oil_temp >= 150.0 or oil_pressure >= 2500.0:\n    oil_temp, oil_pressure, direction = 150.0, 2500.0, -1\nelif oil_temp \u003C= 0.0 or oil_pressure \u003C= 1000.0:\n    oil_temp, oil_pressure, direction = 0.0, 1000.0, 1\n\nOilTemp.EngValue = oil_temp\nOilPressure.EngValue = oil_pressure\nOilTempView.EngValue = oil_temp\nOilPressureView.EngValue = oil_pressure\n",[380,1018,1019,1024,1029,1034,1039,1044,1049,1054,1059,1064,1069,1074,1079,1084,1090,1096,1102,1108,1113,1118,1123,1128],{"__ignoreMap":923},[927,1020,1021],{"class":929,"line":930},[927,1022,1023],{},"# Periodic script (period=2;unit=s): saw-tooth ramp of the simulated sensors.\n",[927,1025,1026],{"class":929,"line":936},[927,1027,1028],{},"# Temperature moves 1 degC per step between 0 and 150, pressure 10 kPa per step between\n",[927,1030,1031],{"class":929,"line":942},[927,1032,1033],{},"# 1000 and 2500, so one sweep up takes 5 minutes; at either end the direction flips.\n",[927,1035,1036],{"class":929,"line":948},[927,1037,1038],{},"#\n",[927,1040,1041],{"class":929,"line":954},[927,1042,1043],{},"# Every value is written twice on purpose:\n",[927,1045,1046],{"class":929,"line":960},[927,1047,1048],{},"#  - OilTemp \u002F OilPressure are the Modbus slave variables. The slave serves their current\n",[927,1050,1051],{"class":929,"line":966},[927,1052,1053],{},"#    value to the master (holding registers 0 and 1). A script write never raises a UI event\n",[927,1055,1056],{"class":929,"line":973},[927,1057,1058],{},"#    on a device protocol, so these two are not shown in any control.\n",[927,1060,1061],{"class":929,"line":979},[927,1062,1063],{},"#  - OilTempView \u002F OilPressureView are virtual variables. The Virtual Data protocol publishes\n",[927,1065,1066],{"class":929,"line":985},[927,1067,1068],{},"#    every script write to the UI, so the graph and signal controls follow them.\n",[927,1070,1071],{"class":929,"line":991},[927,1072,1073],{},"oil_temp += direction * 1.0\n",[927,1075,1076],{"class":929,"line":997},[927,1077,1078],{},"oil_pressure += direction * 10.0\n",[927,1080,1082],{"class":929,"line":1081},13,[927,1083,970],{"emptyLinePlaceholder":969},[927,1085,1087],{"class":929,"line":1086},14,[927,1088,1089],{},"if oil_temp >= 150.0 or oil_pressure >= 2500.0:\n",[927,1091,1093],{"class":929,"line":1092},15,[927,1094,1095],{},"    oil_temp, oil_pressure, direction = 150.0, 2500.0, -1\n",[927,1097,1099],{"class":929,"line":1098},16,[927,1100,1101],{},"elif oil_temp \u003C= 0.0 or oil_pressure \u003C= 1000.0:\n",[927,1103,1105],{"class":929,"line":1104},17,[927,1106,1107],{},"    oil_temp, oil_pressure, direction = 0.0, 1000.0, 1\n",[927,1109,1111],{"class":929,"line":1110},18,[927,1112,970],{"emptyLinePlaceholder":969},[927,1114,1116],{"class":929,"line":1115},19,[927,1117,982],{},[927,1119,1121],{"class":929,"line":1120},20,[927,1122,988],{},[927,1124,1126],{"class":929,"line":1125},21,[927,1127,994],{},[927,1129,1131],{"class":929,"line":1130},22,[927,1132,1000],{},[376,1134,1135,1138,1139,907,1141,1143,1144,1146,1147,1149],{},[393,1136,1137],{},"Dvojí zápis"," je záměrný a představuje podstatu celé ukázky. Zápis do ",[380,1140,744],{},[380,1142,773],{}," pouze uloží hodnotu, kterou Modbus Slave při dalším dotazu\npředá masterovi — protokol zařízení z tohoto zápisu žádný vzorek pro UI\nnevytvoří. Zápis do ",[380,1145,798],{}," a ",[380,1148,824],{}," naopak protokol\nVirtual Variables publikuje jako vzorek s časovou značkou zápisu, a právě\nten vidí graf a signal controly. Kdyby skript zapisoval jen do slave\nproměnných, master by data četl správně, ale workspace by zůstal prázdný;\nkdyby zapisoval jen do virtuálních, ukazovalo by se všechno, ale master by\nčetl nuly.",[511,1151,1153],{"id":1152},"workspace","Workspace",[376,1155,1156,1157,1160],{},"Workspace ",[393,1158,1159],{},"Simulated sensors"," obsahuje tři controly, všechny navázané na\nvirtuální kopie:",[435,1162,1163,1174],{},[438,1164,1165,1167,1168,1170,1171,1173],{},[393,1166,131],{}," „Simulated sensors (virtual copies of the slave registers)“\ns časovým oknem 300 s (přesně jeden průběh rampy) a dvěma svislými osami\ns pevným rozsahem: vlevo 0–150 pro ",[380,1169,798],{}," (červená), vpravo\n1000–2500 pro ",[380,1172,824],{}," (modrá).",[438,1175,1176,1177,1180,1181,907,1183,1185],{},"Dva ",[393,1178,1179],{},"Signal"," controly (obnova 250 ms) pro ",[380,1182,798],{},[380,1184,824],{},", jen pro čtení.",[385,1187,1189],{"id":1188},"co-uvidíte-a-co-vyzkoušet","Co uvidíte a co vyzkoušet",[1191,1192,1193,1196,1199,1217,1220],"ol",{},[438,1194,1195],{},"Spusťte runtime. Graf začne kreslit dvě pily: teplota od 0 °C nahoru,\ntlak od 1000 kPa nahoru; po 5 minutách se obě otočí.",[438,1197,1198],{},"Připojte master na port 502, unit 2, a čtěte holding registry 0 a 1.\nMaster ukazuje tytéž hodnoty jako signal controly a každé 2 s se posune\no 1 a o 10. Slave hodnoty pouze poskytuje; mezi dotazy master nic neposílá\na driver nečinnost na spojení za chybu nepovažuje.",[438,1200,1201,1204,1205,1208,1209,1212,1213,1216],{},[393,1202,1203],{},"Odpojte síťový kabel na straně masteru"," (nebo masteru odpojte síť). Po 5 s\nbez provozu začne keepalive spojení ověřovat a za několik dalších sekund se v okně ",[393,1206,1207],{},"Logs","\nobjeví varování ",[380,1210,1211],{},"client … lost",". Server se vrátí k naslouchání, driver\nzůstává spuštěný; korektní odpojení masteru by se zapsalo jako\n",[380,1214,1215],{},"client … disconnected",". Rampa běží dál — skript ani virtuální\nproměnné na klientovi nezávisí.",[438,1218,1219],{},"Kabel znovu připojte. Master se automaticky znovu připojí a čte hodnoty, které\nmezitím dále rostly; na straně QInsight není třeba nic dělat.",[438,1221,1222,1223,1226],{},"Připojte ",[393,1224,1225],{},"druhý master",", zatímco první ještě drží spojení: nové\npříchozí spojení nahradí to stávající — TCP Server obsluhuje jednoho\nklienta. Odpojeného mastera tak nahradí nový bez čekání na\nkeepalive.",[385,1228,1230],{"id":1229},"související-kapitoly","Související kapitoly",[435,1232,1233,1246,1252,1257,1266,1274,1280],{},[438,1234,1235,1238,1239,1241,1242,1146,1244,448],{},[425,1236,399],{"href":1237},"\u002Fcs\u002Freference\u002Fdrivers#tcp-server"," a\n",[425,1240,504],{"href":503}," — parametry\ndriveru, keepalive, hlášení ",[380,1243,1211],{},[380,1245,1215],{},[438,1247,1248,1251],{},[425,1249,403],{"href":1250},"\u002Fcs\u002Freference\u002Fprotocols#modbus-slave-rtutcp"," —\nnastavení slave, parametry registrů a chování při zápisu od mastera.",[438,1253,1254,1256],{},[425,1255,704],{"href":427}," — proč\nse zobrazení realizuje přes virtuální kopie.",[438,1258,1259,1261,1262,1265],{},[425,1260,200],{"href":201}," — zápis\npřes ",[380,1263,1264],{},"EngValue"," a sdílený prostor skriptů.",[438,1267,1268,1270,1271,448],{},[425,1269,196],{"href":197}," — režimy Startup\na Periodic, parametr ",[380,1272,1273],{},"period",[438,1275,1276,1279],{},[425,1277,167],{"href":1278},"\u002Fcs\u002Frunning\u002Fwatching-live-data#logs-a-script-logs","\n— okna Logs a Script-Logs.",[438,1281,1282,1238,1285,448],{},[425,1283,1284],{"href":129},"Grafy",[425,1286,1287],{"href":144},"Signal control",[1289,1290,1291],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":923,"searchDepth":942,"depth":942,"links":1293},[1294,1295,1296,1302,1303],{"id":387,"depth":936,"text":388},{"id":432,"depth":936,"text":433},{"id":508,"depth":936,"text":509,"children":1297},[1298,1299,1300,1301],{"id":513,"depth":942,"text":514},{"id":711,"depth":942,"text":77},{"id":887,"depth":942,"text":888},{"id":1152,"depth":942,"text":1153},{"id":1188,"depth":936,"text":1189},{"id":1229,"depth":936,"text":1230},"QInsight jako Modbus TCP slave (unit 2) na portu 502 — periodický skript simuluje teplotu a tlak oleje do holding registrů 0 a 1, které čte externí master.","md",{},{"title":327,"description":1304},"CAjy7LftfqGXq7UFpVz0CfrxNQaW6IDcVyewmOV44tk",[1310,1311],{"title":322,"path":323,"stem":324,"navTitle":325,"children":-1},{"title":331,"path":332,"stem":333,"navTitle":331,"children":-1},1791554569480]