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:

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 e 1530627696
  • Intervallo da 2018-08-26 12:00 a 2018-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 e OTHER_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