docs/site/Rockwell/Optix/DotNet/tpDiagnosticQueryInterface/index.html

560 lines
24 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="docmd is a Node.js command-line tool for generating beautiful, lightweight static documentation sites from Markdown files.">
<link rel="canonical" href="/Rockwell/Optix/DotNet/tpDiagnosticQueryInterface/">
<meta property="og:title" content="tpDiagnosticQueryInterface | docmd">
<meta property="og:description" content="docmd is a Node.js command-line tool for generating beautiful, lightweight static documentation sites from Markdown files.">
<meta property="og:url" content="/Rockwell/Optix/DotNet/tpDiagnosticQueryInterface/">
<meta property="og:site_name" content="docmd">
<meta property="og:image" content="/assets/images/docmd-preview.png">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="tpDiagnosticQueryInterface | docmd">
<meta name="twitter:description" content="docmd is a Node.js command-line tool for generating beautiful, lightweight static documentation sites from Markdown files.">
<meta name="twitter:image" content="/assets/images/docmd-preview.png">
<title>tpDiagnosticQueryInterface : docmd</title>
<link rel="shortcut icon" href="../../../assets/favicon.ico" type="image/x-icon">
<script>// Source file from the docmd project — https://github.com/mgks/docmd
/*
* Initialize the theme from localStorage
*/
(function() {
try {
const storedTheme = localStorage.getItem('docmd-theme');
if (storedTheme) {
document.documentElement.setAttribute('data-theme', storedTheme);
// Also update highlight CSS link to match the stored theme
const highlightThemeLink = document.getElementById('highlight-theme');
if (highlightThemeLink) {
const baseHref = highlightThemeLink.getAttribute('data-base-href');
if (baseHref) {
const newHref = baseHref + `docmd-highlight-${storedTheme}.css`;
highlightThemeLink.setAttribute('href', newHref);
}
}
}
} catch (e) {
console.error('Error applying theme from localStorage', e);
}
})();</script>
<link rel="stylesheet" href="../../../assets/css/docmd-main.css">
<link rel="stylesheet" id="highlight-theme" href="../../../assets/css/docmd-highlight-light.css" data-base-href="../../../assets/css/">
<link rel="stylesheet" href="../../../assets/css/docmd-theme-sky.css">
<!-- Google Analytics GA4 -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-8QVBDQ4KM1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-8QVBDQ4KM1');
</script>
</head>
<body class="sidebar-collapsible"
data-theme="light" data-default-collapsed="false"
data-copy-code-enabled="true">
<aside class="sidebar">
<div class="sidebar-header">
<a href="/" class="logo-link">
<img src="../../../assets/images/docmd-logo-light.png" alt="docmd logo" class="logo-light" >
<img src="../../../assets/images/docmd-logo-dark.png" alt="docmd logo" class="logo-dark" >
</a>
</div>
<nav class="sidebar-nav" aria-label="Main navigation">
<ul>
<li class="" >
<a href="../../../" class="" >
<svg class="lucide-icon icon-home" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8" />
<path d="M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" />
</svg>
<span class="nav-item-title">Welcome</span>
</a>
</li>
<li class="collapsible" data-nav-id="#">
<a href="#" class="" >
<svg class="lucide-icon icon-rocket" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z" />
<path d="m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z" />
<path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0" />
<path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5" />
</svg>
<span class="nav-item-title">Getting Started</span>
<svg class="lucide-icon icon-chevron-right collapse-icon" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="m9 18 6-6-6-6" />
</svg>
</a>
<ul class="submenu">
<li class="" >
<a href="https://docmd.mgks.dev" class="" target="_blank" rel="noopener">
<svg class="lucide-icon icon-scroll" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M19 17V5a2 2 0 0 0-2-2H4" />
<path d="M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3" />
</svg>
<span class="nav-item-title">Documentation</span>
<svg class="lucide-icon icon-external-link nav-external-icon" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M15 3h6v6" />
<path d="M10 14 21 3" />
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
</svg>
</a>
</li>
<li class="" >
<a href="https://docmd.mgks.dev/getting-started/installation" class="" target="_blank" rel="noopener">
<svg class="lucide-icon icon-download" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 15V3" />
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" />
<path d="m7 10 5 5 5-5" />
</svg>
<span class="nav-item-title">Installation</span>
<svg class="lucide-icon icon-external-link nav-external-icon" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M15 3h6v6" />
<path d="M10 14 21 3" />
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
</svg>
</a>
</li>
<li class="" >
<a href="https://docmd.mgks.dev/getting-started/basic-usage" class="" target="_blank" rel="noopener">
<svg class="lucide-icon icon-play" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z" />
</svg>
<span class="nav-item-title">Basic Usage</span>
<svg class="lucide-icon icon-external-link nav-external-icon" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M15 3h6v6" />
<path d="M10 14 21 3" />
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
</svg>
</a>
</li>
<li class="" >
<a href="https://docmd.mgks.dev/content" class="" target="_blank" rel="noopener">
<svg class="lucide-icon icon-layout-template" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect width="18" height="7" x="3" y="3" rx="1" />
<rect width="9" height="7" x="3" y="14" rx="1" />
<rect width="5" height="7" x="16" y="14" rx="1" />
</svg>
<span class="nav-item-title">Content</span>
<svg class="lucide-icon icon-external-link nav-external-icon" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M15 3h6v6" />
<path d="M10 14 21 3" />
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
</svg>
</a>
</li>
</ul>
</li>
<li class="" >
<a href="https://github.com/mgks/docmd" class="" target="_blank" rel="noopener">
<svg class="lucide-icon icon-github" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4" />
<path d="M9 18c-4.51 2-5-2-7-2" />
</svg>
<span class="nav-item-title">GitHub</span>
<svg class="lucide-icon icon-external-link nav-external-icon" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M15 3h6v6" />
<path d="M10 14 21 3" />
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
</svg>
</a>
</li>
<li class="" >
<a href="https://github.com/sponsors/mgks" class="" target="_blank" rel="noopener">
<svg class="lucide-icon icon-heart" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5" />
</svg>
<span class="nav-item-title">Support the Project</span>
<svg class="lucide-icon icon-external-link nav-external-icon" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M15 3h6v6" />
<path d="M10 14 21 3" />
<path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />
</svg>
</a>
</li>
</ul>
</nav>
</aside>
<div class="main-content-wrapper">
<div class="page-header">
<div class="header-left">
<button id="sidebar-toggle-button" class="sidebar-toggle-button" aria-label="Toggle Sidebar">
<svg class="lucide-icon icon-panel-left-close" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect width="18" height="18" x="3" y="3" rx="2" />
<path d="M9 3v18" />
<path d="m16 15-3-3 3-3" />
</svg>
</button>
<h1>tpDiagnosticQueryInterface</h1>
</div>
<div class="header-right">
<button id="theme-toggle-button" aria-label="Toggle theme" class="theme-toggle-button theme-toggle-header">
<svg class="lucide-icon icon-sun icon-sun" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="4" />
<path d="M12 2v2" />
<path d="M12 20v2" />
<path d="m4.93 4.93 1.41 1.41" />
<path d="m17.66 17.66 1.41 1.41" />
<path d="M2 12h2" />
<path d="M20 12h2" />
<path d="m6.34 17.66-1.41 1.41" />
<path d="m19.07 4.93-1.41 1.41" />
</svg>
<svg class="lucide-icon icon-moon icon-moon" width="1em" height="1em" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401" />
</svg>
</button>
</div>
</div>
<main class="content-area">
<div class="content-layout">
<div class="main-content">
<h1 id="tpdiagnosticqueryinterface">⚙️ tpDiagnosticQueryInterface</h1>
<p>La classe <strong>tpDiagnosticQueryInterface</strong> è una NetLogic che permette di eseguire query su un database SQLite e aggiornare variabili di output con i risultati in tempo reale.</p>
<p>È pensata per interfacciarsi con un database di diagnostica e fornire dinamicamente dati a variabili HMI, abilitando laggiornamento automatico dei valori tramite query configurabili.</p>
<hr>
<h2 id="panoramica-generale">🚦 Panoramica generale</h2>
<p>La logica si basa su:</p>
<ul>
<li>Una variabile <code>Query</code> che contiene la stringa SQL da eseguire.</li>
<li>Una variabile <code>Enabled</code> che abilita o disabilita lesecuzione della query.</li>
<li>Una lista di variabili <code>OutVariables</code> che ricevono i valori dal primo record risultato della query.</li>
<li>Un database SQLite a cui si accede tramite percorso predefinito.</li>
</ul>
<hr>
<h2 id="funzionamento-principale">🛠️ Funzionamento principale</h2>
<table>
<thead>
<tr>
<th>Elemento</th>
<th>Descrizione</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Start()</code></td>
<td>Inizializza riferimenti alle variabili, al database e si iscrive agli eventi di cambio variabile.</td>
</tr>
<tr>
<td><code>UpdateStatus()</code></td>
<td>Esegue la query SQL se abilitato, aggiorna le variabili di output con i risultati.</td>
</tr>
<tr>
<td><code>Stop()</code></td>
<td>Pulisce le liste e rimuove gli handler eventi per evitare memory leak.</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="flusso-di-lavoro">🔄 Flusso di lavoro</h2>
<ol><li>Alla partenza, recupera le variabili <code>Query</code> e <code>Enabled</code>, e il riferimento al database SQLite.</li>
<li>Si iscrive agli eventi di cambio delle variabili <code>Query</code> e <code>Enabled</code>.</li>
<li>Quando <code>Query</code> o <code>Enabled</code> cambiano, viene eseguita la query SQL se <code>Enabled</code> è true.</li>
<li>Il primo record risultato viene scritto sulle variabili di output, fino a un massimo di variabili disponibili.</li>
</ol>
<hr>
<h2 id="dettagli-importanti">💡 Dettagli importanti</h2>
<ul>
<li>Se la query SQL fallisce, viene loggato un messaggio derrore molto colorito e dettagliato (con frase in dialetto veneziano).</li>
<li>Le variabili di output sono i primi N figli delloggetto NetLogic, dove N è il numero di colonne del risultato SQL.</li>
<li>Laggiornamento supporta solo il primo record del risultato (riga zero).</li>
</ul>
<hr>
<h2 id="come-configurare-le-variabili-di-output-su-netlogic-in-factory-talk-optix">🛠️ Come configurare le variabili di output su NetLogic in Factory Talk Optix</h2>
<p>La classe si aspetta che sulloggetto NetLogic siano create variabili aggiuntive per mappare i valori restituiti dalla query SQL.</p>
<h3 id="1-creazione-delle-variabili-di-output">1. Creazione delle variabili di output</h3>
<ul>
<li><strong>Nome variabile:</strong> Devono avere nomi sequenziali nel formato <code>[0]</code>, <code>[1]</code>, <code>[2]</code>, ecc.</li>
<li><strong>Come crearle:</strong>
<ul>
<li>Apri Factory Talk Optix e seleziona loggetto NetLogic in design time.</li>
<li>Aggiungi variabili figlie di tipo <code>IUAVariable</code> o equivalente, con i nomi indicati sopra.</li>
</ul>
</li>
<li><strong>Tipo variabile:</strong> Può essere arbitrario (es. <code>String</code>, <code>Int32</code>, <code>Float</code>, ecc.) in base al tipo di dato atteso dalla colonna SQL.</li>
</ul>
<h3 id="2-gestione-delle-variabili-in-runtime">2. Gestione delle variabili in runtime</h3>
<ul>
<li>Il codice legge dinamicamente queste variabili usando la numerazione <code>[0]</code>, <code>[1]</code>, ecc., e le usa come destinazione per i valori estratti dal primo record della query.</li>
<li>Se non esistono variabili per tutte le colonne, il ciclo si interrompe al primo nome mancante.</li>
<li>È possibile aggiungere tutte le variabili necessarie in modo sequenziale, in base al numero di colonne della query.</li>
</ul>
<h3 id="3-tipo-arbitrario-e-flessibilit">3. Tipo arbitrario e flessibilità</h3>
<ul>
<li>Le variabili possono avere qualsiasi tipo supportato da Factory Talk Optix e compatibile con i tipi di dato SQL.</li>
<li>Il codice scrive valori tramite <code>RemoteWrite</code> e usa <code>UAValue</code> che gestisce diversi tipi.</li>
<li>È importante che il tipo della variabile corrisponda al tipo del dato restituito per evitare errori.</li>
</ul>
<hr>
<h3 id="esempio-di-configurazione-variabili">🔧 Esempio di configurazione variabili</h3>
<table>
<thead>
<tr>
<th>Nome variabile</th>
<th>Tipo suggerito</th>
<th>Descrizione</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>[0]</code></td>
<td><code>String</code></td>
<td>Prima colonna risultato query</td>
</tr>
<tr>
<td><code>[1]</code></td>
<td><code>Int32</code></td>
<td>Seconda colonna risultato query</td>
</tr>
<tr>
<td><code>[2]</code></td>
<td><code>Float</code></td>
<td>Terza colonna risultato query</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<hr>
<h3 id="nota-importante">⚠️ Nota importante</h3>
<ul>
<li>La classe attualmente supporta solo il primo record della query (riga zero).</li>
<li>Per gestire più righe servirebbe implementare una logica di iterazione e mapping aggiuntiva.</li>
</ul>
<hr>
<h2 id="metodi-principali">🧰 Metodi principali</h2>
<table>
<thead>
<tr>
<th>Metodo</th>
<th>Descrizione</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Start()</code></td>
<td>Setup iniziale: recupera variabili e database, iscrive eventi, prepara lista variabili output.</td>
</tr>
<tr>
<td><code>UpdateStatus()</code></td>
<td>Esegue la query e aggiorna le variabili se abilitato.</td>
</tr>
<tr>
<td><code>UpdateStatus(object, VariableChangeEventArgs)</code></td>
<td>Overload che risponde agli eventi di cambio variabile, invocando il metodo senza parametri.</td>
</tr>
<tr>
<td><code>Stop()</code></td>
<td>Pulizia delle risorse e rimozione degli eventi.</td>
</tr>
</tbody>
</table>
<hr>
<h1 id="in-depth-funzioni-di-tpdiagnosticqueryinterface">🔍 In Depth: Funzioni di tpDiagnosticQueryInterface</h1>
<hr>
<h3 id="start"><code>Start()</code></h3>
<blockquote>
<p><strong>Descrizione:</strong><br>
Metodo di inizializzazione chiamato allavvio della NetLogic.<br>
Recupera le variabili <code>Query</code> e <code>Enabled</code> e il database SQLite.<br>
Registra gli eventi di cambio variabile per aggiornare lo stato.<br>
Costruisce la lista <code>OutVariables</code> basandosi sui figli delloggetto NetLogic.</p>
</blockquote>
<blockquote>
<p><strong>Eccezioni:</strong><br>
Lancia eccezioni se le variabili o il database non vengono trovati, con messaggi personalizzati in dialetto veneziano.</p>
</blockquote>
<hr>
<h3 id="updatestatus"><code>UpdateStatus()</code></h3>
<blockquote>
<p><strong>Descrizione:</strong><br>
Controlla se la logica è abilitata leggendo la variabile <code>Enabled</code>.<br>
Se abilitata, esegue la query SQL contenuta in <code>Query</code>.<br>
Scrive il primo record dei risultati sulle variabili <code>OutVariables</code>.</p>
</blockquote>
<blockquote>
<p><strong>Error Handling:</strong><br>
In caso di errore nella query, logga un messaggio di errore molto colorito contenente dettagli tecnici.</p>
</blockquote>
<hr>
<h3 id="updatestatusobject-sender-variablechangeeventargs-e"><code>UpdateStatus(object sender, VariableChangeEventArgs e)</code></h3>
<blockquote>
<p><strong>Descrizione:</strong><br>
Handler evento che richiama semplicemente <code>UpdateStatus()</code> senza parametri per aggiornare lo stato quando <code>Query</code> o <code>Enabled</code> cambiano.</p>
</blockquote>
<hr>
<h3 id="stop"><code>Stop()</code></h3>
<blockquote>
<p><strong>Descrizione:</strong><br>
Pulizia e rimozione dei riferimenti alle variabili e agli eventi.<br>
Serve a prevenire perdite di memoria quando la NetLogic viene fermata o distrutta.</p>
</blockquote>
<hr>
</div>
<!-- DEBUG: {"headingsLength":17} -->
<!-- TOC sidebar -->
<div class="toc-sidebar">
<div class="toc-container">
<h2 class="toc-title">On This Page</h2>
<ul class="toc-list">
<li class="toc-item toc-level-2">
<a href="#panoramica-generale" class="toc-link">🚦 Panoramica generale</a>
</li>
<li class="toc-item toc-level-2">
<a href="#funzionamento-principale" class="toc-link">🛠️ Funzionamento principale</a>
</li>
<li class="toc-item toc-level-2">
<a href="#flusso-di-lavoro" class="toc-link">🔄 Flusso di lavoro</a>
</li>
<li class="toc-item toc-level-2">
<a href="#dettagli-importanti" class="toc-link">💡 Dettagli importanti</a>
</li>
<li class="toc-item toc-level-2">
<a href="#come-configurare-le-variabili-di-output-su-netlogic-in-factory-talk-optix" class="toc-link">🛠️ Come configurare le variabili di output su NetLogic in Factory Talk Optix</a>
</li>
<li class="toc-item toc-level-3">
<a href="#1-creazione-delle-variabili-di-output" class="toc-link">1. Creazione delle variabili di output</a>
</li>
<li class="toc-item toc-level-3">
<a href="#2-gestione-delle-variabili-in-runtime" class="toc-link">2. Gestione delle variabili in runtime</a>
</li>
<li class="toc-item toc-level-3">
<a href="#3-tipo-arbitrario-e-flessibilit" class="toc-link">3. Tipo arbitrario e flessibilità</a>
</li>
<li class="toc-item toc-level-3">
<a href="#esempio-di-configurazione-variabili" class="toc-link">🔧 Esempio di configurazione variabili</a>
</li>
<li class="toc-item toc-level-3">
<a href="#nota-importante" class="toc-link">⚠️ Nota importante</a>
</li>
<li class="toc-item toc-level-2">
<a href="#metodi-principali" class="toc-link">🧰 Metodi principali</a>
</li>
<li class="toc-item toc-level-3">
<a href="#start" class="toc-link">Start()</a>
</li>
<li class="toc-item toc-level-3">
<a href="#updatestatus" class="toc-link">UpdateStatus()</a>
</li>
<li class="toc-item toc-level-3">
<a href="#updatestatusobject-sender-variablechangeeventargs-e" class="toc-link">UpdateStatus(object sender, VariableChangeEventArgs e)</a>
</li>
<li class="toc-item toc-level-3">
<a href="#stop" class="toc-link">Stop()</a>
</li>
</ul>
</div>
</div>
</div>
</main>
<footer class="page-footer">
<div class="footer-content">
<div class="user-footer">
© 2025 Project.
</div>
<div class="branding-footer">
Build with <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z"></path><path d="M12 5 9.04 7.96a2.17 2.17 0 0 0 0 3.08c.82.82 2.13.85 3 .07l2.07-1.9a2.82 2.82 0 0 1 3.79 0l2.96 2.66"></path><path d="m18 15-2-2"></path><path d="m15 18-2-2"></path></svg> <a href="https://docmd.mgks.dev" target="_blank" rel="noopener">docmd.</a>
</div>
</div>
</footer>
</div>
<script src="../../../assets/js/docmd-main.js"></script>
<script src="../../../assets/js/docmd-image-lightbox.js"></script>
</body>
</html>