Cómo realizar consultas de bases de datos acerca de la automatización

Para aumentar el grado de automatización, es posible realizar consultas en la base de datos del PPS referentes a la distribución del pedido, el grado de utilización y la preparación que proporcionan importantes criterios para ello. Para ello es posible dirigir consultas Select a la base de datos del PPS. En los ejemplos más abajo el valor asignado a d.uid es la UID de la máquina.

Para determinar la UID en base al nombre de red de la máquina, usted puede utilizar funciones de conversión o la función skrpps_02.skr_get_mc_list (ver Diferentes funciones auxiliares para otras opciones que optimizan el rendimiento).
Ejemplo:

SELECT "BO_GUID" from skrpps_02.skr_get_mc_list('skr') where "MC_NAME"='McNetworkName';

La consulta le proporciona la UID de la máquina si utiliza el nombre de red de su máquina para McNetworkName.

Se puede determinar desde la base de datos del PPS:

Consulta referente a la finalización de todos los tickets en una máquina a través de un archivo de lotes

En el siguiente ejemplo se consulta cuando la máquina con determinada UID finaliza todos los tickets.

Copie el código en un archivo de lotes, ajuste la variable Machine_UID en un valor de una de sus máquinas y ejecute el código con derechos de administrador. En la variable DONE_TIME recibirá el resultado de la consulta.

@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

Salida del ejemplo:

D:\PPS\PpsJBossServer\PpsServerInstallScripts>GetDoneTimeByUID.bat
DONE_TIME=2017-07-18 13:57:33.818, ErrorLevel=0

Consultar tiempos de parada especiales:

Tiempos de parada con los siguientes datos:

  • Máquinas en caso de error
  • Otras paradas
  • Tiempo total de tisaje
  • Máquinas con SKR-ID 1530603103 y 1530627696
  • Período de 2018-08-26 12:00 a 2018-09-01 12:00

Estas informaciones pueden ser determinadas a través de una estadística de parada individualizada.
A través de la creación de un Secondary DB y el inicio de un reporte individualizado.
Se puede hacer un test con el pgAdmin Tool, pero no con tablas temporales que son eliminadas automáticamente. En el ejemplo se utiliza la tabla mydb, que debe ser eliminada después de finalizar el test en el esquema report_01.

    841
    Crear 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);

    842
    Generar una estadística de parada individual
  • Sumar o restar columnas con operaciones de cálculo para obtener el resultado deseado.
  • Además las nuevas columnas de resultados reciben nombres propios (ERROR_STOP_DURATION y OTHER_STOP_DURATION).
  • La tabla es ordenada en forma ascendente por la primera columna (nombre máquina).

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 el programa Excel suministrado (StollReportFromSkrToExcel.xlsb) usted puede configurar fácilmente los ajustes básicos del filtro y copiar la consulta de selección.
Cómo acceder a la base de datos vía ODBC

 

Ejemplo del resultado de la consulta

Así envía un pedido directamente a la basa de datos sin crear un archivo XML

En vez de escribir los datos del pedido en un archivo XML y guardarlo en la carpeta D:\ERP\Input, puede insertar el pedido directamente en la cola de tickets ticket_queue hacia la base de datos del pps utilizando una conexión a la base de datos.

La inserción que le sigue inserta un pedido con un registro de datos mínimo en la cola de tickets ticket_queue para la producción automática. Está pensado para recargar un Jacquard en caso de una producción individual con un tamaño de lote de 1. Otras variantes de pedidos también son posibles.

A través del ejemplo del archivo Excel D:\PPS\ODBC_Examples\Excel\StollPpsTicketExportViaODBC.xlsm, usted puede elaborar otras aplicaciones.

Esto requiere de una conexión ODBC al pps y no a la base de datos skr.
El tiempo de tisaje (estimated_order_duration) es entregado en milisegundos.
Por consiguiente 20 min deben ser entrados como 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>'
)

Identifique las piezas producidas en la producción continua basada en tickets

¿Quiere saber cuántas piezas de la producción actual ya se han producido en las máquinas?

La siguiente consulta de la base de datos PPS le brinda información sobre la producción:

  • Cuántas piezas
  • De cuantas maquinas
  • En que maquinas
  • Cual ticket
  • Cual pedido
  • Cuantos tickets non finalizados

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