Merge remote-tracking branch 'origin/master'
# Conflicts: # config/machine_settings/st-ten-11.ini
3
config/csv_import/ricette MULTIMATIC.csv
Normal 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
|
||||||
|
10
config/csv_import/ricette st-ten-8 19-09-2024.csv
Normal 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
|
||||||
|
3
config/csv_import/st-ten-11.csv
Normal 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
|
||||||
|
148
config/instruction_images/st-ten-11/07N131597.svg
Normal file
|
After Width: | Height: | Size: 297 KiB |
68
config/instruction_images/st-ten-11/07N131628.svg
Normal file
|
After Width: | Height: | Size: 216 KiB |
78
config/instruction_images/st-ten-11/5802820548-extra.svg
Normal file
|
After Width: | Height: | Size: 376 KiB |
@ -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 |
90
config/instruction_images/st-ten-11/98FA186CP-extra.svg
Normal file
|
After Width: | Height: | Size: 171 KiB |
90
config/instruction_images/st-ten-11/98FA186CP.svg
Normal file
|
After Width: | Height: | Size: 171 KiB |
49
config/instruction_images/st-ten-12/DEFAULT.svg
Normal 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 |
BIN
config/instruction_images/st-ten-12/img/arw-yel-down.png
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
config/instruction_images/st-ten-12/img/mb1.png
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
config/instruction_images/st-ten-12/img/mi1.PNG
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
config/instruction_images/st-ten-12/img/mi2.PNG
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
config/instruction_images/st-ten-12/img/ok.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
config/instruction_images/st-ten-12/img/rb1.PNG
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
config/instruction_images/st-ten-12/img/rb2.PNG
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
config/instruction_images/st-ten-12/img/rm1.PNG
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
config/instruction_images/st-ten-12/img/rm2.PNG
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
config/instruction_images/st-ten-12/img/tape_black.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
config/instruction_images/st-ten-12/img/tape_white.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
49
config/instruction_images/st-ten-13/DEFAULT.svg
Normal 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 |
BIN
config/instruction_images/st-ten-13/img/arw-yel-down.png
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
config/instruction_images/st-ten-13/img/mb1.png
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
config/instruction_images/st-ten-13/img/mi1.PNG
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
config/instruction_images/st-ten-13/img/mi2.PNG
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
config/instruction_images/st-ten-13/img/ok.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
config/instruction_images/st-ten-13/img/rb1.PNG
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
config/instruction_images/st-ten-13/img/rb2.PNG
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
config/instruction_images/st-ten-13/img/rm1.PNG
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
config/instruction_images/st-ten-13/img/rm2.PNG
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
config/instruction_images/st-ten-13/img/tape_black.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
config/instruction_images/st-ten-13/img/tape_white.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 116 KiB |
@ -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 |
@ -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 |
|
Before Width: | Height: | Size: 186 KiB After Width: | Height: | Size: 186 KiB |
@ -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 |
|
Before Width: | Height: | Size: 161 KiB After Width: | Height: | Size: 193 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 197 KiB |
|
Before Width: | Height: | Size: 184 KiB After Width: | Height: | Size: 184 KiB |
@ -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 |
|
Before Width: | Height: | Size: 464 KiB After Width: | Height: | Size: 91 KiB |
68
config/instruction_images/st-ten-5/5803119922.svg
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
config/label_designs/FERRARI/ferrari_30x16_203.nlbl
Normal file
30
config/label_templates/st-ten-1/ferrari_30x16_203.prn
Normal 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
|
||||||
53
config/label_templates/st-ten-1/ferrari_c01.prn
Normal 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
|
||||||
58
config/label_templates/st-ten-1/ferrari_stten8.prn
Normal 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
|
||||||
47
config/label_templates/st-ten-7/ETA013L.prn
Normal 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>
|
||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
93
config/machine_settings/st-ten-12.ini
Normal 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
|
||||||
93
config/machine_settings/st-ten-13.ini
Normal 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
|
||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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()
|
||||||
|
|
||||||
|
|||||||
47
src/scripts/print_labels.py
Normal 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
@ -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
|
||||||
@ -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
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
1
src/ui/diagnostics/__init__.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
from .diagnostics import Diagnostics
|
||||||
132
src/ui/diagnostics/diagnostics.py
Normal 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("")
|
||||||
47
src/ui/diagnostics/diagnostics.ui
Normal 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>
|
||||||
@ -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/>
|
||||||
|
|||||||
@ -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 "",
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||