docs(test): add Mitsubishi field-test kit (scripts + criticità checklist)
Windows batch harness + extensive IT README for on-site Mitsubishi CNC testing. Covers connect/invia/scarica/validator/offset/param scenarios. Documents C1-C8 criticità found in code review: - path mapping mismatch (download /PRG/<int> vs upload relative <path>/<name>) - Standardize leading \n may trip validator first-line gate - hardcoded /PRG/ ProgramDirectory, no CLI override - Int16 -path limit, ASCII-only FTP, plaintext credentials Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
d4a3e7c4f0
commit
3fd3047584
17 changed files with 710 additions and 0 deletions
152
field-test/CHECKLIST_CRITICITA.md
Normal file
152
field-test/CHECKLIST_CRITICITA.md
Normal file
|
|
@ -0,0 +1,152 @@
|
||||||
|
# Checklist criticità — Mitsubishi field test
|
||||||
|
|
||||||
|
Punti deboli individuati **leggendo il codice** (non ancora verificati su HW reale).
|
||||||
|
Sono le aree dove è più probabile trovare problemi sul controllo del cliente.
|
||||||
|
Compila Esito/Note in campo.
|
||||||
|
|
||||||
|
Data test: __________ Controllo (modello): __________ IP: __________
|
||||||
|
|
||||||
|
Legenda gravità: 🔴 bloccante · 🟠 funzionale · 🟡 robustezza · ⚪ sicurezza/info
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## C1 🔴 — Download indirizzabile solo come `/PRG/<intero>`
|
||||||
|
|
||||||
|
`Program.Scarica` chiama `ReadProgramAsync(pathCNC.ToString())`; `pathCNC` è
|
||||||
|
`Int16` (`-path`). `ResolvePath` (nome=null) costruisce `/PRG/` + `<intero>`.
|
||||||
|
|
||||||
|
**Conseguenza:** non puoi scaricare programmi con nome non numerico (`O1234`,
|
||||||
|
lettere) né numeri > 32767. Se sul CNC i programmi si chiamano `O####`, **nessuno
|
||||||
|
è scaricabile da CLI**.
|
||||||
|
|
||||||
|
- File: `Program.cs:106`, `MitsubishiMachine.cs:203-206`, `ArgParser.cs:69-71`
|
||||||
|
- **Verifica:** dalla ricognizione FTP (§4 README), com'è il nome reale? Prova
|
||||||
|
`t02_scarica.bat` con `PROGNUM` = un numero esistente.
|
||||||
|
- Esito: ☐ OK ☐ KO — Note: ____________________
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## C2 🔴 — Upload va in path **relativo** `<path>/<nome>`, non `/PRG/`
|
||||||
|
|
||||||
|
`Program.Invia` chiama `WriteProgramAsync(pathCNC.ToString(), prog)`. In
|
||||||
|
`ResolvePath` con nome valorizzato, `folder` = `"1"` (default) diventa la
|
||||||
|
directory → path FTP `1/O0001`, **relativo** alla home FTP, non `/PRG/O0001`.
|
||||||
|
|
||||||
|
Il download (C1) invece legge da `/PRG/`. **Upload e download usano cartelle
|
||||||
|
diverse** → il roundtrip da CLI non torna.
|
||||||
|
|
||||||
|
- File: `Program.cs:206`, `MitsubishiMachine.cs:208-210`
|
||||||
|
- **Verifica:** dopo `t01_invia_valido.bat`, controlla via FTP **dove** è finito
|
||||||
|
il file (`dir /`, `dir /PRG/`, `dir /1/`). Esegui `t07_roundtrip.bat`.
|
||||||
|
- Esito: ☐ va in /PRG/ ☐ va in `<path>/` ☐ upload fallito — Dove: __________
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## C3 ⚪ — Nessun flag per la cartella programmi
|
||||||
|
|
||||||
|
`-path` è un intero; non c'è modo di passare un path FTP completo per l'upload
|
||||||
|
(ResolvePath usa `folder` come directory). La directory `/PRG/` è solo il default
|
||||||
|
di config, **non** raggiungibile in upload via CLI.
|
||||||
|
|
||||||
|
- **Verifica:** legata a C2/C6. Annota se serve patch per accettare path testuale.
|
||||||
|
- Esito/Note: ____________________
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## C4 🟠 — `\n` iniziale inserito da Standardize → possibile blocco validatore
|
||||||
|
|
||||||
|
`FanucProgram.Standardize` (`FanucProgram.cs:147-153`) inserisce un `\n`
|
||||||
|
all'inizio del programma se non presente. Il validatore controlla che
|
||||||
|
`lines[0]` (prima riga) sia `O####`: con il `\n` iniziale la prima riga diventa
|
||||||
|
**vuota** → errore "First line must be O####" → upload bloccato **-204**.
|
||||||
|
|
||||||
|
**Conseguenza:** anche un file NC corretto (`O0001_valid.nc`) potrebbe essere
|
||||||
|
**rifiutato** dal validatore quando passa per il flusso CLI Invia.
|
||||||
|
|
||||||
|
- File: `FanucProgram.cs:147-153`, `NcProgramValidator.cs:39-46`
|
||||||
|
- **Verifica:** `t01_invia_valido.bat` → esce 0 o -204? Guarda nel log il
|
||||||
|
messaggio del validatore. Questo è il test **più importante**.
|
||||||
|
- Esito: ☐ upload OK ☐ -204 first line — Messaggio: ____________________
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## C5 🟠 — File scaricato in formato wrapper, non NC grezzo
|
||||||
|
|
||||||
|
`Scarica` salva `programma.ToString()` →
|
||||||
|
```
|
||||||
|
program:{
|
||||||
|
<contenuto>
|
||||||
|
}
|
||||||
|
tooloffsetdata:{
|
||||||
|
}
|
||||||
|
workzerooffset:{
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Il file su disco **non** è NC puro: ha l'involucro `program:{...}` e blocchi
|
||||||
|
offset vuoti. Va bene per re-import nello stesso tool, ma non è apribile
|
||||||
|
direttamente come programma macchina.
|
||||||
|
|
||||||
|
- File: `Program.cs:158`, `FanucProgram.cs:185-190`
|
||||||
|
- **Verifica:** apri `results\downloaded.txt` dopo `t02`. Formato atteso wrapper.
|
||||||
|
- Esito/Note: ____________________
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## C6 🔴 — `ProgramDirectory` hardcoded `/PRG/`
|
||||||
|
|
||||||
|
`MitsubishiConnectionConfig.ProgramDirectory = "/PRG/"`, nessun override CLI.
|
||||||
|
Il Connect fa `LIST /PRG/`: se il controllo del cliente usa una cartella diversa
|
||||||
|
(o root diversa), **Connect fallisce -201** anche con IP/credenziali corretti, e
|
||||||
|
comunque non si può leggere/scrivere altrove.
|
||||||
|
|
||||||
|
- File: `MitsubishiConnectionConfig.cs:13`, `MitsubishiFtpClient.cs:23`, `MitsubishiMachine.cs:47`
|
||||||
|
- **Verifica:** dalla ricognizione FTP, la cartella reale è `/PRG/`? Se no →
|
||||||
|
bloccante, serve patch per rendere la dir configurabile.
|
||||||
|
- Esito: ☐ /PRG/ esiste ☐ dir diversa: __________
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## C7 🟡 — `-azione` mancante → NullReferenceException
|
||||||
|
|
||||||
|
`ArgParser.cs:22-23`: se `-azione=` assente, `Find` ritorna null e `.Substring(8)`
|
||||||
|
solleva NRE. Gestita nel try di `Main` → esce **-101** (non -102). Comportamento
|
||||||
|
accettabile ma il messaggio è generico.
|
||||||
|
|
||||||
|
- File: `ArgParser.cs:22-23`, `Program.cs:18-29`
|
||||||
|
- **Verifica:** `t06_parametri_mancanti.bat` caso (a) → -101.
|
||||||
|
- Esito: ☐ -101 come atteso — Note: ____________________
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## C8 ⚪ — FTP in chiaro (credenziali sniffabili)
|
||||||
|
|
||||||
|
`MitsubishiFtpClient.cs:58-68`: `ftp://` con `NetworkCredential`, nessun TLS.
|
||||||
|
Trasferimento ASCII (`UseBinary=false`). Credenziali e programmi in chiaro sulla
|
||||||
|
rete. Inoltre l'encoding ASCII corrompe caratteri non-ASCII (commenti accentati).
|
||||||
|
|
||||||
|
- File: `MitsubishiFtpClient.cs:42-48, 58-68`
|
||||||
|
- **Verifica:** confermare col cliente che la rete officina è isolata/affidabile.
|
||||||
|
Provare un commento con carattere accentato (`-commento=PROVAÀ`) e vedere se
|
||||||
|
arriva corrotto.
|
||||||
|
- Esito/Note: ____________________
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Riepilogo esiti
|
||||||
|
|
||||||
|
| ID | Gravità | Tema | Esito |
|
||||||
|
|----|---------|------|-------|
|
||||||
|
| C1 | 🔴 | download solo `/PRG/<intero>` | |
|
||||||
|
| C2 | 🔴 | upload path relativo | |
|
||||||
|
| C3 | ⚪ | no flag cartella | |
|
||||||
|
| C4 | 🟠 | `\n` → blocco validatore | |
|
||||||
|
| C5 | 🟠 | file scaricato wrapper | |
|
||||||
|
| C6 | 🔴 | `/PRG/` hardcoded | |
|
||||||
|
| C7 | 🟡 | NRE su `-azione` | |
|
||||||
|
| C8 | ⚪ | FTP chiaro / ASCII | |
|
||||||
|
|
||||||
|
**Note generali / altri problemi riscontrati:**
|
||||||
|
|
||||||
|
____________________________________________________________
|
||||||
|
|
||||||
|
____________________________________________________________
|
||||||
234
field-test/README_TESTING_MITSUBISHI.md
Normal file
234
field-test/README_TESTING_MITSUBISHI.md
Normal file
|
|
@ -0,0 +1,234 @@
|
||||||
|
# Field Test — Mitsubishi CNC — nc_program_manager
|
||||||
|
|
||||||
|
Guida operativa per il test in campo del trasferimento programmi NC verso/da
|
||||||
|
un controllo **Mitsubishi** (serie M, FTP). Pensata per essere eseguita sul
|
||||||
|
portatile in officina dal cliente.
|
||||||
|
|
||||||
|
> Comunicazione Mitsubishi = **FTP in chiaro** (porta 21). Niente FOCAS, niente
|
||||||
|
> LSV2. Solo upload/download file. Stato macchina, allarmi, offset utensile e
|
||||||
|
> origini **non** sono supportati via FTP (vedi §7).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 0. Indice
|
||||||
|
|
||||||
|
1. Cosa fa il software
|
||||||
|
2. Prerequisiti
|
||||||
|
3. Build dell'eseguibile
|
||||||
|
4. Ricognizione FTP **(da fare PRIMA dei test)**
|
||||||
|
5. Parametri CLI
|
||||||
|
6. Scenari di test (T01–T07)
|
||||||
|
7. Cosa Mitsubishi NON supporta
|
||||||
|
8. Codici di uscita
|
||||||
|
9. Log
|
||||||
|
10. Criticità note da verificare → vedi `CHECKLIST_CRITICITA.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Cosa fa il software
|
||||||
|
|
||||||
|
Console app .NET Framework 4.7.2 (Windows). Due azioni:
|
||||||
|
|
||||||
|
- **Invia** — carica un file NC locale sul CNC.
|
||||||
|
- **Scarica** — scarica un programma dal CNC su file locale.
|
||||||
|
|
||||||
|
Per Mitsubishi il transport è FTP: `ftp://<ip>:<porta>/PRG/<programma>`.
|
||||||
|
La cartella programmi è **fissa a `/PRG/`** (hardcoded, vedi criticità C6).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Prerequisiti
|
||||||
|
|
||||||
|
- Windows con .NET Framework 4.7.2.
|
||||||
|
- Rete: il portatile deve raggiungere l'IP del CNC sulla porta FTP (default 21).
|
||||||
|
- Verifica rapida: `ping <ip>` e `ftp <ip>`.
|
||||||
|
- Server FTP **attivo sul controllo** Mitsubishi e cartella `/PRG/` presente.
|
||||||
|
- Credenziali FTP del controllo (o accesso anonimo).
|
||||||
|
- Un **numero programma di test concordato col cliente**, non in uso.
|
||||||
|
- Per la build:
|
||||||
|
- **Debug** (consigliata per i test): nessuna licenza richiesta.
|
||||||
|
- **Release**: richiede `license.lic` valido accanto all'exe (fingerprint macchina).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Build dell'eseguibile
|
||||||
|
|
||||||
|
Da *Developer Command Prompt for VS 2017+* (msbuild + nuget nel PATH):
|
||||||
|
|
||||||
|
```bat
|
||||||
|
cd field-test
|
||||||
|
build.bat
|
||||||
|
```
|
||||||
|
|
||||||
|
Produce `bin\Debug\NcProgramManager.exe`. In Debug il check licenza è saltato
|
||||||
|
(`#if !DEBUG`) — comodo in campo. In alternativa apri la solution in Visual
|
||||||
|
Studio e compila in Debug.
|
||||||
|
|
||||||
|
> Se devi testare anche il flusso licenza, compila in **Release** e copia un
|
||||||
|
> `license.lic` valido nella cartella `bin\Release`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Ricognizione FTP — DA FARE PRIMA
|
||||||
|
|
||||||
|
**Passaggio critico.** Il CLI può indirizzare in download solo `/PRG/<intero>`
|
||||||
|
(vedi C1). Prima di tutto, connettiti manualmente e annota i nomi reali:
|
||||||
|
|
||||||
|
```bat
|
||||||
|
ftp <ip>
|
||||||
|
user <utente>
|
||||||
|
pass <password>
|
||||||
|
dir /PRG/
|
||||||
|
quit
|
||||||
|
```
|
||||||
|
|
||||||
|
Annota:
|
||||||
|
|
||||||
|
- La cartella programmi è davvero `/PRG/`? Se no → C6 bloccante.
|
||||||
|
- I programmi hanno nomi **numerici** (`1`, `100`, `1234`) o con prefisso
|
||||||
|
**`O`** / lettere (`O1234`, `PEZZO1`)?
|
||||||
|
- Solo numerici e ≤ 32767 sono scaricabili da CLI (C1).
|
||||||
|
- Permessi di scrittura per l'utente FTP usato (per i test di Invia).
|
||||||
|
|
||||||
|
Riporta gli esiti in `CHECKLIST_CRITICITA.md`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Parametri CLI
|
||||||
|
|
||||||
|
```
|
||||||
|
NcProgramManager.exe -manufacturer=mitsubishi -azione=<Invia|Scarica> -ip=<ip> [opzioni]
|
||||||
|
```
|
||||||
|
|
||||||
|
| Parametro | Obblig. | Default | Note Mitsubishi |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `-manufacturer=mitsubishi` | sì | `fanuc` | se omesso/errato → usa Fanuc! |
|
||||||
|
| `-azione=Invia` \| `-azione=Scarica` | sì | — | case-insensitive |
|
||||||
|
| `-ip=<ip>` | sì | — | richiesto per non-Fanuc |
|
||||||
|
| `-pathprogramma=<file>` | sì | — | **richiesto anche per Scarica** (file destinazione) |
|
||||||
|
| `-porta=<n>` | no | `21` | porta FTP |
|
||||||
|
| `-username=<u>` | no | vuoto | utente FTP |
|
||||||
|
| `-password=<p>` | no | vuoto | password FTP |
|
||||||
|
| `-path=<intero>` | no | `1` | identifica il programma su CNC. **Solo interi (Int16, max 32767)** |
|
||||||
|
| `-commento=<txt>` | no | — | solo Invia; sostituisce/aggiunge commento `(...)` |
|
||||||
|
| `-debug` | no | off | tiene aperto il terminale a fine esecuzione (**NON usare negli script**, blocca su ReadLine) |
|
||||||
|
| `-help` | no | — | stampa la guida ed esce |
|
||||||
|
| `-compatibility` | no | off | **nessun effetto su Mitsubishi** (parsato ma ignorato dal factory) |
|
||||||
|
| `-tooloffset` / `-workzero` | no | off | **non supportati** → errore (§7) |
|
||||||
|
|
||||||
|
Esempio invio:
|
||||||
|
|
||||||
|
```bat
|
||||||
|
NcProgramManager.exe -manufacturer=mitsubishi -azione=Invia -ip=192.168.1.3 -porta=21 -username=user -password=pass -path=1 -pathprogramma=C:\test\O0001_valid.nc
|
||||||
|
```
|
||||||
|
|
||||||
|
Esempio scarico:
|
||||||
|
|
||||||
|
```bat
|
||||||
|
NcProgramManager.exe -manufacturer=mitsubishi -azione=Scarica -ip=192.168.1.3 -porta=21 -username=user -password=pass -path=1 -pathprogramma=C:\test\out.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Scenari di test
|
||||||
|
|
||||||
|
Modifica **`config.bat`** (IP, porta, credenziali, `PROGNUM`) una volta sola,
|
||||||
|
poi lancia gli script. Output in `field-test\results\`.
|
||||||
|
|
||||||
|
Sequenza completa:
|
||||||
|
|
||||||
|
```bat
|
||||||
|
cd field-test
|
||||||
|
run_all.bat
|
||||||
|
```
|
||||||
|
|
||||||
|
oppure singoli:
|
||||||
|
|
||||||
|
| Script | Scopo | Esito atteso |
|
||||||
|
|---|---|---|
|
||||||
|
| `t06_parametri_mancanti.bat` | parsing args (offline) | -101 / -102 / help=0 |
|
||||||
|
| `t04_errori_connessione.bat` | IP/porta/cred errati | -201 |
|
||||||
|
| `t02_scarica.bat` | download `/PRG/<PROGNUM>` | 0 se il file esiste |
|
||||||
|
| `t01_invia_valido.bat` | upload programma valido | 0 (osserva dove finisce, C2/C4) |
|
||||||
|
| `t03_validatore.bat` | gating pre-invio | 4 blocchi, 1 ok |
|
||||||
|
| `t05_offset_non_supportati.bat` | tool/workzero | -205 / -206 |
|
||||||
|
| `t07_roundtrip.bat` | invia + riscarica | osserva mismatch path C1/C2 |
|
||||||
|
|
||||||
|
> **Attenzione:** `t01`/`t07` **scrivono** sul CNC. Usa un `PROGNUM` di test
|
||||||
|
> concordato. Tieni un backup dei programmi del cliente prima di scrivere.
|
||||||
|
|
||||||
|
### Dettaglio T03 — validatore (regole Fanuc/Mitsubishi)
|
||||||
|
|
||||||
|
Il validatore blocca l'upload (severità Error) se:
|
||||||
|
|
||||||
|
- nome programma ≠ `O####` (esatti 4 cifre);
|
||||||
|
- prima riga ≠ `O####`;
|
||||||
|
- presenza di lettere **minuscole**;
|
||||||
|
- blocco > **80 caratteri**;
|
||||||
|
- caratteri vietati `;` `[` `]`;
|
||||||
|
- parentesi annidate; commento `(...)` > 32 caratteri.
|
||||||
|
|
||||||
|
`#` genera solo **Warning** (macro), upload prosegue.
|
||||||
|
|
||||||
|
File di prova in `samples\`:
|
||||||
|
|
||||||
|
| File | Atteso |
|
||||||
|
|---|---|
|
||||||
|
| `O0001_valid.nc` | 0 — ma verifica C4 (vedi sotto) |
|
||||||
|
| `O0002_lowercase.nc` | -204, "Lowercase letters not allowed" |
|
||||||
|
| `O0003_brackets.nc` | -204, "Forbidden char '['" |
|
||||||
|
| `O0004_longblock.nc` | -204, "Block length 82 exceeds 80" |
|
||||||
|
| `no_header.nc` | -202 (eccezione: nessun `O####` per GetProgramTitle) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Cosa Mitsubishi NON supporta (via FTP)
|
||||||
|
|
||||||
|
| Funzione | Comportamento |
|
||||||
|
|---|---|
|
||||||
|
| Stato macchina / allarmi (`ReadAsync`) | ritorna tutto `Unknown` |
|
||||||
|
| Programma attivo (`ReadActiveProgram`) | "Not supported via FTP" |
|
||||||
|
| Selezione programma main (`SelectMainProgram`) | "Not supported via FTP" |
|
||||||
|
| Tool offset (`-tooloffset`) | exit **-205** |
|
||||||
|
| Work zero offset (`-workzero`) | exit **-206** |
|
||||||
|
|
||||||
|
Solo **Fanuc** (FOCAS) espone offset/stato. Mitsubishi = solo file transfer.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Codici di uscita
|
||||||
|
|
||||||
|
| Codice | Significato |
|
||||||
|
|---|---|
|
||||||
|
| `0` | OK |
|
||||||
|
| `-100` | licenza errata/assente (solo build Release) |
|
||||||
|
| `-101` | parsing parametri fallito (es. manca `-azione`) |
|
||||||
|
| `-102` | parametri obbligatori mancanti (`-ip`, `-pathprogramma`) |
|
||||||
|
| `-103` | azione sconosciuta (≠ Invia/Scarica) |
|
||||||
|
| `-201` | macchina non connessa (FTP irraggiungibile / `/PRG/` assente / cred errate) |
|
||||||
|
| `-202` | eccezione durante l'azione |
|
||||||
|
| `-204` | errore invio/ricezione programma (incl. **blocco validatore**) |
|
||||||
|
| `-205` | tool offset non supportato |
|
||||||
|
| `-206` | work zero offset non supportato |
|
||||||
|
| `-207` / `-208` | documentati ma non applicati per Mitsubishi |
|
||||||
|
|
||||||
|
> In cmd, `%ERRORLEVEL%` mostra il valore negativo. Gli script lo registrano.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. Log
|
||||||
|
|
||||||
|
- **Console**: livello Info (ciò che vedi a schermo). Gli script lo redirigono
|
||||||
|
nei file `results\tNN_*.log`.
|
||||||
|
- **File**: `bin\Debug\logs\nc_program_manager.log` — livello **Debug**
|
||||||
|
(più dettagliato, con stack trace eccezioni). Rotazione giornaliera, 7 giorni.
|
||||||
|
|
||||||
|
Per l'analisi post-test allega entrambi.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. Criticità da verificare
|
||||||
|
|
||||||
|
Vedi **`CHECKLIST_CRITICITA.md`**: elenco puntuale (C1–C8) dei punti deboli noti
|
||||||
|
individuati nel codice, con cosa osservare in campo e come compilarne l'esito.
|
||||||
|
Sono i punti dove è più probabile trovare problemi reali sul controllo del cliente.
|
||||||
30
field-test/build.bat
Normal file
30
field-test/build.bat
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
@echo off
|
||||||
|
REM ============================================================
|
||||||
|
REM BUILD - compila in Debug (licenza NON richiesta).
|
||||||
|
REM Richiede: nuget.exe e MSBuild nel PATH (Developer Command
|
||||||
|
REM Prompt for VS 2017+). In alternativa apri la solution in VS.
|
||||||
|
REM ============================================================
|
||||||
|
setlocal
|
||||||
|
cd /d "%~dp0.."
|
||||||
|
|
||||||
|
echo [build] restore pacchetti NuGet...
|
||||||
|
nuget restore NcProgramManager.csproj -PackagesDirectory packages
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo [build] nuget restore FALLITO. Apri la solution in Visual Studio e compila.
|
||||||
|
goto :end
|
||||||
|
)
|
||||||
|
|
||||||
|
echo [build] compilazione Debug ^| AnyCPU...
|
||||||
|
msbuild NcProgramManager.csproj /p:Configuration=Debug /p:Platform=AnyCPU /v:minimal
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo [build] MSBuild FALLITO.
|
||||||
|
goto :end
|
||||||
|
)
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo [build] OK -> bin\Debug\NcProgramManager.exe
|
||||||
|
echo [build] NOTA: build Debug salta il check licenza (#if !DEBUG).
|
||||||
|
echo [build] Per testare con licenza usa Configuration=Release + license.lic.
|
||||||
|
|
||||||
|
:end
|
||||||
|
endlocal
|
||||||
29
field-test/config.bat
Normal file
29
field-test/config.bat
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
@echo off
|
||||||
|
REM ============================================================
|
||||||
|
REM CONFIG FIELD TEST MITSUBISHI - modifica questi valori
|
||||||
|
REM Compila una sola volta prima di lanciare gli altri script.
|
||||||
|
REM ============================================================
|
||||||
|
|
||||||
|
REM IP del CNC Mitsubishi (server FTP del controllo)
|
||||||
|
set IP=192.168.1.3
|
||||||
|
|
||||||
|
REM Porta FTP (default Mitsubishi = 21)
|
||||||
|
set PORT=21
|
||||||
|
|
||||||
|
REM Credenziali FTP del controllo (vuote se anonimo)
|
||||||
|
set USER=user
|
||||||
|
set PASS=pass
|
||||||
|
|
||||||
|
REM Numero programma usato nei test di Scarica/Invia.
|
||||||
|
REM ATTENZIONE: -path accetta solo INTERI (Int16, max 32767).
|
||||||
|
REM Vedi criticita C1/C2 nel README.
|
||||||
|
set PROGNUM=1
|
||||||
|
|
||||||
|
REM Percorso eseguibile (Debug = nessuna licenza richiesta)
|
||||||
|
set EXE=%~dp0..\bin\Debug\NcProgramManager.exe
|
||||||
|
|
||||||
|
REM Cartella risultati log
|
||||||
|
set RESULTS=%~dp0results
|
||||||
|
|
||||||
|
echo [config] IP=%IP% PORT=%PORT% USER=%USER% PROGNUM=%PROGNUM%
|
||||||
|
echo [config] EXE=%EXE%
|
||||||
32
field-test/run_all.bat
Normal file
32
field-test/run_all.bat
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
@echo off
|
||||||
|
REM ============================================================
|
||||||
|
REM RUN ALL - esegue T01..T07 in sequenza.
|
||||||
|
REM Prima: compila (build.bat) e modifica config.bat con IP/cred.
|
||||||
|
REM ATTENZIONE: T01/T07 SCRIVONO sul CNC. Concordare col cliente
|
||||||
|
REM un numero programma di test non in uso (config.bat PROGNUM).
|
||||||
|
REM NON usare -debug negli script (bloccherebbe su ReadLine).
|
||||||
|
REM ============================================================
|
||||||
|
setlocal
|
||||||
|
pushd "%~dp0"
|
||||||
|
|
||||||
|
call config.bat
|
||||||
|
echo.
|
||||||
|
echo ############ RICOGNIZIONE: verifica /PRG/ via FTP PRIMA dei test ############
|
||||||
|
echo Esempio: ftp %IP% (poi: dir /PRG/ )
|
||||||
|
echo Annotare i nomi reali dei programmi (numerici? con O? lettere?).
|
||||||
|
echo.
|
||||||
|
pause
|
||||||
|
|
||||||
|
call t06_parametri_mancanti.bat
|
||||||
|
call t04_errori_connessione.bat
|
||||||
|
call t02_scarica.bat
|
||||||
|
call t01_invia_valido.bat
|
||||||
|
call t03_validatore.bat
|
||||||
|
call t05_offset_non_supportati.bat
|
||||||
|
call t07_roundtrip.bat
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ############ FINE. Log in: %RESULTS% ############
|
||||||
|
echo Compilare CHECKLIST_CRITICITA.md con gli esiti.
|
||||||
|
popd
|
||||||
|
endlocal
|
||||||
5
field-test/samples/O0001_valid.nc
Normal file
5
field-test/samples/O0001_valid.nc
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
O0001(TEST HENESIS)
|
||||||
|
G0 G90 X0 Y0
|
||||||
|
G1 Z-5. F100
|
||||||
|
G0 Z50.
|
||||||
|
M30
|
||||||
3
field-test/samples/O0002_lowercase.nc
Normal file
3
field-test/samples/O0002_lowercase.nc
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
O0002(MINUSCOLE)
|
||||||
|
G0 x0 y0
|
||||||
|
M30
|
||||||
3
field-test/samples/O0003_brackets.nc
Normal file
3
field-test/samples/O0003_brackets.nc
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
O0003(PARENTESI QUADRE)
|
||||||
|
G65 P1 A[1]
|
||||||
|
M30
|
||||||
3
field-test/samples/O0004_longblock.nc
Normal file
3
field-test/samples/O0004_longblock.nc
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
O0004(BLOCCO LUNGO)
|
||||||
|
G1 X1.0 Y1.0 Z1.0 A1.0 B1.0 C1.0 X2.0 Y2.0 Z2.0 A2.0 B2.0 C2.0 X3.0 Y3.0 Z3.0 F100
|
||||||
|
M30
|
||||||
3
field-test/samples/no_header.nc
Normal file
3
field-test/samples/no_header.nc
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
(NESSUN NUMERO PROGRAMMA)
|
||||||
|
G0 X0 Y0
|
||||||
|
M30
|
||||||
23
field-test/t01_invia_valido.bat
Normal file
23
field-test/t01_invia_valido.bat
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
@echo off
|
||||||
|
REM ============================================================
|
||||||
|
REM T01 - INVIO programma valido (happy path)
|
||||||
|
REM Carica samples\O0001_valid.nc sul CNC.
|
||||||
|
REM Atteso: Errore:0. Verificare che il file compaia su CNC.
|
||||||
|
REM OSSERVARE (criticita C2/C3): in quale cartella FTP finisce
|
||||||
|
REM il file (-path=%PROGNUM% -> path relativo "%PROGNUM%/O0001"
|
||||||
|
REM invece di "/PRG/O0001"?). Verificare anche se la validazione
|
||||||
|
REM blocca per "First line must be O####" a causa del \n iniziale
|
||||||
|
REM inserito da FanucProgram.Standardize (criticita C4).
|
||||||
|
REM ============================================================
|
||||||
|
setlocal
|
||||||
|
call "%~dp0config.bat"
|
||||||
|
if not exist "%RESULTS%" mkdir "%RESULTS%"
|
||||||
|
set LOG=%RESULTS%\t01_invia_valido.log
|
||||||
|
|
||||||
|
echo === T01 INVIO VALIDO === > "%LOG%"
|
||||||
|
"%EXE%" -manufacturer=mitsubishi -azione=Invia -ip=%IP% -porta=%PORT% -username=%USER% -password=%PASS% -path=%PROGNUM% -pathprogramma=%~dp0samples\O0001_valid.nc >> "%LOG%" 2>&1
|
||||||
|
echo EXITCODE=%ERRORLEVEL% >> "%LOG%"
|
||||||
|
echo EXITCODE=%ERRORLEVEL%
|
||||||
|
echo Log: %LOG%
|
||||||
|
type "%LOG%"
|
||||||
|
endlocal
|
||||||
30
field-test/t02_scarica.bat
Normal file
30
field-test/t02_scarica.bat
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
@echo off
|
||||||
|
REM ============================================================
|
||||||
|
REM T02 - SCARICO programma dal CNC
|
||||||
|
REM Legge /PRG/%PROGNUM% e salva in results\downloaded.txt.
|
||||||
|
REM Atteso: Errore:0 se il file /PRG/%PROGNUM% esiste sul CNC.
|
||||||
|
REM CRITICITA C1: -path accetta solo interi -> legge SEMPRE
|
||||||
|
REM /PRG/<intero>. Se i programmi sul CNC hanno nomi tipo "O1234"
|
||||||
|
REM o lettere, NON sono indirizzabili da CLI. Fare prima la
|
||||||
|
REM ricognizione FTP manuale (vedi README sezione 4).
|
||||||
|
REM CRITICITA C5: il file salvato NON e' NC grezzo ma formato
|
||||||
|
REM wrapper "program:{...} tooloffsetdata:{} workzerooffset:{}".
|
||||||
|
REM ============================================================
|
||||||
|
setlocal
|
||||||
|
call "%~dp0config.bat"
|
||||||
|
if not exist "%RESULTS%" mkdir "%RESULTS%"
|
||||||
|
set LOG=%RESULTS%\t02_scarica.log
|
||||||
|
set OUT=%RESULTS%\downloaded.txt
|
||||||
|
|
||||||
|
echo === T02 SCARICO === > "%LOG%"
|
||||||
|
"%EXE%" -manufacturer=mitsubishi -azione=Scarica -ip=%IP% -porta=%PORT% -username=%USER% -password=%PASS% -path=%PROGNUM% -pathprogramma=%OUT% >> "%LOG%" 2>&1
|
||||||
|
echo EXITCODE=%ERRORLEVEL% >> "%LOG%"
|
||||||
|
echo EXITCODE=%ERRORLEVEL%
|
||||||
|
echo File scaricato: %OUT%
|
||||||
|
echo Log: %LOG%
|
||||||
|
type "%LOG%"
|
||||||
|
if exist "%OUT%" (
|
||||||
|
echo --- CONTENUTO SCARICATO ---
|
||||||
|
type "%OUT%"
|
||||||
|
)
|
||||||
|
endlocal
|
||||||
27
field-test/t03_validatore.bat
Normal file
27
field-test/t03_validatore.bat
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
@echo off
|
||||||
|
REM ============================================================
|
||||||
|
REM T03 - VALIDATORE pre-invio (gating)
|
||||||
|
REM Tenta l'invio di 4 programmi non conformi + 1 valido.
|
||||||
|
REM Attesi (regole Fanuc/Mitsubishi in NcProgramValidator):
|
||||||
|
REM O0001_valid -> Errore:0 (ma vedi criticita C4)
|
||||||
|
REM O0002_lowercase -> -204 "Lowercase letters not allowed"
|
||||||
|
REM O0003_brackets -> -204 "Forbidden char '['/']'"
|
||||||
|
REM O0004_longblock -> -204 "Block length > 80 chars"
|
||||||
|
REM no_header -> -202 (GetProgramTitle eccezione: nessun O####)
|
||||||
|
REM Verificare che il validatore BLOCCHI prima di scrivere su CNC.
|
||||||
|
REM ============================================================
|
||||||
|
setlocal enabledelayedexpansion
|
||||||
|
call "%~dp0config.bat"
|
||||||
|
if not exist "%RESULTS%" mkdir "%RESULTS%"
|
||||||
|
set LOG=%RESULTS%\t03_validatore.log
|
||||||
|
echo === T03 VALIDATORE === > "%LOG%"
|
||||||
|
|
||||||
|
for %%F in (O0001_valid O0002_lowercase O0003_brackets O0004_longblock no_header) do (
|
||||||
|
echo. >> "%LOG%"
|
||||||
|
echo ----- INVIO %%F ----- >> "%LOG%"
|
||||||
|
"%EXE%" -manufacturer=mitsubishi -azione=Invia -ip=%IP% -porta=%PORT% -username=%USER% -password=%PASS% -path=%PROGNUM% -pathprogramma=%~dp0samples\%%F.nc >> "%LOG%" 2>&1
|
||||||
|
echo EXITCODE %%F = !ERRORLEVEL! >> "%LOG%"
|
||||||
|
)
|
||||||
|
echo Log: %LOG%
|
||||||
|
type "%LOG%"
|
||||||
|
endlocal
|
||||||
36
field-test/t04_errori_connessione.bat
Normal file
36
field-test/t04_errori_connessione.bat
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
@echo off
|
||||||
|
REM ============================================================
|
||||||
|
REM T04 - ERRORI di connessione
|
||||||
|
REM Tre casi, tutti attesi -201 "Macchina non connessa":
|
||||||
|
REM a) IP inesistente
|
||||||
|
REM b) porta errata
|
||||||
|
REM c) credenziali errate
|
||||||
|
REM NOTA: il Connect fa una LIST su /PRG/. Se il controllo usa
|
||||||
|
REM una cartella programmi DIVERSA da /PRG/, anche con IP/cred
|
||||||
|
REM corretti la connessione FALLISCE (criticita C6: ProgramDirectory
|
||||||
|
REM e' hardcoded "/PRG/", nessun flag CLI per cambiarla).
|
||||||
|
REM ============================================================
|
||||||
|
setlocal
|
||||||
|
call "%~dp0config.bat"
|
||||||
|
if not exist "%RESULTS%" mkdir "%RESULTS%"
|
||||||
|
set LOG=%RESULTS%\t04_errori_connessione.log
|
||||||
|
echo === T04 ERRORI CONNESSIONE === > "%LOG%"
|
||||||
|
|
||||||
|
echo. >> "%LOG%"
|
||||||
|
echo ----- a) IP inesistente 10.255.255.1 ----- >> "%LOG%"
|
||||||
|
"%EXE%" -manufacturer=mitsubishi -azione=Scarica -ip=10.255.255.1 -porta=%PORT% -username=%USER% -password=%PASS% -path=%PROGNUM% -pathprogramma=%RESULTS%\dl_a.txt >> "%LOG%" 2>&1
|
||||||
|
echo EXITCODE_a=%ERRORLEVEL% >> "%LOG%"
|
||||||
|
|
||||||
|
echo. >> "%LOG%"
|
||||||
|
echo ----- b) porta errata 9999 ----- >> "%LOG%"
|
||||||
|
"%EXE%" -manufacturer=mitsubishi -azione=Scarica -ip=%IP% -porta=9999 -username=%USER% -password=%PASS% -path=%PROGNUM% -pathprogramma=%RESULTS%\dl_b.txt >> "%LOG%" 2>&1
|
||||||
|
echo EXITCODE_b=%ERRORLEVEL% >> "%LOG%"
|
||||||
|
|
||||||
|
echo. >> "%LOG%"
|
||||||
|
echo ----- c) credenziali errate ----- >> "%LOG%"
|
||||||
|
"%EXE%" -manufacturer=mitsubishi -azione=Scarica -ip=%IP% -porta=%PORT% -username=NOUSER -password=NOPASS -path=%PROGNUM% -pathprogramma=%RESULTS%\dl_c.txt >> "%LOG%" 2>&1
|
||||||
|
echo EXITCODE_c=%ERRORLEVEL% >> "%LOG%"
|
||||||
|
|
||||||
|
echo Log: %LOG%
|
||||||
|
type "%LOG%"
|
||||||
|
endlocal
|
||||||
27
field-test/t05_offset_non_supportati.bat
Normal file
27
field-test/t05_offset_non_supportati.bat
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
@echo off
|
||||||
|
REM ============================================================
|
||||||
|
REM T05 - Tool offset / Work zero NON supportati su Mitsubishi
|
||||||
|
REM Attesi:
|
||||||
|
REM -tooloffset -> -205 "ToolOffset non supportato per questo produttore"
|
||||||
|
REM -workzero -> -206 "WorkZeroOffset non supportato per questo produttore"
|
||||||
|
REM (supportati solo da Fanuc via FOCAS). Conferma gating corretto.
|
||||||
|
REM ============================================================
|
||||||
|
setlocal
|
||||||
|
call "%~dp0config.bat"
|
||||||
|
if not exist "%RESULTS%" mkdir "%RESULTS%"
|
||||||
|
set LOG=%RESULTS%\t05_offset.log
|
||||||
|
echo === T05 OFFSET NON SUPPORTATI === > "%LOG%"
|
||||||
|
|
||||||
|
echo. >> "%LOG%"
|
||||||
|
echo ----- Scarica con -tooloffset ----- >> "%LOG%"
|
||||||
|
"%EXE%" -manufacturer=mitsubishi -azione=Scarica -ip=%IP% -porta=%PORT% -username=%USER% -password=%PASS% -path=%PROGNUM% -pathprogramma=%RESULTS%\dl_tool.txt -tooloffset >> "%LOG%" 2>&1
|
||||||
|
echo EXITCODE_tool=%ERRORLEVEL% >> "%LOG%"
|
||||||
|
|
||||||
|
echo. >> "%LOG%"
|
||||||
|
echo ----- Scarica con -workzero ----- >> "%LOG%"
|
||||||
|
"%EXE%" -manufacturer=mitsubishi -azione=Scarica -ip=%IP% -porta=%PORT% -username=%USER% -password=%PASS% -path=%PROGNUM% -pathprogramma=%RESULTS%\dl_wz.txt -workzero >> "%LOG%" 2>&1
|
||||||
|
echo EXITCODE_wz=%ERRORLEVEL% >> "%LOG%"
|
||||||
|
|
||||||
|
echo Log: %LOG%
|
||||||
|
type "%LOG%"
|
||||||
|
endlocal
|
||||||
39
field-test/t06_parametri_mancanti.bat
Normal file
39
field-test/t06_parametri_mancanti.bat
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
@echo off
|
||||||
|
REM ============================================================
|
||||||
|
REM T06 - Parametri mancanti / parsing
|
||||||
|
REM Attesi:
|
||||||
|
REM a) manca -azione -> -101 (NRE in ArgParser, vedi criticita C7)
|
||||||
|
REM b) manca -ip -> -102 parametri mancanti
|
||||||
|
REM c) manca -pathprogramma -> -102 (richiesto ANCHE per Scarica)
|
||||||
|
REM d) -help -> 0, stampa guida
|
||||||
|
REM NON usa rete: testabili anche offline.
|
||||||
|
REM ============================================================
|
||||||
|
setlocal
|
||||||
|
call "%~dp0config.bat"
|
||||||
|
if not exist "%RESULTS%" mkdir "%RESULTS%"
|
||||||
|
set LOG=%RESULTS%\t06_parametri.log
|
||||||
|
echo === T06 PARAMETRI MANCANTI === > "%LOG%"
|
||||||
|
|
||||||
|
echo. >> "%LOG%"
|
||||||
|
echo ----- a) manca -azione ----- >> "%LOG%"
|
||||||
|
"%EXE%" -manufacturer=mitsubishi -ip=%IP% -porta=%PORT% -pathprogramma=%RESULTS%\x.txt >> "%LOG%" 2>&1
|
||||||
|
echo EXITCODE_a=%ERRORLEVEL% >> "%LOG%"
|
||||||
|
|
||||||
|
echo. >> "%LOG%"
|
||||||
|
echo ----- b) manca -ip ----- >> "%LOG%"
|
||||||
|
"%EXE%" -manufacturer=mitsubishi -azione=Scarica -porta=%PORT% -pathprogramma=%RESULTS%\x.txt >> "%LOG%" 2>&1
|
||||||
|
echo EXITCODE_b=%ERRORLEVEL% >> "%LOG%"
|
||||||
|
|
||||||
|
echo. >> "%LOG%"
|
||||||
|
echo ----- c) manca -pathprogramma ----- >> "%LOG%"
|
||||||
|
"%EXE%" -manufacturer=mitsubishi -azione=Scarica -ip=%IP% -porta=%PORT% >> "%LOG%" 2>&1
|
||||||
|
echo EXITCODE_c=%ERRORLEVEL% >> "%LOG%"
|
||||||
|
|
||||||
|
echo. >> "%LOG%"
|
||||||
|
echo ----- d) -help ----- >> "%LOG%"
|
||||||
|
"%EXE%" -help >> "%LOG%" 2>&1
|
||||||
|
echo EXITCODE_d=%ERRORLEVEL% >> "%LOG%"
|
||||||
|
|
||||||
|
echo Log: %LOG%
|
||||||
|
type "%LOG%"
|
||||||
|
endlocal
|
||||||
34
field-test/t07_roundtrip.bat
Normal file
34
field-test/t07_roundtrip.bat
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
@echo off
|
||||||
|
REM ============================================================
|
||||||
|
REM T07 - ROUND TRIP (Invia poi Scarica)
|
||||||
|
REM Carica O0001_valid.nc, poi prova a riscaricarlo.
|
||||||
|
REM ATTESO TEORICO: roundtrip OK.
|
||||||
|
REM ATTESO REALE (criticita C2 vs C1): l'INVIO scrive in path
|
||||||
|
REM relativo "%PROGNUM%/O0001" mentre lo SCARICO legge "/PRG/%PROGNUM%".
|
||||||
|
REM I due path NON coincidono -> il roundtrip via CLI probabilmente
|
||||||
|
REM FALLISCE o legge un file diverso. Documentare il comportamento
|
||||||
|
REM reale (dove finisce davvero il file, con ricognizione FTP).
|
||||||
|
REM ============================================================
|
||||||
|
setlocal
|
||||||
|
call "%~dp0config.bat"
|
||||||
|
if not exist "%RESULTS%" mkdir "%RESULTS%"
|
||||||
|
set LOG=%RESULTS%\t07_roundtrip.log
|
||||||
|
echo === T07 ROUNDTRIP === > "%LOG%"
|
||||||
|
|
||||||
|
echo. >> "%LOG%"
|
||||||
|
echo ----- 1) INVIO O0001_valid ----- >> "%LOG%"
|
||||||
|
"%EXE%" -manufacturer=mitsubishi -azione=Invia -ip=%IP% -porta=%PORT% -username=%USER% -password=%PASS% -path=%PROGNUM% -pathprogramma=%~dp0samples\O0001_valid.nc >> "%LOG%" 2>&1
|
||||||
|
echo EXITCODE_invio=%ERRORLEVEL% >> "%LOG%"
|
||||||
|
|
||||||
|
echo. >> "%LOG%"
|
||||||
|
echo ----- 2) SCARICO %PROGNUM% ----- >> "%LOG%"
|
||||||
|
"%EXE%" -manufacturer=mitsubishi -azione=Scarica -ip=%IP% -porta=%PORT% -username=%USER% -password=%PASS% -path=%PROGNUM% -pathprogramma=%RESULTS%\roundtrip_out.txt >> "%LOG%" 2>&1
|
||||||
|
echo EXITCODE_scarico=%ERRORLEVEL% >> "%LOG%"
|
||||||
|
|
||||||
|
echo Log: %LOG%
|
||||||
|
type "%LOG%"
|
||||||
|
if exist "%RESULTS%\roundtrip_out.txt" (
|
||||||
|
echo --- CONTENUTO RISCARICATO ---
|
||||||
|
type "%RESULTS%\roundtrip_out.txt"
|
||||||
|
)
|
||||||
|
endlocal
|
||||||
Loading…
Add table
Reference in a new issue