Introduzione
RTIndustry IIoT permette l'integrazione bidirezionale con sistemi ERP e MES tramite un database condiviso (MySQL o SQL Server). L'integrazione avviene attraverso due tabelle di scambio:
writewo— L'ERP scrive gli ordini di lavoro, il Kanban li legge e li processareadwo— Il Kanban scrive i dati di produzione, l'ERP li legge per monitoraggio
Questo approccio non richiede API REST, webhook o integrazioni custom. L'unico requisito è che entrambi i sistemi (ERP e RTIndustry) abbiano accesso allo stesso database.
receipt, wovalue, spare1-5) disponibili anche su MySQL.
Architettura di Integrazione
writeworeadworeadwoCome funziona
- L'ERP inserisce un ordine di lavoro nella tabella
writewoconreaded = 0 - Il Kanban esegue un polling ogni 5 secondi sulla tabella
writewo, cercando record conreaded != 1 - Trovato un nuovo record, il Kanban lo processa: crea la card sulla board, aggiorna
readed = 1(accettato) oppurereaded = 3(errore) - Durante la lavorazione, il Kanban scrive/aggiorna i dati di produzione nella tabella
readwo - L'ERP può leggere
readwoin qualsiasi momento per ottenere lo stato della produzione
Prerequisiti
- Database: MySQL 8.x oppure SQL Server 2017+ accessibile da entrambi i sistemi
- Rete: Connessione di rete tra il server database, il PC con RTIndustry e il server ERP
- RTIndustry: Versione 4.x installata e configurata (vedi Documentazione → Installazione)
- Permessi DB: L'utente database deve avere permessi SELECT, INSERT, UPDATE sulla tabella
writewoe almeno SELECT sureadwo
hmi viene creato automaticamente dall'installer RTIndustry. Le tabelle writewo e readwo
sono già presenti nel database dopo l'installazione. Non è necessario crearle manualmente.
Connessione al Database
Parametri di default
Host: 127.0.0.1
Port: 3306
Database: hmi
User: root
Password: RTIndustry@2025!
Host: 127.0.0.1
Port: 1433
Database: hmi
User: sa
Password: (configurata in fase di installazione SQL Server)
I parametri di connessione sono configurabili dalla dashboard RTIndustry
(https://localhost:1880/ui → sezione Configuration).
hmi) utilizzato da RTIndustry.
Non è necessario un database separato per l'integrazione.
Tabella writewo (ERP → Kanban)
La tabella writewo è il canale di comunicazione dall'ERP verso il Kanban.
L'ERP inserisce un record per ogni ordine di lavoro da inviare alla macchina.
Il Kanban legge la tabella ogni 5 secondi e processa i nuovi ordini.
Schema dei campi
Campi identificativi
| Campo | Tipo | Obbl. | Default | Descrizione |
|---|---|---|---|---|
id |
INT |
Auto | AUTO_INCREMENT | ID univoco del record, generato automaticamente |
readed |
INT |
Si | 0 |
Stato della comunicazione (vedi macchina a stati) |
column |
VARCHAR(50) |
Si | 'requested' |
Colonna Kanban di destinazione: requested, in_progress, done |
kanbanwoid |
VARCHAR(255) |
Si | 'external' |
ID dell'ordine di lavoro nel sistema ERP |
rejectedreason |
VARCHAR(255) |
No | NULL |
Motivo di rifiuto (compilato dal Kanban in caso di errore) |
Campi installazione
| Campo | Tipo | Default | Descrizione |
|---|---|---|---|
serial |
VARCHAR(50) |
NULL |
Numero seriale del dispositivo / macchina di destinazione |
client |
VARCHAR(50) |
NULL |
Nome del cliente / stabilimento |
plant |
VARCHAR(50) |
NULL |
Nome dello stabilimento |
workstation |
VARCHAR(50) |
NULL |
Identificativo della postazione di lavoro |
Campi ordine di lavoro
| Campo | Tipo | Default | Descrizione |
|---|---|---|---|
programname |
VARCHAR(255) |
NULL |
Nome del programma CNC |
programnumber |
VARCHAR(255) |
NULL |
Numero del programma CNC |
description |
VARCHAR(255) |
NULL |
Descrizione dell'ordine di lavoro |
itemcode |
VARCHAR(50) |
NULL |
Codice articolo / codice parte |
quantity |
INT |
NULL |
Quantità da produrre |
customername |
VARCHAR(100) |
NULL |
Nome del cliente (committente) |
customercode |
VARCHAR(100) |
NULL |
Codice cliente |
operatorname |
VARCHAR(100) |
NULL |
Nome dell'operatore assegnato |
notes |
VARCHAR(100) |
NULL |
Note aggiuntive |
duedate |
DATE |
NULL |
Data di consegna prevista |
targettime |
INT |
NULL |
Tempo target per pezzo (secondi) |
targetenergy |
VARCHAR(45) |
NULL |
Consumo energetico target (Wh) |
Campi aggiuntivi
| Campo | Tipo | Default | Descrizione |
|---|---|---|---|
receipt |
VARCHAR(50) |
NULL |
Numero bolla / ricevuta |
wovalue |
DECIMAL(10,2) |
NULL |
Valore economico dell'ordine |
spare1 |
VARCHAR(50) |
NULL |
Campo libero 1 (uso personalizzato) |
spare2 |
VARCHAR(50) |
NULL |
Campo libero 2 |
spare3 |
VARCHAR(50) |
NULL |
Campo libero 3 |
spare4 |
VARCHAR(50) |
NULL |
Campo libero 4 |
spare5 |
VARCHAR(50) |
NULL |
Campo libero 5 |
spare1-spare5 sono a disposizione per dati personalizzati
specifici dell'integrazione. Possono contenere qualsiasi informazione aggiuntiva che il vostro
ERP necessita di passare al Kanban (es. codice lotto, numero commessa, reparto, ecc.).
Inserimento di un ordine di lavoro
Per creare un nuovo ordine di lavoro nella board Kanban, l'ERP inserisce un record nella tabella writewo:
INSERT INTO hmi.writewo (
readed,
`column`,
kanbanwoid,
serial,
client,
plant,
workstation,
programname,
programnumber,
description,
itemcode,
quantity,
customername,
customercode,
operatorname,
notes,
duedate,
targettime,
targetenergy
) VALUES (
0, -- readed: 0 = nuovo, da leggere
'requested', -- colonna Kanban di destinazione
'ERP-ORD-2026-001', -- ID ordine nel vostro ERP
'SN-001', -- seriale macchina (opzionale)
'ACME SpA', -- cliente
'Stabilimento Nord', -- stabilimento
'Centro Lavoro 1', -- postazione
'Flangia_V2', -- nome programma CNC
'P1234', -- numero programma
'Flangia acciaio D.120mm', -- descrizione
'FLG-120-SS', -- codice articolo
100, -- quantità da produrre
'Meccanica Rossi', -- nome committente
'CLI-042', -- codice committente
'Mario Bianchi', -- operatore assegnato
'Urgente - priorita altà, -- note
'2026-02-28', -- data consegna
45, -- tempo target per pezzo (secondi)
'150' -- energia target (Wh)
);
INSERT INTO hmi.dbo.writewo (
readed,
[column],
kanbanwoid,
serial,
client,
plant,
workstation,
programname,
programnumber,
[description],
itemcode,
quantity,
customername,
customercode,
operatorname,
notes,
duedate,
targettime,
targetenergy,
receipt,
wovalue
) VALUES (
0, -- readed: 0 = nuovo, da leggere
'requested', -- colonna Kanban di destinazione
'ERP-ORD-2026-001', -- ID ordine nel vostro ERP
'SN-001', -- seriale macchina (opzionale)
'ACME SpA', -- cliente
'Stabilimento Nord', -- stabilimento
'Centro Lavoro 1', -- postazione
'Flangia_V2', -- nome programma CNC
'P1234', -- numero programma
'Flangia acciaio D.120mm', -- descrizione
'FLG-120-SS', -- codice articolo
100, -- quantità da produrre
'Meccanica Rossi', -- nome committente
'CLI-042', -- codice committente
'Mario Bianchi', -- operatore assegnato
'Urgente - priorita altà, -- note
'2026-02-28', -- data consegna
45, -- tempo target per pezzo (secondi)
'150', -- energia target (Wh)
'DDT-2026-0042', -- bolla/ricevuta
1250.00 -- valore ordine
);
column è una parola riservata SQL. In MySQL va racchiusa tra backtick (`column`),
in SQL Server tra parentesi quadre ([column]).
Modifica di un ordine già inviato
Per modificare un ordine di lavoro già accettato dal Kanban (es. cambiare la quantità), l'ERP aggiorna
il record e imposta readed = 2 per segnalare la modifica:
UPDATE hmi.writewo
SET
readed = 2, -- 2 = modificato, da ri-leggere
quantity = 150, -- nuova quantità
notes = 'Quantita aggiornata da 100 a 150'
WHERE kanbanwoid = 'ERP-ORD-2026-001';
UPDATE hmi.dbo.writewo
SET
readed = 2, -- 2 = modificato, da ri-leggere
quantity = 150, -- nuova quantità
notes = 'Quantita aggiornata da 100 a 150'
WHERE kanbanwoid = 'ERP-ORD-2026-001';
Il Kanban rileva il record con readed = 2 al prossimo ciclo di polling (entro 5 secondi),
aggiorna la card sulla board e reimposta readed = 1.
Tabella readwo (Kanban → ERP)
La tabella readwo contiene i dati di produzione scritti dal Kanban.
L'ERP può leggere questa tabella per monitorare lo stato degli ordini, i tempi macchina,
le quantità prodotte, gli scarti e tutte le metriche OEE.
Il Kanban aggiorna la tabella in tempo reale ogni volta che cambia lo stato di un ordine di lavoro
(cambio fase, conteggio pezzi, completamento).
Usa INSERT ... ON DUPLICATE KEY UPDATE (MySQL) oppure MERGE (SQL Server),
quindi ogni ordine ha sempre una sola riga aggiornata.
Schema dei campi
Identificazione ordine
| Campo | Tipo | Descrizione |
|---|---|---|
id | VARCHAR(255) | ID univoco dell'ordine di lavoro (PK) |
order_number | VARCHAR(255) | Numero ordine (dal campo kanbanwoid di writewo) |
number | INT | Numero sequenziale ordine |
column | VARCHAR(45) | Colonna Kanban attuale: requested, in_progress, done |
status | VARCHAR(255) | Stato attuale (REQUESTED, RUNNING, PAUSED, STOPPED, COMPLETED, ecc.) |
Informazioni ordine
| Campo | Tipo | Descrizione |
|---|---|---|
description | VARCHAR(255) | Descrizione ordine |
item_code | VARCHAR(255) | Codice articolo |
customer_name | VARCHAR(255) | Nome cliente |
customer_code | VARCHAR(255) | Codice cliente |
program_name | VARCHAR(45) | Nome programma CNC |
program_number | VARCHAR(255) | Numero programma CNC |
operator_name | VARCHAR(255) | Nome operatore |
notes | VARCHAR(255) | Note |
Installazione
| Campo | Tipo | Descrizione |
|---|---|---|
client | VARCHAR(45) | Nome cliente / stabilimento |
plant | VARCHAR(45) | Stabilimento |
ward | VARCHAR(45) | Reparto |
workstation | VARCHAR(45) | Postazione di lavoro |
machine | VARCHAR(255) | Identificativo macchina |
Quantità e date
| Campo | Tipo | Descrizione |
|---|---|---|
qty_requested | INT | Quantità richiesta |
qty_done | INT | Quantità prodotta (pezzi buoni) |
qty_scrap | INT | Quantità scartata |
machine_qty | INT | Contatore pezzi macchina |
target_time | INT | Tempo target per pezzo (secondi) |
target_energy | INT | Energia target (Wh) |
in_time | TINYINT | Flag: 1 = in orario, 0 = in ritardo |
due_date | TIMESTAMP | Data di consegna |
start_date | TIMESTAMP | Data/ora inizio lavorazione |
end_date | TIMESTAMP | Data/ora fine lavorazione |
creation_date | TIMESTAMP | Data/ora creazione record (automatica) |
duration | VARCHAR(255) | Durata formattata |
Tempi macchina (MWT — Machine Working Times)
Tutti i tempi sono espressi in secondi.
| Campo | Tipo | Descrizione |
|---|---|---|
mwt_total | INT | Tempo totale ordine |
mwt_running | INT | Tempo in RUNNING (produzione attiva) |
mwt_paused | INT | Tempo in PAUSED |
mwt_stopped | INT | Tempo in STOPPED |
mwt_downtime | INT | Tempo in FAULT (guasto) |
mwt_alarm | INT | Tempo in allarme |
mwt_maintenance | INT | Tempo in MAINTENANCE |
mwt_cleaning | INT | Tempo in CLEANING |
mwt_reworked | INT | Tempo in REWORK |
mwt_setup | INT | Tempo in SET-UP |
production_time | INT | Tempo effettivo di produzione |
Metriche di performance
| Campo | Tipo | Descrizione |
|---|---|---|
cycletime_avg | INT | Tempo ciclo medio (secondi) |
best_cycle | INT | Miglior tempo ciclo (secondi) |
worst_cycle | INT | Peggior tempo ciclo (secondi) |
deviation | INT | Deviazione dal tempo target (secondi) |
deviation_avg | INT | Deviazione media dal target (secondi) |
deviation_v_trend | INT | Deviazione vs. trend |
trend_avg_deviation | INT | Trend deviazione media |
number_of_workorder | INT | Numero sequenziale ordine |
Query di lettura per l'ERP
Tutti gli ordini in corso
-- Ordini attualmente in lavorazione
SELECT id, description, item_code, status,
qty_requested, qty_done, qty_scrap,
operator_name, start_date
FROM hmi.readwo
WHERE `column` = 'in_progress'
ORDER BY start_date DESC;
-- Ordini attualmente in lavorazione
SELECT id, [description], item_code, [status],
qty_requested, qty_done, qty_scrap,
operator_name, start_date
FROM hmi.dbo.readwo
WHERE [column] = 'in_progress'
ORDER BY start_date DESC;
Ordini completati con metriche OEE
-- Ordini completati con calcolo OEE
SELECT
id,
description,
qty_requested,
qty_done,
qty_scrap,
-- Disponibilità (%)
ROUND(mwt_running * 100.0 /
NULLIF(mwt_running + mwt_paused + mwt_maintenance + mwt_downtime, 0), 1
) AS availability_pct,
-- Performance (%)
ROUND((target_time * qty_done) * 100.0 /
NULLIF(production_time, 0), 1
) AS performance_pct,
-- Qualità (%)
ROUND(qty_done * 100.0 /
NULLIF(qty_done + qty_scrap, 0), 1
) AS quality_pct,
cycletime_avg,
best_cycle,
worst_cycle,
start_date,
end_date
FROM hmi.readwo
WHERE `column` = 'done'
ORDER BY end_date DESC
LIMIT 50;
-- Ordini completati con calcolo OEE
SELECT TOP 50
id,
[description],
qty_requested,
qty_done,
qty_scrap,
-- Disponibilità (%)
ROUND(CAST(mwt_running AS FLOAT) * 100.0 /
NULLIF(mwt_running + mwt_paused + mwt_maintenance + mwt_downtime, 0), 1
) AS availability_pct,
-- Performance (%)
ROUND(CAST(target_time * qty_done AS FLOAT) * 100.0 /
NULLIF(production_time, 0), 1
) AS performance_pct,
-- Qualità (%)
ROUND(CAST(qty_done AS FLOAT) * 100.0 /
NULLIF(qty_done + qty_scrap, 0), 1
) AS quality_pct,
cycletime_avg,
best_cycle,
worst_cycle,
start_date,
end_date
FROM hmi.dbo.readwo
WHERE [column] = 'done'
ORDER BY end_date DESC;
Monitorare lo stato di un singolo ordine
-- Stato completo di un ordine specifico
SELECT *
FROM hmi.readwo
WHERE id = 'WO-2026-02-10-001';
-- Stato completo di un ordine specifico
SELECT *
FROM hmi.dbo.readwo
WHERE id = 'WO-2026-02-10-001';
Campo readed — Macchina a stati
Il campo readed nella tabella writewo implementa una macchina a stati
che coordina la comunicazione bidirezionale tra ERP e Kanban:
| Valore | Stato | Chi lo imposta | Significato |
|---|---|---|---|
0 |
NUOVO | ERP | L'ERP ha inserito un nuovo ordine di lavoro. Il Kanban deve leggerlo. |
1 |
ACCETTATO | Kanban | Il Kanban ha letto e accettato l'ordine. La card è stata creata sulla board. |
2 |
MODIFICATO | ERP | L'ERP ha modificato un ordine già accettato. Il Kanban deve ri-leggerlo e aggiornare la card. |
3 |
ERRORE WORKSTATION | Kanban | Il Kanban ha rifiutato l'ordine (es. superato il limite di 15 WO per colonna). Il motivo è nel campo rejectedreason. |
4 |
ERRORE KANBAN | Kanban | Errore interno del Kanban durante la lettura del record. |
SELECT * FROM writewo WHERE readed != 1 ogni 5 secondi.
Questo significa che processa tutti i record negli stati 0, 2, 3 e 4.
Solo i record con readed = 1 vengono ignorati (già accettati).
Flusso Operativo Completo
ERP inserisce l'ordine
L'ERP esegue una INSERT nella tabella writewo con readed = 0
e column = 'requested'. L'ordine contiene tutti i dati necessari alla produzione.
Kanban legge l'ordine (entro 5 secondi)
Il polling del Kanban trova il record con readed = 0.
Verifica che la colonna di destinazione non abbia superato il limite di 15 card.
Kanban crea la card sulla board
Se tutto è valido, il Kanban crea una nuova card nella colonna requested
e aggiorna readed = 1, rejectedreason = NULL.
Se c'è' un errore, imposta readed = 3 con il motivo in rejectedreason.
Operatore lavora l'ordine
L'operatore trascina la card nella colonna In Progress, cambia gli stati (Play, Pause, Stop, ecc.), conta i pezzi buoni e scarti, e infine sposta la card in Done.
Kanban aggiorna readwo
Ad ogni cambio di stato, il Kanban aggiorna la tabella readwo con i dati
di produzione aggiornati: quantità, tempi macchina, stato, metriche di performance.
ERP legge i risultati
L'ERP può interrogare readwo in qualsiasi momento per ottenere
lo stato aggiornato dell'ordine, le quantità prodotte, i tempi e le metriche OEE.
Gestione Errori
Errore 3 — Workstation Error
Il Kanban imposta readed = 3 quando non può accettare l'ordine.
La causa più comune è il superamento del limite di 15 card per colonna.
Il campo rejectedreason contiene il messaggio di errore, ad esempio:
Colonna 'requested' piena (15/15). Ritento alle 14:35:22
Come gestire l'errore nell'ERP
-- Controllare ordini rifiutati
SELECT id, kanbanwoid, rejectedreason
FROM hmi.writewo
WHERE readed = 3;
-- Il Kanban ritenta automaticamente.
-- Se volete forzare il ri-processamento:
UPDATE hmi.writewo
SET readed = 0
WHERE readed = 3 AND kanbanwoid = 'ERP-ORD-2026-001';
-- Controllare ordini rifiutati
SELECT id, kanbanwoid, rejectedreason
FROM hmi.dbo.writewo
WHERE readed = 3;
-- Il Kanban ritenta automaticamente.
-- Se volete forzare il ri-processamento:
UPDATE hmi.dbo.writewo
SET readed = 0
WHERE readed = 3 AND kanbanwoid = 'ERP-ORD-2026-001';
readed = 3, include nel messaggio un timestamp di ritentativo.
Al prossimo ciclo di polling, il Kanban riprova automaticamente a processare il record.
Se la colonna si è liberata, l'ordine viene accettato e readed torna a 1.
Errore 4 — Kanban Error
readed = 4 indica un errore interno del Kanban (es. errore di parsing dei dati).
In questo caso, verificate che i campi inseriti siano nel formato corretto e non contengano caratteri speciali non supportati.
Trasmissione File
Oltre ai dati via database, RTIndustry supporta lo scambio di file tramite cartelle condivise (locali o di rete via SMB/CIFS).
Cartelle di scambio
| Cartella | Default | Direzione | Contenuto |
|---|---|---|---|
WOAttachments |
{installDir}\WOAttachments |
ERP → Kanban | Allegati ordine (PDF, disegni, istruzioni) |
WOPartPrograms |
{installDir}\WOPartPrograms |
ERP ↔ Kanban | Programmi pezzo CNC (NC, ISO, H) |
WOMachineDocuments |
{installDir}\WOMachineDocuments |
Bidirezionale | Documentazione macchina |
Struttura delle cartelle
I file vengono organizzati in sottocartelle con il nome dell'ID ordine di lavoro:
WOAttachments/
+-- WO-2026-02-10-001/
| +-- disegno_flangia.pdf
| +-- istruzioni_lavorazione.pdf
+-- WO-2026-02-10-002/
+-- specifica_tecnica.pdf
WOPartPrograms/
+-- WO-2026-02-10-001/
| +-- Flangia_V2.H
| +-- Flangia_V2.NC
+-- ERP-ORD-2026-001/
+-- P1234.NC
L'ERP può copiare i file nelle sottocartelle prima o dopo l'inserimento dell'ordine in writewo.
Il Kanban mostrerà automaticamente gli allegati disponibili nell'interfaccia HMI.
/ui → Configuration).
Possono essere impostati su percorsi di rete (es. \\server\share\WOAttachments)
per consentire l'accesso condiviso tra ERP e RTIndustry.
Il servizio Windows deve avere i permessi di lettura/scrittura sulla share.
Part Programs e invio a macchina
I programmi pezzo nella cartella WOPartPrograms possono essere inviati direttamente
alla macchina CNC dall'interfaccia HMI dell'operatore:
- Heidenhain: Invio via protocollo DNC con selezione percorso origine/destinazione
- FANUC: Invio via FOCAS (upload part program)
- Altre macchine: Upload manuale dalla pagina Part Programs del Kanban
Per associare automaticamente un programma a un ordine, impostare il campo programname
nella tabella writewo con il nome del file (senza estensione).
Il Kanban cerchera' il file nella sottocartella corrispondente.
Limiti e Best Practice
Limiti del sistema
| Parametro | Valore | Note |
|---|---|---|
| Max card per colonna | 15 | Se superato, readed = 3 con messaggio di errore |
| Frequenza polling | 5 secondi | Il Kanban legge writewo ogni 5 secondi |
| Colonne Kanban | 3 | requested, in_progress, done |
Max lunghezza kanbanwoid |
255 caratteri | Identificativo univoco dell'ordine ERP |
Best practice
-
Usare sempre
column = 'requested'per i nuovi ordini. Inserire direttamente inin_progressodoneè supportato ma sconsigliato per il flusso standard. -
Non inserire più di 15 ordini alla volta nella stessa colonna.
Se necessario, inserirli a gruppi e attendere che il Kanban li accetti (
readed = 1) prima di inserirne altri. -
Monitorare il campo
readeddopo ogni inserimento. Un valore di1conferma l'accettazione. Un valore di3o4indica un errore. -
Usare
kanbanwoidcome chiave di correlazione tra il vostro ERP e RTIndustry. Questo campo viene riportato anche inreadwo.order_numberper la tracciabilità. -
Non cancellare i record da
writewodopo l'inserimento. Il Kanban gestisce il ciclo di vita tramite il camporeaded. -
Non modificare
readwodall'ERP. La tabellareadwoè gestita esclusivamente dal Kanban. L'ERP deve solo leggerla. -
Compilare il campo
workstationse avete più installazioni RTIndustry sullo stesso database. Questo permette al Kanban di filtrare gli ordini per la propria postazione.
Esempi Completi
Esempio 1: Flusso completo ERP → produzione → consuntivo
-- 1. ERP: Inserire un ordine di lavoro
INSERT INTO hmi.writewo (
readed, `column`, kanbanwoid,
programname, programnumber, description,
itemcode, quantity, customername, customercode,
targettime, targetenergy, duedate, operatorname
) VALUES (
0, 'requested', 'SAP-PRD-2026-00142',
'Albero_Motore_V3', 'P5678', 'Albero motore acciaio C45',
'ALB-MOT-C45', 200, 'Automotive Parts Srl', 'CLI-108',
32, '120', '2026-03-15', 'Giuseppe Verdi'
);
-- 2. ERP: Verificare accettazione (dopo qualche secondo)
SELECT id, readed, rejectedreason
FROM hmi.writewo
WHERE kanbanwoid = 'SAP-PRD-2026-00142';
-- Risultato atteso: readed = 1, rejectedreason = NULL
-- 3. ERP: Monitorare la produzione in corso
SELECT
id, status, `column`,
qty_requested, qty_done, qty_scrap,
mwt_running, mwt_paused, mwt_stopped,
cycletime_avg, deviation
FROM hmi.readwo
WHERE order_number = 'SAP-PRD-2026-00142';
-- 4. ERP: Leggere il consuntivo finale (quando column = 'done')
SELECT
qty_done,
qty_scrap,
ROUND(mwt_running / 60.0, 1) AS minuti_running,
ROUND(mwt_paused / 60.0, 1) AS minuti_pausa,
ROUND(mwt_stopped / 60.0, 1) AS minuti_stop,
ROUND(mwt_setup / 60.0, 1) AS minuti_setup,
cycletime_avg AS tempo_ciclo_medio_sec,
best_cycle AS miglior_ciclo_sec,
worst_cycle AS peggior_ciclo_sec,
start_date,
end_date,
TIMESTAMPDIFF(MINUTE, start_date, end_date) AS durata_totale_minuti
FROM hmi.readwo
WHERE order_number = 'SAP-PRD-2026-00142'
AND `column` = 'done';
-- 1. ERP: Inserire un ordine di lavoro
INSERT INTO hmi.dbo.writewo (
readed, [column], kanbanwoid,
programname, programnumber, [description],
itemcode, quantity, customername, customercode,
targettime, targetenergy, duedate, operatorname
) VALUES (
0, 'requested', 'SAP-PRD-2026-00142',
'Albero_Motore_V3', 'P5678', 'Albero motore acciaio C45',
'ALB-MOT-C45', 200, 'Automotive Parts Srl', 'CLI-108',
32, '120', '2026-03-15', 'Giuseppe Verdi'
);
-- 2. ERP: Verificare accettazione (dopo qualche secondo)
SELECT id, readed, rejectedreason
FROM hmi.dbo.writewo
WHERE kanbanwoid = 'SAP-PRD-2026-00142';
-- Risultato atteso: readed = 1, rejectedreason = NULL
-- 3. ERP: Monitorare la produzione in corso
SELECT
id, [status], [column],
qty_requested, qty_done, qty_scrap,
mwt_running, mwt_paused, mwt_stopped,
cycletime_avg, deviation
FROM hmi.dbo.readwo
WHERE order_number = 'SAP-PRD-2026-00142';
-- 4. ERP: Leggere il consuntivo finale (quando column = 'done')
SELECT
qty_done,
qty_scrap,
ROUND(CAST(mwt_running AS FLOAT) / 60.0, 1) AS minuti_running,
ROUND(CAST(mwt_paused AS FLOAT) / 60.0, 1) AS minuti_pausa,
ROUND(CAST(mwt_stopped AS FLOAT) / 60.0, 1) AS minuti_stop,
ROUND(CAST(mwt_setup AS FLOAT) / 60.0, 1) AS minuti_setup,
cycletime_avg AS tempo_ciclo_medio_sec,
best_cycle AS miglior_ciclo_sec,
worst_cycle AS peggior_ciclo_sec,
start_date,
end_date,
DATEDIFF(MINUTE, start_date, end_date) AS durata_totale_minuti
FROM hmi.dbo.readwo
WHERE order_number = 'SAP-PRD-2026-00142'
AND [column] = 'done';
Esempio 2: Polling ERP per ordini rifiutati
-- Polling periodico per controllare errori
SELECT
id,
kanbanwoid,
readed,
rejectedreason,
CASE readed
WHEN 0 THEN 'In attesa di lettura'
WHEN 1 THEN 'Accettato'
WHEN 2 THEN 'Modifica in attesa'
WHEN 3 THEN 'Rifiutato (workstation)'
WHEN 4 THEN 'Errore Kanban'
END AS stato_descrizione
FROM hmi.writewo
WHERE readed != 1
ORDER BY id DESC;
-- Polling periodico per controllare errori
SELECT
id,
kanbanwoid,
readed,
rejectedreason,
CASE readed
WHEN 0 THEN 'In attesa di lettura'
WHEN 1 THEN 'Accettato'
WHEN 2 THEN 'Modifica in attesa'
WHEN 3 THEN 'Rifiutato (workstation)'
WHEN 4 THEN 'Errore Kanban'
END AS stato_descrizione
FROM hmi.dbo.writewo
WHERE readed != 1
ORDER BY id DESC;
Troubleshooting
L'ordine non appare sulla board Kanban
- Verificare che
readed = 0nel record inserito - Verificare che il Kanban sia in esecuzione (servizio NodeRED attivo)
- Controllare se
readedè diventato3(rifiutato) — leggererejectedreason - Verificare che la colonna di destinazione non abbia superato le 15 card
- Attendere almeno 5 secondi (frequenza di polling)
Errore "colonna piena"
- Spostare o completare alcuni ordini esistenti prima di inserirne di nuovi
- Il limite è di 15 card per colonna (per ogni colonna separatamente)
- Il Kanban ritenta automaticamente, quindi l'ordine verrà accettato quando si libera spazio
I dati in readwo non si aggiornano
- Verificare che la connessione al database sia attiva dalla dashboard (
/ui→ Configuration) - Verificare che l'ordine sia effettivamente in lavorazione sulla board
readwoviene aggiornato ad ogni cambio di stato dell'ordine, non in polling
Caratteri speciali nei campi
- Evitare apici singoli (
') non escapati nei valori dei campi - Usare query parametrizzate (prepared statements) nel codice ERP
- Il charset del database è
utf8mb4— supporta caratteri Unicode
Connessione al database rifiutata
- Verificare che il server MySQL/SQL Server sia in esecuzione
- Verificare host, porta e credenziali
- Per connessioni remote, verificare che il firewall permetta la porta (3306 MySQL / 1433 SQL Server)
- Per MySQL, verificare che l'utente abbia i permessi per connessioni remote (
GRANT ... TO 'user'@'%')