如何进行自动化数据库查询
为了提高自动化程度,可以在PPS数据库中提交关于订单分配、工作量和设置的查询,对此,数据库提供了重要依据。您可以向PPS数据库发送Select查询。在下面的示例中,分配到d.uid值是机器的UID。
要确定机器网络名称UID,可以使用转换功能或skrpps_02.skr_get_mc_list功能(其他性能导向选项请见不同帮助功能)。
示例:
SELECT "BO_GUID" from skrpps_02.skr_get_mc_list('skr') where "MC_NAME"='McNetworkName';
如果给 McNetworkName
输入机器的网络名称,查询将会提供机器的 UID。
从 PPS 数据库可以确定:
- 订单的数量
- 仍旧需要编织的并已经分配到机器上的(APPROVED)
- 当前正在处理的(IN_PROGRESS)
- 当前正在执行任务的(打印任务)(IN_ACTIVITY)
- 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'
- 注意:
如果您用*
替换count(t)
,会收到一个关于工票和机器信息的一个表。
这样,您可以确定相应信息,例如,工票的名称或机器所处的进程状态。 - 对于某些应用程序,只需要要知道有多少个工票已经处于 ToDo 状态。因此,...
t.state in (…)
替换成...t.state='APPROVED'
。 - 也可以不使用
d.uid='56665454'
,而使用d.name='McNetworkName'
或d.skrmachineid=1480329483
来跳过确定 UID 的过程。请注意,只有UID是唯一的。网络名可以变化。在SKR中重新输入机器时,SKRID也会改变。 - 直至机器处理完所有订单的时间。
可以确定机器还将需要多长时间来处理已下发的订单。计算的基础是订单中设定的每片的编织时间和班效率设置以及正在使用的在STOLL:PRODUCTION_EFFICIENCY标签里建立的数值。对于那些有很多片处于正在处理状态的订单,采用外推方式推断结束时间。每片结束时间近似实际的结束时间。
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'
- 机器的设置状态
- 通过PPS可以将一个setup订单分配到机器上。
工票模板AutoProduction已经包含字段两个 和
一个定义 setup 状态的标签可以用在工票里。如果 setup 适用于多个织片,则可以定义多个 setup 状态。如果不使用 setup 订单的话,也可以用编织工票来确定 setup状态。 - setup 状态是通过这个标签来确定的:
<STOLL:REQUIRED_SETUP_LEVELS>
<STOLL:SETUP Level="F46r548"/>
<STOLL:SETUP Level="F15r773"/>
...
</STOLL:REQUIRED_SETUP_LEVELS> - 如果在机器上工票的状态为处理中或已完成,那么可以检测到机器 setup 状态
F46r548
。
pps 数据库SQL查询: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"%';
通过批处理文件查询机器完成所有工票的时间
在以下示例中,查询一台指定 UID 的机器完成了所有工票的时间。
将代码复制到一个批处理文件中,将Machine_UID变量设成机器之一的值,以管理员权限执行代码。在DONE_TIME处接收到查询结果。
@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
输出示例:
D:\PPS\PpsJBossServer\PpsServerInstallScripts>GetDoneTimeByUID.bat
DONE_TIME=2017-07-18 13:57:33.818, ErrorLevel=0
查询指定停机时间:
具有以下数据的停机时间:
- 机器发生故障时
- 其他停机情况
- 总的运行时间
- 具有 SKR-ID
1530603103
和1530627696
的机器 - 时间段
2018-08-26 12:00
至2018-09-01 12:00
这个信息可以通过个性化停机统计来获得。
生成一个 Secondary DB 并触发个性化报告。
为了进行测试,可以使用 pgAdmin Tool,但不要用临时表,会被自动删除。在示例中,使用 mydb 表,在结束测试后必须要在 report_01 架构里删除。
- 587
- 创建 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);
- 588
- 生成单独的自停统计。
- 使用算术运算加减列以获得所需的结果。
- 此外,结果列会获得自己的名称(
ERROR_STOP_DURATION
和OTHER_STOP_DURATION
) - 该表按第一列(机器名称)升序排序。
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
注意:
使用交付的 Excel 程序(StollReportFromSkrToExcel.xlsb),您可以轻松配置基本筛选设置并复制选择查询。
如何通过 ODBC 访问数据库
查询结果示例
如果在不生成一个 XML 文件的情况下直接添加一个订单到数据库
您可以用一个到 pps 数据库的数据库链接直接把订单插入到 ticket_queue,而不是将订单数据写入到一个 XML 文件里然后再保存到 D:\ERP\Input 文件夹中。
随后插入的内容添加了一个订单到 ticket_queue,这个订单包含用于自动生产的最少数据记录。这种方式用于在批量大小为1的个性化生产时重新加载提花,其他订单形式也是可以的。
在示例 Excel 文件 D:\PPS\ODBC_Examples\Excel\StollPpsTicketExportViaODBC.xlsm 基础上可以开发更多的应用。
为此,需要一个到 pps 和 skr 数据库的 ODBC 连接。
编织时间(estimated_order_duration)是以毫秒为单位传输的。
因此,20 分钟将输入为 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>'
)
针对基于正在运行工票的生产,确定已完成的件数
您想知道机器上正在进行的生产已经编织完多少件?
查询 PPS 数据库,将获得有关生产的如下信息。
- 多少件
- 来自多少台机器
- 在哪些机器上
- 哪个工票
- 哪个订单
- 有多少未完成工票
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