[{"data":1,"prerenderedAt":2266},["ShallowReactive",2],{"docs-nav-docs_en":3,"docs-page-\u002Fen\u002Freference\u002Fprotocols":291,"docs-surround-\u002Fen\u002Freference\u002Fprotocols":2263},[4],{"title":5,"path":6,"stem":7,"children":8},"En","\u002Fen","en",[9,13,41,58,76,103,157,171,190,211,238,253,274],{"title":10,"path":6,"stem":11,"navTitle":12},"QInsight Documentation","en\u002Findex","Overview",{"title":14,"navTitle":15,"path":16,"stem":17,"children":18,"page":40},"Getting Started",null,"\u002Fen\u002Fgetting-started","en\u002F01.getting-started",[19,23,27,31,36],{"title":20,"path":21,"stem":22,"navTitle":20},"What is QENEX Suite","\u002Fen\u002Fgetting-started\u002Fwhat-is-qenex-suite","en\u002F01.getting-started\u002F1.what-is-qenex-suite",{"title":24,"path":25,"stem":26,"navTitle":24},"What is QInsight","\u002Fen\u002Fgetting-started\u002Fwhat-is-qinsight","en\u002F01.getting-started\u002F2.what-is-qinsight",{"title":28,"path":29,"stem":30,"navTitle":28},"Installation","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F01.getting-started\u002F3.installation",{"title":32,"path":33,"stem":34,"navTitle":35},"The QInsight user interface","\u002Fen\u002Fgetting-started\u002Fthe-qinsight-interface","en\u002F01.getting-started\u002F4.the-qinsight-interface","User interface",{"title":37,"path":38,"stem":39,"navTitle":37},"Licensing","\u002Fen\u002Fgetting-started\u002Flicensing","en\u002F01.getting-started\u002F5.licensing",false,{"title":42,"navTitle":15,"path":43,"stem":44,"children":45,"page":40},"First Project","\u002Fen\u002Ffirst-project","en\u002F02.first-project",[46,50,54],{"title":47,"path":48,"stem":49,"navTitle":47},"Create a project","\u002Fen\u002Ffirst-project\u002Fcreate-a-project","en\u002F02.first-project\u002F1.create-a-project",{"title":51,"path":52,"stem":53,"navTitle":51},"Project structure","\u002Fen\u002Ffirst-project\u002Fproject-structure","en\u002F02.first-project\u002F2.project-structure",{"title":55,"path":56,"stem":57,"navTitle":55},"Project password","\u002Fen\u002Ffirst-project\u002Fproject-password","en\u002F02.first-project\u002F3.project-password",{"title":59,"navTitle":15,"path":60,"stem":61,"children":62,"page":40},"Connecting a Device","\u002Fen\u002Fconnecting-a-device","en\u002F03.connecting-a-device",[63,67,71],{"title":64,"path":65,"stem":66,"navTitle":64},"Add a driver","\u002Fen\u002Fconnecting-a-device\u002Fadd-a-driver","en\u002F03.connecting-a-device\u002F1.add-a-driver",{"title":68,"path":69,"stem":70,"navTitle":68},"Add a protocol","\u002Fen\u002Fconnecting-a-device\u002Fadd-a-protocol","en\u002F03.connecting-a-device\u002F2.add-a-protocol",{"title":72,"path":73,"stem":74,"navTitle":75},"Link a driver and a protocol","\u002Fen\u002Fconnecting-a-device\u002Flink-driver-and-protocol","en\u002F03.connecting-a-device\u002F3.link-driver-and-protocol","Linking",{"title":77,"navTitle":15,"path":78,"stem":79,"children":80,"page":40},"Variables","\u002Fen\u002Fvariables","en\u002F04.variables",[81,85,90,94,99],{"title":82,"path":83,"stem":84,"navTitle":82},"What is a variable","\u002Fen\u002Fvariables\u002Fwhat-is-a-variable","en\u002F04.variables\u002F1.what-is-a-variable",{"title":86,"path":87,"stem":88,"navTitle":89},"Conversion and presentation","\u002Fen\u002Fvariables\u002Fconversion-and-presentation","en\u002F04.variables\u002F2.conversion-and-presentation","Conversion & presentation",{"title":91,"path":92,"stem":93,"navTitle":91},"Add a variable","\u002Fen\u002Fvariables\u002Fadd-a-variable","en\u002F04.variables\u002F3.add-a-variable",{"title":95,"path":96,"stem":97,"navTitle":98},"Matrix variable (array, curve, map)","\u002Fen\u002Fvariables\u002Fmatrix-variable","en\u002F04.variables\u002F4.matrix-variable","Matrix variable",{"title":100,"path":101,"stem":102,"navTitle":100},"Events","\u002Fen\u002Fvariables\u002Fevents","en\u002F04.variables\u002F5.events",{"title":104,"navTitle":15,"path":105,"stem":106,"children":107,"page":40},"Visualization","\u002Fen\u002Fvisualization","en\u002F05.visualization",[108,113,118,122,127,132,137,142,147,152],{"title":109,"path":110,"stem":111,"navTitle":112},"Create a workspace","\u002Fen\u002Fvisualization\u002Fcreate-a-workspace","en\u002F05.visualization\u002F1.create-a-workspace","Workspace",{"title":114,"path":115,"stem":116,"navTitle":117},"Writing values to the device","\u002Fen\u002Fvisualization\u002Fwrite-to-device","en\u002F05.visualization\u002F10.write-to-device","Writing to the device",{"title":119,"path":120,"stem":121,"navTitle":119},"Add a control","\u002Fen\u002Fvisualization\u002Fadd-a-control","en\u002F05.visualization\u002F2.add-a-control",{"title":123,"path":124,"stem":125,"navTitle":126},"Bind a control to a variable","\u002Fen\u002Fvisualization\u002Fbind-a-control","en\u002F05.visualization\u002F3.bind-a-control","Bind a control",{"title":128,"path":129,"stem":130,"navTitle":131},"Graph — signal time course","\u002Fen\u002Fvisualization\u002Fgraph-control","en\u002F05.visualization\u002F4.graph-control","Graph",{"title":133,"path":134,"stem":135,"navTitle":136},"XY Graph — signal versus signal","\u002Fen\u002Fvisualization\u002Fxy-graph-control","en\u002F05.visualization\u002F5.xy-graph-control","XY Graph",{"title":138,"path":139,"stem":140,"navTitle":141},"Gauge — instantaneous value indicator","\u002Fen\u002Fvisualization\u002Fgauge-control","en\u002F05.visualization\u002F6.gauge-control","Gauge",{"title":143,"path":144,"stem":145,"navTitle":146},"Single-Signal — a value with a caption","\u002Fen\u002Fvisualization\u002Fsignal-control","en\u002F05.visualization\u002F7.signal-control","Single-Signal",{"title":148,"path":149,"stem":150,"navTitle":151},"Watch Table — a table of variables","\u002Fen\u002Fvisualization\u002Fwatch-table-control","en\u002F05.visualization\u002F8.watch-table-control","Watch Table",{"title":153,"path":154,"stem":155,"navTitle":156},"Matrix control — maps and calibration","\u002Fen\u002Fvisualization\u002Fmatrix-control","en\u002F05.visualization\u002F9.matrix-control","Matrix control",{"title":158,"navTitle":15,"path":159,"stem":160,"children":161,"page":40},"Running and Monitoring","\u002Fen\u002Frunning","en\u002F06.running",[162,166],{"title":163,"path":164,"stem":165,"navTitle":163},"Start and stop","\u002Fen\u002Frunning\u002Fstart-and-stop","en\u002F06.running\u002F1.start-and-stop",{"title":167,"path":168,"stem":169,"navTitle":170},"Watching live data","\u002Fen\u002Frunning\u002Fwatching-live-data","en\u002F06.running\u002F2.watching-live-data","Live data",{"title":172,"navTitle":15,"path":173,"stem":174,"children":175,"page":40},"Logging and Replay","\u002Fen\u002Flogging-and-replay","en\u002F07.logging-and-replay",[176,180,185],{"title":177,"path":178,"stem":179,"navTitle":177},"Logging data","\u002Fen\u002Flogging-and-replay\u002Flogging-data","en\u002F07.logging-and-replay\u002F1.logging-data",{"title":181,"path":182,"stem":183,"navTitle":184},"Replaying a log","\u002Fen\u002Flogging-and-replay\u002Freplaying-a-log","en\u002F07.logging-and-replay\u002F2.replaying-a-log","Replay",{"title":186,"path":187,"stem":188,"navTitle":189},"Exporting data","\u002Fen\u002Flogging-and-replay\u002Fexporting-data","en\u002F07.logging-and-replay\u002F3.exporting-data","Export",{"title":191,"navTitle":15,"path":192,"stem":193,"children":194,"page":40},"Python Scripts","\u002Fen\u002Fpython-scripts","en\u002F08.python-scripts",[195,199,203,207],{"title":196,"path":197,"stem":198,"navTitle":12},"Scripts overview","\u002Fen\u002Fpython-scripts\u002Fscripts-overview","en\u002F08.python-scripts\u002F1.scripts-overview",{"title":200,"path":201,"stem":202,"navTitle":200},"Accessing variables","\u002Fen\u002Fpython-scripts\u002Faccessing-variables","en\u002F08.python-scripts\u002F2.accessing-variables",{"title":204,"path":205,"stem":206,"navTitle":204},"Example script","\u002Fen\u002Fpython-scripts\u002Fexample-script","en\u002F08.python-scripts\u002F3.example-script",{"title":208,"path":209,"stem":210,"navTitle":208},"CSV post-processing","\u002Fen\u002Fpython-scripts\u002Fcsv-post-processing","en\u002F08.python-scripts\u002F4.csv-post-processing",{"title":212,"navTitle":15,"path":213,"stem":214,"children":215,"page":40},"Custom extensions","\u002Fen\u002Fcustom-extensions","en\u002F09.custom-extensions",[216,220,224,228,233],{"title":217,"path":218,"stem":219,"navTitle":217},"Custom driver","\u002Fen\u002Fcustom-extensions\u002Fcustom-driver","en\u002F09.custom-extensions\u002F1.custom-driver",{"title":221,"path":222,"stem":223,"navTitle":221},"Custom protocol","\u002Fen\u002Fcustom-extensions\u002Fcustom-protocol","en\u002F09.custom-extensions\u002F2.custom-protocol",{"title":225,"path":226,"stem":227,"navTitle":225},"Custom Control","\u002Fen\u002Fcustom-extensions\u002Fcustom-control","en\u002F09.custom-extensions\u002F3.custom-control",{"title":229,"path":230,"stem":231,"navTitle":232},"Complete example — ISS position","\u002Fen\u002Fcustom-extensions\u002Fiss-example","en\u002F09.custom-extensions\u002F4.iss-example","Example ISS",{"title":234,"path":235,"stem":236,"navTitle":237},"Complete example — temperature sensor","\u002Fen\u002Fcustom-extensions\u002Ftemp-sensor-example","en\u002F09.custom-extensions\u002F5.temp-sensor-example","Example temp sensor",{"title":239,"navTitle":15,"path":240,"stem":241,"children":242,"page":40},"Firmware SDK","\u002Fen\u002Fdevice-sdk","en\u002F10.device-sdk",[243,248],{"title":244,"path":245,"stem":246,"navTitle":247},"Firmware SDK — introduction","\u002Fen\u002Fdevice-sdk\u002Fintroduction","en\u002F10.device-sdk\u002F1.introduction","Introduction",{"title":249,"path":250,"stem":251,"navTitle":252},"XCP SDK","\u002Fen\u002Fdevice-sdk\u002Fxcp","en\u002F10.device-sdk\u002F2.xcp","XCP",{"title":254,"navTitle":15,"path":255,"stem":256,"children":257,"page":40},"Reference","\u002Fen\u002Freference","en\u002F11.reference",[258,262,266,270],{"title":259,"path":260,"stem":261,"navTitle":259},"Drivers","\u002Fen\u002Freference\u002Fdrivers","en\u002F11.reference\u002F1.drivers",{"title":263,"path":264,"stem":265,"navTitle":263},"Protocols","\u002Fen\u002Freference\u002Fprotocols","en\u002F11.reference\u002F2.protocols",{"title":267,"path":268,"stem":269,"navTitle":267},"Controls","\u002Fen\u002Freference\u002Fcontrols","en\u002F11.reference\u002F3.controls",{"title":271,"path":272,"stem":273,"navTitle":271},"Troubleshooting","\u002Fen\u002Freference\u002Ftroubleshooting","en\u002F11.reference\u002F4.troubleshooting",{"title":275,"navTitle":15,"path":276,"stem":277,"children":278,"page":40},"Examples","\u002Fen\u002Fexamples","en\u002F12.examples",[279,283,287],{"title":280,"path":281,"stem":282,"navTitle":280},"Filtering a signal with a script","\u002Fen\u002Fexamples\u002Ffilter-script","en\u002F12.examples\u002F1.filter-script",{"title":284,"path":285,"stem":286,"navTitle":284},"Bit field and a script","\u002Fen\u002Fexamples\u002Fbit-field-script","en\u002F12.examples\u002F2.bit-field-script",{"title":288,"path":289,"stem":290,"navTitle":288},"Two ECUs at once","\u002Fen\u002Fexamples\u002Ftwo-ecus","en\u002F12.examples\u002F3.two-ecus",{"id":292,"title":263,"body":293,"description":2257,"extension":2258,"meta":2259,"navTitle":263,"navigation":2260,"path":264,"seo":2261,"stem":265,"__hash__":2262},"docs_en\u002Fen\u002F11.reference\u002F2.protocols.md",{"type":294,"value":295,"toc":2236},"minimark",[296,300,324,351,365,368,494,497,501,509,512,515,524,589,616,631,634,641,676,684,687,779,785,788,826,829,836,856,863,865,905,909,912,934,962,965,972,978,1058,1080,1085,1092,1102,1106,1117,1137,1148,1162,1168,1202,1209,1215,1221,1228,1231,1286,1290,1305,1308,1314,1348,1356,1360,1371,1375,1382,1397,1404,1406,1473,1476,1577,1616,1619,1683,1687,1696,1727,1731,1738,1744,1751,1753,1806,1819,1882,1885,1892,1903,1906,1945,1972,1975,1982,1991,2055,2073,2075,2135,2161,2164,2171,2183,2197,2200,2224,2230],[297,298,263],"h1",{"id":299},"protocols",[301,302,303,304,309,310,314,315,319,320,323],"p",{},"A protocol decodes the data coming from a ",[305,306,308],"a",{"href":307},"\u002Freference\u002Fdrivers","driver"," and\nhands it to variables. Protocol settings are entered in the ",[311,312,313],"strong",{},"Settings","\nfield in the ",[316,317,318],"code",{},"key=value;key=value"," form; per-variable parameters go into\nthe ",[311,321,322],{},"Comm params"," field when a variable is assigned to the protocol.",[301,325,326,327,329,330,334,335,338,339,342,343,346,347,350],{},"Protocols with their own settings have the ",[311,328,313],{}," field automatically\npre-filled with default values when added (the ",[331,332,333],"em",{},"Pre-filled"," line under each\nbelow). ",[311,336,337],{},"These are only defaults — always overwrite them to match your real\nsetup"," (e.g. ",[316,340,341],{},"masterId","\u002F",[316,344,345],{},"slaveId"," for XCP, ",[316,348,349],{},"mode"," for Modbus). Protocols\nwith no settings of their own (Raw CAN Frames, JSON Signal Stream,\nSimulation Signals) are configured only through per-variable parameters and\nthe Settings field stays empty.",[301,352,353,354,356,357,360,361,364],{},"The ",[311,355,322],{}," field is also pre-filled when a variable is assigned\nto a protocol — with the protocol's own template containing placeholders\n(e.g. ",[316,358,359],{},"canId=\"0x100\""," for Raw CAN). ",[311,362,363],{},"Always replace the placeholders with\nreal values."," A faulty Comm param (missing mandatory parameter, wrong\nformat) removes the variable from communication: a warning appears in the\nlog and the variable simply stays empty — the protocol itself keeps\nrunning. Unknown keys are ignored without any message; keys are\ncase-insensitive and values may be quoted.",[301,366,367],{},"The protocol must match the driver's data type — the usual pairs:",[369,370,371,384],"table",{},[372,373,374],"thead",{},[375,376,377,381],"tr",{},[378,379,380],"th",{},"Protocol",[378,382,383],{},"Driver",[385,386,387,398,407,417,432,443,454,465,474,484],"tbody",{},[375,388,389,395],{},[390,391,392],"td",{},[311,393,394],{},"Raw CAN Frames",[390,396,397],{},"PEAK CAN Adapter",[375,399,400,405],{},[390,401,402],{},[311,403,404],{},"XCP on CAN",[390,406,397],{},[375,408,409,414],{},[390,410,411],{},[311,412,413],{},"XCP on TCP",[390,415,416],{},"TCP Client",[375,418,419,429],{},[390,420,421,424,425,428],{},[311,422,423],{},"Modbus Master"," (",[316,426,427],{},"mode=rtu",")",[390,430,431],{},"Serial Port (COM)",[375,433,434,441],{},[390,435,436,424,438,428],{},[311,437,423],{},[316,439,440],{},"mode=tcp",[390,442,416],{},[375,444,445,452],{},[390,446,447,424,450,428],{},[311,448,449],{},"Modbus Slave",[316,451,427],{},[390,453,431],{},[375,455,456,462],{},[390,457,458,424,460,428],{},[311,459,449],{},[316,461,440],{},[390,463,464],{},"TCP Server",[375,466,467,472],{},[390,468,469],{},[311,470,471],{},"JSON Signal Stream",[390,473,416],{},[375,475,476,481],{},[390,477,478],{},[311,479,480],{},"Simulation Signals",[390,482,483],{},"Simulation",[375,485,486,491],{},[390,487,488],{},[311,489,490],{},"Virtual Variables",[390,492,493],{},"Virtual Variables Host",[301,495,496],{},"Project Configuration enforces this: protocols that cannot work with the\nselected driver are greyed out in the protocol list, with a tooltip\nexplaining what they need.",[498,499,394],"h2",{"id":500},"raw-can-frames",[301,502,503],{},[331,504,505,506],{},"Technical name (stored in the project): ",[316,507,508],{},"RawCanProtocol",[301,510,511],{},"CAN bus monitoring: maps standard (11-bit) CAN frames to variables by their\nidentifier — no higher-layer parsing. Read-only; extended (29-bit) frames\nare ignored.",[301,513,514],{},"The protocol has no settings of its own.",[301,516,517,520,521],{},[311,518,519],{},"Comm params pre-fill:"," ",[316,522,523],{},"canId=\"0x100\";offset=\"0\";byteOrder=\"le\"",[369,525,526,539],{},[372,527,528],{},[375,529,530,533,536],{},[378,531,532],{},"Parameter",[378,534,535],{},"Default",[378,537,538],{},"Meaning",[385,540,541,557,569],{},[375,542,543,548,551],{},[390,544,545],{},[316,546,547],{},"canId",[390,549,550],{},"0",[390,552,553,554],{},"11-bit CAN identifier in hexadecimal, e.g. ",[316,555,556],{},"0x100",[375,558,559,564,566],{},[390,560,561],{},[316,562,563],{},"offset",[390,565,550],{},[390,567,568],{},"index of the first frame data byte to read",[375,570,571,576,579],{},[390,572,573],{},[316,574,575],{},"byteOrder",[390,577,578],{},"le",[390,580,581,582,584,585,588],{},"byte order: ",[316,583,578],{}," (little-endian), ",[316,586,587],{},"be"," (big-endian)",[301,590,591,592,594,595,602,603,606,607,609,610,612,613,615],{},"Beware: ",[316,593,547],{}," is interpreted ",[311,596,597,598,601],{},"as hexadecimal even without the ",[316,599,600],{},"0x","\nprefix"," — ",[316,604,605],{},"canId=100"," means 0x100 (decimal 256), not one hundred. The\nvalue is not checked against the 11-bit range; an out-of-range id or a\ntypo (which silently becomes zero) only shows up as the variable never\nreceiving data. For ",[316,608,575],{}," only the listed tokens count — anything\nelse silently means ",[316,611,578],{},". An ",[316,614,563],{}," past the end of the frame yields\nall zeros.",[301,617,618,619,622,623,626,627,630],{},"Supports all numeric types of ",[311,620,621],{},"scalar"," variables including ",[316,624,625],{},"float"," and\n",[316,628,629],{},"double"," (the width comes from the variable's data type; missing bytes of\na short frame are zero-padded). Matrix, string and enum variables are not\nserved.",[498,632,404],{"id":633},"xcp-on-can",[301,635,636],{},[331,637,505,638],{},[316,639,640],{},"XcpProtocol",[301,642,643,644,647,648,424,651,654,655,658,659,663,664,667,668,671,672,675],{},"A simplified ",[311,645,646],{},"XCP master"," (ASAM MCD-1 XCP) over CAN. Reads ECU memory\neither by ",[311,649,650],{},"polling",[316,652,653],{},"SHORT_UPLOAD",") or by ",[311,656,657],{},"DAQ"," — the ECU streams the\nvalues itself (both modes are explained in\n",[305,660,662],{"href":661},"#xcp-polling-daq-and-stim","XCP polling, DAQ, and STIM","\nbelow, shared by both XCP variants). Operator writes go via ",[316,665,666],{},"SET_MTA"," +\n",[316,669,670],{},"DOWNLOAD",", periodic stimulation of variables streams via ",[311,673,674],{},"STIM",". No\nblock mode, no seed & key (a protected calibration disables\nwrites; a protected DAQ resource falls back to polling). Byte order and\naddress granularity are taken from the slave's CONNECT response.",[301,677,678,520,681],{},[311,679,680],{},"Pre-filled:",[316,682,683],{},"masterId=0x200;slaveId=0x201;extendedIds=false;timeoutMs=1000;daqTimestamps=slave",[301,685,686],{},"Protocol settings:",[369,688,689,699],{},[372,690,691],{},[375,692,693,695,697],{},[378,694,532],{},[378,696,535],{},[378,698,538],{},[385,700,701,713,726,742,755],{},[375,702,703,707,710],{},[390,704,705],{},[316,706,341],{},[390,708,709],{},"— (mandatory)",[390,711,712],{},"CAN id of master → slave frames, hexadecimal",[375,714,715,719,721],{},[390,716,717],{},[316,718,345],{},[390,720,709],{},[390,722,723,724],{},"CAN id of slave → master frames; must differ from ",[316,725,341],{},[375,727,728,733,736],{},[390,729,730],{},[316,731,732],{},"extendedIds",[390,734,735],{},"false",[390,737,738,741],{},[316,739,740],{},"true"," = both ids are 29-bit (extended)",[375,743,744,749,752],{},[390,745,746],{},[316,747,748],{},"timeoutMs",[390,750,751],{},"1000",[390,753,754],{},"per-command response timeout in ms",[375,756,757,762,765],{},[390,758,759],{},[316,760,761],{},"daqTimestamps",[390,763,764],{},"slave",[390,766,767,768,770,771,774,775,428],{},"time-axis source of DAQ samples: ",[316,769,764],{}," = ECU timestamps, ",[316,772,773],{},"master"," = PC receive time (see ",[305,776,778],{"href":777},"#daq-behaviour-and-diagnostics","DAQ behaviour and diagnostics",[301,780,781,782,784],{},"Per-variable parameters are common to both XCP variants — see\n",[305,783,662],{"href":661},".",[301,786,787],{},"CAN-specific behaviour:",[789,790,791,809,812,815,820],"ul",{},[792,793,794,795,342,798,342,801,804,805,808],"li",{},"Values longer than 6–7 bytes (",[316,796,797],{},"Long",[316,799,800],{},"ULong",[316,802,803],{},"Double",") are polled and\nwritten as a chain of several commands and the transfer is ",[311,806,807],{},"not\natomic"," — if the ECU changes the value meanwhile, the result may be\ninconsistent. (DAQ does not have this problem: the ECU samples the\nvalues consistently at its event.)",[792,810,811],{},"A DAQ packet on classic CAN carries at most 8 bytes including its\nheader, so one packet holds only a few small values — the protocol\nautomatically spreads the variables over more packets per cycle.",[792,813,814],{},"Only slaves with BYTE address granularity are supported (the common\ncase); any other granularity is rejected and the protocol stays\nFaulted.",[792,816,817,819],{},[316,818,748],{}," applies per command; on a timeout the transaction is\nretried up to twice, so the worst-case wait is roughly three times as\nlong.",[792,821,822,823,825],{},"Invalid protocol settings (missing\u002Fnon-hex id, id outside the CAN\nrange, ",[316,824,748],{}," ≤ 0) put the protocol into the Faulted state at\nstart with the cause in the log.",[498,827,413],{"id":828},"xcp-on-tcp",[301,830,831],{},[331,832,505,833],{},[316,834,835],{},"XcpTcpProtocol",[301,837,838,839,841,842,845,846,849,850,852,853,855],{},"The same simplified ",[311,840,646],{}," over ",[311,843,844],{},"XCP on Ethernet"," (TCP\ntransport): polling or DAQ reads, operator writes and STIM, byte order\nand limits taken from the CONNECT response. The ECU is the TCP ",[311,847,848],{},"server","; QInsight\nconnects to it through the ",[311,851,416],{}," driver — the IP address and\nport therefore belong to the ",[311,854,308],{}," settings, not to the protocol.",[301,857,858,520,860],{},[311,859,680],{},[316,861,862],{},"timeoutMs=1000;daqTimestamps=slave",[301,864,686],{},[369,866,867,877],{},[372,868,869],{},[375,870,871,873,875],{},[378,872,532],{},[378,874,535],{},[378,876,538],{},[385,878,879,889],{},[375,880,881,885,887],{},[390,882,883],{},[316,884,748],{},[390,886,751],{},[390,888,754],{},[375,890,891,895,897],{},[390,892,893],{},[316,894,761],{},[390,896,764],{},[390,898,767,899,770,901,774,903,428],{},[316,900,764],{},[316,902,773],{},[305,904,778],{"href":777},[301,906,781,907,784],{},[305,908,662],{"href":661},[301,910,911],{},"TCP-specific behaviour:",[789,913,914,924],{},[792,915,916,917,919,920,923],{},"Ethernet allows large XCP packets, so every supported value (up to\n8 bytes, including ",[316,918,803],{},") is transferred ",[311,921,922],{},"in one packet, atomically","\n— no chaining as on CAN — and one DAQ packet typically carries a whole\ngroup of variables at once.",[792,925,926,927,930,931,933],{},"Timeouts of the TCP connection itself (",[316,928,929],{},"connectionTimeoutMs",",\nreconnects) are configured on the TCP Client driver; ",[316,932,748],{}," here\nonly covers the XCP command\u002Fresponse exchange.",[301,935,936,939,940,946,947,949,950,953,954,957,958,961],{},[311,937,938],{},"Trying it without hardware:"," the open-source\n",[305,941,945],{"href":942,"rel":943},"https:\u002F\u002Fgithub.com\u002Fvectorgrp\u002FXCPlite",[944],"nofollow","XCPlite"," slave works as a free\ntest ECU on localhost. Two ready-made projects ship in the QInsight\n",[316,948,275],{}," folder: ",[316,951,952],{},"XcpTcp_XCPlite_Daq01.qproj"," (a minimal DAQ-only\nproject — four variables streamed from the ECU) and\n",[316,955,956],{},"XcpTcp_XCPlite_Test01.qproj"," (DAQ measurement plus calibration writes).\nBuild the XCPlite ",[316,959,960],{},"hello_xcp"," example, run it, and open either project.",[498,963,662],{"id":964},"xcp-polling-daq-and-stim",[301,966,967,968,971],{},"Both XCP protocols configure variables the same way and offer two ways\nof reading them (polling and DAQ) plus streamed writing (STIM). Which\nmode a variable uses is decided by the ",[311,969,970],{},"event"," it is bound to —\nnothing else in the configuration changes.",[301,973,974,975,977],{},"Per-variable parameters (the ",[311,976,322],{}," field):",[369,979,980,990],{},[372,981,982],{},[375,983,984,986,988],{},[378,985,532],{},[378,987,535],{},[378,989,538],{},[385,991,992,1008,1020,1041],{},[375,993,994,999,1001],{},[390,995,996],{},[316,997,998],{},"address",[390,1000,709],{},[390,1002,1003,1004,1007],{},"32-bit ECU memory address, hexadecimal (",[316,1005,1006],{},"0x…",") or decimal",[375,1009,1010,1015,1017],{},[390,1011,1012],{},[316,1013,1014],{},"addressExtension",[390,1016,550],{},[390,1018,1019],{},"address-space qualifier (decimal)",[375,1021,1022,1027,1030],{},[390,1023,1024],{},[316,1025,1026],{},"direction",[390,1028,1029],{},"read",[390,1031,1032,1034,1035,1034,1038],{},[316,1033,1029],{},", ",[316,1036,1037],{},"write",[316,1039,1040],{},"readWrite",[375,1042,1043,1048,1051],{},[390,1044,1045],{},[316,1046,1047],{},"eventRef",[390,1049,1050],{},"—",[390,1052,1053,1054,342,1056,428],{},"name of the event the variable is bound to (mandatory for ",[316,1055,1029],{},[316,1057,1040],{},[301,1059,1060,1061,1064,1065,1068,1069,1072,1073,626,1076,1079],{},"The pre-filled ",[316,1062,1063],{},"address=\"0x0\""," is just a placeholder — always replace it\nwith the real address from the ECU description (typically the\n",[316,1066,1067],{},"ECU_ADDRESS"," and ",[316,1070,1071],{},"ECU_ADDRESS_EXTENSION"," attributes in an A2L file).\nThe value width and data type are taken from the variable itself, so\nthey are not entered here. Older projects may still contain ",[316,1074,1075],{},"size",[316,1077,1078],{},"dataType"," keys — they are accepted and validated against the variable's\ntype; a mismatch is a configuration error.",[1081,1082,1084],"h3",{"id":1083},"polling-the-master-asks","Polling — the master asks",[301,1086,1087,1088,1091],{},"The default mode. The variable is bound to an ordinary ",[311,1089,1090],{},"periodic\nevent","; the master reads the address in the event's period (PC timing,\none request\u002Fresponse per variable per cycle). Simple and universal — it\nworks with every XCP slave — but each value costs a round-trip, so it\ndoes not scale to fast rates or many variables.",[1093,1094,1100],"pre",{"className":1095,"code":1097,"language":1098,"meta":1099},[1096],"language-text","Event:       Poll100ms         (Period 100, Unit Milisec)\nComm params: address=\"0x39B68\";addressExtension=\"1\";direction=\"read\";eventRef=\"Poll100ms\"\n","text","",[316,1101,1097],{"__ignoreMap":1099},[1081,1103,1105],{"id":1104},"daq-the-ecu-streams","DAQ — the ECU streams",[301,1107,1108,1109,1112,1113,1116],{},"In DAQ mode (Data Acquisition) the master only configures at connect\n",[311,1110,1111],{},"what"," to sample and ",[311,1114,1115],{},"on which ECU event channel"," — from then on the\nECU samples the values itself, at its own rate, and streams them without\nbeing asked. The gains over polling:",[789,1118,1119,1125,1131],{},[792,1120,1121,1124],{},[311,1122,1123],{},"speed"," — sampling at the ECU's own cycle (e.g. every 1 ms),\nfar beyond what request\u002Fresponse polling can do,",[792,1126,1127,1130],{},[311,1128,1129],{},"consistency"," — all values of one event channel are sampled at the\nsame instant in the ECU, so they belong together,",[792,1132,1133,1136],{},[311,1134,1135],{},"efficiency"," — no per-value requests; many variables cost almost\nnothing extra.",[301,1138,1139,1140,1143,1144,1147],{},"An ",[311,1141,1142],{},"ECU event channel"," is a point in the ECU program where the ECU\npublishes fresh values — e.g. \"every loop of the 1 ms task\". The channel\nnumbers and names are listed in the ECU's A2L file (the ",[316,1145,1146],{},"EVENT"," entries)\nor its documentation.",[301,1149,1150,1153,1154,1157,1158,1161],{},[311,1151,1152],{},"How to use DAQ:"," create a periodic ",[305,1155,970],{"href":1156},"\u002Fvariables\u002Fevents"," and\nfill in its ",[311,1159,1160],{},"Extra Params"," field (Home → Project Configuration →\nEvents):",[1093,1163,1166],{"className":1164,"code":1165,"language":1098,"meta":1099},[1096],"direction=\"DAQ\";daqId=\"1\"\n",[316,1167,1165],{"__ignoreMap":1099},[369,1169,1170,1179],{},[372,1171,1172],{},[375,1173,1174,1177],{},[378,1175,1176],{},"Extra Params key",[378,1178,538],{},[385,1180,1181,1192],{},[375,1182,1183,1187],{},[390,1184,1185],{},[316,1186,1026],{},[390,1188,1189,1191],{},[316,1190,657],{}," marks the event as an ECU event channel",[375,1193,1194,1199],{},[390,1195,1196],{},[316,1197,1198],{},"daqId",[390,1200,1201],{},"the ECU event channel number (0–65535, from the A2L)",[301,1203,1204,1205,1208],{},"The two keys are only valid together. The event's ",[311,1206,1207],{},"Period"," does not\ndrive anything in DAQ mode — it documents the channel's expected cycle\nand is checked against the value the ECU reports at connect (a mismatch\nlogs a warning with both values).",[301,1210,1211,1212,1214],{},"Then bind variables to this event exactly like to any other — via\n",[316,1213,1047],{},":",[1093,1216,1219],{"className":1217,"code":1218,"language":1098,"meta":1099},[1096],"Event:       Daq_mainloop      (Period 1, Unit Milisec,\n                                Extra Params: direction=\"DAQ\";daqId=\"1\")\nComm params: address=\"0x39B68\";addressExtension=\"1\";direction=\"read\";eventRef=\"Daq_mainloop\"\n",[316,1220,1218],{"__ignoreMap":1099},[301,1222,1223,1224,1227],{},"Variables bound to a DAQ event are streamed; variables bound to a normal\nperiodic event keep polling. ",[311,1225,1226],{},"Both modes mix freely in one protocol"," —\ntypical setups stream the fast measurements and poll (or write) the\ncalibration parameters. Writes are not affected by DAQ at all.",[1081,1229,778],{"id":1230},"daq-behaviour-and-diagnostics",[789,1232,1233,1246,1255,1261,1280],{},[792,1234,1235,1238,1239,1242,1243,1245],{},[311,1236,1237],{},"Validation is strict."," A typo in Extra Params never silently turns\nDAQ off: ",[316,1240,1241],{},"direction=\"DAQ\""," without ",[316,1244,1198],{}," (or the other way round),\nor a malformed entry, removes the variable from communication at\nproject load with a log warning describing exactly what is wrong.\nAn unknown key only logs a warning and is ignored.",[792,1247,1248,1251,1252,1254],{},[311,1249,1250],{},"The channel is verified at connect."," The protocol asks the ECU for\nthe channel's name and cycle (when the slave supports the query),\nwrites the ECU name of the channel to the log — check it to be sure\nthe ",[316,1253,1198],{}," points where you think — and compares the cycle with the\nevent's Period.",[792,1256,1257,1260],{},[311,1258,1259],{},"Automatic fallback to polling."," When the slave has no DAQ resource,\nprotects it with seed & key, rejects the channel, or the DAQ setup\nfails, the affected variables automatically fall back to polling\n(the event's Period then drives the poll rate) and a warning explains\nwhy. The session keeps running either way.",[792,1262,1263,1266,1267,1269,1270,1272,1273,1276,1277,1279],{},[311,1264,1265],{},"Timestamps"," of DAQ samples follow the ",[316,1268,761],{}," setting. The\ndefault ",[316,1271,764],{}," places samples onto the time axis by the ",[311,1274,1275],{},"ECU\ntimestamps"," — each sample then carries the exact sampling instant in\nthe ECU, not the packet arrival time (a substantial difference with\nbatched transfers). The timestamps are anchored to the PC clock and a\nslow ECU clock drift is compensated continuously; a sustained drift\nabove ~0.3 % logs a diagnostic warning (usually a sign of a wrong\nclock source in the ECU). A slave without timestamps automatically\nfalls back to the receive time. The value ",[316,1278,773],{}," ignores the ECU\ntimestamps and samples always carry the PC receive time.",[792,1281,1282,1285],{},[311,1283,1284],{},"Overload is a warning, not a failure."," When the ECU cannot keep up\nit drops samples and signals an overload; QInsight logs a warning and\nthe measurement continues with the next samples. The same applies when\nthe PC side cannot process a burst in time.",[1081,1287,1289],{"id":1288},"stim-stimulation-from-the-master","STIM — stimulation from the master",[301,1291,1292,1293,1295,1296,1299,1300,1304],{},"DAQ also has an opposite direction: ",[311,1294,674],{}," (stimulation). The master\nperiodically streams the current values of writable variables to the ECU\nas ",[311,1297,1298],{},"a stream of data packets"," — no request\u002Fresponse per write. It\nsuits smooth driving of ECU inputs, e.g. setpoints computed by a\n",[305,1301,1303],{"href":1302},"\u002Fpython-scripts\u002Fscripts-overview","Python script"," or an operator slider.",[301,1306,1307],{},"The configuration mirrors DAQ — just with the opposite direction:",[1093,1309,1312],{"className":1310,"code":1311,"language":1098,"meta":1099},[1096],"Event:       Stim_mainloop     (Period 10, Unit Milisec,\n                                Extra Params: direction=\"STIM\";daqId=\"2\")\nComm params: address=\"0x39B70\";direction=\"write\";eventRef=\"Stim_mainloop\"\n",[316,1313,1311],{"__ignoreMap":1099},[789,1315,1316,1329,1341],{},[792,1317,1139,1318,1320,1321,1324,1325,1328],{},[311,1319,970],{}," with Extra Params ",[316,1322,1323],{},"direction=\"STIM\";daqId=\"N\""," marks the\nECU event channel that consumes the stimulation. Unlike DAQ, here the\n",[311,1326,1327],{},"Period does drive the event",": it is the interval at which the\nmaster transmits the packet stream (PC timing), so the event must be\nperiodic with a positive period.",[792,1330,1331,1333,1334,1336,1337,1340],{},[311,1332,77],{}," are bound to the event via ",[316,1335,1047],{}," and must have\n",[316,1338,1339],{},"direction=\"write\"","; only scalar variables can be stimulated.",[792,1342,1343,1344,1347],{},"Every period the ",[311,1345,1346],{},"current values"," of all the channel's variables are\nsent — the last operator or script write keeps streaming into the ECU\nuntil a new write replaces it.",[301,1349,1350,1351,667,1353,1355],{},"Automatic fallback to direct writes: when the slave has no STIM\nresource, protects it with seed & key, the channel fails validation, or\na value does not fit the STIM packet limits, the affected variables fall\nback — with a warning — to plain on-change writes (",[316,1352,666],{},[316,1354,670],{},") and the session keeps running. While stimulation is active,\nwrites of the stimulated variables travel exclusively through the\nstream — no individual write commands are sent for them. DAQ, STIM, and\npolling mix freely in one protocol.",[1081,1357,1359],{"id":1358},"operator-writes","Operator writes",[301,1361,1362,1363,1366,1367,1370],{},"Written values are entered in ",[311,1364,1365],{},"engineering units"," — the raw value for\nthe ECU is computed by the inverse conversion of the presentation (see\n",[305,1368,114],{"href":1369},"\u002Fvisualization\u002Fwrite-to-device","); the\nprotocol always sends raw to the ECU. Writes are blocked not only by a\nprotected calibration but also when the slave offers no calibration\nresource at all.",[498,1372,1374],{"id":1373},"modbus-master-rtutcp","Modbus Master (RTU\u002FTCP)",[301,1376,1377],{},[331,1378,505,1379],{},[316,1380,1381],{},"ModbusMasterProtocol",[301,1383,1384,1385,1388,1389,1392,1393,1396],{},"A ",[311,1386,1387],{},"Modbus master (client)",": periodically reads coils and registers and\nwrites values on operator request. Framing is ",[316,1390,1391],{},"rtu"," (CRC16, serial line)\nor ",[316,1394,1395],{},"tcp"," (MBAP header).",[301,1398,1399,520,1401],{},[311,1400,680],{},[316,1402,1403],{},"mode=rtu;unitId=1;timeoutMs=1000;retries=2",[301,1405,686],{},[369,1407,1408,1418],{},[372,1409,1410],{},[375,1411,1412,1414,1416],{},[378,1413,532],{},[378,1415,535],{},[378,1417,538],{},[385,1419,1420,1436,1449,1460],{},[375,1421,1422,1426,1428],{},[390,1423,1424],{},[316,1425,349],{},[390,1427,709],{},[390,1429,1430,1432,1433,1435],{},[316,1431,1391],{}," (Serial Port), or ",[316,1434,1395],{}," (TCP Client)",[375,1437,1438,1443,1446],{},[390,1439,1440],{},[316,1441,1442],{},"unitId",[390,1444,1445],{},"1",[390,1447,1448],{},"slave\u002Funit address",[375,1450,1451,1455,1457],{},[390,1452,1453],{},[316,1454,748],{},[390,1456,751],{},[390,1458,1459],{},"response timeout in ms",[375,1461,1462,1467,1470],{},[390,1463,1464],{},[316,1465,1466],{},"retries",[390,1468,1469],{},"2",[390,1471,1472],{},"number of request retries",[301,1474,1475],{},"Per-variable parameters:",[369,1477,1478,1488],{},[372,1479,1480],{},[375,1481,1482,1484,1486],{},[378,1483,532],{},[378,1485,535],{},[378,1487,538],{},[385,1489,1490,1513,1526,1544,1566],{},[375,1491,1492,1497,1500],{},[390,1493,1494],{},[316,1495,1496],{},"registerType",[390,1498,1499],{},"holdingRegister",[390,1501,1502,1034,1505,1034,1508,1034,1511],{},[316,1503,1504],{},"coil",[316,1506,1507],{},"discreteInput",[316,1509,1510],{},"inputRegister",[316,1512,1499],{},[375,1514,1515,1519,1521],{},[390,1516,1517],{},[316,1518,998],{},[390,1520,709],{},[390,1522,1523,1524],{},"zero-based start address, decimal or ",[316,1525,1006],{},[375,1527,1528,1533,1536],{},[390,1529,1530],{},[316,1531,1532],{},"wordOrder",[390,1534,1535],{},"big",[390,1537,1538,1539,1034,1541],{},"register order of multi-register values: ",[316,1540,1535],{},[316,1542,1543],{},"little",[375,1545,1546,1550,1552],{},[390,1547,1548],{},[316,1549,1026],{},[390,1551,1029],{},[390,1553,1554,1034,1556,1034,1558,1560,1561,1068,1563,1565],{},[316,1555,1029],{},[316,1557,1037],{},[316,1559,1040],{},"; ",[316,1562,1507],{},[316,1564,1510],{}," are read-only",[375,1567,1568,1572,1574],{},[390,1569,1570],{},[316,1571,1047],{},[390,1573,1050],{},[390,1575,1576],{},"periodic event supplying the poll interval (mandatory for read variables)",[301,1578,1579,1580,1034,1583,1586,1587,1034,1590,1593,1594,1034,1597,1034,1600,1603,1604,1034,1606,1586,1608,1610,1611,1034,1613,1615],{},"The register count follows the variable's data type: 1 (",[316,1581,1582],{},"Byte",[316,1584,1585],{},"SByte",",\n",[316,1588,1589],{},"UShort",[316,1591,1592],{},"Short","), 2 (",[316,1595,1596],{},"UInt",[316,1598,1599],{},"Int",[316,1601,1602],{},"Float","), 4 (",[316,1605,800],{},[316,1607,797],{},[316,1609,803],{},"). The bit tables (",[316,1612,1504],{},[316,1614,1507],{},") always occupy 1 bit\nregardless of the type; any non-zero value = ON. Only numeric scalar\nvariables can be mapped (bool, string and enum cannot).",[301,1617,1618],{},"More master behaviour notes:",[789,1620,1621,1633,1649,1670,1680],{},[792,1622,1623,1625,1626,1629,1630,1632],{},[316,1624,1466],{}," is the number of retries ",[311,1627,1628],{},"on top of"," the first attempt\n(default 2 = up to 3 transmissions) and ",[316,1631,748],{}," applies to each\nattempt separately.",[792,1634,1635,1637,1638,1640,1641,1644,1645,1648],{},[316,1636,1442],{}," is decimal. ",[316,1639,998],{}," may be hex (",[316,1642,1643],{},"0x64",") but is shown in\ndecimal (",[316,1646,1647],{},"100",") after the project is saved — it is the same value.",[792,1650,1651,1653,1654,1034,1657,1586,1660,1560,1663,1665,1666,342,1668,784],{},[316,1652,1496],{}," also accepts the shortened aliases ",[316,1655,1656],{},"discrete",[316,1658,1659],{},"input",[316,1661,1662],{},"holding",[316,1664,1532],{}," accepts ",[316,1667,587],{},[316,1669,578],{},[792,1671,1672,1673,1675,1676,1679],{},"Each polled variable is read by its own separate request in the period\nof its event; ",[316,1674,1047],{}," must name an existing ",[311,1677,1678],{},"periodic"," event.",[792,1681,1682],{},"Invalid Comm params remove the variable from communication with a\nwarning in the log.",[1081,1684,1686],{"id":1685},"matrix-variables","Matrix variables",[301,1688,1689,1690,1693,1694,1214],{},"The Modbus Master also transfers\n",[305,1691,1686],{"href":1692},"\u002Fvariables\u002Fmatrix-variable"," (array\u002Fcurve\u002Fmap) — the\nwhole block as a contiguous register range starting at ",[316,1695,998],{},[789,1697,1698,1712,1715,1718],{},[792,1699,1700,1701,1703,1704,1706,1707,342,1709,1711],{},"only the register tables are allowed: ",[316,1702,1499],{}," (read and\nwrite) and ",[316,1705,1510],{}," (read-only); the bit tables\n",[316,1708,1504],{},[316,1710,1507],{}," are rejected for a matrix,",[792,1713,1714],{},"register count = matrix size in bytes \u002F 2 (rounded up); reads use a\nsingle FC03\u002FFC04 request, writes send only the registers of the\nchanged cells (FC06\u002FFC16),",[792,1716,1717],{},"size limit: the matrix is never split into multiple frames — a\nwritable matrix may span at most 123 registers (246 B), a read-only\nmatrix 125 registers (250 B); the configurator enforces a uniform\n246 B limit,",[792,1719,1720,1722,1723,1726],{},[316,1721,1532],{}," does not apply to a matrix — the byte order is driven by\nthe variable's ",[311,1724,1725],{},"Endianness"," (a register is 2 bytes, high byte\nfirst).",[498,1728,1730],{"id":1729},"modbus-slave-rtutcp","Modbus Slave (RTU\u002FTCP)",[301,1732,1733],{},[331,1734,505,1735],{},[316,1736,1737],{},"ModbusSlaveProtocol",[301,1739,1384,1740,1743],{},[311,1741,1742],{},"Modbus slave (server)",": serves variables as coils, discrete inputs,\ninput and holding registers. A remote master reads the live variable\nvalues; a write from the master (FC 05\u002F06\u002F16) sets the variable value.",[301,1745,1746,520,1748],{},[311,1747,680],{},[316,1749,1750],{},"mode=rtu;unitId=1;respondToAnyUnit=false",[301,1752,686],{},[369,1754,1755,1765],{},[372,1756,1757],{},[375,1758,1759,1761,1763],{},[378,1760,532],{},[378,1762,535],{},[378,1764,538],{},[385,1766,1767,1782,1793],{},[375,1768,1769,1773,1775],{},[390,1770,1771],{},[316,1772,349],{},[390,1774,709],{},[390,1776,1777,1432,1779,1781],{},[316,1778,1391],{},[316,1780,1395],{}," (TCP Server)",[375,1783,1784,1788,1790],{},[390,1785,1786],{},[316,1787,1442],{},[390,1789,1445],{},[390,1791,1792],{},"the slave's own address",[375,1794,1795,1800,1803],{},[390,1796,1797],{},[316,1798,1799],{},"respondToAnyUnit",[390,1801,1802],{},"tcp: true, rtu: false",[390,1804,1805],{},"respond regardless of the requested unit address",[301,1807,1808,1809,1586,1811,1034,1813,1815,1816,1818],{},"Per-variable parameters are the same as for the master (",[316,1810,1496],{},[316,1812,998],{},[316,1814,1532],{},"); ",[316,1817,1047],{}," is not needed. Slave behaviour notes:",[789,1820,1821,1835,1841,1844,1854],{},[792,1822,1823,1824,1034,1826,1828,1829,1831,1832,1834],{},"For the read-only tables (",[316,1825,1507],{},[316,1827,1510],{},") the\n",[316,1830,1026],{}," must stay ",[316,1833,1029],{}," — any other direction is an error and the\nvariable is not created.",[792,1836,1837,1838,1840],{},"The slave serves ",[311,1839,621],{}," variables only; Matrix variables are not\nmapped and a warning appears in the log.",[792,1842,1843],{},"Each variable claims a contiguous address range; overlapping addresses\nare a startup error.",[792,1845,1846,1847,1034,1849,1034,1851,1853],{},"A write from the master must cover the variable's whole range at once:\na multi-register value (",[316,1848,1602],{},[316,1850,1599],{},[316,1852,803],{},"…) cannot be written\nregister-by-register with FC06 — only with a single FC16 spanning the\nfull range; a partial write is rejected as ILLEGAL DATA ADDRESS.\nLikewise a read touching an unmapped address (a gap between variables)\nis rejected as a whole.",[792,1855,353,1856,1858,1859,1861,1862,1865,1866,1868,1869,1871,1872,342,1874,1876,1877,342,1879,1881],{},[331,1857,535],{}," of ",[316,1860,1799],{}," in the table applies when the\nparameter is ",[311,1863,1864],{},"omitted"," — the pre-filled template however contains\n",[316,1867,735],{},", so for the TCP \"respond to anyone\" behaviour set ",[316,1870,740],{},"\nyourself. Values are ",[316,1873,740],{},[316,1875,735],{}," (not ",[316,1878,1445],{},[316,1880,550],{},").",[498,1883,471],{"id":1884},"json-signal-stream",[301,1886,1887],{},[331,1888,505,1889],{},[316,1890,1891],{},"JsonSignalProtocol",[301,1893,1894,1895,1898,1899,1902],{},"Decodes newline-delimited text lines with JSON objects\n",[316,1896,1897],{},"{\"name\": \"...\", \"value\": ..., \"t\": ...}"," into variable values. Read-only.\nThe optional ",[316,1900,1901],{},"t"," field (source time in seconds) is used to reconstruct\ntimestamps.",[301,1904,1905],{},"The protocol has no settings of its own. Per-variable parameters:",[369,1907,1908,1918],{},[372,1909,1910],{},[375,1911,1912,1914,1916],{},[378,1913,532],{},[378,1915,535],{},[378,1917,538],{},[385,1919,1920],{},[375,1921,1922,1927,1930],{},[390,1923,1924],{},[316,1925,1926],{},"id",[390,1928,1929],{},"variable name",[390,1931,1932,1933,1936,1937,1034,1939,1034,1942,428],{},"signal name in the JSON ",[316,1934,1935],{},"name"," field (aliases ",[316,1938,1935],{},[316,1940,1941],{},"signal",[316,1943,1944],{},"signalName",[301,1946,1947,1948,1950,1951,1950,1953,1955,1956,1958,1959,342,1961,1964,1965,1968,1969,1971],{},"Supports numeric, string, bool, and enum variables. When several aliases\nare given at once, the precedence is ",[316,1949,1935],{}," > ",[316,1952,1941],{},[316,1954,1944],{}," >\n",[316,1957,1926],{},". Signal names are matched case-insensitively. Unparsable lines,\nmessages without ",[316,1960,1935],{},[316,1962,1963],{},"value"," and values not convertible to the\nvariable's type are dropped ",[311,1966,1967],{},"without any message"," — when a signal stays\nempty, first check the exact name match in the ",[316,1970,1935],{}," field.",[498,1973,480],{"id":1974},"simulation-signals",[301,1976,1977],{},[331,1978,505,1979],{},[316,1980,1981],{},"SimulDataProtocol",[301,1983,1984,1985,1987,1988,1990],{},"Generates simulated signals for testing without hardware — used\nexclusively with the Simulation driver. Each variable is generated exactly\nin the period of its event (",[316,1986,1047],{},"), so different variables can run\nat different rates. The signal shape is selected by the ",[316,1989,1941],{}," parameter:",[369,1992,1993,2003],{},[372,1994,1995],{},[375,1996,1997,2000],{},[378,1998,1999],{},"Signal",[378,2001,2002],{},"Shape",[385,2004,2005,2015,2025,2035,2045],{},[375,2006,2007,2012],{},[390,2008,2009],{},[316,2010,2011],{},"step",[390,2013,2014],{},"staircase sine ±750, period 15 s (the value changes once per second)",[375,2016,2017,2022],{},[390,2018,2019],{},[316,2020,2021],{},"noisystep",[390,2023,2024],{},"sine ±1000, period 7.5 s, with ±50 noise",[375,2026,2027,2032],{},[390,2028,2029],{},[316,2030,2031],{},"walk1",[390,2033,2034],{},"random walk around 0 (step ±0.5, mean-reverting)",[375,2036,2037,2042],{},[390,2038,2039],{},[316,2040,2041],{},"walk2",[390,2043,2044],{},"random walk around 10 (step ±1.0, mean-reverting)",[375,2046,2047,2052],{},[390,2048,2049],{},[316,2050,2051],{},"walk3",[390,2053,2054],{},"random walk around −5 (step ±0.3, mean-reverting)",[301,2056,2057,2058,2061,2062,2065,2066,2068,2069,2072],{},"The walks (",[316,2059,2060],{},"walk*",") advance one step with ",[311,2063,2064],{},"every generated sample"," — a\nvariable with a faster event therefore wanders faster. Each variable owns\nan independent generator instance (two variables with the same ",[316,2067,1941],{},"\nrun independently); the value is converted to the variable's type\n(integer types are rounded and clamped to the type range). Only ",[311,2070,2071],{},"numeric\nscalar"," variables are generated — string, bool, enum and Matrix are\nskipped with a warning in the log.",[301,2074,1905],{},[369,2076,2077,2087],{},[372,2078,2079],{},[375,2080,2081,2083,2085],{},[378,2082,532],{},[378,2084,535],{},[378,2086,538],{},[385,2088,2089,2101,2112,2124],{},[375,2090,2091,2095,2098],{},[390,2092,2093],{},[316,2094,1941],{},[390,2096,2097],{},"by variable type",[390,2099,2100],{},"signal shape (see the table above)",[375,2102,2103,2107,2109],{},[390,2104,2105],{},[316,2106,1047],{},[390,2108,1050],{},[390,2110,2111],{},"periodic event defining the generation rate; a variable without it is not generated",[375,2113,2114,2118,2121],{},[390,2115,2116],{},[316,2117,1026],{},[390,2119,2120],{},"Read",[390,2122,2123],{},"communication direction",[375,2125,2126,2130,2132],{},[390,2127,2128],{},[316,2129,1926],{},[390,2131,1050],{},[390,2133,2134],{},"signal identifier (informational)",[301,2136,2137,2138,2141,2142,2144,2145,2147,2148,2150,2151,2153,2154,2156,2157,2160],{},"The Comm params template pre-fills ",[316,2139,2140],{},"signal=\"step\"",". Without ",[316,2143,1941],{}," the\nshape is chosen by value type (int → ",[316,2146,2021],{},", float → ",[316,2149,2011],{},",\notherwise ",[316,2152,2031],{},"); an unknown ",[316,2155,1941],{}," value falls back to the same\ntype-based choice with a warning. ",[316,2158,2159],{},"multiplier"," from older projects is\nignored.",[498,2162,490],{"id":2163},"virtual-variables",[301,2165,2166],{},[331,2167,505,2168],{},[316,2169,2170],{},"VirtualDataProtocol",[301,2172,2173,2174,2177,2178,2182],{},"Carrier of ",[311,2175,2176],{},"virtual variables",": variables whose values do not come from\na device but are computed by\n",[305,2179,2181],{"href":2180},"\u002Fpython-scripts\u002Faccessing-variables","Python scripts"," — typically\nfilters, derived quantities and other computed signals. A variable\nassigned to this protocol behaves like any other communicated signal: it\ncan be shown in controls, logged and replayed, and it counts towards the\ncommunicated-signal limit of the Free licence. Used exclusively with the\nVirtual Variables Host driver.",[301,2184,2185,2186,424,2189,2192,2193,2196],{},"The protocol has no timer: ",[311,2187,2188],{},"a sample is born the moment a script writes\nthe variable",[316,2190,2191],{},"RawValue"," or ",[316,2194,2195],{},"EngValue","). Every write = one sample,\ntimestamped at the moment of the write — even when the script writes the\nsame value again. Writes pass through a buffer, are published in write\norder, and the script never waits for the rendering; when the script does\nnot write, no samples appear.",[301,2198,2199],{},"The protocol has no settings of its own. Variable parameters:",[369,2201,2202,2212],{},[372,2203,2204],{},[375,2205,2206,2208,2210],{},[378,2207,532],{},[378,2209,535],{},[378,2211,538],{},[385,2213,2214],{},[375,2215,2216,2220,2222],{},[390,2217,2218],{},[316,2219,1926],{},[390,2221,1929],{},[390,2223,2134],{},[301,2225,2226,2227,784],{},"An on-change trigger of another script can be attached to a virtual\nvariable to chain computations — just avoid a cycle (a script writing to\nthe very variable whose trigger runs it). A complete walk-through with an\nexponential filter is the example\n",[305,2228,280],{"href":2229},"\u002Fexamples\u002Ffilter-script",[301,2231,2232,2233,784],{},"Protocols are plugins — for a custom protocol see\n",[305,2234,212],{"href":2235},"\u002Fcustom-extensions\u002Fcustom-protocol",{"title":1099,"searchDepth":2237,"depth":2237,"links":2238},3,[2239,2241,2242,2243,2250,2253,2254,2255,2256],{"id":500,"depth":2240,"text":394},2,{"id":633,"depth":2240,"text":404},{"id":828,"depth":2240,"text":413},{"id":964,"depth":2240,"text":662,"children":2244},[2245,2246,2247,2248,2249],{"id":1083,"depth":2237,"text":1084},{"id":1104,"depth":2237,"text":1105},{"id":1230,"depth":2237,"text":778},{"id":1288,"depth":2237,"text":1289},{"id":1358,"depth":2237,"text":1359},{"id":1373,"depth":2240,"text":1374,"children":2251},[2252],{"id":1685,"depth":2237,"text":1686},{"id":1729,"depth":2240,"text":1730},{"id":1884,"depth":2240,"text":471},{"id":1974,"depth":2240,"text":480},{"id":2163,"depth":2240,"text":490},"A catalog of the shipped protocols — protocol and per-variable parameters and driver pairing.","md",{},true,{"title":263,"description":2257},"MiRq8ShmMgisMZOyV1vxJcCqrISJ_sClwyXeTpjxQVU",[2264,2265],{"title":259,"path":260,"stem":261,"navTitle":259,"children":-1},{"title":267,"path":268,"stem":269,"navTitle":267,"children":-1},1787589608767]