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:
- Cantidad de pedidos que
- todavía están para procesar y ya le fueron asignados a la máquina (APPROVED)
- momentáneamente están en progreso (IN_PROGRESS)
- momentáneamente se realiza una actividad (imprimir) (IN_ACTIVITY)
- Consulta 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:
Si reemplazacount(t)
con*
, se visualizará una tabla con informaciones acerca de los tickets y de la máquina.
Así usted puede determinar p.ej. el nombre de los tickets o el progreso en la máquina. - Para algunas aplicaciones solo se desea saber la cantidad de tickets que ya se encuentran en ToDo. Para ello sustituya ...
t.state in (…)
por ...t.state='APPROVED'
. - En vez de
d.uid='56665454'
también puede entrard.name='McNetworkName'
od.skrmachineid=1480329483
, para ahorrarse la determinación de la UID. Pero tenga en cuenta que solo la UID es inequívoca. El nombre de red puede cambiar. Cuando nuevamente incluye la máquina en el SKR, también cambia la ID de SKR. - Tiempo que demora la máquina en procesar todos los pedidos
Es posible determinar durante cuanto tiempo la máquina estará ocupada con los pedidos liberados. La base para el cálculo es el tiempo por pieza que fue especificado en el pedido y la eficiencia de turno configurada así como el valor establecido en la etiqueta STOLL:PRODUCTION_EFFICIENCY, si fue utilizado. En caso de pedidos en curso con varias piezas se realiza una extrapolación hacia la finalización . Y con cada pieza, la extrapolación se acerca a la real hora de finalización.
Consulta 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'
- Estado de preparación de la máquina
- A través del PPS es posible distribuir un pedido de preparación a las máquinas.
La plantilla para tickets AutoProduction ya contiene dos campos y para su entrada.
En el ticket se puede utilizar una etiqueta que define el estado de preparación. Se pueden definir varios estados de preparación si la preparación es adecuada para varios tejidos. El estado de preparación también puede ser establecido con un ticket de tisaje si no se deben utilizar pedidos de preparación. - El estado de preparación es determinado a través de esta etiqueta:
<STOLL:REQUIRED_SETUP_LEVELS>
<STOLL:SETUP Level="F46r548"/>
<STOLL:SETUP Level="F15r773"/>
...
</STOLL:REQUIRED_SETUP_LEVELS> - Si un ticket así es entrado en el procesamiento en la máquina o está procesado, es posible buscar por máquinas p.ej. con este estado de preparación
F46r548
.
Consulta SQL de la base de datos de 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"%';
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
y1530627696
- Período de
2018-08-26 12:00
a2018-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
yOTHER_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