Come eseguire le verifiche database a fini di automazione
Per aumentare il grado di automazione, è possibile eseguire verifiche in merito alla distribuzione di ordini, al grado di utilizzo e all'allestimento nel database del PPS, che forniscono in cambio criteri importanti. A tale scopo possono essere rivolte al database del PPS verifiche Select. Negli esempi qui in basso, il valore assegnato a d.uid è l'UID della macchina.
Per determinare l'UID a partire dal nome di rete della macchina è possibile ricorrere alle funzioni di conversione o alla funzione skrpps_02.skr_get_mc_list (vedi Diverse funzioni ausiliarie per ulteriori opzioni ottimizzate in termini di prestazioni).
Esempio:
SELECT "BO_GUID" from skrpps_02.skr_get_mc_list('skr') where "MC_NAME"='McNetworkName';
La query fornisce l'UID della macchina, se per McNetworkName
si utilizza il nome di rete delle macchine.
Dal database del PPS è possibile calcolare:
- Il numero di ordini cliente che
- devono essere ancora fatti e sono già stati assegnati alle macchine (APPROVED)
- sono attualmente in fase di disbrigo (IN_PROGRESS)
- per i quali è attualmente in corso un'attività (stampa) (IN_ACTIVITY)
- Verifica SQL:
SELECT count(t) FROM ticket t JOIN device d on t.device_id = d.id WHERE t.state in ('APPROVED', 'IN_PROGRESS', 'IN_ACTIVITY') AND d.uid='56665454'
- Nota:
Se si sostituiscecount(t)
con*
, si riceve una tabella con informazioni sui ticket e sulla macchina.
È possibile determinare in questo modo ad es. i nomi dei ticket o lo stato di disbrigo sulla macchina. - Per alcune applicazione si vuole solo conoscere il numero di ticket già in ToDo. Sostituisci ...
t.state in (…)
con ...t.state='APPROVED'
: - Al posto di
d.uid='56665454'
è possibile anche ricorrere ad.name='McNetworkName'
o ad.skrmachineid=1480329483
, per evitare di determinare l'UID. Tener presente comunque che solo l'UID è univoco. Il nome di rete può modificarsi. Quando si introduce nuovamente la macchina nell'SKR, cambia anche l'SKR ID. - Tempo entro il quale la macchina ha eseguito tutti gli ordini
È possibile calcolare la durata di tempo che impiega la macchina per ordini rilasciati. La base del calcolo è il tempo per telo specificato nell'ordine e l'efficienza del turno configurato, nonché, se utilizzato, il valore impostato nel tag STOLL:PRODUCTION_EFFICIENCY. Per ordini in corso con più teli viene fatto un calcolo approssimativo della fine. E con ogni telo il calcolo approssimativo si avvicina all'ora di fine effettiva.
Verifica SQL:SELECT max(t.endDate) FROM Ticket t JOIN Device d on t.device_id = d.id WHERE t.state in ('APPROVED','IN_PROGRESS', 'IN_ACTIVITY') AND d.uid='56665454'
- Stato di allestimento della macchina
- Con il PPS è possibile ripartire un ordine di allestimento sulle macchine.
Il ticket modello AutoProduction comprende già due campi e per l'immissione.
Nel ticket è possibile ricorrere a un tag che definisce uno stato di allestimento. Possono essere definiti più stati di allestimento, se l'allestimento si presta per più tessuti. Se non si intende ricorrere agli ordini di allestimento, lo stato di allestimento può essere impostato anche con un ticket di lavoro. - Lo stato di allestimento viene definito con questo tag:
<STOLL:REQUIRED_SETUP_LEVELS>
<STOLL:SETUP Level="F46r548"/>
<STOLL:SETUP Level="F15r773"/>
...
</STOLL:REQUIRED_SETUP_LEVELS> - Se un ticket viene portato sulla macchina a fini di lavorazione o risulta sbrigato, è possibile la ricerca di macchine che presentano ad es. questo stato di allestimento
F46r548
.
Query SQL della DB pps:SELECT d.name, d.uid, l.value from loopthroughitementry l JOIN orders_loopthroughitementry ol on l.id = ol.loopthroughitems_id JOIN Orders o ON o.id = ol.orders_id
JOIN Ticket t on t.order_id = o.id
JOIN Device d on t.device_id = d.id where
key='REQUIRED_SETUP_LEVELS' and l.value like '%"F46r548"%';
Query mediante un file batch su quando è pronta una macchina con tutti i ticket.
Nell'esempio seguente viene verificato il tempo di approntamento con tutti i ticket della macchina con un determinato UID.
Copiare il codice in un file batch, impostare la variabile Machine_UID su un valore tratto da una delle macchine ed eseguire il codice con diritti di amministratore. Nella variabile DONE_TIME si riceve il risultato della query.
@echo off
setlocal enabledelayedexpansion
set "PgLatestRootPath=C:\Program Files\Stoll\skr3\PostgreSql\9.5.5-1\bin"
set "PgRootPath=!PgLatestRootPath!"
if not exist "!PgRootPath!" Set "PgRootPath=C:\Program Files\Stoll\skr3\PostgreSql\9.5.3-1\bin"
set "Machine_UID=56665454"
call :GetDoneTime !Machine_UID! DONE_TIME
echo DONE_TIME=!DONE_TIME!, ErrorLevel=!ErrorLevel!
goto :EOF
:GetDoneTime
call :UndefErrorLevel
set "MC_UID=%~1"
set "ReturnDoneTimeValueRef=%~2"
set "DataVal=NULL"
set "PGPASSWORD=ppsfrontend"
set "PGCLIENTENCODING=utf-8"
set pd_SelCmd=SELECT max(t.endDate) FROM Ticket t JOIN Device d on t.device_id = d.id WHERE t.state in ('APPROVED','IN_PROGRESS', 'IN_ACTIVITY') AND d.uid='!MC_UID!';
set pg_SelCall="!PgRootPath!\psql" -U ppsfrontend -h localhost -d pps
set pg_cmd="echo !pd_SelCmd! | !pg_SelCall! || echo/ & echo/ & call echo NULL NULL %%^^^errorlevel%%"
set "pg_cmd=!pg_cmd:)=^)!"
REM Execute PG command and split up table at | and space. Resulting DataValue obtained from second column.
REM Check for errors of call
for /f "skip=2 tokens=1,2,3" %%i in ('!pg_cmd!') do (
REM Get value in first and second parameter from split - which is from third row
set "DataVal=%%i %%j"
REM If error happend, report it. Error code is obtained in 3rd parameter.
if "!DataVal!"=="NULL NULL" (
echo ## Postgres DB operation failed with ERROR: %%~k
set "DataVal=NULL"
) else (
REM Check if not valid
if "!DataVal:~0,1!"=="(" set "DataVal=NULL"
)
goto GotDoneTime
)
:GotDoneTime
if not '!ReturnDoneTimeValueRef!'=='' set "!ReturnDoneTimeValueRef!=!DataVal!"
if "!DataVal!"=="NULL" set "ERRORLEVEL=1" & exit /b 1
exit /b 0
:UndefErrorLevel
REM Undefine ERRORLEVEL, otherwise !ERRORLEVEL! keeps last set value. The ERRORLEVEL system value is not the same as !ERRORLEVEL!
set "ERRORLEVEL="
exit /b 0
Output esemplificativa:
D:\PPS\PpsJBossServer\PpsServerInstallScripts>GetDoneTimeByUID.bat
DONE_TIME=2017-07-18 13:57:33.818, ErrorLevel=0
Per verificare i tempi di arresto speciali:
Tempi di arresto con i dati seguenti:
- Macchine in caso di errore
- Altri arresti
- Tempo di esecuzione complessivo
- Macchine con SKR-ID
1530603103
e1530627696
- Intervallo da
2018-08-26 12:00
a2018-09-01 12:00
Queste informazioni possono essere ottenute mediante una statistica degli arresti personalizzata.
Con la creazione di un Secondary DB e l'attivazione di un report personalizzato.
A livello di prova, ciò è possibile con il pgAdmin Tool, ma non con tabelle temporanee che vengono cancellate automaticamente. Nell'esempio viene utilizzata la tabella mydb, che al termine della prova deve essere nuovamente cancellata nello schema report_01.
- 333
- Crea Secondary DB tables.
SELECT * FROM skrpps_02.skr_create_secundary_db_tables('report_01'::text ,'mydb'::text,'eUnlogged'::skrpps_02.e_sec_tabletype ,'skr'::text,ARRAY[1457359086, 1457359088],'2018-08-26 12:00'::timestamp,'2018-09-01 12:00'::timestamp,'999999','999'::interval);
- 334
- Generare un statistica degli arresti personalizzata.
- Per ottenere il risultato desiderato, aggiungere o sottrarre le colonne con operazioni di calcolo.
- Le nuove colonne dei risultati ricevono inoltre nomi a parte (
ERROR_STOP_DURATION
eOTHER_STOP_DURATION
). - La tabella viene ordinata in ordine crescente tramite la prima colonna (nome della macchina).
SELECT skrpps_02.skr_mcid2mcname( "AGG_MC_ID",'skr') AS "AGG_MC_NAME"
, "AGG_MC_ID",
("STOP_DURATION" - "ENGAGING_DURATION" - "PIECE_COUNTER_ZERO_DURATION" - "PROGRAMMING_DURATION" - "OFF_DURATION" - "BOOT_DURATION" - "NO_DATA_DURATION" - "MCSTATE_UNKNOWN_DURATION"
) AS "ERROR_STOP_DURATION",
("ENGAGING_DURATION" + "PIECE_COUNTER_ZERO_DURATION" + "PROGRAMMING_DURATION" + "OFF_DURATION" + "BOOT_DURATION" + "NO_DATA_DURATION" + "MCSTATE_UNKNOWN_DURATION") AS "OTHER_STOP_DURATION",
"RUN_DURATION"
FROM skrpps_02.eval_stop_statistic
(
'report_01' -- __sSchema text
,'mydb' -- _sTable_Prefix text
,Array['AGG_MC_ID'] -- _aSortorder text[]
,true -- _bGroupByMachine boolean
,false -- _bGroupByShift boolean
,false -- _bGroupByUserName boolean
,false -- _bGroupByPattern boolean
,false -- _bGroupBySeq boolean
,false -- _bGroupByTicketUid boolean
,false -- _bGroupByTicketProductionId boolean
,false -- _bGroupByTicketProductionSub1Id boolean
,false -- _bGroupByTicketProductionSub2Id boolean
,false -- _bGroupByTicketCustomerId boolean
,false -- _bGroupByTicketArticleId boolean
,NULL -- _aFilterShift integer[]
,NULL -- _aFilterUsername text[]
,NULL -- _aFilterPattern text[]
,NULL -- _aFilterSeq text[]
,NULL -- _aFilterTicketUid bigint[]
,NULL -- _aFilterTicketProductionId text[]
,NULL -- _aFilterTicketProductionsub1Id text[]
,NULL -- _aFilterTicketProductionsub2Id text[]
,NULL -- _aFilterTicketCustomerId text[]
,NULL -- _aFilterTicketArticleid text[]
,NULL -- _aFilterUserState Smallint[]
,NULL -- _aFilterSintralState Smallint[]
) where "OVERALL_DURATION" <> "NO_DATA_DURATION" order by 1 asc
Nota:
Con il programma Excel fornito a corredo (StollReportFromSkrToExcel.xlsb) è possibile configurare facilmente le impostazioni filtro di base e copiare la query Select.
Come accedere al database via ODBC
Esempio di risultato della query
Come trasferire un ordine senza creare un file XML direttamente nel database
Anziché scrivere i dati dell'ordine in un file XML e trasferire quindi quest'ultimo nella cartella D:\ERP\Input, attraverso una connessione al database del pps è possibile inserire l'ordine direttamente nel ticket_queue.
L'inserimento successivo inserisce un ordine con record di dati minimo per l'autoproduzione nel ticket_queue. L'intento è quello di ricaricare uno Jacquard per una produzione personalizzata con lotto di grandezza 1. Sono ugualmente possibili altre varianti di ordine.
Con il file Excel dell'esempio D:\PPS\ODBC_Examples\Excel\StollPpsTicketExportViaODBC.xlsm è possibile elaborare altre applicazioni.
Al riguardo è necessaria una connessione ODBC al database pps- e non al database skr.
Il tempo di lavoro (estimated_order_duration) viene trasmesso in millisecondi.
20 min devono essere riportati quindi come 20*60*1000=1200000
.
INSERT INTO "ticket_queue" (
ticket_number,
ticket_type,
pattern_subdirectory,
pattern_file_name,
total_num_of_executions,
estimated_order_duration,
custom_xml, machine_list_xml,
order_description,
pattern_preload_condition_xml
)
Values (
'145609_bandage_2154879',
'AUTO_PRODUCTION',
'production\Spring2019',
'CMSADF-3 KW.bandage_2154879.zip',
1,
1200000,
'<STOLL:CUSTOM xmlns="http://schemas.custom.com/ticketing/ticket/v0.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.custom.com/ticketing/ticket/v0.3 CustomTicket.xsd"/>',
'<STOLL:MACHINE_LIST>
<STOLL:MACHINE Name="312_ADF-3KW" BoIgnore="1" Pieces="1"/>
</STOLL:MACHINE_LIST>',
'Ticket created by Sapas',
'<STOLL:PATTERN_PRELOAD_CONDITION>
<STOLL:ERASE_ALL State="false"/>
<STOLL:ERASE_ALL_YARNCARRIERPOS State="false"/>
<STOLL:ERASE_ALL_SEQYARNCARRIERPOS State="false"/>
<STOLL:LOAD_PAT_CONTAINER_COMP SIN="false" JAC="true" SET="false"/>
</STOLL:PATTERN_PRELOAD_CONDITION>'
)
Calcolo dei teli prodotti nella produzione basata su ticket ancora in corso
Si desidera calcolare quanti teli della produzione in corso sono stati già prodotto sulle macchine?
Con la query seguente del database del PPS, si ricevono informazioni sulla produzione:
- quanti teli
- da quante macchine
- su quali macchine
- quale ticket
- quale ordine
- quanti ticket non sono stati ancora completati
SELECT d.name AS device_name, executionsdone, numberofexecutions, t.name AS ticket_name, ordernumber AS order_name, patternfilename FROM Ticket t JOIN Device d on device_id=d.id JOIN Orders o ON o.id = t.order_id WHERE o.type in ('GENERAL','AUTO_PRODUCTION', 'GUIDED_PRODUCTION') and t.state ='IN_PROGRESS' order by order_name