Merge remote-tracking branch 'origin/master'

# Conflicts:
#	config/machine_settings/st-ten-11.ini
This commit is contained in:
ST-TEN-11 2024-10-09 10:59:18 +02:00
commit 8a35e3f03b
91 changed files with 1657 additions and 6478 deletions

View File

@ -0,0 +1,3 @@
codice_ricetta,cliente,part_number,dimensione_lotto_abilitata,dimensione_lotto,verifica_connettore_abilitata,connettore,verifica_codice_a_barre_abilitata,codice_a_barre,verifica_resistenza_connettore_abilitata,scala_resistenza,r nominale,tolleranza_resistenza_pos,tolleranza_resistenza_neg,avvitatura_abilitata,viti,prova_tenuta_abilitata,tempo_pre_riempimento,pressione_pre_riempimento,tempo_riempimento,tempo_assestamento,percentuale_minima_pressione_assestamento,percentuale_massima_pressione_assestamento,tempo_di_test,pressione_di_test_delta_minimo,pressione_di_test,pressione_di_test_delta_massimo,tempo_svuotamento,pressione_svuotamento,prova_tenuta_abilitata_2,tempo_pre_riempimento_2,pressione_pre_riempimento_2,tempo_riempimento_2,tempo_assestamento_2,percentuale_minima_pressione_assestamento_2,percentuale_massima_pressione_assestamento_2,tempo_di_test_2,pressione_di_test_delta_minimo_2,pressione_di_test_2,pressione_di_test_delta_massimo_2,tempo_svuotamento_2,pressione_svuotamento_2,test_visione_abilitato,ricetta_visione,stampa_etichetta_abilitata,modello_etichetta
200116-09-1238,Multimatic,200116-09-1238,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,3000,30,0,100,,0,1000,20,20,5,5,10,30,15000,30,0,100,False,000952054.ini,x,ETA30x16.prn
200116-09-1320,Multimatic,200116-09-1320,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,10,10,5,5,10,30,3000,30,0,100,,0,1000,20,20,5,5,10,30,15000,30,0,100,False,000952054.ini,x,ETA30x16.prn
1 codice_ricetta cliente part_number dimensione_lotto_abilitata dimensione_lotto verifica_connettore_abilitata connettore verifica_codice_a_barre_abilitata codice_a_barre verifica_resistenza_connettore_abilitata scala_resistenza r nominale tolleranza_resistenza_pos tolleranza_resistenza_neg avvitatura_abilitata viti prova_tenuta_abilitata tempo_pre_riempimento pressione_pre_riempimento tempo_riempimento tempo_assestamento percentuale_minima_pressione_assestamento percentuale_massima_pressione_assestamento tempo_di_test pressione_di_test_delta_minimo pressione_di_test pressione_di_test_delta_massimo tempo_svuotamento pressione_svuotamento prova_tenuta_abilitata_2 tempo_pre_riempimento_2 pressione_pre_riempimento_2 tempo_riempimento_2 tempo_assestamento_2 percentuale_minima_pressione_assestamento_2 percentuale_massima_pressione_assestamento_2 tempo_di_test_2 pressione_di_test_delta_minimo_2 pressione_di_test_2 pressione_di_test_delta_massimo_2 tempo_svuotamento_2 pressione_svuotamento_2 test_visione_abilitato ricetta_visione stampa_etichetta_abilitata modello_etichetta
2 200116-09-1238 Multimatic 200116-09-1238 SCRx 500.0 9999999.99 10.0 5.0 x 0 1000 10 10 5 5 10 30 3000 30 0 100 0 1000 20 20 5 5 10 30 15000 30 0 100 False 000952054.ini x ETA30x16.prn
3 200116-09-1320 Multimatic 200116-09-1320 SCRx 500.0 9999999.99 10.0 5.0 x 0 1000 10 10 5 5 10 30 3000 30 0 100 0 1000 20 20 5 5 10 30 15000 30 0 100 False 000952054.ini x ETA30x16.prn

View File

@ -0,0 +1,10 @@
codice_ricetta,cliente,part_number,dimensione_lotto_abilitata,dimensione_lotto,verifica_connettore_abilitata,connettore,verifica_codice_a_barre_abilitata,codice_a_barre,verifica_resistenza_connettore_abilitata,scala_resistenza,r nominale,tolleranza_resistenza_pos,tolleranza_resistenza_neg,avvitatura_abilitata,viti,prova_tenuta_abilitata,tempo_pre_riempimento,pressione_pre_riempimento,tempo_riempimento,tempo_assestamento,percentuale_minima_pressione_assestamento,percentuale_massima_pressione_assestamento,tempo_di_test,pressione_di_test_delta_minimo,pressione_di_test,pressione_di_test_delta_massimo,tempo_svuotamento,pressione_svuotamento,prova_tenuta_abilitata_2,tempo_pre_riempimento_2,pressione_pre_riempimento_2,tempo_riempimento_2,tempo_assestamento_2,percentuale_minima_pressione_assestamento_2,percentuale_massima_pressione_assestamento_2,tempo_di_test_2,pressione_di_test_delta_minimo_2,pressione_di_test_2,pressione_di_test_delta_massimo_2,tempo_svuotamento_2,pressione_svuotamento_2,test_visione_abilitato,ricetta_visione,stampa_etichetta_abilitata,modello_etichetta
000746453 REV.5,FERRARI,000746453 REV.5,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,10,30,5,5,20,25,10000,5,1,100,,0,1000,20,20,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,ferrari_stten8.prn
5803112815,IVECO,5803112815,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,5,10,5,5,10,30,5000,5,1,100,,0,1000,20,20,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,ETA30x16_203dpi.prn
5803112816,IVECO,5803112816,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,5,10,5,5,10,30,5000,5,1,100,,0,1000,20,20,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,ETA30x16_203dpi.prn
MY83-6B747-BA,ASTON MARTIN,MY83-6B747-BA,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,5,10,5,5,10,30,7000,5,1,100,,0,1000,20,20,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,aston_martin.prn
MY83-6B748-BA,ASTON MARTIN,MY83-6B748-BA,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,5,10,5,5,10,30,7000,5,1,100,,0,1000,20,20,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,aston_martin.prn
MY83-6L694-AB,ASTON MARTIN,MY83-6L694-AB,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,5,10,5,5,10,30,7000,5,1,100,,0,1000,20,20,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,aston_martin.prn
MY83-6L701-AB,ASTON MARTIN,MY83-6L701-AB,,,,SCRx,,,,500.0,1000000000.0,10.0,5.0,,,x,0,1000,5,10,5,5,10,30,7000,5,1,100,,0,1000,20,20,5,5,10,30,15000,30,1,100,0,termorestringente_923578.ini,x,aston_martin.prn
19799.00.35,DELL'ORTO,19799.00.35,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,5,10,5,5,20,30,9000,10,1,100,,0,1000,20,20,5,5,10,30,15000,30,1,100,False,000952054.ini,x,ETA30x16_203dpi.prn
19872.00.35,DELL'ORTO,19872.00.35,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,5,10,5,5,20,30,9000,10,1,100,,0,1000,20,20,5,5,10,30,15000,30,1,100,False,000952054.ini,x,ETA30x16_203dpi.prn
1 codice_ricetta cliente part_number dimensione_lotto_abilitata dimensione_lotto verifica_connettore_abilitata connettore verifica_codice_a_barre_abilitata codice_a_barre verifica_resistenza_connettore_abilitata scala_resistenza r nominale tolleranza_resistenza_pos tolleranza_resistenza_neg avvitatura_abilitata viti prova_tenuta_abilitata tempo_pre_riempimento pressione_pre_riempimento tempo_riempimento tempo_assestamento percentuale_minima_pressione_assestamento percentuale_massima_pressione_assestamento tempo_di_test pressione_di_test_delta_minimo pressione_di_test pressione_di_test_delta_massimo tempo_svuotamento pressione_svuotamento prova_tenuta_abilitata_2 tempo_pre_riempimento_2 pressione_pre_riempimento_2 tempo_riempimento_2 tempo_assestamento_2 percentuale_minima_pressione_assestamento_2 percentuale_massima_pressione_assestamento_2 tempo_di_test_2 pressione_di_test_delta_minimo_2 pressione_di_test_2 pressione_di_test_delta_massimo_2 tempo_svuotamento_2 pressione_svuotamento_2 test_visione_abilitato ricetta_visione stampa_etichetta_abilitata modello_etichetta
2 000746453 REV.5 FERRARI 000746453 REV.5 SCRx 500.0 1000000000.0 10.0 5.0 x 0 1000 10 30 5 5 20 25 10000 5 1 100 0 1000 20 20 5 5 10 30 15000 30 1 100 0 termorestringente_923578.ini x ferrari_stten8.prn
3 5803112815 IVECO 5803112815 SCRx 500.0 9999999.99 10.0 5.0 x 0 1000 5 10 5 5 10 30 5000 5 1 100 0 1000 20 20 5 5 10 30 15000 30 1 100 0 termorestringente_923578.ini x ETA30x16_203dpi.prn
4 5803112816 IVECO 5803112816 SCRx 500.0 1000000000.0 10.0 5.0 x 0 1000 5 10 5 5 10 30 5000 5 1 100 0 1000 20 20 5 5 10 30 15000 30 1 100 0 termorestringente_923578.ini x ETA30x16_203dpi.prn
5 MY83-6B747-BA ASTON MARTIN MY83-6B747-BA SCRx 500.0 1000000000.0 10.0 5.0 x 0 1000 5 10 5 5 10 30 7000 5 1 100 0 1000 20 20 5 5 10 30 15000 30 1 100 0 termorestringente_923578.ini x aston_martin.prn
6 MY83-6B748-BA ASTON MARTIN MY83-6B748-BA SCRx 500.0 1000000000.0 10.0 5.0 x 0 1000 5 10 5 5 10 30 7000 5 1 100 0 1000 20 20 5 5 10 30 15000 30 1 100 0 termorestringente_923578.ini x aston_martin.prn
7 MY83-6L694-AB ASTON MARTIN MY83-6L694-AB SCRx 500.0 1000000000.0 10.0 5.0 x 0 1000 5 10 5 5 10 30 7000 5 1 100 0 1000 20 20 5 5 10 30 15000 30 1 100 0 termorestringente_923578.ini x aston_martin.prn
8 MY83-6L701-AB ASTON MARTIN MY83-6L701-AB SCRx 500.0 1000000000.0 10.0 5.0 x 0 1000 5 10 5 5 10 30 7000 5 1 100 0 1000 20 20 5 5 10 30 15000 30 1 100 0 termorestringente_923578.ini x aston_martin.prn
9 19799.00.35 DELL'ORTO 19799.00.35 SCRx 500.0 9999999.99 10.0 5.0 x 0 1000 5 10 5 5 20 30 9000 10 1 100 0 1000 20 20 5 5 10 30 15000 30 1 100 False 000952054.ini x ETA30x16_203dpi.prn
10 19872.00.35 DELL'ORTO 19872.00.35 SCRx 500.0 9999999.99 10.0 5.0 x 0 1000 5 10 5 5 20 30 9000 10 1 100 0 1000 20 20 5 5 10 30 15000 30 1 100 False 000952054.ini x ETA30x16_203dpi.prn

View File

@ -0,0 +1,3 @@
codice_ricetta,cliente,codice_prodotto,descrizione,dimensione_lotto_abilitata,dimensione_lotto,verifica_connettore_abilitata,connettore,verifica_codice_a_barre_abilitata,codice_a_barre,verifica_resistenza_connettore_abilitata,scala_resistenza,r nominale,tolleranza_resistenza_pos,tolleranza_resistenza_neg,avvitatura_abilitata,viti,prova_tenuta_abilitata,tempo_pre_riempimento,pressione_pre_riempimento,tempo_riempimento,tempo_assestamento,percentuale_minima_pressione_assestamento,percentuale_massima_pressione_assestamento,tempo_di_test,pressione_di_test_delta_minimo,pressione_di_test,pressione_di_test_delta_massimo,tempo_svuotamento,pressione_svuotamento,prova_tenuta_abilitata_2,tempo_pre_riempimento_2,pressione_pre_riempimento_2,tempo_riempimento_2,tempo_assestamento_2,percentuale_minima_pressione_assestamento_2,percentuale_massima_pressione_assestamento_2,tempo_di_test_2,pressione_di_test_delta_minimo_2,pressione_di_test_2,pressione_di_test_delta_massimo_2,tempo_svuotamento_2,pressione_svuotamento_2,test_visione_abilitato,ricetta_visione,stampa_etichetta_abilitata,modello_etichetta,archived
07N131597,Lamborghini,07N131597,nuova dima grande,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,15,15,5,5,10,30,7000,30,0,100,,0,1000,20,20,5,5,10,30,15000,30,0,100,False,000952054.ini,x,ETA013L.prn,False
07N131628,Lamborghini,07N131628,nuova dima piccola,,,,SCRx,,,,500.0,9999999.99,10.0,5.0,,,x,0,1000,15,15,5,5,10,30,7000,30,0,100,,0,1000,20,20,5,5,10,30,15000,30,0,100,False,000952054.ini,x,ETA013L.prn,False
1 codice_ricetta cliente codice_prodotto descrizione dimensione_lotto_abilitata dimensione_lotto verifica_connettore_abilitata connettore verifica_codice_a_barre_abilitata codice_a_barre verifica_resistenza_connettore_abilitata scala_resistenza r nominale tolleranza_resistenza_pos tolleranza_resistenza_neg avvitatura_abilitata viti prova_tenuta_abilitata tempo_pre_riempimento pressione_pre_riempimento tempo_riempimento tempo_assestamento percentuale_minima_pressione_assestamento percentuale_massima_pressione_assestamento tempo_di_test pressione_di_test_delta_minimo pressione_di_test pressione_di_test_delta_massimo tempo_svuotamento pressione_svuotamento prova_tenuta_abilitata_2 tempo_pre_riempimento_2 pressione_pre_riempimento_2 tempo_riempimento_2 tempo_assestamento_2 percentuale_minima_pressione_assestamento_2 percentuale_massima_pressione_assestamento_2 tempo_di_test_2 pressione_di_test_delta_minimo_2 pressione_di_test_2 pressione_di_test_delta_massimo_2 tempo_svuotamento_2 pressione_svuotamento_2 test_visione_abilitato ricetta_visione stampa_etichetta_abilitata modello_etichetta archived
2 07N131597 Lamborghini 07N131597 nuova dima grande SCRx 500.0 9999999.99 10.0 5.0 x 0 1000 15 15 5 5 10 30 7000 30 0 100 0 1000 20 20 5 5 10 30 15000 30 0 100 False 000952054.ini x ETA013L.prn False
3 07N131628 Lamborghini 07N131628 nuova dima piccola SCRx 500.0 9999999.99 10.0 5.0 x 0 1000 15 15 5 5 10 30 7000 30 0 100 0 1000 20 20 5 5 10 30 15000 30 0 100 False 000952054.ini x ETA013L.prn False

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 297 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 216 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 376 KiB

View File

@ -61,7 +61,7 @@
height="50.946007" height="50.946007"
preserveAspectRatio="none" preserveAspectRatio="none"
xlink:href="img/arw-yel-down.png" xlink:href="img/arw-yel-down.png"
id="sensor_3_inv" id="sensor_3"
x="963.87476" x="963.87476"
y="-183.19855" y="-183.19855"
inkscape:svg-dpi="1" inkscape:svg-dpi="1"
@ -83,7 +83,7 @@
height="50.946007" height="50.946007"
preserveAspectRatio="none" preserveAspectRatio="none"
xlink:href="img/arw-yel-down.png" xlink:href="img/arw-yel-down.png"
id="sensor_5" id="sensor_5_inv"
x="1488.8005" x="1488.8005"
y="-19.472771" y="-19.472771"
inkscape:svg-dpi="1" inkscape:svg-dpi="1"

Before

Width:  |  Height:  |  Size: 376 KiB

After

Width:  |  Height:  |  Size: 376 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 171 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 171 KiB

View File

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="1200"
height="700"
viewBox="0 0 1200 700"
version="1.1"
id="svg5"
xml:space="preserve"
inkscape:version="1.2.2 (1:1.2.2+202212051550+b0a8486541)"
sodipodi:docname="DEFAULT.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview7"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1.0570734"
inkscape:cx="365.15913"
inkscape:cy="357.59106"
inkscape:window-width="2560"
inkscape:window-height="1023"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" /><defs
id="defs2" /><g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"><text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff7f2a;fill-opacity:1;stroke:#aa4400"
x="277.31964"
y="373.9111"
id="text226"><tspan
sodipodi:role="line"
id="tspan224"
x="277.31964"
y="373.9111"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:53.3333px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:#aa4400;fill:#ff7f2a">DISEGNO NON DISPONIBILE</tspan></text></g></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

View File

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="1200"
height="700"
viewBox="0 0 1200 700"
version="1.1"
id="svg5"
xml:space="preserve"
inkscape:version="1.2.2 (1:1.2.2+202212051550+b0a8486541)"
sodipodi:docname="DEFAULT.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview7"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="1.0570734"
inkscape:cx="365.15913"
inkscape:cy="357.59106"
inkscape:window-width="2560"
inkscape:window-height="1023"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" /><defs
id="defs2" /><g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"><text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff7f2a;fill-opacity:1;stroke:#aa4400"
x="277.31964"
y="373.9111"
id="text226"><tspan
sodipodi:role="line"
id="tspan224"
x="277.31964"
y="373.9111"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:53.3333px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke:#aa4400;fill:#ff7f2a">DISEGNO NON DISPONIBILE</tspan></text></g></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 116 KiB

View File

@ -8,7 +8,7 @@
version="1.1" version="1.1"
id="svg5" id="svg5"
xml:space="preserve" xml:space="preserve"
inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)" inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
sodipodi:docname="5803034027.svg" sodipodi:docname="5803034027.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
@ -29,12 +29,12 @@
inkscape:document-units="mm" inkscape:document-units="mm"
showgrid="false" showgrid="false"
inkscape:zoom="0.74746377" inkscape:zoom="0.74746377"
inkscape:cx="557.21764" inkscape:cx="556.54871"
inkscape:cy="157.86718" inkscape:cy="158.53611"
inkscape:window-width="2490" inkscape:window-width="1920"
inkscape:window-height="1016" inkscape:window-height="1017"
inkscape:window-x="70" inkscape:window-x="-8"
inkscape:window-y="27" inkscape:window-y="-8"
inkscape:window-maximized="1" inkscape:window-maximized="1"
inkscape:current-layer="layer1" /><metadata inkscape:current-layer="layer1" /><metadata
id="metadata11"><rdf:RDF><cc:Work id="metadata11"><rdf:RDF><cc:Work
@ -55,20 +55,10 @@
xlink:href="img/arw-yel-down.png" xlink:href="img/arw-yel-down.png"
inkscape:label="sensor_4" inkscape:label="sensor_4"
inkscape:svg-dpi="1" inkscape:svg-dpi="1"
y="276.89706" y="185.92274"
x="473.19138" x="324.68918"
id="sensor_4" id="sensor_4"
preserveAspectRatio="none" preserveAspectRatio="none"
height="62.298107" height="62.298107"
width="64.190125" /><image
xlink:href="img/arw-yel-down.png"
inkscape:label="sensor_3"
inkscape:svg-dpi="1"
y="195.4939"
x="325.5499"
id="sensor_3"
preserveAspectRatio="none"
height="62.298107"
width="64.190125" width="64.190125"
inkscape:transform-center-x="111.41632" style="stroke-width:1.00157;stroke-dasharray:none" /></g></svg>
inkscape:transform-center-y="16.838762" /></g></svg>

Before

Width:  |  Height:  |  Size: 283 KiB

After

Width:  |  Height:  |  Size: 283 KiB

View File

@ -53,15 +53,6 @@
x="-69.333839" x="-69.333839"
y="-24.57136" /><image y="-24.57136" /><image
xlink:href="img/arw-yel-down.png" xlink:href="img/arw-yel-down.png"
inkscape:label="sensor_4"
inkscape:svg-dpi="1"
y="169.13637"
x="497.30814"
id="sensor_4"
preserveAspectRatio="none"
height="62.298107"
width="64.190125" /><image
xlink:href="img/arw-yel-down.png"
inkscape:label="sensor_3" inkscape:label="sensor_3"
inkscape:svg-dpi="1" inkscape:svg-dpi="1"
y="97.074028" y="97.074028"

Before

Width:  |  Height:  |  Size: 283 KiB

After

Width:  |  Height:  |  Size: 283 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 186 KiB

View File

@ -54,15 +54,6 @@
preserveAspectRatio="none" preserveAspectRatio="none"
height="62.298107" height="62.298107"
width="64.190125" /> width="64.190125" />
<image
xlink:href="img/arw-yel-down.png"
inkscape:label="sensor_4"
inkscape:svg-dpi="1"
y="46.962872"
x="749.03607"
id="sensor_4"
preserveAspectRatio="none"
height="62.298107"
width="64.190125" />
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 186 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 161 KiB

After

Width:  |  Height:  |  Size: 193 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 148 KiB

After

Width:  |  Height:  |  Size: 197 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 184 KiB

After

Width:  |  Height:  |  Size: 184 KiB

View File

@ -94,16 +94,6 @@
preserveAspectRatio="none" preserveAspectRatio="none"
height="62.298107" height="62.298107"
width="64.190125" /> width="64.190125" />
<image
xlink:href="img/arw-yel-down.png"
inkscape:label="sensor_5"
inkscape:svg-dpi="1"
y="19.962202"
x="854.75916"
id="sensor_5"
preserveAspectRatio="none"
height="62.298107"
width="64.190125" />
<image <image
xlink:href="img/arw-yel-down.png" xlink:href="img/arw-yel-down.png"
inkscape:label="sensor_4" inkscape:label="sensor_4"
@ -114,15 +104,5 @@
preserveAspectRatio="none" preserveAspectRatio="none"
height="62.298107" height="62.298107"
width="64.190125" /> width="64.190125" />
<image
xlink:href="img/arw-yel-down.png"
inkscape:label="sensor_6"
inkscape:svg-dpi="1"
y="148.2662"
x="825.11084"
id="sensor_6"
preserveAspectRatio="none"
height="62.298107"
width="64.190125" />
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 184 KiB

After

Width:  |  Height:  |  Size: 184 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 464 KiB

After

Width:  |  Height:  |  Size: 91 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

View File

@ -0,0 +1,30 @@
CT~~CD,~CC^~CT~
^XA
~TA000
~JSN
^LT0
^MNW
^MTT
^PON
^PMN
^LH0,0
^JMA
^PR2,2
~SD15
^JUS
^LRN
^CI27
^PA0,1,1,0
^XZ
^XA
^MMT
^PW256
^LL144
^LS0
^FT21,129^BQN,2,4
^FH\^FDLA,{PART}{SN5}{MO}{YY}^FS
^FT234,104^A0I,23,23^FH\^CI28^FD{PART}^FS^CI27
^FT234,50^A0I,23,23^FH\^CI28^FDN:{SN5}^FS^CI27
^FT234,23^A0I,23,23^FH\^CI28^FD{DD}/{MO}/{YY}^FS^CI27
^PQ1,0,1,Y
^XZ

View File

@ -0,0 +1,53 @@
CT~~CD,~CC^~CT~
^XA
~TA000
~JSN
^LT0
^MNW
^MTT
^PON
^PMN
^LH0,0
^JMA
^PR2,2
~SD20
^JUS
^LRN
^CI27
^PA0,1,1,0
^XZ
^XA
^MMT
^PW472
^LL1654
^LS0
^FT40,729^A0N,38,33^FH\^CI28^FD{DD}/{MO}/{YY}^FS^CI27
^FT259,729^A0N,38,33^FH\^CI28^FD{HH}:{MI}:{SS}^FS^CI27
^FT27,1497^A0N,46,46^FH\^CI28^FDESITO:^FS^CI27
^FT213,1497^A0N,46,46^FH\^CI28^FDCONFORME^FS^CI27
^FT43,130^A0N,38,38^FH\^CI28^FDNumero Disegno^FS^CI27
^FT40,683^A0N,38,38^FH\^CI28^FDData/Ora Prova^FS^CI27
^FT40,784^A0N,38,38^FH\^CI28^FDStazione: {STATION}^FS^CI27
^FT40,615^A0N,38,38^FH\^CI28^FDN. Pezzo:^FS^CI27
^FT200,617^A0N,38,38^FH\^CI28^FD{SN5}^FS^CI27
^FT40,831^A0N,38,38^FH\^CI28^FDOPERATORE: {OPERATOR}^FS^CI27
^FO77,960^GB318,0,12^FS
^FT28,1043^A0N,38,38^FH\^CI28^FDP. prova:^FS^CI27
^FT28,1090^A0N,38,38^FH\^CI28^FDP. rilevata:^FS^CI27
^FT214,1090^A0N,38,38^FH\^CI28^FD{RESPSET}mbar^FS^CI27
^FT28,1130^A0N,38,38^FH\^CI28^FDCaduta ammessa:^FS^CI27
^FT305,1130^A0N,38,38^FH\^CI28^FD{PMIN} mbar^FS^CI27
^FT28,1179^A0N,38,38^FH\^CI28^FDCaduta rilevata:^FS^CI27
^FT264,1179^A0N,38,38^FH\^CI28^FD{RESLEAK} mbar^FS^CI27
^FT28,1342^A0N,38,38^FH\^CI28^FDT.Prova^FS^CI27
^FT306,1348^A0N,38,38^FH\^CI28^FD{TTEST} s^FS^CI27
^FT27,1278^A0N,38,38^FH\^CI28^FDT.Riempim.^FS^CI27
^FT306,1278^A0N,38,38^FH\^CI28^FD{TFILL} s^FS^CI27
^FT28,1310^A0N,38,38^FH\^CI28^FDT.Stabilizzazione^FS^CI27
^FT306,1313^A0N,38,38^FH\^CI28^FD{TSET} s^FS^CI27
^FT214,1043^A0N,38,38^FH\^CI28^FD{PTEST} mbar^FS^CI27
^FT46,352^BXN,9,200,0,0,1,_,1
^FH\^FD{PART}{MO}{YY}{SN5}^FS
^FT43,425^A0N,38,38^FH\^CI28^FD{PART}{MO}{YY}{SN5}^FS^CI27
^PQ1,0,1,Y
^XZ

View File

@ -0,0 +1,58 @@
CT~~CD,~CC^~CT~
^XA
~TA000
~JSN
^LT0
^MNW
^MTT
^PON
^PMN
^LH0,0
^JMA
^PR2,2
~SD20
^JUS
^LRN
^CI27
^PA0,1,1,0
^XZ
^XA
^MMT
^PW336
^LL1055
^LS0
^FT65,66^A0N,39,38^FH\^CI28^FDERRECINQUE^FS^CI27
^FT52,403^BQN,2,7
^FH\^FDLA,{PART}^FS
^FT23,436^A0N,31,30^FH\^CI28^FDPart number:^FS^CI27
^FT23,527^A0N,31,30^FH\^CI28^FD{PART}^FS^CI27
^FT25,101^A0N,17,18^FH\^CI28^FDVia Meucci 31/A - 10079 Mappano(TO)^FS^CI27
^FT61,173^A0N,39,38^FH\^CI28^FD{CLIENT}^FS^CI27
^FT61,211^A0N,39,38^FH\^CI28^FDLEAK TEST^FS^CI27
^FT23,921^A0N,23,23^FH\^CI28^FD{DD}/{MO}/{YY}^FS^CI27
^FT169,921^A0N,23,23^FH\^CI28^FD{HH}:{MI}:{SS}^FS^CI27
^FT25,1006^A0N,31,30^FH\^CI28^FDCHECK:^FS^CI27
^FT151,1006^A0N,31,30^FH\^CI28^FDPASSED^FS^CI27
^FT23,964^A0N,25,25^FH\^CI28^FDOperator:^FS^CI27
^FT151,964^A0N,25,25^FH\^CI28^FD{OPERATOR}^FS^CI27
^FT23,489^A0N,31,30^FH\^CI28^FD{DESCRIPTION}^FS^CI27
^FT23,567^A0N,31,30^FH\^CI28^FDSequential number:^FS^CI27
^FT23,602^A0N,31,30^FH\^CI28^FD{SN5}^FS^CI27
^FT27,658^A0N,28,28^FH\^CI28^FDTest 1:^FS^CI27
^FT27,685^A0N,23,23^FH\^CI28^FDMeasured press.:^FS^CI27
^FT199,687^A0N,20,20^FH\^CI28^FD{RESPSET} mbar^FS^CI27
^FT27,707^A0N,23,23^FH\^CI28^FDAllowed leak:^FS^CI27
^FT199,709^A0N,20,20^FH\^CI28^FD{PMIN} mbar^FS^CI27
^FT27,730^A0N,23,23^FH\^CI28^FDMeasured leak:^FS^CI27
^FT187,731^A0N,20,20^FH\^CI28^FD{RESLEAK} mbar^FS^CI27
^FT27,817^A0N,23,23^FH\^CI28^FDMeasure time:^FS^CI27
^FT215,818^A0N,20,20^FH\^CI28^FD{TTEST} s^FS^CI27
^FT26,773^A0N,23,23^FH\^CI28^FDFill time:^FS^CI27
^FT215,770^A0N,20,20^FH\^CI28^FD{TFILL} s^FS^CI27
^FT27,795^A0N,23,23^FH\^CI28^FDSettling time:^FS^CI27
^FT215,794^A0N,20,20^FH\^CI28^FD{TSET} s^FS^CI27
^FT136,658^A0N,28,28^FH\^CI28^FD{PTEST} mbar^FS^CI27
^FT151,124^A0N,17,18^FH\^CI28^FDItaly^FS^CI27
^FT27,893^A0N,23,23^FH\^CI28^FDTest date/time:^FS^CI27
^PQ1,0,1,Y
^XZ

View File

@ -0,0 +1,47 @@
<xpml><page quantity='0' pitch='130.0 mm'></xpml>SIZE 57.5 mm, 130 mm
GAP 3 mm, 0 mm
DIRECTION 0,0
REFERENCE 0,0
OFFSET 0 mm
SET PEEL OFF
SET CUTTER OFF
SET PARTIAL_CUTTER OFF
<xpml></page></xpml><xpml><page quantity='1' pitch='130.0 mm'></xpml>SET TEAR ON
CLS
CODEPAGE 1252
TEXT 203,232,"0",180,9,9,"{TSET}s"
TEXT 203,386,"0",180,9,9,"{RESPFILL}mbar"
TEXT 292,813,"0",180,9,9,"{CLIENT}"
TEXT 330,990,"0",180,12,12,"ERRECINQUE"
TEXT 292,930,"0",180,8,8,"Fluid system"
TEXT 307,901,"0",180,8,8,"Via Meucci 31/A"
TEXT 333,872,"0",180,8,8,"10079 Mappano (TO)"
TEXT 379,813,"0",180,9,9,"Cliente:"
TEXT 379,778,"0",180,9,9,"N. disegno:"
TEXT 379,736,"0",180,9,9,"N. dis. R5:"
TEXT 379,703,"0",180,9,9,"N. pezzo:"
TEXT 379,667,"0",180,9,9,"Data/ora prova:"
TEXT 379,632,"0",180,9,9,"{DATETIME}"
TEXT 257,778,"0",180,9,9,"{RECIPE}"
TEXT 257,743,"0",180,11,11,"{PART}"
TEXT 257,703,"0",180,9,9,"{SN}"
BARCODE 379,576,"128M",102,0,180,2,4,"!105{BCODE}"
TEXT 379,386,"0",180,9,9,"P. riempimento:"
TEXT 379,348,"0",180,9,9,"P. assestamento:"
TEXT 379,310,"0",180,9,9,"Caduta:"
TEXT 203,348,"0",180,9,9,"{RESPSET}mbar"
TEXT 203,310,"0",180,9,9,"{RESLEAK}mbar"
TEXT 379,271,"0",180,9,9,"T. riemp:"
TEXT 379,232,"0",180,9,9,"T. stab:"
TEXT 379,194,"0",180,9,9,"T. prova:"
TEXT 203,271,"0",180,9,9,"{TFILL}s"
TEXT 203,194,"0",180,9,9,"{TTEST}s"
TEXT 379,155,"0",180,9,9,"Caduta MAX"
TEXT 379,116,"0",180,9,9,"Press nominale"
TEXT 203,155,"0",180,9,9,"{PMIN}mbar"
TEXT 203,116,"0",180,9,9,"{PTEST}mbar"
TEXT 379,67,"0",180,11,11,"ESITO:"
TEXT 285,67,"0",180,11,11,"{RESULT}"
TEXT 379,464,"0",180,9,9,"{BCODE}"
PRINT 1,1
<xpml></page></xpml><xpml><end/></xpml>

View File

@ -118,6 +118,7 @@ r nominale: 1000000000
tolleranza_resistenza_pos: 10 tolleranza_resistenza_pos: 10
tolleranza_resistenza_neg: 5 tolleranza_resistenza_neg: 5
prova_tenuta_abilitata: x prova_tenuta_abilitata: x
istruzione_abilitata_extra:
warning_img: warning_img:
#TECNA RECIPE PARAMETERS #TECNA RECIPE PARAMETERS

View File

@ -10,3 +10,6 @@ st-ten-8: st-ten-8
ST-TEN-9: st-ten-9 ST-TEN-9: st-ten-9
st-ten-10: st-ten-10 st-ten-10: st-ten-10
st-ten-11: st-ten-11 st-ten-11: st-ten-11
st-ten-12: st-ten-12
st-ten-13: st-ten-13

View File

@ -17,7 +17,9 @@ digital_io: present
barcode_recipe_selection: present barcode_recipe_selection: present
fixture_id: present fixture_id: present
discard_box: absent discard_box: absent
enforce_piece_removal: yes second_leak_test: present
dual_channel: absent
#enforce_piece_removal: yes
[tecna_t3] [tecna_t3]
port: COM4 port: COM4
@ -29,7 +31,9 @@ printer: zd421
[digital_io] [digital_io]
# OUTPUT MAP FOR FIXTURE CONNECTOR # OUTPUT MAP FOR FIXTURE CONNECTOR
id: USB-5860,BID#0
id_fixture: USB-5862,BID#0
discard_idx:12 # BIT NUMBER OF THE I/0 MODULE USED FOR DISCARD SENSING
[fixture_rfid] [fixture_rfid]
port: COM5 port: COM5
@ -73,6 +77,7 @@ pressione_svuotamento_2: 100
canale_di_prova_2: 2 canale_di_prova_2: 2
modello_etichetta: EtichettaR5_Montaggio_1prova.prn modello_etichetta: EtichettaR5_Montaggio_1prova.prn
pid_pressure_correction: 105 pid_pressure_correction: 105
istruzione_abilitata_extra:
[autotest_leak] [autotest_leak]
enabled: true enabled: true

View File

@ -0,0 +1,93 @@
[machine]
description = ST-TEN-12 AUTOMATICO
instruction_folder = st-ten-12
image_for_warning= st-ten-12
[hardware_config]
archive_synchronizer: present
uvc_camera: absent
label_printer: present
neo_pixels: absent
remote_api: absent
tecna_t3: present
vision_saver: absent
vision: absent
screwdriver: absent
digital_io: present
barcode_recipe_selection: present
fixture_id: present
discard_box: absent
enforce_piece_removal: yes
[tecna_t3]
port: COM4
model: t3p
[label_printer]
platform: windows
printer: zd421
[digital_io]
# OUTPUT MAP FOR FIXTURE CONNECTOR
id: USB-5862,BID#0
[fixture_rfid]
port: COM5
[recipe]
recipe_name_field: codice_ricetta
part_number_field: codice_prodotto
label_template_field: modello_etichetta
description_field: descrizione
[recipes_defaults]
tester_discharge_enable: yes
dimensione_lotto_abilitata: x
tempo_pre_riempimento: 0
pressione_pre_riempimento: 1000
tempo_riempimento: 15
tempo_assestamento: 15
tempo_di_test: 10
n_componenti:1
percentuale_minima_pressione_assestamento: 5
percentuale_massima_pressione_assestamento: 5
pressione_di_test_delta_minimo: 30
pressione_di_test: 7000
pressione_di_test_delta_massimo: 30
tempo_svuotamento: 0
pressione_svuotamento: 100
canale_di_prova: 1
prova_tenuta_abilitata_2:
tempo_pre_riempimento_2: 0
pressione_pre_riempimento_2: 1000
tempo_riempimento_2: 20
tempo_assestamento_2: 20
tempo_di_test_2: 10
percentuale_minima_pressione_assestamento_2: 5
percentuale_massima_pressione_assestamento_2: 5
pressione_di_test_delta_minimo_2: 30
pressione_di_test_2: 15000
pressione_di_test_delta_massimo_2: 30
tempo_svuotamento_2: 0
pressione_svuotamento_2: 100
canale_di_prova_2: 2
modello_etichetta: EtichettaR5_Montaggio_1prova.prn
pid_pressure_correction: 105
[autotest_leak]
enabled: true
pre_filling_time: 0
pre_filling_pressure: 1000
filling_time: 10
settling_time: 10
settling_pressure_min_percent: 5
settling_pressure_max_percent: 5
test_pressure: 7000
test_time: 10
test_pressure_qpos: 10 #Q+ Upper test leak limit
test_pressure_qneg: 30 #Q- Lower test leak limit
test_pressure_tt_qpos: 1 # Q+ Upper test leak limit (tube-tube)
test_pressure_tt_qneg: 5 # Q- Lower test leak limit (tube-tube)
flush_time: 1
flush_pressure: 100
relay_config: 1

View File

@ -0,0 +1,93 @@
[machine]
description = ST-TEN-13 AUTOMATICO
instruction_folder = st-ten-13
image_for_warning= st-ten-13
[hardware_config]
archive_synchronizer: present
uvc_camera: absent
label_printer: present
neo_pixels: absent
remote_api: absent
tecna_t3: present
vision_saver: absent
vision: absent
screwdriver: absent
digital_io: present
barcode_recipe_selection: present
fixture_id: present
discard_box: absent
enforce_piece_removal: yes
[tecna_t3]
port: COM4
model: t3p
[label_printer]
platform: windows
printer: zd421
[digital_io]
# OUTPUT MAP FOR FIXTURE CONNECTOR
id: USB-5862,BID#0
[fixture_rfid]
port: COM5
[recipe]
recipe_name_field: codice_ricetta
part_number_field: codice_prodotto
label_template_field: modello_etichetta
description_field: descrizione
[recipes_defaults]
tester_discharge_enable: yes
dimensione_lotto_abilitata: x
tempo_pre_riempimento: 0
pressione_pre_riempimento: 1000
tempo_riempimento: 15
tempo_assestamento: 15
tempo_di_test: 10
n_componenti:1
percentuale_minima_pressione_assestamento: 5
percentuale_massima_pressione_assestamento: 5
pressione_di_test_delta_minimo: 30
pressione_di_test: 7000
pressione_di_test_delta_massimo: 30
tempo_svuotamento: 0
pressione_svuotamento: 100
canale_di_prova: 1
prova_tenuta_abilitata_2:
tempo_pre_riempimento_2: 0
pressione_pre_riempimento_2: 1000
tempo_riempimento_2: 20
tempo_assestamento_2: 20
tempo_di_test_2: 10
percentuale_minima_pressione_assestamento_2: 5
percentuale_massima_pressione_assestamento_2: 5
pressione_di_test_delta_minimo_2: 30
pressione_di_test_2: 15000
pressione_di_test_delta_massimo_2: 30
tempo_svuotamento_2: 0
pressione_svuotamento_2: 100
canale_di_prova_2: 2
modello_etichetta: EtichettaR5_Montaggio_1prova.prn
pid_pressure_correction: 105
[autotest_leak]
enabled: true
pre_filling_time: 0
pre_filling_pressure: 1000
filling_time: 10
settling_time: 10
settling_pressure_min_percent: 5
settling_pressure_max_percent: 5
test_pressure: 7000
test_time: 10
test_pressure_qpos: 10 #Q+ Upper test leak limit
test_pressure_qneg: 30 #Q- Lower test leak limit
test_pressure_tt_qpos: 1 # Q+ Upper test leak limit (tube-tube)
test_pressure_tt_qneg: 5 # Q- Lower test leak limit (tube-tube)
flush_time: 1
flush_pressure: 100
relay_config: 1

View File

@ -12,6 +12,7 @@ tecna_t3: present
digital_io: present digital_io: present
digital_io_flush_blow: present digital_io_flush_blow: present
barcode_recipe_selection: present barcode_recipe_selection: present
enforce_piece_removal: yes
external_flush_blow: present # EXTERNAL BOX CONTROLLING MULTI-CHANNEL TEST (IF PRESENT), BLOW-CLEANING AND EXTERNAL FLUSH external_flush_blow: present # EXTERNAL BOX CONTROLLING MULTI-CHANNEL TEST (IF PRESENT), BLOW-CLEANING AND EXTERNAL FLUSH
show_instructions: yes show_instructions: yes

View File

@ -13,6 +13,7 @@ tecna_t3: present
digital_io: present digital_io: present
barcode_recipe_selection: present barcode_recipe_selection: present
show_instructions: yes show_instructions: yes
enforce_piece_removal: yes
[tecna_t3] [tecna_t3]
port: COM4 port: COM4
@ -94,8 +95,8 @@ settling_pressure_min_percent: 5
settling_pressure_max_percent: 5 settling_pressure_max_percent: 5
test_pressure: 5000 test_pressure: 5000
test_time: 10 test_time: 10
test_pressure_qpos: 7 test_pressure_qpos: 8
test_pressure_qneg: 17 test_pressure_qneg: 12
test_pressure_tt_qpos: 1 # Q+ Upper test leak limit (tube-tube) (positive mbar) test_pressure_tt_qpos: 1 # Q+ Upper test leak limit (tube-tube) (positive mbar)
test_pressure_tt_qneg: 5 # Q- Lower test leak limit (tube-tube) (negative mbar) test_pressure_tt_qneg: 5 # Q- Lower test leak limit (tube-tube) (negative mbar)
flush_time: 1 flush_time: 1

View File

@ -3,8 +3,8 @@
import platform import platform
from ctypes import * from ctypes import *
from Automation.BDaq import * from components.Automation.BDaq import *
from Automation.BDaq import Utils from components.Automation.BDaq import Utils
if platform.architecture()[0] == '32bit': if platform.architecture()[0] == '32bit':
c_uint64 = c_uint32 c_uint64 = c_uint32

View File

@ -1,12 +1,12 @@
#!/usr/bin/python #!/usr/bin/python
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from Automation.BDaq import ErrorCode from components.Automation.BDaq import ErrorCode
from Automation.BDaq.BDaqApi import TDaqCtrlBase, TArray, BioFailed from components.Automation.BDaq.BDaqApi import TDaqCtrlBase, TArray, BioFailed
from Automation.BDaq import DeviceInformation, ControlState from components.Automation.BDaq import DeviceInformation, ControlState
from Automation.BDaq.DeviceCtrl import DeviceCtrl from components.Automation.BDaq.DeviceCtrl import DeviceCtrl
from Automation.BDaq import Utils from components.Automation.BDaq import Utils
from Automation.BDaq import ErrorCode from components.Automation.BDaq import ErrorCode
class DaqCtrlBase(object): class DaqCtrlBase(object):

View File

@ -5,10 +5,10 @@ from ctypes import c_int32, c_byte, c_uint8
from ctypes import create_unicode_buffer from ctypes import create_unicode_buffer
from ctypes import pointer from ctypes import pointer
from Automation.BDaq.BDaqApi import TArray, TerminalBoard from components.Automation.BDaq.BDaqApi import TArray, TerminalBoard
from Automation.BDaq.BDaqApi import TDeviceCtrl, BioFailed from components.Automation.BDaq.BDaqApi import TDeviceCtrl, BioFailed
from Automation.BDaq import ErrorCode from components.Automation.BDaq import ErrorCode
from Automation.BDaq import Utils from components.Automation.BDaq import Utils
class DeviceCtrl(object): class DeviceCtrl(object):

View File

@ -2,8 +2,8 @@
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from Automation.BDaq.BDaqApi import TDiCosintPort, BioFailed from components.Automation.BDaq.BDaqApi import TDiCosintPort, BioFailed
from Automation.BDaq import ErrorCode from components.Automation.BDaq import ErrorCode
class DiCosintPort(object): class DiCosintPort(object):

View File

@ -1,8 +1,8 @@
#!/usr/bin/python #!/usr/bin/python
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from Automation.BDaq.BDaqApi import TDiPmintPort from components.Automation.BDaq.BDaqApi import TDiPmintPort
from Automation.BDaq import ErrorCode from components.Automation.BDaq import ErrorCode
class DiPmintPort(object): class DiPmintPort(object):

View File

@ -1,9 +1,9 @@
#!/usr/bin/python #!/usr/bin/python
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from Automation.BDaq.BDaqApi import TDiintChannel, BioFailed from components.Automation.BDaq.BDaqApi import TDiintChannel, BioFailed
from Automation.BDaq import ErrorCode, ActiveSignal from components.Automation.BDaq import ErrorCode, ActiveSignal
from Automation.BDaq import Utils from components.Automation.BDaq import Utils
class DiintChannel(object): class DiintChannel(object):

View File

@ -1,10 +1,10 @@
#!/usr/bin/python #!/usr/bin/python
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from Automation.BDaq.BDaqApi import TDioCtrlBase, TArray from components.Automation.BDaq.BDaqApi import TDioCtrlBase, TArray
from Automation.BDaq.DaqCtrlBase import DaqCtrlBase from components.Automation.BDaq.DaqCtrlBase import DaqCtrlBase
from Automation.BDaq.DioFeatures import DioFeatures from components.Automation.BDaq.DioFeatures import DioFeatures
from Automation.BDaq.DioPort import DioPort from components.Automation.BDaq.DioPort import DioPort
class DioCtrlBase(DaqCtrlBase): class DioCtrlBase(DaqCtrlBase):

View File

@ -3,10 +3,10 @@
import ctypes import ctypes
from Automation.BDaq.BDaqApi import TArray from components.Automation.BDaq.BDaqApi import TArray
from Automation.BDaq.BDaqApi import TDioFeatures from components.Automation.BDaq.BDaqApi import TDioFeatures
from Automation.BDaq import MathInterval from components.Automation.BDaq import MathInterval
from Automation.BDaq import Utils from components.Automation.BDaq import Utils
class DioFeatures(object): class DioFeatures(object):

View File

@ -1,9 +1,9 @@
#!/usr/bin/python #!/usr/bin/python
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from Automation.BDaq.BDaqApi import TDioPort, BioFailed from components.Automation.BDaq.BDaqApi import TDioPort, BioFailed
from Automation.BDaq import Utils from components.Automation.BDaq import Utils
from Automation.BDaq import ErrorCode, DioPortDir, DoCircuitType from components.Automation.BDaq import ErrorCode, DioPortDir, DoCircuitType
class DioPort(object): class DioPort(object):

View File

@ -3,13 +3,13 @@
from ctypes import * from ctypes import *
from Automation.BDaq import Scenario, ErrorCode from components.Automation.BDaq import Scenario, ErrorCode
from Automation.BDaq.DioCtrlBase import DioCtrlBase from components.Automation.BDaq.DioCtrlBase import DioCtrlBase
from Automation.BDaq.BDaqApi import TInstantDiCtrl, TArray, BioFailed from components.Automation.BDaq.BDaqApi import TInstantDiCtrl, TArray, BioFailed
from Automation.BDaq.DiintChannel import DiintChannel from components.Automation.BDaq.DiintChannel import DiintChannel
from Automation.BDaq.NosFltChannel import NosFltChannel from components.Automation.BDaq.NosFltChannel import NosFltChannel
from Automation.BDaq.DiPmintPort import DiPmintPort from components.Automation.BDaq.DiPmintPort import DiPmintPort
from Automation.BDaq.DiCosintPort import DiCosintPort from components.Automation.BDaq.DiCosintPort import DiCosintPort
class InstantDiCtrl(DioCtrlBase): class InstantDiCtrl(DioCtrlBase):

View File

@ -3,9 +3,9 @@
from ctypes import * from ctypes import *
from Automation.BDaq import Scenario, ErrorCode from components.Automation.BDaq import Scenario, ErrorCode
from Automation.BDaq.BDaqApi import TInstantDoCtrl from components.Automation.BDaq.BDaqApi import TInstantDoCtrl
from Automation.BDaq.DioCtrlBase import DioCtrlBase from components.Automation.BDaq.DioCtrlBase import DioCtrlBase
class InstantDoCtrl(DioCtrlBase): class InstantDoCtrl(DioCtrlBase):

View File

@ -1,8 +1,8 @@
#!/usr/bin/python #!/usr/bin/python
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from dummies.Automation.BDaq.BDaqApi import TNosFltChannel, BioFailed from components.dummies.Automation.BDaq.BDaqApi import TNosFltChannel, BioFailed
from dummies.Automation.BDaq import ErrorCode from components.dummies.Automation.BDaq import ErrorCode
class NoiseFilterChannel(object): class NoiseFilterChannel(object):

View File

@ -1,7 +1,7 @@
#!/usr/bin/python #!/usr/bin/python
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from Automation.BDaq.NoiseFilterChannel import NoiseFilterChannel from components.Automation.BDaq.NoiseFilterChannel import NoiseFilterChannel
class NosFltChannel(NoiseFilterChannel): class NosFltChannel(NoiseFilterChannel):

View File

@ -1,7 +1,7 @@
#!/usr/bin/python #!/usr/bin/python
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from Automation.BDaq import * from components.Automation.BDaq import *
def CreateArray(DataType, DataNum): def CreateArray(DataType, DataNum):

View File

@ -3,8 +3,8 @@
import platform import platform
from ctypes import * from ctypes import *
from Automation.BDaq import * from components.Automation.BDaq import *
from Automation.BDaq import Utils from components.Automation.BDaq import Utils
if platform.architecture()[0] == '32bit': if platform.architecture()[0] == '32bit':
c_uint64 = c_uint32 c_uint64 = c_uint32

View File

@ -3,9 +3,9 @@
from ctypes import * from ctypes import *
from dummies.Automation.BDaq import Scenario, ErrorCode from components.dummies.Automation.BDaq import Scenario, ErrorCode
from dummies.Automation.BDaq.BDaqApi import TInstantDoCtrl from components.dummies.Automation.BDaq.BDaqApi import TInstantDoCtrl
from dummies.Automation.BDaq.DioCtrlBase import DioCtrlBase from components.dummies.Automation.BDaq.DioCtrlBase import DioCtrlBase
class InstantDoCtrl(DioCtrlBase): class InstantDoCtrl(DioCtrlBase):

View File

@ -44,7 +44,7 @@ class USB_586x(Component):
self.mutex = QMutex() self.mutex = QMutex()
self.simulate="--sim-io" in sys.argv self.simulate="--sim-io" in sys.argv
# DEVICE INFORMATION # DEVICE INFORMATION
self.id=config[name]["id"] self.id=config["digital_io"]["id"]
if "5860" in self.id: if "5860" in self.id:
self.type = "5860" self.type = "5860"
self.in_size = 1 self.in_size = 1
@ -60,6 +60,8 @@ class USB_586x(Component):
self.info.ModuleIndex = 0 self.info.ModuleIndex = 0
self.open_device() self.open_device()
#self.out_bits = self.config["digital_outputs"]
#self.in_bits = self.config["digital_inputs"]
# SET ALL RELAYS OFF # SET ALL RELAYS OFF
for bit in range(0, self.out_size * 8): for bit in range(0, self.out_size * 8):
@ -69,6 +71,7 @@ class USB_586x(Component):
self.last_get = None self.last_get = None
self.state_count = None self.state_count = None
self.last_out = None self.last_out = None
self.sim_in = [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]
def open_device(self): def open_device(self):
# DIGITAL I/O CLASS # DIGITAL I/O CLASS
@ -176,7 +179,7 @@ class USB_586x(Component):
if is_win or self.simulate: if is_win or self.simulate:
if self.simulate: if self.simulate:
read=[1,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0] read = self.sim_in
break break
else: else:
if self.io_ok: if self.io_ok:
@ -213,6 +216,17 @@ class USB_586x(Component):
def get_bit(self, byte, bit): def get_bit(self, byte, bit):
return self.get()[byte][bit] return self.get()[byte][bit]
def get_in(self,input_name,data=None):
if data is None:
data=self.last_get
sensor_index = int(self.in_bits[input_name])
byte_idx = int(sensor_index / 8)
bit_idx = sensor_index % 8
if data is None:
return 0
else:
return data[byte_idx][bit_idx]
# Send data byte # Send data byte
def set(self, start_byte, val): def set(self, start_byte, val):
for byte, v in enumerate(val, start=start_byte): for byte, v in enumerate(val, start=start_byte):
@ -256,3 +270,14 @@ class USB_586x(Component):
# val from buffer channel # val from buffer channel
def vfbc(self, buffer, channel): def vfbc(self, buffer, channel):
return buffer[channel[0]][channel[1]] return buffer[channel[0]][channel[1]]
def set_out(self,output_name,value):
if output_name in self.out_bits.keys():
sensor_index = int(self.out_bits[output_name])
byte_idx=int(sensor_index/8)
bit_idx=sensor_index%8
self.set_bit_verify(byte_idx,bit_idx,value)
def set_in_bit(self, byte, bit, val):
self.sim_in[byte][bit] = val
return True

View File

@ -10,7 +10,7 @@ import traceback
import weakref import weakref
from datetime import datetime from datetime import datetime
from pathlib import Path from pathlib import Path
from ui.diagnostics import Diagnostics
from lib.helpers.single_process import SingleProcess from lib.helpers.single_process import SingleProcess
if platform.system().lower() == "windows": if platform.system().lower() == "windows":
@ -196,6 +196,8 @@ try:
self.main_window.table_selection_a.triggered.connect(self.set_recipe_mode_table) self.main_window.table_selection_a.triggered.connect(self.set_recipe_mode_table)
self.main_window.barcode_selection_a.triggered.connect(self.set_recipe_mode_barcode) self.main_window.barcode_selection_a.triggered.connect(self.set_recipe_mode_barcode)
self.main_window.ristampa_etichetta_a.triggered.connect(self.reprint_label) self.main_window.ristampa_etichetta_a.triggered.connect(self.reprint_label)
self.main_window.diagnostics_a.triggered.connect(
lambda checked, selfie=weakref.ref(self): selfie().main_window.open_dialog(Diagnostics(selfie())))
if "--users-management" in sys.argv: if "--users-management" in sys.argv:
self.main_window.users_management_a.trigger() self.main_window.users_management_a.trigger()

View File

@ -0,0 +1,47 @@
import time
from datetime import datetime
from PyQt5.QtWidgets import QApplication
from src.components.os_label_printer import *
from src.lib.helpers import ConfigReader
SYSTEM_ID = "ST-TEN-1"
START_SN=1
STOP_SN=40
TEMPLATE="ferrari_30x16_203.prn"
PRINTER_NAME="Zebra_Technologies_ZTC_ZD421-203dpi_ZPL"
config = ConfigReader(system_id=SYSTEM_ID)
config["label_printer"]["printer"] = PRINTER_NAME
printer=Os_Label_Printer(config=config,name="label_printer")
timenow = datetime.now()
app = QApplication(sys.argv)
for sn in range(START_SN,STOP_SN+1):
print(f"PRINTING LABEL # {sn}")
context = {
# RECIPE DATA
"PART": "000825276",
# SERIAL DEFINITION
"SN": str(sn),
"SN4": f"{sn:0>4}",
"SN5": f"{sn:0>5}",
"SN6": f"{sn:0>6}",
# TIME DEFINITION
"DATETIME": timenow.strftime("%d/%m/%Y %H:%M:%S"),
"DATE": timenow.strftime("%d/%m/%Y"),
"TIME": timenow.strftime("%H:%M:%S"),
"YYYY": timenow.strftime("%Y"),
"YY": timenow.strftime("%y"),
"MO": timenow.strftime("%m"),
"DD": timenow.strftime("%d"),
"HH": timenow.strftime("%H"),
"MI": timenow.strftime("%M"),
"SS": timenow.strftime("%S"),
"JJJ": timenow.strftime("%j"),
}
printer.print_label(TEMPLATE,context)
time.sleep(1)

43
src/test/test_usb586x.py Normal file
View File

@ -0,0 +1,43 @@
import os
import platform
import sys
import time
if platform.system() == "Windows":
sys.path.append(f"{os.getcwd()}\\src\\components")
else:
sys.path.append(f"{os.getcwd()}/src/components")
from src.components.usb_586x import USB_586x
from lib.helpers import ConfigReader
test_config = ConfigReader()
if "--5862" in sys.argv:
test_config["digital_io"]["id"] = "USB-5862,BID#0"
out_size = in_size = 16
else:
test_config["digital_io"]["id"] = "USB-5860,BID#0"
out_size = in_size = 8
digital_io = USB_586x(test_config)
digital_io.start()
# READ CONFIG
out_num = 0
n_in_bytes = int(in_size / 8)
while True:
out_bit = out_num % 8
out_byte = int(out_num / 8)
res = digital_io.set_bit(out_byte, out_bit, 1)
time.sleep(0.5)
res2 = digital_io.set_bit(out_byte, out_bit, 0)
input_data = digital_io.get()
if "--5862" in sys.argv:
print("in:{} {} out:{}".format(bytes(input_data[0]), bytes(input_data[1]), out_num))
else:
print("in:{} out:{}".format(bytes(input_data[0]), out_num))
time.sleep(0.5)
out_num += 1
if out_num == out_size:
out_num = 0

View File

@ -47,3 +47,4 @@ from .test_test import Test_Test
from .test_vision import Test_Vision from .test_vision import Test_Vision
from .users_management import Users_Management from .users_management import Users_Management
from .vision_step_editor import Vision_Step_Editor from .vision_step_editor import Vision_Step_Editor
from .diagnostics import Diagnostics

View File

@ -106,7 +106,7 @@ class Archive(Widget):
for archived in list(ArchiveDbModel.select()): for archived in list(ArchiveDbModel.select()):
exportable = { exportable = {
# "id": archived.id, # "id": archived.id,
"time": archived.time, "time": archived.timenow,
"user": archived.user, "user": archived.user,
"result": archived.result, "result": archived.result,
"overridden": archived.overridden, "overridden": archived.overridden,

View File

@ -0,0 +1 @@
from .diagnostics import Diagnostics

View File

@ -0,0 +1,132 @@
import sys
from PyQt5 import QtGui, QtCore
from PyQt5.QtCore import Qt, pyqtSlot
from PyQt5.QtWidgets import QTableWidgetItem, QPushButton, QHeaderView, QLabel, QLineEdit
from ui.widget import Widget
class Diagnostics(Widget):
def __init__(self, parent):
super().__init__()
self.parent = parent
self.simulate = "--sim-io" in sys.argv
self.inputs = self.parent.config["digital_inputs"]
self.outputs = self.parent.config["digital_outputs"]
self.color_red = "#f00"
self.color_green = "#0f0"
headers_out = ["OUTPUT", "SET"]
headers_in = ["INPUT", "STATUS"]
r = 0
self.latch = [False for o in range (len(self.outputs))]
self.latch_in = [False for i in range(len(self.inputs))]
# POPULATE OUTPUT TABLE
self.output_tb.setColumnCount(len(headers_out))
self.output_tb.setHorizontalHeaderLabels(headers_out)
self.output_tb.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.output_tb.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.output_tb.setRowCount(len(self.outputs))
self.output_tb.setVerticalHeaderLabels(list(self.outputs))
self.ICON_OK = QtGui.QPixmap("src/ui/icons/ok.png").scaled(30, 30, QtCore.Qt.KeepAspectRatio)
self.ICON_KO = QtGui.QPixmap("src/ui/icons/ko.png").scaled(30, 30, QtCore.Qt.KeepAspectRatio)
self.ICON_OFF = QtGui.QPixmap("src/ui/icons/off.png").scaled(30, 30, QtCore.Qt.KeepAspectRatio)
self.out_buttons=[QPushButton() for o in range(len(self.outputs))]
for output_name,output_idx in self.outputs.items():
for c, header in enumerate(headers_out):
if header == "ACTIVATE":
self.out_buttons[r].setCheckable(True)
self.out_buttons[r].setText("OFF")
self.output_tb.setCellWidget(r, c, self.out_buttons[r])
indexb = QtCore.QPersistentModelIndex(self.output_tb.model().index(r, c))
self.out_buttons[r].clicked.connect(lambda *args, index=indexb: self.plc_bit_toggle(index))
elif header == "OUTPUT":
i = QTableWidgetItem()
i.setText(str(output_idx))
self.output_tb.setItem(r, c, i)
r += 1
# POPULATE INPUT TABLE
self.input_tb.setColumnCount(len(headers_in))
self.input_tb.setHorizontalHeaderLabels(headers_in)
self.input_tb.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.input_tb.verticalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.input_tb.setRowCount(len(self.inputs))
self.input_tb.setVerticalHeaderLabels(list(self.inputs))
r = 0
if self.simulate:
self.in_buttons = [QPushButton() for i in range(len(self.outputs))]
for input_name, input_idx in self.inputs.items():
for c, header in enumerate(headers_in):
if header == "STATUS":
if self.simulate:
self.in_buttons[r].setCheckable(True)
self.in_buttons[r].setText("OFF")
self.input_tb.setCellWidget(r, c, self.in_buttons[r])
indexb = QtCore.QPersistentModelIndex(self.input_tb.model().index(r, c))
self.in_buttons[r].clicked.connect(lambda *args, index=indexb: self.in_bit_toggle(index))
else:
w = QLabel()
w.setPixmap(self.ICON_KO)
self.input_tb.setCellWidget(r, c, w)
elif header == "INPUT":
i = QTableWidgetItem()
i.setText(str(input_idx))
self.input_tb.setItem(r, c, i)
r += 1
if not self.simulate:
self.parent.components["digital_io"].update.connect(self.update)
def plc_bit_toggle(self,bit_num):
bit_num=bit_num.row()
byte_idx = int(bit_num / 8)
bit_idx = bit_num % 8
if self.latch[bit_num] is True:
self.latch[bit_num]=False
self.out_buttons[bit_num].setText("OFF")
else:
self.latch[bit_num]=True
self.out_buttons[bit_num].setText("ON")
self.parent.components["digital_io"].set_bit(byte_idx, bit_idx, self.latch[bit_num])
def digital_int_update(self, bit_num, output_name):
row_num = bit_num.row()
item = self.output_tb.cellWidget(row_num, 1)
try:
value = int(item.text(), 10)
self.parent.components["digital_io"].set_int(output_name, value)
except ValueError:
item.setText("")
def in_bit_toggle(self, bit_num):
bit_num = bit_num.row()
byte_idx = int(bit_num / 8)
bit_idx = bit_num % 8
if self.latch_in[bit_num] is True:
self.latch_in[bit_num] = False
self.in_buttons[bit_num].setText("OFF")
else:
self.latch_in[bit_num] = True
self.in_buttons[bit_num].setText("ON")
self.parent.components["digital_io"].set_in_bit(byte_idx, bit_idx, self.latch_in[bit_num])
# UPDATE DIGITAL INPUTS DISPLAY
@pyqtSlot(dict)
def update(self, data):
r = 0
for input_name, input_idx in self.inputs.items():
item = self.input_tb.cellWidget(r, 1)
input_idx = int(input_idx)
byte_idx = int(input_idx / 8)
bit_idx = input_idx % 8
if data[1][byte_idx][bit_idx]:
item.setPixmap(self.ICON_OK)
else:
item.setPixmap(self.ICON_KO)
r += 1
pass
def closeEvent(self, event):
self.components["digital_io"].set_bit("")

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>600</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>600</width>
<height>600</height>
</size>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="1" column="0">
<widget class="QTableWidget" name="input_tb"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>INPUTS</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_2">
<property name="text">
<string>OUTPUTS</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QTableWidget" name="output_tb"/>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -25,7 +25,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>843</width> <width>843</width>
<height>31</height> <height>27</height>
</rect> </rect>
</property> </property>
<widget class="QMenu" name="menuAbout"> <widget class="QMenu" name="menuAbout">
@ -50,6 +50,7 @@
</property> </property>
<addaction name="users_management_a"/> <addaction name="users_management_a"/>
<addaction name="save_tecna_recipes_a"/> <addaction name="save_tecna_recipes_a"/>
<addaction name="diagnostics_a"/>
</widget> </widget>
<widget class="QMenu" name="menuStrumenti"> <widget class="QMenu" name="menuStrumenti">
<property name="font"> <property name="font">
@ -128,6 +129,11 @@
<string>Ristampa etichetta</string> <string>Ristampa etichetta</string>
</property> </property>
</action> </action>
<action name="diagnostics_a">
<property name="text">
<string>Diagnostica</string>
</property>
</action>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>

View File

@ -94,6 +94,7 @@ class Recipe_Selection(Widget):
self.config.get("recipes_defaults", noner)["verifica_resistenza_connettore_abilitata"]) and "resistance" not in self.unsupported_steps, self.config.get("recipes_defaults", noner)["verifica_resistenza_connettore_abilitata"]) and "resistance" not in self.unsupported_steps,
"screws": len(self.config.get("recipes_defaults", noner)["avvitatura_abilitata"]) and "screws" not in self.unsupported_steps, "screws": len(self.config.get("recipes_defaults", noner)["avvitatura_abilitata"]) and "screws" not in self.unsupported_steps,
"instruction": len(self.config.get("recipes_defaults", noner)["istruzione_abilitata"]) and "instruction" not in self.unsupported_steps, "instruction": len(self.config.get("recipes_defaults", noner)["istruzione_abilitata"]) and "instruction" not in self.unsupported_steps,
"instruction_extra": len(self.config.get("recipes_defaults", noner)["istruzione_abilitata_extra"]) and "instruction_extra" not in self.unsupported_steps,
"leak_1": len(self.config.get("recipes_defaults", noner)["prova_tenuta_abilitata"]) and "leak_1" not in self.unsupported_steps, "leak_1": len(self.config.get("recipes_defaults", noner)["prova_tenuta_abilitata"]) and "leak_1" not in self.unsupported_steps,
"leak_2": len(self.config.get("recipes_defaults", noner)["prova_tenuta_abilitata_2"]) and "leak_2" not in self.unsupported_steps, "leak_2": len(self.config.get("recipes_defaults", noner)["prova_tenuta_abilitata_2"]) and "leak_2" not in self.unsupported_steps,
"vision": len(self.config.get("recipes_defaults", noner)["test_visione_abilitato"]) and "vision" not in self.unsupported_steps, "vision": len(self.config.get("recipes_defaults", noner)["test_visione_abilitato"]) and "vision" not in self.unsupported_steps,
@ -275,6 +276,9 @@ class Recipe_Selection(Widget):
if defaults is None: if defaults is None:
global noner global noner
defaults = self.config.get("recipes_defaults", noner) defaults = self.config.get("recipes_defaults", noner)
if 'codice_prodotto' not in defaults:
defaults['codice_prodotto'] = "VALORE_PREDEFINITO"
if csv_path is None: if csv_path is None:
csv_path, _ = QFileDialog.getOpenFileName( csv_path, _ = QFileDialog.getOpenFileName(
None, None,
@ -319,7 +323,7 @@ class Recipe_Selection(Widget):
else: else:
step.save() step.save()
recipe.client = row.get("cliente", defaults["cliente"]) recipe.client = row.get("cliente", defaults["cliente"])
recipe.part_number = row.get(part_number_field, defaults["part_number"]) recipe.part_number = row.get(part_number_field, defaults["codice_prodotto"])
recipe.description = row.get(description_field, defaults["descrizione"]) recipe.description = row.get(description_field, defaults["descrizione"])
recipe.spec = { recipe.spec = {
"count": len(row.get("dimensione_lotto_abilitata", defaults["dimensione_lotto_abilitata"])) and "count" not in self.unsupported_steps, "count": len(row.get("dimensione_lotto_abilitata", defaults["dimensione_lotto_abilitata"])) and "count" not in self.unsupported_steps,
@ -377,6 +381,8 @@ class Recipe_Selection(Widget):
if len(csv_dir): if len(csv_dir):
os.makedirs(csv_dir, exist_ok=True) os.makedirs(csv_dir, exist_ok=True)
recipe_name_field = self.config.get("recipe", {}).get("recipe_name_field", "codice_ricetta").strip() recipe_name_field = self.config.get("recipe", {}).get("recipe_name_field", "codice_ricetta").strip()
part_number_field = self.config.get("recipe", {}).get("part_number_field", "codice_prodotto").strip()
description_field = self.config.get("recipe", {}).get("description_field", "descrizione").strip()
barcode_enable_field = self.config.get("recipe", {}).get("barcode_enable_field", "verifica_codice_a_barre_abilitata").strip() barcode_enable_field = self.config.get("recipe", {}).get("barcode_enable_field", "verifica_codice_a_barre_abilitata").strip()
barcode_serial_field = self.config.get("recipe", {}).get("barcode_serial_field", "codice_a_barre").strip() barcode_serial_field = self.config.get("recipe", {}).get("barcode_serial_field", "codice_a_barre").strip()
print_template_field = self.config.get("recipe", {}).get("label_template_field", "modello_etichetta").strip() print_template_field = self.config.get("recipe", {}).get("label_template_field", "modello_etichetta").strip()
@ -384,7 +390,8 @@ class Recipe_Selection(Widget):
fieldnames = [ fieldnames = [
recipe_name_field, recipe_name_field,
"cliente", "cliente",
"part_number", part_number_field,
description_field,
"dimensione_lotto_abilitata", "dimensione_lotto_abilitata",
"dimensione_lotto", "dimensione_lotto",
"verifica_connettore_abilitata", "verifica_connettore_abilitata",
@ -434,7 +441,8 @@ class Recipe_Selection(Widget):
exportable = { exportable = {
recipe_name_field: recipe.name, recipe_name_field: recipe.name,
"cliente": recipe.client, "cliente": recipe.client,
"part_number": recipe.part_number, part_number_field: recipe.part_number,
description_field: recipe.description,
# "dimensione_lotto_abilitata": "x" if recipe.spec["count"] else "", # "dimensione_lotto_abilitata": "x" if recipe.spec["count"] else "",
# "dimensione_lotto": steps["count"].spec["amount"], # "dimensione_lotto": steps["count"].spec["amount"],
"verifica_connettore_abilitata": "x" if recipe.spec["connector"] else "", "verifica_connettore_abilitata": "x" if recipe.spec["connector"] else "",

View File

@ -59,6 +59,13 @@ class Recipe_Spec_And_Step_Editor(Editor):
"editor": Instruction_Step_Editor(), "editor": Instruction_Step_Editor(),
"tab": self.instruction_t, "tab": self.instruction_t,
}, },
"instruction_extra": {
"type": "instruction_extra",
"enable": self.instruction_extra_enabled_cb,
"widget": "instruction_extra_editor_w",
"editor": Instruction_Step_Editor(),
"tab": self.instruction_extra_t,
},
"leak_1": { "leak_1": {
"type": "leak_1", "type": "leak_1",
"enable": self.leak_enabled_1_cb, "enable": self.leak_enabled_1_cb,

View File

@ -38,7 +38,7 @@ Fasi di Test</string>
<item row="0" column="0" colspan="2"> <item row="0" column="0" colspan="2">
<widget class="QTabWidget" name="steps_tw"> <widget class="QTabWidget" name="steps_tw">
<property name="currentIndex"> <property name="currentIndex">
<number>0</number> <number>6</number>
</property> </property>
<widget class="QWidget" name="count_t"> <widget class="QWidget" name="count_t">
<attribute name="title"> <attribute name="title">
@ -260,7 +260,7 @@ Fasi di Test</string>
<string>Montaggio</string> <string>Montaggio</string>
</attribute> </attribute>
<layout class="QGridLayout" name="gridLayout_11"> <layout class="QGridLayout" name="gridLayout_11">
<item row="0" column="0"> <item row="1" column="0">
<spacer name="horizontalSpacer_20"> <spacer name="horizontalSpacer_20">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
@ -273,14 +273,10 @@ Fasi di Test</string>
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="0" column="1"> <item row="2" column="0" colspan="3">
<widget class="QCheckBox" name="instruction_enabled_cb"> <widget class="QWidget" name="instruction_editor_w" native="true"/>
<property name="text">
<string>Fase Abilitata</string>
</property>
</widget>
</item> </item>
<item row="0" column="2"> <item row="1" column="2">
<spacer name="horizontalSpacer_19"> <spacer name="horizontalSpacer_19">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
@ -293,8 +289,55 @@ Fasi di Test</string>
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="1" column="1">
<widget class="QCheckBox" name="instruction_enabled_cb">
<property name="text">
<string>Fase Abilitata</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="instruction_extra_t">
<attribute name="title">
<string>Montaggio extra</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_22">
<item row="0" column="0">
<spacer name="horizontalSpacer_41">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>572</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="instruction_extra_enabled_cb">
<property name="text">
<string>Fase Abilitata</string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_42">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>571</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0" colspan="3"> <item row="1" column="0" colspan="3">
<widget class="QWidget" name="instruction_editor_w" native="true"/> <widget class="QWidget" name="instruction_extra_editor_w" native="true"/>
</item> </item>
</layout> </layout>
</widget> </widget>

View File

@ -106,13 +106,15 @@ class Test(Widget):
text=u"EMERGENZA INTERVENUTA - RIPRISTINARE PULSANTE E SELEZIONARE \"RESET EMERGENZA\" DAL MEN\u00d9 \"STRUMENTI\"", widget=None), text=u"EMERGENZA INTERVENUTA - RIPRISTINARE PULSANTE E SELEZIONARE \"RESET EMERGENZA\" DAL MEN\u00d9 \"STRUMENTI\"", widget=None),
"fail": Test_Assembly(img_path=self.select_step_img("fail"), text=u"CICLO INTERROTTO, PREMERE CONTINUA PER COMINCIARE UN NUOVO CICLO", widget=Test_Fail(parent=self)), "fail": Test_Assembly(img_path=self.select_step_img("fail"), text=u"CICLO INTERROTTO, PREMERE CONTINUA PER COMINCIARE UN NUOVO CICLO", widget=Test_Fail(parent=self)),
"blow": Test_Assembly(img_path=None, text=u"SOFFIAGGIO TUBO IN CORSO - ATTENDERE...", widget=Test_Warning_Img(components=self.components, recipe=self.recipe, step=self.step)), "blow": Test_Assembly(img_path=None, text=u"SOFFIAGGIO TUBO IN CORSO - ATTENDERE...", widget=Test_Warning_Img(components=self.components, recipe=self.recipe, step=self.step)),
"leak_1": Test_Assembly(img_path=None, text=None, widget=Test_Leak(components=self.components, recipe=self.recipe, step=self.step, pieces=self.pieces, parent=self)) "leak_1": Test_Assembly(img_path=None, text=None, widget=Test_Leak(config=self.config,components=self.components, recipe=self.recipe, step=self.step, pieces=self.pieces, parent=self))
if self.config["hardware_config"]["tecna_t3"] != "absent" or self.config["hardware_config"]["furness_controls"] !="absent" else None, if self.config["hardware_config"]["tecna_t3"] != "absent" or self.config["hardware_config"]["furness_controls"] !="absent" else None,
"leak_2": Test_Assembly(img_path=None, text=None, widget=Test_Leak(components=self.components, recipe=self.recipe, step=self.step, pieces=self.pieces, parent=self)) "leak_2": Test_Assembly(img_path=None, text=None, widget=Test_Leak(config=self.config,components=self.components, recipe=self.recipe, step=self.step, pieces=self.pieces, parent=self))
if self.config["hardware_config"]["tecna_t3"] != "absent" or self.config["hardware_config"]["furness_controls"] != "absent" else None, if self.config["hardware_config"]["tecna_t3"] != "absent" or self.config["hardware_config"]["furness_controls"] != "absent" else None,
"flush": Test_Assembly(img_path=None, text=u"SCARICO ARIA IN CORSO - ATTENDERE...", widget=Test_Warning_Img(components=self.components, recipe=self.recipe, step=self.step)), "flush": Test_Assembly(img_path=None, text=u"SCARICO ARIA IN CORSO - ATTENDERE...", widget=Test_Warning_Img(components=self.components, recipe=self.recipe, step=self.step)),
"instruction": Test_Assembly(img_path=None, text=u"ESEGUIRE LE OPERAZIONI DI MONTAGGIO INDICATE IN FIGURA", "instruction": Test_Assembly(img_path=None, text=u"ESEGUIRE LE OPERAZIONI DI MONTAGGIO INDICATE IN FIGURA",
widget=Test_Instructions(config=self.config,components=self.components, recipe=self.recipe, bench_name=self.config.machine_id, step=self.step)), widget=Test_Instructions(config=self.config,components=self.components, recipe=self.recipe, bench_name=self.config.machine_id, step=self.step)),
"instruction_extra": Test_Assembly(img_path=None, text=u"ESEGUIRE LE OPERAZIONI DI MONTAGGIO EXTRA INDICATE IN FIGURA",
widget=Test_Instructions(config=self.config, components=self.components,recipe=self.recipe, bench_name=self.config.machine_id,step=self.step)),
"piece_removal": Test_Assembly(img_path=None, text=u"RIMUOVERE IL PEZZO APRENDO TUTTE LE CHIUSURE", "piece_removal": Test_Assembly(img_path=None, text=u"RIMUOVERE IL PEZZO APRENDO TUTTE LE CHIUSURE",
widget=Test_Instructions(config=self.config,components=self.components, recipe=self.recipe, bench_name=self.config.machine_id, step=self.step)), widget=Test_Instructions(config=self.config,components=self.components, recipe=self.recipe, bench_name=self.config.machine_id, step=self.step)),
"print": Test_Assembly(img_path=self.select_step_img("print"), text=u"STAMPA ETICHETTA IN CORSO", widget=None), "print": Test_Assembly(img_path=self.select_step_img("print"), text=u"STAMPA ETICHETTA IN CORSO", widget=None),
@ -375,6 +377,7 @@ class Test(Widget):
def set_recipe(self, recipe=None): def set_recipe(self, recipe=None):
self.recipe = recipe self.recipe = recipe
inserted_instruction = False
self.require_discard_piece = False self.require_discard_piece = False
if self.recipe is None: if self.recipe is None:
self.cycle_steps = None self.cycle_steps = None
@ -397,7 +400,6 @@ class Test(Widget):
n_pieces_adapted -= 1 n_pieces_adapted -= 1
new_barcode_step = copy.deepcopy(step) new_barcode_step = copy.deepcopy(step)
new_barcode_step.spec["n_pieces"] = str(n_pieces_adapted) new_barcode_step.spec["n_pieces"] = str(n_pieces_adapted)
n_pieces_adapted -= 1
steps.insert(i + 1, new_barcode_step) steps.insert(i + 1, new_barcode_step)
if i in skip: if i in skip:
continue continue
@ -437,6 +439,22 @@ class Test(Widget):
if step.type in ("leak_1", "leak_2"): if step.type in ("leak_1", "leak_2"):
self.leak_step = step self.leak_step = step
step_types = [step.type for step in steps]
if "leak_1" in step_types and "leak_2" in step_types:
leak1_index = step_types.index("leak_1")
leak2_index = step_types.index("leak_2")
if leak1_index + 1 == leak2_index: # Ensure 'leak_1' is immediately followed by 'leak_2'
steps.insert(leak2_index, Steps(type="instruction_extra", spec={}))
inserted_instruction = True
# Insert 'instruction_extra' after the first 'instructions' if not inserted between leaks
if not inserted_instruction:
for i, step in enumerate(steps):
if step.type == "instructions":
steps.insert(i + 1, Steps(type="instruction_extra", spec={}))
inserted_instruction = True
break
if not print_found: if not print_found:
steps.append(Steps(type="done")) steps.append(Steps(type="done"))
if count_found: if count_found:

View File

@ -48,7 +48,11 @@ class Test_Instructions(Test_Test):
self.get_connection = self.components["digital_io"].out.connect(self.get) self.get_connection = self.components["digital_io"].out.connect(self.get)
if step is not None: if step is not None:
svg_path=f"{self.svg_path}{self.recipe}.svg" if step.type == "instruction":
svg_path = f"{self.svg_path}{self.recipe}.svg"
elif step.type == "instruction_extra":
svg_path = f"{self.svg_path}{self.recipe}-extra.svg"
if not os.path.exists(svg_path): if not os.path.exists(svg_path):
svg_path=f"{self.svg_path}DEFAULT.svg" svg_path=f"{self.svg_path}DEFAULT.svg"
self.svg_root = etree.parse(svg_path) self.svg_root = etree.parse(svg_path)
@ -74,26 +78,32 @@ class Test_Instructions(Test_Test):
for elem in self.monitored_ids: for elem in self.monitored_ids:
sensor_name = elem.attrib['id'] sensor_name = elem.attrib['id']
sensor_index = int(sensor_name.split("_")[1]) - 3 sensor_index_part = sensor_name.split("_")[1]
try:
sensor_index = int(sensor_index_part) - 3
except ValueError:
sensor_index = sensor_index_part
inverse = '_inv' in sensor_name inverse = '_inv' in sensor_name
stat = '_stat' in sensor_name stat = '_stat' in sensor_name
if sensor_index not in self.inputs: if sensor_index not in self.inputs:
continue self.inputs[sensor_index] = False
if stat: if stat:
if inverse: if inverse and not self.inputs[sensor_index]:
self.expected_input_state = False if step and step.type == "instruction" else True
self.show_ok(elem) self.show_ok(elem)
self.show_icon(elem)
else: else:
self.expected_input_state = True if step and step.type == "instruction" else False
self.show_ok(elem) self.show_ok(elem)
self.show_icon(elem)
else: else:
if inverse: if inverse:
if not self.inputs[sensor_index]: if not self.inputs[sensor_index]:
self.show_ok(elem) self.show_ko(elem)
self.show_icon(elem) self.show_icon(elem)
else: else:
self.show_ko(elem) self.show_ok(elem)
if self.flag: if self.flag:
self.show_icon(elem) self.show_icon(elem)
else: else:
@ -160,11 +170,28 @@ class Test_Instructions(Test_Test):
if len(data[0]["digital_io"])==0: if len(data[0]["digital_io"])==0:
return return
for sensor in self.monitored_ids: for sensor in self.monitored_ids:
sensor_index = int(sensor.attrib['id'].split("_")[1])-3 sensor_name = sensor.attrib['id']
byte_idx=int(sensor_index/8) sensor_index_part = sensor.attrib['id'].split("_")[1]
bit_idx=sensor_index%8
if data[0]["digital_io"][byte_idx][bit_idx] == self.expected_input_state: try:
self.inputs[sensor_index] = True sensor_index = int(sensor_index_part) - 3
except ValueError:
sensor_index = sensor_index_part
inverse = 'inv' in sensor_name
byte_idx=int(sensor_index/8) if isinstance(sensor_index, int) else None
bit_idx=sensor_index%8 if isinstance(sensor_index, int) else None
current_bitstate = data[0]["digital_io"][byte_idx][bit_idx] if isinstance(sensor_index, int) else None
if 'stat' in sensor_name:
continue
if isinstance(sensor_index, int):
if (inverse and current_bitstate != self.expected_input_state) or (not inverse and current_bitstate == self.expected_input_state):
self.inputs[sensor_index] = True
else:
self.inputs[sensor_index] = False
ok = False
else: else:
self.inputs[sensor_index] = False self.inputs[sensor_index] = False
ok = False ok = False

View File

@ -48,14 +48,7 @@
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property> </property>
<layout class="QGridLayout" name="gridLayout_3"> <layout class="QGridLayout" name="gridLayout_3">
<item row="1" column="1"> <item row="2" column="0">
<widget class="QPushButton" name="print_b">
<property name="text">
<string>OK</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QWidget" name="svg_w" native="true"> <widget class="QWidget" name="svg_w" native="true">
<property name="minimumSize"> <property name="minimumSize">
<size> <size>

View File

@ -12,13 +12,14 @@ from ui.test_test import Test_Test
VALVE_TIME=0.5 VALVE_TIME=0.5
class Test_Leak(Test_Test): class Test_Leak(Test_Test):
def __init__(self, components=None, recipe=None, step=None, pieces=None, run_once=False, reset_on_start=True, enable_override=False,parent=None): def __init__(self, config,components=None, recipe=None, step=None, pieces=None, run_once=False, reset_on_start=True, enable_override=False,parent=None):
super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, reset_on_start=reset_on_start, enable_override=enable_override) super().__init__(components=components, recipe=recipe, step=step, pieces=pieces, run_once=run_once, reset_on_start=reset_on_start, enable_override=enable_override)
self.get_connection = None self.get_connection = None
self.io_ok = True self.io_ok = True
self.blow_on = False self.blow_on = False
self.parent=parent self.parent=parent
self.step=step self.step=step
self.config = config
self.recipe_written = False self.recipe_written = False
self.start_b.clicked.connect(self.start_test) self.start_b.clicked.connect(self.start_test)
self.stop_b.clicked.connect(self.stop_test) self.stop_b.clicked.connect(self.stop_test)
@ -144,10 +145,15 @@ class Test_Leak(Test_Test):
# AUTO START SECOND TEST # AUTO START SECOND TEST
if step.type == "leak_2": if step.type == "leak_2":
self.recipe_written = False if self.config["hardware_config"].get("dual_chanel","absent") == "present":
time.sleep(1) self.recipe_written = False
self.start_b.setEnabled(True) time.sleep(1)
self.start_b.click() self.start_b.setEnabled(True)
self.start_b.click()
else:
self.recipe_written = False
time.sleep(1)
self.start_b.setEnabled(True)
return show return show