# NcProgramManager

Software per il trasferimento di programmi CNC da e verso controller di macchine utensili. Supporta Fanuc (FOCAS), Heidenhain (LSV2), Siemens Sinumerik (FTP), Mitsubishi (FTP), Fagor (FTP) e Mazak (FTP). Funziona completamente offline come applicazione console per Windows.

## Requisiti

- Windows (qualsiasi versione compatibile con .NET Framework 4.7.2)
- .NET Framework 4.7.2 installato
- File `license.lic` valido (rilasciato dal fornitore)

## Licenza

Copiare il file `license.lic` nella stessa cartella dell'eseguibile `NcProgramManager.exe`. Senza licenza valida il programma si chiude all'avvio.

Per ottenere una licenza contattare il fornitore fornendo l'impronta hardware della macchina. L'impronta si ottiene eseguendo il comando `fingerprint` dello strumento `LicenseGenerator.exe` sulla macchina di destinazione.

## Utilizzo

```
NcProgramManager.exe -manufacturer=<tipo> -azione=<azione> -ip=<ip> -porta=<porta> [opzioni]
```

### Parametri

| Parametro | Valori | Descrizione |
|-----------|--------|-------------|
| `-azione=` | `Scarica` / `Invia` | Azione da eseguire |
| `-manufacturer=` | `fanuc` / `heidenhain` / `siemens` / `mitsubishi` / `fagor` / `mazak` | Tipo di controller CNC (predefinito: `fanuc`) |
| `-ip=` | indirizzo IP | Indirizzo IP del controller — connessione Ethernet |
| `-porta=` | numero porta | Porta di connessione Ethernet |
| `-tipo=` | `3` / `2` | Tipo di connessione: `3` = Ethernet, `2` = HSSB (solo Fanuc, legacy) |
| `-nodo=` | numero nodo | Nodo HSSB (solo Fanuc, connessione HSSB) |
| `-username=` | nome utente | Credenziale per Heidenhain, Siemens, Mitsubishi, Fagor, Mazak |
| `-password=` | password | Credenziale per Heidenhain, Siemens, Mitsubishi, Fagor, Mazak |
| `-pathprogramma=` | percorso file | Percorso del file locale da caricare sul CNC (richiesto per `Invia`) |
| `-path=` | numero | Percorso programmi sul CNC; predefinito `1` = `//CNC_MEM/USER/PATH1/` |
| `-workzero=` | qualsiasi valore | Se presente: include dati work zero offset nell'operazione |
| `-tooloffset=` | qualsiasi valore | Se presente: include dati tool offset nell'operazione |
| `-commento=` | testo | Commento da associare al programma |
| `-compatibility` | — | Attiva modalità compatibilità (flag senza valore) |
| `-debug=` | qualsiasi valore | Mantiene il terminale aperto al termine dell'operazione |
| `-help` | — | Mostra l'elenco dei parametri e termina (flag senza valore) |

La licenza viene letta automaticamente dal file `license.lic` nella cartella dell'eseguibile — nessun parametro aggiuntivo richiesto.

## Esempi

Scarica programma da controller Fanuc:

```
NcProgramManager.exe -manufacturer=fanuc -azione=Scarica -ip=192.168.1.100 -porta=8193
```

Invia programma a controller Heidenhain:

```
NcProgramManager.exe -manufacturer=heidenhain -azione=Invia -ip=192.168.1.50 -porta=19000 -username=operator -password=secret
```

Scarica programma da Siemens Sinumerik:

```
NcProgramManager.exe -manufacturer=siemens -azione=Scarica -ip=192.168.1.200 -porta=21 -username=admin -password=secret
```

Invia programma a Fagor 8065:

```
NcProgramManager.exe -manufacturer=fagor -azione=Invia -ip=192.168.1.150 -porta=21 -username=user -password=pass -pathprogramma=C:\programmi\PROG1.nc
```

## Controller supportati

| Produttore | Protocollo | Porta predefinita | Note |
|------------|------------|-------------------|------|
| Fanuc | FOCAS (DLL 32-bit) | 8193 | Richiede `fwlib32.dll` nella stessa cartella |
| Heidenhain | LSV2 (TCP) | 19000 | Testato su TNC series |
| Siemens | FTP | 21 | Directory programmi: `/_N_MPF_DIR/` — richiede opzione FTP abilitata sul Sinumerik |
| Mitsubishi | FTP | 21 | Directory programmi: `/PRG/` |
| Fagor | FTP | 21 | Directory programmi: `/Users/Prg/`. Modelli supportati: 8060, 8065, 8070 (FTP nativo); 8055 (richiede opzione Ethernet) |
| Mazak | FTP | 21 | G-code EIA/ISO (testo). Famiglia Smooth (G/X/Ai/EZ). Porta 21 o 23 (alcune unità Ai usano IIS su 23). Directory programmi site-specific (da configurare). **Richiede opzione EIA/ISO attiva sul controllo** |

### Controller Fagor

#### Modelli supportati

| Modello | Supporto | Note |
|---------|----------|------|
| 8055 | Solo con opzione Ethernet | Richiede attivazione esplicita del server FTP via parametri macchina |
| 8060 | Sì | FTP nativo (sistema Windows-based) |
| 8065 | Sì | FTP nativo (sistema Windows-based) |
| 8070 | Sì | FTP nativo (sistema Windows embedded) |

#### Modelli NON supportati

| Modello | Motivo |
|---------|--------|
| 8055 base (senza Ethernet) | Solo trasferimento RS232; il programma non implementa il protocollo seriale |
| 8025 / 8030 / 8040 / 8050 | Legacy, esclusivamente RS232 |

#### Regole nome programma

- Lunghezza massima 24 caratteri
- Caratteri ammessi: lettere (A-Z, a-z), cifre (0-9), spazi
- Carattere `ñ` NON ammesso
- Estensione predefinita: `.nc` (configurabile via codice)

#### Funzioni non supportate via FTP

- `ReadActiveProgramAsync` — Fagor espone lo stato di esecuzione via DNC/OPC-UA, non via FTP
- `SelectMainProgramAsync` — selezione del programma principale richiede DNC, non disponibile via FTP
- Lettura runtime stato macchina (`ReadAsync` ritorna sempre `Unknown`)

#### Variabili d'ambiente per test integration con macchina reale

| Variabile | Valore | Default |
|-----------|--------|---------|
| `FAGOR_TEST_IP` | indirizzo IP macchina Fagor | (test skippato se assente) |
| `FAGOR_USER` | username FTP | `user` |
| `FAGOR_PASS` | password FTP | `pass` |

### Controller Mazak

#### Formato supportato

- Solo EIA/ISO (G-code in formato testo). Famiglia Smooth.
- **NON supportato: Mazatrol (formato binario proprietario CMT)** — nessuna API pubblica lato PC. Escluso.
- **Richiede opzione EIA/ISO attiva** sul controllo (opzione a pagamento, non sempre presente). Se assente l'invio è impossibile.
- Nessun equivalente FOCAS/SDK: il trasferimento avviene solo tramite file via FTP. MTConnect serve solo per il monitoraggio, non per l'invio.

#### Porta FTP

- Porta 21 di default; alcune unità Smooth Ai richiedono la 23 (la porta 21 va in conflitto con il backup Mazatrol all'avvio e allo spegnimento). Override tramite `-porta`.

#### Directory programmi e credenziali

- Directory programmi e credenziali sono site-specific, da configurare (nessun default sicuro).

#### Regole nome programma

- **Nomi file preservati così come sono** — nessun vincolo di rinomina `O####` (vincolo presente solo su Fanuc, non su Mazak).

#### Programmi multi-file

- Per i programmi composti da più file (main + sottoprogrammi): inviare ogni file separatamente. Il main richiama i sottoprogrammi a runtime via `M98 P<numero>`; il controllo li collega per nome/numero, quindi non vanno uniti in un unico file.

#### Funzioni non supportate via FTP

- `ReadActiveProgramAsync` — stato runtime non disponibile via FTP
- `SelectMainProgramAsync` — selezione del programma principale non disponibile via FTP
- `ReadAsync` — lettura runtime stato macchina non disponibile via FTP

Coerente con il comportamento di Fagor e Siemens.

#### Variabili d'ambiente per test integration con macchina reale

| Variabile | Valore | Default |
|-----------|--------|---------|
| `MAZAK_TEST_IP` | indirizzo IP macchina Mazak | (test skippato se assente) |
| `MAZAK_USER` | username FTP | `user` |
| `MAZAK_PASS` | password FTP | `pass` |

## Validazione del programma NC

Prima di inviare un programma al controller, NcProgramManager esegue una validazione automatica del codice NC. Gli errori bloccano il trasferimento. Gli avvisi vengono registrati ma non interrompono l'operazione.

## Codici di errore

| Codice | Descrizione | Causa probabile | Soluzione |
|--------|-------------|-----------------|-----------|
| `-100` | Licenza errata o non valida | File `license.lic` assente, corrotto o generato per un'altra macchina | Verificare che `license.lic` sia nella stessa cartella dell'eseguibile e generato per questa macchina |
| `-101` | Impossibile parsare i parametri di input | Sintassi errata negli argomenti passati (spazi attorno a `=`, caratteri speciali) | Controllare che ogni parametro sia nella forma `-nome=valore` senza spazi. Eseguire con `-help` per la sintassi corretta |
| `-102` | Parametri obbligatori mancanti | Mancano `-azione=`, `-ip=` o `-porta=` | Aggiungere i parametri mancanti alla riga di comando |
| `-103` | Codice connessione non valido | Valore `-tipo=` non è `3` (Ethernet) né `2` (HSSB) | Usare `-tipo=3` per connessione Ethernet (più comune) o `-tipo=2` per HSSB |
| `-201` | Impossibile connettersi alla macchina | IP o porta errati, macchina spenta, firewall, protocollo non abilitato sul CNC | Verificare IP e porta, pingare la macchina, controllare che il protocollo (FOCAS/LSV2/FTP) sia abilitato sul controller |
| `-202` | Eccezione durante l'esecuzione dell'azione | Errore di rete durante l'operazione, timeout, CNC in stato non valido | Controllare la connessione di rete; riprovare. Se persiste, verificare lo stato del CNC |
| `-203` | L'azione richiesta è fallita | Il CNC ha rifiutato l'operazione (protezione scrittura, programma in esecuzione, permessi insufficienti) | Verificare che il CNC non stia eseguendo programmi e che non sia attiva la protezione scrittura |
| `-204` | Errore durante invio o ricezione del programma CN | File locale non trovato (per `Invia`), memoria CNC piena, nome programma non valido | Per `Invia`: verificare il percorso in `-pathprogramma=`. Per `Scarica`: verificare che il programma esista sul CNC |
| `-205` | Errore durante invio o ricezione dei dati tool offset | Tool offset non supportato dal produttore selezionato, o errore di comunicazione | Verificare che il produttore supporti tool offset. Rimuovere `-tooloffset=` se non necessario |
| `-206` | Errore durante invio o ricezione dei dati work zero offset | Work zero offset non supportato dal produttore selezionato, o errore di comunicazione | Verificare che il produttore supporti work zero offset. Rimuovere `-workzero=` se non necessario |
| `-207` | Il CN deve essere in modalità MDI o EDIT | Il CNC è in modalità AUTO o MEM durante un tentativo di invio programma | Portare il CNC in modalità MDI o EDIT dal pannello operatore, poi ripetere l'operazione |
| `-208` | Programma CN caricato ma non impostato come principale | Il programma è stato trasferito ma il CNC non lo ha selezionato come programma attivo | Selezionare manualmente il programma come programma principale dal pannello del CNC |
