Merge pull request 'Phase 11: Data Set Service and reporting' (#12) from docs/phase-11-datasets-reports into main
Reviewed-on: cliu/ci-server-config#12
This commit is contained in:
commit
668a1d2e31
27 changed files with 1323 additions and 12 deletions
|
|
@ -37,4 +37,4 @@ Rules:
|
||||||
| Check groups, units, clients, rollover with `hisdbg` | `tasks/history-checks.md` | verified |
|
| Check groups, units, clients, rollover with `hisdbg` | `tasks/history-checks.md` | verified |
|
||||||
| Archive / retrieve, `hasdbg` | C40 summary §4, L20 summary §5 | from docs (no archive device) |
|
| Archive / retrieve, `hasdbg` | C40 summary §4, L20 summary §5 | from docs (no archive device) |
|
||||||
| Repair and recovery (`hisrep`, `hisrecover`, `isfrename`, `hiswrn`) | L20 summary §4 | from docs |
|
| Repair and recovery (`hisrep`, `hisrecover`, `isfrename`, `hiswrn`) | L20 summary §4 | from docs |
|
||||||
| Reading history from classes, reports, ODBC | C40 summary §5 | from docs (phases 6, 11) |
|
| Reading history from classes and reports; ODBC | C40 summary §5; reports: skill `reporting` | verified for reports (`rql-interactive.md`); ODBC from docs |
|
||||||
|
|
|
||||||
45
.claude/skills/reporting/SKILL.md
Normal file
45
.claude/skills/reporting/SKILL.md
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
---
|
||||||
|
name: reporting
|
||||||
|
description: >-
|
||||||
|
CI Server R1.03 REPORT Service, report definitions and RQL. Use when the user wants to create,
|
||||||
|
change, schedule or delete a report (daily / shift / hourly report, report triggered by an
|
||||||
|
item value or status, ad-hoc report with parameters such as an item, object, date or list),
|
||||||
|
write or debug an RQL query (SELECT from item_val, item_history, alarm_current, alarm_chrono,
|
||||||
|
audit_trail, unit_df …, COLUMN formats, HEADER/FOOTER, cursors DECLARE/FETCH, LOOP, GPV_VALUE,
|
||||||
|
@P0 parameters, @DATE), generate a report now (GENERATE), view, print or delete generated
|
||||||
|
reports (REPORT_VAL), output a report to a file, CSV (SPOOL, @EXPORT) or HTML, use a logbook,
|
||||||
|
set up report printers (printer device, destination, FILE / HARDCOPY output, PRINTER_DEV_DF,
|
||||||
|
PRINTER_DEST_DF), try queries in the interactive report generator (rptgen -s rptgen.rpt), stop
|
||||||
|
a hanging report (rptstp), check REPORT Service (rptman, rptge1, rptman.sup, rptge1.rpt,
|
||||||
|
report_start), use the system reports (ALARM_HISTORY, AUDIT_TRAIL, ITEM_HISTORY, SYSTEM_LOG …),
|
||||||
|
put a report component on a display, or use the Excel Add-in (DART) for reports. Sources
|
||||||
|
IM 36K10C30-01EN, IM 36K10P20-01EN, IM 36K10R40-01EN, IM 36K10E10-01EN.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Reporting (R1.03)
|
||||||
|
|
||||||
|
Background: `knowledge/manuals/IM36K10C30-01EN.md` (report definition fields, scheduling and
|
||||||
|
trigger behaviour, devices, generated reports, system reports), `IM36K10P20-01EN.md` (RQL),
|
||||||
|
`IM36K10R40-01EN.md` (REPORT Service processes and set-up files), `IM36K10E10-01EN.md` (Excel
|
||||||
|
Add-in), `IM36K10L50-01EN.md` (datasets, `dssqld`).
|
||||||
|
|
||||||
|
Rules:
|
||||||
|
- Run `system-check` first; follow the user's chosen way of working.
|
||||||
|
- Report names ≤ 16 characters. Report queries only **read**, except `SPV_*` functions and
|
||||||
|
`GPV_VALUE(<item>, <non-zero>)` (resets the item) — never use those without approval.
|
||||||
|
- A scheduled report runs on its own; schedule at least every 10 minutes and set a lifetime, or
|
||||||
|
generated reports pile up in history.
|
||||||
|
- Generator set-up files (`tls\sup\*.rpt`), `rptman.sup` and `report_start.cmd` need admin rights
|
||||||
|
and a restart: hand them to the user (skill `portal-setup`, `change-setup-file.md`).
|
||||||
|
- Example names come from `CI-Eng-Sample` (`CIENG_TANK1`, `CIENG_INFLOW_HI`, `CIENG_HTML`,
|
||||||
|
destination `CIENG_FILE`).
|
||||||
|
|
||||||
|
| Task | File | Status |
|
||||||
|
|---|---|---|
|
||||||
|
| Check REPORT Service: processes, set-up files, system reports, stop a hanging report (`rptstp`) | `tasks/report-checks.md` | verified |
|
||||||
|
| Try RQL in the interactive generator (`rptgen -s rptgen.rpt`), CSV with `SPOOL` | `tasks/rql-interactive.md` | verified |
|
||||||
|
| Define reports by quick load (ad hoc with parameters, schedule, item trigger, HTML, logbook); generate, read, print, delete; remove | `tasks/define-reports.md` | verified (command line and Engineering Module) |
|
||||||
|
| Report output to a file: printer device and destination | `tasks/output-devices.md` | verified |
|
||||||
|
| Report component on a display; Operator Interface generate/view | C30 summary §5 | from docs |
|
||||||
|
| Hardcopy printers, application devices, more generators, separate RPI servers | C30 summary §3, R40 summary §1, §3 | from docs |
|
||||||
|
| Excel Add-in (DART) | E10 summary | from docs (Excel not installed on the test system) |
|
||||||
140
.claude/skills/reporting/tasks/define-reports.md
Normal file
140
.claude/skills/reporting/tasks/define-reports.md
Normal file
|
|
@ -0,0 +1,140 @@
|
||||||
|
---
|
||||||
|
task: Define reports by quick load (ad hoc with parameters, schedule, item trigger, HTML, logbook); generate, read, print and delete generated reports; remove reports
|
||||||
|
version: R1.03
|
||||||
|
source: IM 36K10C30-01EN §2.1, §2.3.1, §3, App. 1; IM 36K10L50-01EN App. 1 (REPORT_DF, REPORT_VAL); IM 36K10P20-01EN; practiced on CI-Eng-Sample 2026-10-01
|
||||||
|
status: verified
|
||||||
|
---
|
||||||
|
|
||||||
|
# Define and run reports
|
||||||
|
|
||||||
|
Reports live in `REPORT_DF` (definitions) and `REPORT_VAL` (generated reports). This task uses
|
||||||
|
quick load (`dssqld`); the Engineering Module equivalent is *Configuration > Reporting > Reports*
|
||||||
|
(right-click › *Add*; tabs *General*, *Query*, *Time scheduling*, *Item triggering*). Field
|
||||||
|
meanings: `knowledge/manuals/IM36K10C30-01EN.md` §2. Test queries first in the interactive
|
||||||
|
generator (`rql-interactive.md`). Working examples: `examples/CI-Eng-Sample/18_report_df.qli`.
|
||||||
|
|
||||||
|
## 1. Report definition file
|
||||||
|
|
||||||
|
```
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,DESCRIPTION,PRIORITY,ADHOC_ENABLED,LOGBOOK_ENABLED,LIFE_TIME,ACTIVATION_TIME,GENERATION_INTERVAL,CORRECT_DAYLIGHT,DEST_NAME,ADHOC_DEST,PARAM_PROMPT_1,QUERY
|
||||||
|
|
||||||
|
@REPORT_DF
|
||||||
|
"<REPORT>","<description>",0,1,1,"1 Weeks","01-01-2026 06:00:00","1 Days",1,"<DEST>","<DEST>","[ITEM:NAME like ""<Section>.*""]Item:",\
|
||||||
|
@"
|
||||||
|
select name, item_value, status from item_val where name like '<Section>.%';
|
||||||
|
if @p0 = '' then
|
||||||
|
set @item '<Section>.<Tag>';
|
||||||
|
else
|
||||||
|
set @item @p0;
|
||||||
|
endif;
|
||||||
|
select count(item_value), avg(item_value) from item_history
|
||||||
|
where item_name = @item and sample_time > @date - 3600;
|
||||||
|
"@
|
||||||
|
```
|
||||||
|
|
||||||
|
`dssqld -i <file>.qli -l <file>.qlo`, check `Errors` 0. Inside the query use single quotes for
|
||||||
|
strings; the memo runs from `@"` to `"@` and needs no `\` continuation.
|
||||||
|
|
||||||
|
| Want | Fields |
|
||||||
|
|---|---|
|
||||||
|
| Ad hoc only | `ADHOC_ENABLED` 1; leave `ACTIVATION_TIME` / `GENERATION_INTERVAL` out |
|
||||||
|
| Parameters | `PARAM_PROMPT_n` (`[ITEM:<filter>]`, `[OBJECT:<class>:<filter>]`, `[DATE:TIME]`, `[LIST:a:b]` + text); the query reads `@P0`… (strings; `number(@p0)` for numbers and dates) |
|
||||||
|
| Schedule | `ACTIVATION_TIME` (first run, `dd-mm-yyyy hh:mm:ss`), `GENERATION_INTERVAL` **≥ 10 minutes** (`HIS-E-ROLLTOFAST` otherwise), `CORRECT_DAYLIGHT` 1 for a fixed local time |
|
||||||
|
| Item trigger | `TRIGGER_ITEM`, `TRIGGER_CON_1` (`Greater Than`, `Less Than`, `Equal To`, `Not Equal To`, `Greater Or Equal Than`, `Less Or Equal Than`), `TRIGGER_VAL_1`, optional second condition with `TRIGGER_COMB` `And`/`Or`, or status `TRIGGER_STAT_1/2`; `DELAY` e.g. `"5 Seconds"` |
|
||||||
|
| Output | `DEST_NAME` (scheduled and triggered runs) and `ADHOC_DEST` (ad-hoc runs): destinations from `output-devices.md` |
|
||||||
|
| Keep for | `LIFE_TIME` (also the lifetime of the report's storage group) |
|
||||||
|
| Logbook | `LOGBOOK_ENABLED` 1, text in `LOGBOOK` (memo); query: `logbook_text('<REPORT>')` |
|
||||||
|
| HTML | query writes `<HTML>…</HTML>` lines after `header ''; footer ''; set @page_size 0; set @width 512;` — `CONTAINS_HTML` becomes 1 by itself |
|
||||||
|
|
||||||
|
Loading creates a storage group of type *Report* with the report's name (`HIS_GROUP_DF`). The page
|
||||||
|
header/footer come from `tls\sup\rptge1.rpt` (customer name, description, date, report name, page)
|
||||||
|
unless the query sets its own.
|
||||||
|
|
||||||
|
Change a report: `dssqld -m` with `NAME` plus the fields to change.
|
||||||
|
|
||||||
|
## 2. Generate now (ad hoc)
|
||||||
|
|
||||||
|
```
|
||||||
|
@FIELDS
|
||||||
|
NAME,PARAM_VALUE_1,GENERATE
|
||||||
|
@REPORT_DF
|
||||||
|
"<REPORT>","<answer to prompt 1>",1
|
||||||
|
```
|
||||||
|
|
||||||
|
`dssqld -m`. `GENERATE` returns to 0 when finished (a second or two for small reports). The run is
|
||||||
|
made as user `FULL AUTHORIZATION` by `DSSQLD<pid>`; without `ADHOC_DEST` the manager then logs
|
||||||
|
`FSL-E-PRT_UNKUSER` (the report is still stored, ISS-045).
|
||||||
|
|
||||||
|
## 3. Read generated reports
|
||||||
|
|
||||||
|
```
|
||||||
|
@FIELDS
|
||||||
|
NAME,GENERATION_TIME,DELETION_TIME,USER_NAME,ACTION_PROCESS,CONTAINS_HTML,REPORT
|
||||||
|
@SELECT
|
||||||
|
'REPORT_NAME = "<REPORT>"'
|
||||||
|
@REPORT_VAL
|
||||||
|
```
|
||||||
|
|
||||||
|
`dssqld -e out.qlo <file>.qli` (no `-c`: the `REPORT` memo is multi-line). `NAME` is
|
||||||
|
`<REPORT>.<DD-MON-YY hh:mm:ss>`; `DELETION_TIME` = generation + lifetime; `ACTION_PROCESS` is
|
||||||
|
`RPTMAN` for scheduled/triggered runs. Engineering Module: expand the report, right-click a
|
||||||
|
generated report › *View*.
|
||||||
|
|
||||||
|
## 4. Print / send a generated report to a destination
|
||||||
|
|
||||||
|
```
|
||||||
|
@FIELDS
|
||||||
|
NAME,DEST_NAME,PRINT
|
||||||
|
@REPORT_VAL
|
||||||
|
"<REPORT>.01-OCT-26 15:57:53","<DEST>",1
|
||||||
|
```
|
||||||
|
|
||||||
|
`dssqld -m`; check `PRINTER_JOB_OVV` and `umhlog.log` (`output-devices.md` §4).
|
||||||
|
|
||||||
|
## 5. Schedule and trigger behaviour (verified)
|
||||||
|
|
||||||
|
- After each run `ACTIVATION_TIME` moves to the next slot. A start time in the past is moved
|
||||||
|
forward, not caught up.
|
||||||
|
- `CORRECT_DAYLIGHT` 0 counts in UTC: 06:00 set in summer time ran at 05:00 in winter time.
|
||||||
|
- An item trigger fires when the condition **becomes** true: 0 → 450 (limit 400) gave a report
|
||||||
|
after the 5 s delay; 450 → 430 did not; back to 0 and up again gave another.
|
||||||
|
|
||||||
|
## 6. Delete generated reports and remove reports
|
||||||
|
|
||||||
|
- One generated report: `dssqld -r` on `REPORT_VAL` with `@FIELDS NAME` and the full name (needs
|
||||||
|
`REPORT_DELETE_GENERATED_REPORT`).
|
||||||
|
- A report definition: **clear the schedule first** — a scheduled report cannot be deleted
|
||||||
|
(`RPT-E-ACTIVE`):
|
||||||
|
|
||||||
|
```
|
||||||
|
@FIELDS
|
||||||
|
NAME,ACTIVATION_TIME,GENERATION_INTERVAL
|
||||||
|
@REPORT_DF
|
||||||
|
"<REPORT>","",""
|
||||||
|
```
|
||||||
|
|
||||||
|
`dssqld -m`, then `dssqld -r` with `@FIELDS NAME` / `@REPORT_DF` / `"<REPORT>"`. This also deletes
|
||||||
|
the report's storage group, all its generated reports and its logbook file
|
||||||
|
(`%TLS_DAT_PATH%\<report>.lbk`). Remove reports before the trigger items and the destinations
|
||||||
|
they use.
|
||||||
|
|
||||||
|
## Verified on CI-Eng-Sample (2026-10-01)
|
||||||
|
|
||||||
|
`CIENG_TANK1` (parameter `[ITEM:…]`, daily 06:00 with `CORRECT_DAYLIGHT` 1, ad-hoc destination),
|
||||||
|
`CIENG_INFLOW_HI` (trigger `TANK1.INFLOW` > 400, delay 5 s) and `CIENG_HTML` (cursor loop, HTML,
|
||||||
|
logbook) loaded, generated (ad hoc with `@P0` = `TANK1.INFLOW`, by trigger 5 s after the write, by
|
||||||
|
schedule), read, printed to `CIENG_FILE`, deleted; full sample remove/reload with 0 errors.
|
||||||
|
|
||||||
|
Engineering Module (checked by the user 2026-10-01): the forms show the loaded fields (General:
|
||||||
|
*Report destination* = `DEST_NAME`, no field for `ADHOC_DEST`; Query with Structure / Keywords /
|
||||||
|
Datasets panes; Time scheduling with *Correct for daylight saving*; Item triggering). Right-click ›
|
||||||
|
*Generate* opens a dialog with *Destination* (preset `<None>`, `ADHOC_DEST` is not pre-selected) and
|
||||||
|
one field per parameter prompt; an `[ITEM:…]` prompt gives an item tree browser, but the filter did
|
||||||
|
**not** limit it (whole tree shown, ISS-048). The run is made by the logged-in user (`ADMIN`, process
|
||||||
|
`JHMISET…`) and printed to the chosen destination without errors. Generated reports are listed under
|
||||||
|
the report by local time; *View* has its own *Destination* box and *Export…*; HTML reports render as
|
||||||
|
HTML.
|
||||||
75
.claude/skills/reporting/tasks/output-devices.md
Normal file
75
.claude/skills/reporting/tasks/output-devices.md
Normal file
|
|
@ -0,0 +1,75 @@
|
||||||
|
---
|
||||||
|
task: Send reports to a file - printer device and destination
|
||||||
|
version: R1.03
|
||||||
|
source: IM 36K10C30-01EN §2.2; IM 36K10L50-01EN App. 1 (PRINTER_*); practiced on CI-Eng-Sample 2026-10-01
|
||||||
|
status: verified
|
||||||
|
---
|
||||||
|
|
||||||
|
# Report output devices and destinations
|
||||||
|
|
||||||
|
A report goes to a **destination** (`PRINTER_DEST_DF`), which sends it to a primary (and optional
|
||||||
|
secondary) **device** (`PRINTER_DEV_DF`). Devices: FILE, HARDCOPY (Windows printer queue),
|
||||||
|
APPLICATION. Engineering Module: *Configuration > Reporting > Printers > Device / Destinations*.
|
||||||
|
The printer manager is `FMFPRT`.
|
||||||
|
|
||||||
|
## 1. Find the output types of this node
|
||||||
|
|
||||||
|
```
|
||||||
|
dssqld -e types.csv -d PRINTER_TYPE_DF -c
|
||||||
|
```
|
||||||
|
|
||||||
|
Names are `<node>:FILE`, `<node>:HARDCOPY`, `<node>:APPLICATION` (`<node>` = CI Server node name,
|
||||||
|
`NODE_NAME` in `LOCAL_NODE_DF`, e.g. `UNLICENCED` on an unlicensed system). A device needs the full
|
||||||
|
name; plain `FILE` is refused (`DSSP-E-NORELV`).
|
||||||
|
|
||||||
|
## 2. File device and destination
|
||||||
|
|
||||||
|
```
|
||||||
|
@FIELDS
|
||||||
|
NAME,DESCRIPTION,OUTPUT_TYPE,PARAMETERS,SUSPEND
|
||||||
|
@PRINTER_DEV_DF
|
||||||
|
"<DEVICE>","Report file","<node>:FILE","PATH,""<folder>"",FILE,""<file>.txt"",OVERWRITE,""Yes""",0
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,DESCRIPTION,PRIMARY_DEVICE,POLICY,ALLOW_OPERATOR,PRIORITY
|
||||||
|
@PRINTER_DEST_DF
|
||||||
|
"<DEST>","Report file","<DEVICE>","None",1,0
|
||||||
|
```
|
||||||
|
|
||||||
|
`dssqld -i`. `<folder>` must be a literal path that exists (no `%variables%`: `FSL-E-PRT_PAR,
|
||||||
|
Invalid device parameter` in `umhlog.log`). `OVERWRITE "Yes"` keeps one file with the latest
|
||||||
|
report (`"No"` not tried). `ALLOW_OPERATOR` 1 also lists the destination in
|
||||||
|
`PRINTER_OPER_DEST_DF` (needed for `ADHOC_DEST` and the operator's generate/print dialogs).
|
||||||
|
`CI-Eng-Sample` builds this file at load time from `17_printer_df.tpl` (node name and
|
||||||
|
`%TLS_LST_PATH%` filled in by `17_printer_df.ps1`).
|
||||||
|
|
||||||
|
Printer instead of file: `OUTPUT_TYPE` `<node>:HARDCOPY`, `PARAMETERS`
|
||||||
|
`TYPE,"WINDOWS",QUEUE,"\\<server>\<printer>"` (+ `FONT`, `POINT`, `LINES`, `ORIENTATION`) — not
|
||||||
|
practiced (no printer).
|
||||||
|
|
||||||
|
## 3. Use it
|
||||||
|
|
||||||
|
Set `DEST_NAME` (scheduled/triggered runs) and `ADHOC_DEST` (ad-hoc runs) of the report to
|
||||||
|
`<DEST>`, or print a generated report (`define-reports.md` §4).
|
||||||
|
|
||||||
|
## 4. Check
|
||||||
|
|
||||||
|
```
|
||||||
|
dssqld -e jobs.csv -d PRINTER_JOB_OVV -c (job, file, submitter, status, destination, device)
|
||||||
|
dssqld -e devs.csv -d PRINTER_DEV_OVV -c (device status, e.g. Ready)
|
||||||
|
```
|
||||||
|
|
||||||
|
A job can show *Finished* even when the device failed; also read `%TLS_LOG_PATH%\umhlog.log`
|
||||||
|
(`From: FMFPRT`, `FSL-E-…`). The output file holds the text report as generated (HTML reports as
|
||||||
|
HTML source).
|
||||||
|
|
||||||
|
## 5. Remove
|
||||||
|
|
||||||
|
Remove (or repoint) the reports that use the destination, then the destination, then the device
|
||||||
|
(`DSSP-E-NODEL … still in use` otherwise). The output file is not deleted.
|
||||||
|
|
||||||
|
## Verified (2026-10-01)
|
||||||
|
|
||||||
|
`CIENG_FILE` (`UNLICENCED:FILE`, `C:\Users\Public\Yokogawa\tls\lst\cieng_report.txt`, overwrite):
|
||||||
|
printed generated reports, scheduled, triggered and ad-hoc runs wrote the file; jobs *Finished*,
|
||||||
|
device *Ready*; `%TLS_LST_PATH%` in the path failed as above.
|
||||||
68
.claude/skills/reporting/tasks/report-checks.md
Normal file
68
.claude/skills/reporting/tasks/report-checks.md
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
---
|
||||||
|
task: Check REPORT Service (processes, set-up files, system reports) and stop a hanging report
|
||||||
|
version: R1.03
|
||||||
|
source: IM 36K10R40-01EN §1.3, §2.2, §2.3, §5; IM 36K10C30-01EN §4, App. 1.3; practiced on the test system 2026-10-01
|
||||||
|
status: verified
|
||||||
|
---
|
||||||
|
|
||||||
|
# REPORT Service checks
|
||||||
|
|
||||||
|
All read-only except `rptstp` (cancels one running report).
|
||||||
|
|
||||||
|
## 1. Processes
|
||||||
|
|
||||||
|
```
|
||||||
|
durwfp -p rptman -t 0 (errorlevel 0 = running)
|
||||||
|
tasklist /FI "IMAGENAME eq rpt*"
|
||||||
|
```
|
||||||
|
|
||||||
|
Default: `rptman.exe` (manager) and one `rptgen.exe` attached as `RPTGE1`. The `rpi*` info servers
|
||||||
|
are linked into the generator, so they do **not** run as processes unless `report_start.cmd` was
|
||||||
|
changed. REPORT Service is started by `%TLS_ROOT_PATH%\tls\com\report_start.cmd` and only if
|
||||||
|
HISTORY Service (`his`) runs.
|
||||||
|
|
||||||
|
## 2. Set-up files (`%TLS_ROOT_PATH%\tls\sup`)
|
||||||
|
|
||||||
|
| File | For | What to read |
|
||||||
|
|---|---|---|
|
||||||
|
| `rptman.sup` | Manager | `his = 0, HIS, 0`, `dur_queue_size = 500` |
|
||||||
|
| `rptge1.rpt` | Background generator `RPTGE1` | Page layout (`@page_size 66`, `@width 120`, margins), default header/footer, `@workspace 500`, `dictionary rpidis.'tlsdic';`, `login rptman;` (priority 0) — every report starts with this |
|
||||||
|
| `rptgen.rpt` | Interactive generator | No `login` (= interactive), `@page_size 23`, `@formfeed 0` |
|
||||||
|
| `rptgsp.rpt` | Spare generator, priority 9 | Not started by default |
|
||||||
|
|
||||||
|
Messages of the manager and printer manager go to `%TLS_LOG_PATH%\umhlog.log` (`--> From:
|
||||||
|
RPTMAN`, `FMFPRT`; codes `RPT-…`, `FSL-…`).
|
||||||
|
|
||||||
|
## 3. Defined and generated reports
|
||||||
|
|
||||||
|
```
|
||||||
|
@FIELDS
|
||||||
|
NAME,DESCRIPTION,PRIORITY,ADHOC_ENABLED,LIFE_TIME,ACTIVATION_TIME,GENERATION_INTERVAL,DEST_NAME,ADHOC_DEST,PARAM_PROMPT_1
|
||||||
|
@SELECT
|
||||||
|
@REPORT_DF
|
||||||
|
@FIELDS
|
||||||
|
NAME,REPORT_NAME,GENERATION_TIME,DELETION_TIME,USER_NAME,ACTION_PROCESS
|
||||||
|
@SELECT
|
||||||
|
@REPORT_VAL
|
||||||
|
```
|
||||||
|
|
||||||
|
`dssqld -e reports.csv <file>.qli -c`. A fresh R1.03 system has 28 system reports (all ad hoc,
|
||||||
|
lifetime 1 week, priority 0), listed in `IM36K10C30-01EN.md` §8. Add `QUERY` to the field list
|
||||||
|
(without `-c`) to read their RQL — useful examples.
|
||||||
|
|
||||||
|
## 4. Stop a hanging report
|
||||||
|
|
||||||
|
A report in an endless loop keeps its generator busy (`REPORT_DF.GENERATE` stays 1). Stop it:
|
||||||
|
|
||||||
|
```
|
||||||
|
rptstp rptge1
|
||||||
|
```
|
||||||
|
|
||||||
|
Verified: the loop stopped at once, `GENERATE` went back to 0, the generator stayed up and ran the
|
||||||
|
next report. An empty generated report remains; delete it (`define-reports.md` §6). From the
|
||||||
|
user side the manual names the *Cancel* button and `REPORT_DF.CANCEL` = 1 (not tried).
|
||||||
|
|
||||||
|
## Verified (2026-10-01)
|
||||||
|
|
||||||
|
`rptman` and `rptgen` running; `rpi*` lines commented out in `report_start.cmd`; set-up files as
|
||||||
|
above; 28 system reports; `rptstp rptge1` cancelled the test report `CIENG_LOOP`.
|
||||||
77
.claude/skills/reporting/tasks/rql-interactive.md
Normal file
77
.claude/skills/reporting/tasks/rql-interactive.md
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
---
|
||||||
|
task: Try RQL queries in the interactive report generator; write CSV with SPOOL
|
||||||
|
version: R1.03
|
||||||
|
source: IM 36K10R40-01EN §4; IM 36K10P20-01EN §3–6, §9; IM 36K10C30-01EN §3.2.3; practiced on the test system and CI-Eng-Sample 2026-10-01
|
||||||
|
status: verified
|
||||||
|
---
|
||||||
|
|
||||||
|
# RQL in the interactive generator
|
||||||
|
|
||||||
|
`rptgen -s rptgen.rpt` starts a report generator in the console (prompt `RPT>`). It reads RQL,
|
||||||
|
prints results at once and needs no report definition — the quickest way to test a query or look
|
||||||
|
into a dataset. CI Server must be running. Read-only unless the query uses `SPV_*` or
|
||||||
|
`GPV_VALUE(…, <non-zero>)`.
|
||||||
|
|
||||||
|
## 1. Run a query file
|
||||||
|
|
||||||
|
Put the statements in a file (each ends with `;`) and pipe it in; end with `QUIT;`:
|
||||||
|
|
||||||
|
```
|
||||||
|
set @next 0;
|
||||||
|
set @width 132;
|
||||||
|
column t as 'DD-MMM-YYYY hh:mm:ss' heading 'Time';
|
||||||
|
select name, item_value, status from item_val where name like 'CI-Eng-Sample.TANK1.%';
|
||||||
|
select sample_time t, item_value, quality from item_history
|
||||||
|
where item_name = 'CI-Eng-Sample.TANK1.LEVEL' and group_name = 'CIENG_SCAN10S'
|
||||||
|
and sample_time > @date - 600 order by sample_time;
|
||||||
|
select count(item_value), min(item_value), max(item_value), avg(item_value) from item_history
|
||||||
|
where item_name = 'CI-Eng-Sample.TANK1.LEVEL' and sample_time > @date - 3600;
|
||||||
|
select gpv_value('CI-Eng-Sample.TANK1.LEVEL', 0), gpv_status('CI-Eng-Sample.TANK1.LEVEL');
|
||||||
|
quit;
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
rptgen -s rptgen.rpt < query.rql > query.out
|
||||||
|
```
|
||||||
|
|
||||||
|
(Git Bash: `timeout 60 rptgen -s rptgen.rpt < query.rql`; PowerShell does not support `<`, use
|
||||||
|
`cmd /c "rptgen -s rptgen.rpt < query.rql"`.)
|
||||||
|
|
||||||
|
- `set @next 0;` first, otherwise output stops after each page (`Press <RETURN> to continue`).
|
||||||
|
- `rptgen.rpt` has `@page_size 23`, so headings repeat every 23 lines; `set @page_size 0;` for one
|
||||||
|
long list.
|
||||||
|
- Errors show the code and a caret under the position, e.g. `RPT-E-ALIASSEL` (an alias used twice
|
||||||
|
in one SELECT), `RPT-E-UNKFLDSPC` (unknown field). Field names: `dssqld -f -d <DATASET>`.
|
||||||
|
- `LOOP` does not work here (`RPT-E-LPNOTAL`); test loops and cursors in a report definition
|
||||||
|
(`define-reports.md`).
|
||||||
|
- `@P0`…`@P7` and `@NAME` do not exist here; `SET` them to test a report query.
|
||||||
|
|
||||||
|
## 2. Dates
|
||||||
|
|
||||||
|
RQL dates are seconds since 1970 in **local time**. `@date` is now; constants like
|
||||||
|
`01-Oct-2026 15:00` or `12:00` (today) need no quotes; `number('01-Oct-2026 15:00')` converts text.
|
||||||
|
Show them with a date format (`column t as 'DD-MMM-YYYY hh:mm:ss'`). `to_gmt(@date)` gives real
|
||||||
|
Unix time (10 h less on a UTC+10 system) — use it only when another program needs UTC.
|
||||||
|
|
||||||
|
## 3. CSV file with SPOOL
|
||||||
|
|
||||||
|
```
|
||||||
|
spool 'C:\Users\Public\Yokogawa\tls\lst\cieng_levels.csv';
|
||||||
|
set @export 1;
|
||||||
|
select name, item_value, status from item_val where name like 'CI-Eng-Sample.TANK1.%';
|
||||||
|
spool;
|
||||||
|
set @export 0;
|
||||||
|
```
|
||||||
|
|
||||||
|
Result: one line per row, strings quoted (`"CI-Eng-Sample.TANK1.LEVEL",61,"NORMAL"`), no headings.
|
||||||
|
File name ≤ 79 characters, literal (no `%variables%`), overwritten each time, never cleaned up by
|
||||||
|
CI Server — delete it when done. The same statements work inside a report definition.
|
||||||
|
|
||||||
|
## Verified (2026-10-01)
|
||||||
|
|
||||||
|
Current values, history of `CIENG_EVENT` / `CIENG_SCAN10S` (count 299 in an hour at 10 s), group
|
||||||
|
functions, `GROUP BY` on `unit_df`, `GPV_VALUE`/`GPV_STATUS`/`GPV_QUALITY` (61, 9, 0), string and
|
||||||
|
date functions (`SUBSTR`, `DECODE`, `NUMBER`, `DRAW`, `LINE`, `MONTH_DAYS`, `TO_GMT`), integer vs
|
||||||
|
real arithmetic (`12/5+10.0` = 12), CSV via `SPOOL` (file removed afterwards). Aggregated history
|
||||||
|
(`interpolation = '30Minutes'`) returned no rows because the test system had no completed
|
||||||
|
aggregation periods (also empty through `dssqld`).
|
||||||
|
|
@ -83,6 +83,10 @@ prompt. Setup files (`*.sup`) are plain text (CRLF); edit them with the Setup Fi
|
||||||
(observed 2026-10-01: a run started 17:25 ran out at 09:52 the next morning after a sleep);
|
(observed 2026-10-01: a run started 17:25 ran out at 09:52 the next morning after a sleep);
|
||||||
some processes (e.g. `umh`) stay attached, but `dssqld`/`itmval` fail and the log shows
|
some processes (e.g. `umh`) stay attached, but `dssqld`/`itmval` fail and the log shows
|
||||||
`ISF-F-LIC_PROB, DATABASE Service is not licensed`.
|
`ISF-F-LIC_PROB, DATABASE Service is not licensed`.
|
||||||
|
- `Stop-Service StartCIServer` can fail with *Cannot stop StartCIServer service* although CI
|
||||||
|
Server does restart (seen 2026-10-01: the error was shown, the service stayed *Running*, and all
|
||||||
|
processes had new PIDs and a new `STARTUP_TIME` in `LOCAL_NODE_DF` within a minute). Check
|
||||||
|
`STARTUP_TIME` before retrying.
|
||||||
- **Close the Edit Module (and Engineering Module) before stopping CI Server.** A local Edit
|
- **Close the Edit Module (and Engineering Module) before stopping CI Server.** A local Edit
|
||||||
Module is attached to the BUS Service (`JWUIGED<pid>`, a `java.exe` in the user's session) and
|
Module is attached to the BUS Service (`JWUIGED<pid>`, a `java.exe` in the user's session) and
|
||||||
does not stop with the service. The next start then aborts at once; `%TLS_LOG_PATH%\ci_start.log`
|
does not stop with the service. The next start then aborts at once; `%TLS_LOG_PATH%\ci_start.log`
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,10 @@ description: >-
|
||||||
a system, tune or debug CI Server, or plan a system layout (standalone, separate portal, HAC,
|
a system, tune or debug CI Server, or plan a system layout (standalone, separate portal, HAC,
|
||||||
host-to-host, enterprise) or time synchronization, check whether a CI Server process is
|
host-to-host, enterprise) or time synchronization, check whether a CI Server process is
|
||||||
running (durwfp), stop a single process (durstp), read the message log (umhlog), or check
|
running (durwfp), stop a single process (durstp), read the message log (umhlog), or check
|
||||||
BUS Service queues (adaptive queues, dur.sup). Sources IM 36K10J10-01EN, IM 36K10L30-01EN.
|
BUS Service queues (adaptive queues, dur.sup), or work with DSS / Data Set Services (dsssda,
|
||||||
|
dssevt, dssman, dss.sup, quick load macros and includes, memo fields from a file, dssutl,
|
||||||
|
DSS compiler dss, .dss files, data dictionary tlsdic_dss.dic). Sources IM 36K10J10-01EN,
|
||||||
|
IM 36K10L30-01EN, IM 36K10L50-01EN, IM 36K10P30-01EN.
|
||||||
---
|
---
|
||||||
|
|
||||||
# System management (R1.03)
|
# System management (R1.03)
|
||||||
|
|
@ -34,3 +37,4 @@ Rules for every task:
|
||||||
| Database consistency check (`dsschk`) | `tasks/consistency-check.md` | verified (check only) |
|
| Database consistency check (`dsschk`) | `tasks/consistency-check.md` | verified (check only) |
|
||||||
| Tuning checks: limits and health snapshots | `tasks/tuning-checks.md` | verified (read-only) |
|
| Tuning checks: limits and health snapshots | `tasks/tuning-checks.md` | verified (read-only) |
|
||||||
| BUS Service utilities: is a process attached (`durwfp`), stop one process (`durstp`), message tools, adaptive queues | `tasks/bus-utilities.md` | verified (`durwfp`, read-only checks); message tools fail (ISS-030) |
|
| BUS Service utilities: is a process attached (`durwfp`), stop one process (`durstp`), message tools, adaptive queues | `tasks/bus-utilities.md` | verified (`durwfp`, read-only checks); message tools fail (ISS-030) |
|
||||||
|
| DSS checks and tools: DSS processes, `dss.sup`, quick load macros/includes/memo files, `dssutl`, DSS compiler syntax check | `tasks/dss-tools.md` | verified |
|
||||||
|
|
|
||||||
81
.claude/skills/system-management/tasks/dss-tools.md
Normal file
81
.claude/skills/system-management/tasks/dss-tools.md
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
---
|
||||||
|
task: DSS (Data Set Services) checks and tools - processes, dss.sup, quick load directives, dssutl, DSS compiler syntax check
|
||||||
|
version: R1.03
|
||||||
|
source: IM 36K10L50-01EN §1, §2.1, §2.2, §3, §4; IM 36K10P30-01EN §2, §3; practiced on the test system 2026-10-01
|
||||||
|
status: verified
|
||||||
|
---
|
||||||
|
|
||||||
|
# DSS tools
|
||||||
|
|
||||||
|
Everything here is read-only except where marked. Background:
|
||||||
|
`knowledge/manuals/IM36K10L50-01EN.md`, `IM36K10P30-01EN.md`.
|
||||||
|
|
||||||
|
## 1. DSS processes and `dss.sup`
|
||||||
|
|
||||||
|
`tasklist /FI "IMAGENAME eq dss*"` — expect `dsswth`, `dssana`, `dssanc`, `dssadb`, `dsslck`,
|
||||||
|
`dssman`, `dsschk` (server) and several `dsssda` / `dssevt` (10 and 7 on a default R1.03 node).
|
||||||
|
`durwfp -p dssman -t 0` tests one by its BUS Service name (`DSSSDA00`…, `DSSSDAOPC00`…,
|
||||||
|
`DSSEVT00`…). Started by `tls\com\database_start.cmd`; the number of general `DSSSDA` comes from
|
||||||
|
`%TLS_MAX_SDA_ID%` (default 3 → `DSSSDA00`–`03`).
|
||||||
|
|
||||||
|
`%TLS_ROOT_PATH%\tls\sup\dss.sup` (Setup File Editor or text): queue sizes, heartbeats, `FLOWC`,
|
||||||
|
and `DSSSDA_SRV` / `DSSEVT_SRV` lines `<node|-1>, "<client process>", "<server process>"` that tie
|
||||||
|
clients to server instances (`*` = all others). Changing it needs admin rights and a restart.
|
||||||
|
|
||||||
|
## 2. Quick load directives (`dssqld`)
|
||||||
|
|
||||||
|
Besides `@FIELDS`, `@SELECT`, `@LANGUAGE` and `@<DATASET>` (tasks `export-dataset.md`,
|
||||||
|
`load-remove-records.md`):
|
||||||
|
|
||||||
|
```
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
@MACRO
|
||||||
|
RPT_FIELDS,NAME,DESCRIPTION,ADHOC_ENABLED,LIFE_TIME,QUERY
|
||||||
|
@INCLUDE
|
||||||
|
"part2"
|
||||||
|
```
|
||||||
|
|
||||||
|
with `part2.qli` in the current folder starting `@FIELDS` / `RPT_FIELDS` / `@<DATASET>` … —
|
||||||
|
macros must come before any data; includes and macros nest up to 10 deep.
|
||||||
|
|
||||||
|
Memo fields (class methods, report queries, logbooks): inline `@"` … `"@` (preferred), empty
|
||||||
|
`@""@`, or `@"<file>"@`. The file form is read by the server side: use an **absolute path of at
|
||||||
|
most 82 characters** (relative names fail with `CRL-E-ENOENT`, longer ones with
|
||||||
|
`DSSG-E-STRBUFSMAL`; ISS-046).
|
||||||
|
|
||||||
|
## 3. `dssutl` - read one record interactively
|
||||||
|
|
||||||
|
Menu tool on the primary index. Pipe the answers (Git Bash):
|
||||||
|
|
||||||
|
```
|
||||||
|
printf '1\n<dataset number>\n2\n2\n1\n1\n<primary key value>\n-1\n-1\n-1\n-1\n-1\n-1\n' | timeout 30 dssutl
|
||||||
|
```
|
||||||
|
|
||||||
|
= choose a data set › number from the list (first run `printf '1\n-1\n-1\n'` to see the
|
||||||
|
numbered list, e.g. `REPORT_DF` was 209) › choose a field set › all fields › read equal › enter
|
||||||
|
the key. Values are raw: dates in seconds since 1970 (local time), intervals as
|
||||||
|
`<count>.<unit code>` (`10.1` = 10 minutes, `1.3` = 1 day, `1.4` = 1 week), memos as the path of
|
||||||
|
their container file. The *Modify* menu writes to the running system — use `dssqld -m` instead
|
||||||
|
unless the user asks for `dssutl`.
|
||||||
|
|
||||||
|
## 4. DSS compiler as a syntax checker
|
||||||
|
|
||||||
|
To check a `.dss` file (custom dataset or an edited copy) without touching the dictionary:
|
||||||
|
|
||||||
|
```
|
||||||
|
mkdir <scratch>\dss ; copy "%TLS_ROOT_PATH%\tls\src\*.dss" <scratch>\dss (or only your file + dss_global.dss)
|
||||||
|
cd <scratch>\dss
|
||||||
|
dss -l -w
|
||||||
|
```
|
||||||
|
|
||||||
|
Without `-d` the compiler only checks; results are in `tlsdic_dss.lst` (`<file> (<line>,<col>):
|
||||||
|
<message>` and `<n> errors found.`). **Never run `dss -d` without the user's approval**: it rewrites
|
||||||
|
`%TLS_DAT_PATH%\tlsdic_dss.dic` (host node only) and needs a restart.
|
||||||
|
|
||||||
|
## Verified (2026-10-01)
|
||||||
|
|
||||||
|
17 DSS processes as listed; installed `dss.sup` routing read; macro + include load of a report;
|
||||||
|
memo from file (relative fails, 125-character path fails, short absolute path works); `dssutl`
|
||||||
|
read of `REPORT_DF` record `CIENG_TANK1`; compiler check of all 253 installed files (0 errors,
|
||||||
|
dictionary unchanged) and of a test file with a missing `>` (1 error, line/column shown).
|
||||||
1
examples/CI-Eng-Sample/.gitignore
vendored
1
examples/CI-Eng-Sample/.gitignore
vendored
|
|
@ -1 +1,2 @@
|
||||||
*.qlo
|
*.qlo
|
||||||
|
17_printer_df.qli
|
||||||
|
|
|
||||||
16
examples/CI-Eng-Sample/17_printer_df.ps1
Normal file
16
examples/CI-Eng-Sample/17_printer_df.ps1
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
# Build 17_printer_df.qli from 17_printer_df.tpl for this system (CI-Eng-Sample, CI Server R1.03.00).
|
||||||
|
# The printer device needs the CI Server node name ("<node>:FILE") and a literal output path,
|
||||||
|
# so they are filled in here: node name from LOCAL_NODE_DF, path from %TLS_LST_PATH%.
|
||||||
|
# Called by load.cmd; needs CI Server running.
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
Set-Location -LiteralPath $PSScriptRoot
|
||||||
|
$null = & dssqld -e 17_node.qlo -d LOCAL_NODE_DF -c
|
||||||
|
$node = $null
|
||||||
|
foreach ($row in (Import-Csv 17_node.qlo)) { if ($row.NAME -eq 'THIS_NODE') { $node = $row.NODE_NAME } }
|
||||||
|
Remove-Item 17_node.qlo
|
||||||
|
if (-not $node) { throw 'Node name not found in LOCAL_NODE_DF' }
|
||||||
|
$lst = $env:TLS_LST_PATH
|
||||||
|
if (-not $lst) { throw 'TLS_LST_PATH is not set' }
|
||||||
|
$text = (Get-Content -Raw 17_printer_df.tpl).Replace('<NODE>', $node).Replace('<LST>', $lst)
|
||||||
|
Set-Content -Encoding ascii -NoNewline -Path 17_printer_df.qli -Value $text
|
||||||
|
Write-Output "17_printer_df.qli: node $node, path $lst"
|
||||||
23
examples/CI-Eng-Sample/17_printer_df.tpl
Normal file
23
examples/CI-Eng-Sample/17_printer_df.tpl
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
! CI-Eng-Sample report output device and destination, CI Server R1.03.00.
|
||||||
|
! TEMPLATE: load.cmd replaces <NODE> with the CI Server node name (LOCAL_NODE_DF NODE_NAME) and
|
||||||
|
! <LST> with %TLS_LST_PATH%, writes 17_printer_df.qli and loads that. The output type must be
|
||||||
|
! "<node>:FILE" (PRINTER_TYPE_DF) and the path must be a literal path (no %variables%).
|
||||||
|
! Every printed report overwrites <LST>\cieng_report.txt.
|
||||||
|
@FIELDS
|
||||||
|
NAME,DESCRIPTION,OUTPUT_TYPE,PARAMETERS,SUSPEND
|
||||||
|
|
||||||
|
@PRINTER_DEV_DF
|
||||||
|
"CIENG_FILE","CI-Eng-Sample report file","<NODE>:FILE","PATH,""<LST>"",FILE,""cieng_report.txt"",OVERWRITE,""Yes""",0
|
||||||
|
|
||||||
|
! Destination used by the sample reports; visible to operators (PRINTER_OPER_DEST_DF).
|
||||||
|
@FIELDS
|
||||||
|
NAME,DESCRIPTION,PRIMARY_DEVICE,POLICY,ALLOW_OPERATOR,PRIORITY
|
||||||
|
|
||||||
|
@PRINTER_DEST_DF
|
||||||
|
"CIENG_FILE","CI-Eng-Sample report file","CIENG_FILE","None",1,0
|
||||||
82
examples/CI-Eng-Sample/18_report_df.qli
Normal file
82
examples/CI-Eng-Sample/18_report_df.qli
Normal file
|
|
@ -0,0 +1,82 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
! CI-Eng-Sample reports (REPORT_DF), CI Server R1.03.00. Load after 17_printer_df (destination).
|
||||||
|
! Each report gets a storage group of type Report with the same name (lifetime = LIFE_TIME,
|
||||||
|
! rollover = GENERATION_INTERVAL, so a schedule must be at least 10 minutes).
|
||||||
|
! Report names: at most 16 characters.
|
||||||
|
!
|
||||||
|
! CIENG_TANK1 : values of all TANK1 items plus last-hour statistics of one item (parameter
|
||||||
|
! @p0, chosen in an item browser; its filter does not limit it, ISS-048); daily at 06:00.
|
||||||
|
! The activation time lies in the past; CI Server moves it to the next 06:00.
|
||||||
|
! CORRECT_DAYLIGHT 1 keeps 06:00 across daylight-saving changes (with 0 the
|
||||||
|
! interval runs in UTC and 06:00 in January became 05:00 in October).
|
||||||
|
! CIENG_INFLOW_HI: generated 5 s after TANK1.INFLOW rises above 400 (only when the condition
|
||||||
|
! becomes true, not again while it stays above).
|
||||||
|
! CIENG_HTML : HTML output (CONTAINS_HTML is set automatically), cursor loop, logbook text.
|
||||||
|
@FIELDS
|
||||||
|
NAME,DESCRIPTION,PRIORITY,ADHOC_ENABLED,LOGBOOK_ENABLED,LIFE_TIME,ACTIVATION_TIME,GENERATION_INTERVAL,CORRECT_DAYLIGHT,DEST_NAME,ADHOC_DEST,PARAM_PROMPT_1,QUERY
|
||||||
|
|
||||||
|
@REPORT_DF
|
||||||
|
"CIENG_TANK1","CI-Eng-Sample tank 1 values",0,1,1,"1 Weeks","01-01-2026 06:00:00","1 Days",1,"CIENG_FILE","CIENG_FILE","[ITEM:NAME like ""CI-Eng-Sample.TANK1.*""]Item for statistics:",\
|
||||||
|
@"
|
||||||
|
/* CI-Eng-Sample: current values of tank 1, then last-hour statistics of one item */
|
||||||
|
column v as '9999.9' heading 'Value';
|
||||||
|
select name, item_value v, status from item_val where name like 'CI-Eng-Sample.TANK1.%';
|
||||||
|
select '';
|
||||||
|
if @p0 = '' then
|
||||||
|
set @item 'CI-Eng-Sample.TANK1.LEVEL';
|
||||||
|
else
|
||||||
|
set @item @p0;
|
||||||
|
endif;
|
||||||
|
select 'Last hour: ' || @item;
|
||||||
|
column n heading 'Samples';
|
||||||
|
column mi as '9999.9' heading 'Min';
|
||||||
|
column ma as '9999.9' heading 'Max';
|
||||||
|
column av as '9999.9' heading 'Average';
|
||||||
|
select count(item_value) n, min(item_value) mi, max(item_value) ma, avg(item_value) av
|
||||||
|
from item_history where item_name = @item and sample_time > @date - 3600;
|
||||||
|
"@
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,DESCRIPTION,PRIORITY,ADHOC_ENABLED,LIFE_TIME,TRIGGER_ITEM,TRIGGER_CON_1,TRIGGER_VAL_1,DELAY,DEST_NAME,ADHOC_DEST,QUERY
|
||||||
|
|
||||||
|
@REPORT_DF
|
||||||
|
"CIENG_INFLOW_HI","CI-Eng-Sample tank 1 inflow above 400",0,1,"1 Weeks","CI-Eng-Sample.TANK1.INFLOW","Greater Than",400,"5 Seconds","CIENG_FILE","CIENG_FILE",\
|
||||||
|
@"
|
||||||
|
column t as 'DD-MMM-YYYY hh:mm:ss';
|
||||||
|
select 'Tank 1 inflow high: ' || char(gpv_value('CI-Eng-Sample.TANK1.INFLOW', 0), '%.1f') || ' m3/h at', @date t;
|
||||||
|
"@
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME,DESCRIPTION,PRIORITY,ADHOC_ENABLED,LOGBOOK_ENABLED,LIFE_TIME,ADHOC_DEST,LOGBOOK,QUERY
|
||||||
|
|
||||||
|
@REPORT_DF
|
||||||
|
"CIENG_HTML","CI-Eng-Sample tank 1 as HTML",0,1,1,"1 Weeks","CIENG_FILE",@"
|
||||||
|
Sample logbook text
|
||||||
|
"@,\
|
||||||
|
@"
|
||||||
|
/* HTML output: no header/footer, no page breaks */
|
||||||
|
header '';
|
||||||
|
footer '';
|
||||||
|
set @page_size 0;
|
||||||
|
set @width 512;
|
||||||
|
select '<HTML><BODY><H3>CI-Eng-Sample tank 1</H3><TABLE BORDER=1>';
|
||||||
|
set @n '';
|
||||||
|
set @v 0.;
|
||||||
|
declare @c is select name, item_value from item_val where name like 'CI-Eng-Sample.TANK1.%';
|
||||||
|
open @c;
|
||||||
|
loop
|
||||||
|
fetch @c into @n, @v;
|
||||||
|
if @rqlcount = 0 then
|
||||||
|
exit;
|
||||||
|
endif;
|
||||||
|
select '<TR><TD>' || @n || '</TD><TD>' || char(@v, '%.1f') || '</TD></TR>';
|
||||||
|
endloop;
|
||||||
|
close @c;
|
||||||
|
declare;
|
||||||
|
select '</TABLE><P>Logbook: ' || logbook_text('CIENG_HTML') || '</P></BODY></HTML>';
|
||||||
|
"@
|
||||||
15
examples/CI-Eng-Sample/83_remove_report_df.qli
Normal file
15
examples/CI-Eng-Sample/83_remove_report_df.qli
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
! Remove CI-Eng-Sample reports. Also deletes each report's storage group (its generated
|
||||||
|
! reports) and logbook file (tls\dat\<report>.lbk).
|
||||||
|
@FIELDS
|
||||||
|
NAME
|
||||||
|
|
||||||
|
@REPORT_DF
|
||||||
|
"CIENG_TANK1"
|
||||||
|
"CIENG_INFLOW_HI"
|
||||||
|
"CIENG_HTML"
|
||||||
13
examples/CI-Eng-Sample/83a_stop_report_df.qli
Normal file
13
examples/CI-Eng-Sample/83a_stop_report_df.qli
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
! Stop the schedule of CIENG_TANK1 (load with dssqld -m before 83_remove_report_df):
|
||||||
|
! a report with an active schedule cannot be deleted (RPT-E-ACTIVE).
|
||||||
|
@FIELDS
|
||||||
|
NAME,ACTIVATION_TIME,GENERATION_INTERVAL
|
||||||
|
|
||||||
|
@REPORT_DF
|
||||||
|
"CIENG_TANK1","",""
|
||||||
19
examples/CI-Eng-Sample/84_remove_printer_df.qli
Normal file
19
examples/CI-Eng-Sample/84_remove_printer_df.qli
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
@LANGUAGE
|
||||||
|
ENGLISH
|
||||||
|
|
||||||
|
@VERSION
|
||||||
|
1.03.00
|
||||||
|
|
||||||
|
! Remove the CI-Eng-Sample report destination, then its device (after 83_remove_report_df).
|
||||||
|
! The output file %TLS_LST_PATH%\cieng_report.txt is not deleted (remove.cmd deletes it).
|
||||||
|
@FIELDS
|
||||||
|
NAME
|
||||||
|
|
||||||
|
@PRINTER_DEST_DF
|
||||||
|
"CIENG_FILE"
|
||||||
|
|
||||||
|
@FIELDS
|
||||||
|
NAME
|
||||||
|
|
||||||
|
@PRINTER_DEV_DF
|
||||||
|
"CIENG_FILE"
|
||||||
|
|
@ -73,6 +73,10 @@ cmd /c "<repo>\examples\CI-Eng-Sample\remove.cmd"
|
||||||
| `CIENG_TANKS` | Area of interest | Label for tank items (`TANK1.LEVEL` `AOI_1`) |
|
| `CIENG_TANKS` | Area of interest | Label for tank items (`TANK1.LEVEL` `AOI_1`) |
|
||||||
| `CIENG_TANK1` | Alarm selection area | `SECTION = "CI-Eng-Sample.TANK1"`, compiled on load |
|
| `CIENG_TANK1` | Alarm selection area | `SECTION = "CI-Eng-Sample.TANK1"`, compiled on load |
|
||||||
| `CIENG_VIEWER` | Authorization group | Read-only: `ITEM_READ`, `SECTION_READ`, `ALARM_CURRENT_READ`, `ALARM_CHRONO_READ`. No users are created by the sample. |
|
| `CIENG_VIEWER` | Authorization group | Read-only: `ITEM_READ`, `SECTION_READ`, `ALARM_CURRENT_READ`, `ALARM_CHRONO_READ`. No users are created by the sample. |
|
||||||
|
| `CIENG_FILE` | Printer device + destination | FILE output to `%TLS_LST_PATH%\cieng_report.txt` (overwritten by each printed report); destination visible to operators |
|
||||||
|
| `CIENG_TANK1` | Report | Values of the `TANK1` items + last-hour statistics of one item (ad-hoc parameter chosen in an item browser, default `LEVEL`); daily 06:00 local time and ad hoc; output `CIENG_FILE`; lifetime 1 week |
|
||||||
|
| `CIENG_INFLOW_HI` | Report | Generated 5 s after `TANK1.INFLOW` rises above 400; output `CIENG_FILE` |
|
||||||
|
| `CIENG_HTML` | Report | Ad hoc; `TANK1` values as an HTML table (cursor loop) plus the logbook text |
|
||||||
|
|
||||||
Items created by objects (`TANK1.CALC.VOLUME`, `TANK1.JFLOW.sPerMin`) and their sections are
|
Items created by objects (`TANK1.CALC.VOLUME`, `TANK1.JFLOW.sPerMin`) and their sections are
|
||||||
deleted with the objects; they are not in `02_item_df.qli`.
|
deleted with the objects; they are not in `02_item_df.qli`.
|
||||||
|
|
@ -96,8 +100,11 @@ New items start with status 13 (`NOT INIT`) until a value is written.
|
||||||
| `13_opcua_line_df.qli`, `14_opcua_station_df.qli`, `15_item_opcua_df.qli` | OPC UA client line; station, subscription, points; connected items |
|
| `13_opcua_line_df.qli`, `14_opcua_station_df.qli`, `15_item_opcua_df.qli` | OPC UA client line; station, subscription, points; connected items |
|
||||||
| `01b_alarm_df.qli` | Alarm definitions: acknowledgement type, area of interest, alarm selection area (`ALARM_ACK_DF`, `ALARM_AOI_DF`, `ALARM_ASA_DF`) |
|
| `01b_alarm_df.qli` | Alarm definitions: acknowledgement type, area of interest, alarm selection area (`ALARM_ACK_DF`, `ALARM_AOI_DF`, `ALARM_ASA_DF`) |
|
||||||
| `16_item_alarm_df.qli` | Switch on alarming for `TANK1.LEVEL` (loaded with `dssqld -m`) |
|
| `16_item_alarm_df.qli` | Switch on alarming for `TANK1.LEVEL` (loaded with `dssqld -m`) |
|
||||||
|
| `17_printer_df.tpl`, `17_printer_df.ps1` | Report file device and destination; the script fills in this system's node name and `%TLS_LST_PATH%` and writes `17_printer_df.qli` (not in the repo) |
|
||||||
|
| `18_report_df.qli` | Reports (`REPORT_DF`, RQL in the `QUERY` memo) |
|
||||||
|
| `83a_stop_report_df.qli` | Clears the schedule of `CIENG_TANK1` before removal (a scheduled report cannot be deleted) |
|
||||||
| `equipment/eqpciengslv_start.cmd`, `_stop.cmd` | Start/stop the Modbus slave mirror (copy to `tls\com`) |
|
| `equipment/eqpciengslv_start.cmd`, `_stop.cmd` | Start/stop the Modbus slave mirror (copy to `tls\com`) |
|
||||||
| `76_`…`93_remove_*.qli` | Names to delete, in reverse order (alarm definitions last, `93`) |
|
| `76_`…`93_remove_*.qli` | Names to delete, in reverse order (reports and printer `83`/`84` first, alarm definitions last, `93`) |
|
||||||
| `load.cmd`, `remove.cmd` | Run the steps in the right order |
|
| `load.cmd`, `remove.cmd` | Run the steps in the right order |
|
||||||
| `displays/CIENG_Tank.xml` | Display (HTML mode): title, number field on `TANK1.LEVEL`, alarm overview, trend of `TANK1.LEVEL`, button *Operator layout* |
|
| `displays/CIENG_Tank.xml` | Display (HTML mode): title, number field on `TANK1.LEVEL`, alarm overview, trend of `TANK1.LEVEL`, button *Operator layout* |
|
||||||
| `displays/CIENG_Menu.xml` | Navigation display (200 x 700): *Tank 1*, *Current Alarm* (main frame), *Tank 1 popup* (layout `popup`) |
|
| `displays/CIENG_Menu.xml` | Navigation display (200 x 700): *Tank 1*, *Current Alarm* (main frame), *Tank 1 popup* (layout `popup`) |
|
||||||
|
|
@ -171,12 +178,26 @@ Remove: `layouts\layout.ps1 -Remove` (restores the file exactly) and
|
||||||
These change the system's own setup files: back the files up first and restore them after
|
These change the system's own setup files: back the files up first and restore them after
|
||||||
testing. See the `system-management` skill, task `monitoring-processes.md`.
|
testing. See the `system-management` skill, task `monitoring-processes.md`.
|
||||||
|
|
||||||
|
## Reports
|
||||||
|
|
||||||
|
No admin rights needed. `load.cmd` creates the device, destination and three reports; each report
|
||||||
|
gets its own storage group of type *Report*. Try them (skill `reporting`, task `define-reports.md`):
|
||||||
|
|
||||||
|
- Ad hoc: `REPORT_DF` `NAME,PARAM_VALUE_1,GENERATE` = `"CIENG_TANK1","CI-Eng-Sample.TANK1.INFLOW",1`
|
||||||
|
with `dssqld -m`, or in the Engineering Module *Configuration > Reporting > Reports* › right-click
|
||||||
|
› *Generate*. The output lands in `%TLS_LST_PATH%\cieng_report.txt` and in `REPORT_VAL`.
|
||||||
|
- Trigger: `itmval -p -n CI-Eng-Sample.TANK1.INFLOW -v 450` → `CIENG_INFLOW_HI` 5 s later; write a
|
||||||
|
value below 400 before the next test.
|
||||||
|
- `CIENG_TANK1` also runs every day at 06:00 (local time).
|
||||||
|
|
||||||
|
`remove.cmd` clears the schedule, removes the reports (with their generated reports and logbook
|
||||||
|
files), the destination and device, and deletes `cieng_report.txt`.
|
||||||
|
|
||||||
## Planned additions
|
## Planned additions
|
||||||
|
|
||||||
| Phase | Adds |
|
| Phase | Adds |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 10 | A symbol and a faceplate popup (displays and the operator layout exist) |
|
| 10 | A symbol and a faceplate popup (displays and the operator layout exist) |
|
||||||
| 11 | A report |
|
|
||||||
|
|
||||||
## Rules
|
## Rules
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,3 +37,8 @@ dssqld -i 14_opcua_station_df.qli -l 14_opcua_station_df.qlo
|
||||||
dssqld -i 15_item_opcua_df.qli -l 15_item_opcua_df.qlo
|
dssqld -i 15_item_opcua_df.qli -l 15_item_opcua_df.qlo
|
||||||
rem Alarming: switch on alarms for TANK1.LEVEL (modify existing record)
|
rem Alarming: switch on alarms for TANK1.LEVEL (modify existing record)
|
||||||
dssqld -m 16_item_alarm_df.qli -l 16_item_alarm_df.qlo
|
dssqld -m 16_item_alarm_df.qli -l 16_item_alarm_df.qlo
|
||||||
|
rem Reports: file output device and destination (17_printer_df.qli is built for this node
|
||||||
|
rem from 17_printer_df.tpl), then the report definitions.
|
||||||
|
powershell -NoProfile -ExecutionPolicy Bypass -File 17_printer_df.ps1
|
||||||
|
dssqld -i 17_printer_df.qli -l 17_printer_df.qlo
|
||||||
|
dssqld -i 18_report_df.qli -l 18_report_df.qlo
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,17 @@
|
||||||
@echo off
|
@echo off
|
||||||
rem Remove CI-Eng-Sample from a CI Server R1.03 TEST system (also deletes its history).
|
rem Remove CI-Eng-Sample from a CI Server R1.03 TEST system (also deletes its history).
|
||||||
rem Run in an elevated prompt while CI Server is running; call this script by full path.
|
rem Run in an elevated prompt while CI Server is running; call this script by full path.
|
||||||
rem Order: object, class, trigger group, storage links, stop + delete storage groups, items, sections (children first).
|
rem Order: reports, printer, OPC UA, Modbus, auth group, object, class, trigger group, storage links, stop + delete storage groups, items, sections (children first).
|
||||||
rem A storage group with an active unit cannot be deleted (HIS-E-GROUPHASUNT), so the
|
rem A storage group with an active unit cannot be deleted (HIS-E-GROUPHASUNT), so the
|
||||||
rem group first gets a stop time one minute ahead; the script waits until it has passed.
|
rem group first gets a stop time one minute ahead; the script waits until it has passed.
|
||||||
cd /d "%~dp0"
|
cd /d "%~dp0"
|
||||||
|
rem Reports first (they refer to TANK1.INFLOW and the destination), then destination and device.
|
||||||
|
rem A scheduled report cannot be deleted, so its schedule is cleared first.
|
||||||
|
dssqld -m 83a_stop_report_df.qli -l 83a_stop_report_df.qlo
|
||||||
|
dssqld -r 83_remove_report_df.qli -l 83_remove_report_df.qlo
|
||||||
|
dssqld -r 84_remove_printer_df.qli -l 84_remove_printer_df.qlo
|
||||||
|
if exist "%TLS_LST_PATH%\cieng_report.txt" del "%TLS_LST_PATH%\cieng_report.txt"
|
||||||
|
if exist 17_printer_df.qli del 17_printer_df.qli
|
||||||
dssqld -r 76_remove_item_opcua_df.qli -l 76_remove_item_opcua_df.qlo
|
dssqld -r 76_remove_item_opcua_df.qli -l 76_remove_item_opcua_df.qlo
|
||||||
dssqld -r 77_remove_opcua_station_df.qli -l 77_remove_opcua_station_df.qlo
|
dssqld -r 77_remove_opcua_station_df.qli -l 77_remove_opcua_station_df.qlo
|
||||||
dssqld -r 78_remove_opcua_line_df.qli -l 78_remove_opcua_line_df.qlo
|
dssqld -r 78_remove_opcua_line_df.qli -l 78_remove_opcua_line_df.qlo
|
||||||
|
|
|
||||||
|
|
@ -62,3 +62,9 @@ development system (see "Test system" in `progress.md`); they do not exist on ot
|
||||||
| ISS-040 | 2026-10-01 | HISTORY (aggregation) | Aggregation group `CIENG_AGG` (30 min + hour, `TANK1.LEVEL` max/min/avg) ran (`ithsag.log`: *Aggregation Completed*) but stored no values: retrieval gave `0x09 = ITM error` per period. `TANK1.LEVEL` was in `CIENG_EVENT` and `CIENG_SCAN10S`, both priority 0. Also `INTERPOLATION = "30 minutes"` is refused by `dssqld`; the installed name is `30Minutes`. | closed | Closed 2026-10-01 (confirmed by user). 2026-10-01 14:02: after `CIENG_SCAN10S` got `PRIORITY` 10, the 13:30–14:00 period stored max 77, min 33, avg 52.7, quality 1000 (`ithdbg` 20 and `dssqld` with `INTERPOLATION = "30Minutes"`). Cause: equal source priorities (C40 §2.1 says the highest-priority group is the source, but not that a tie gives nothing). Sample fixed (priority 10). The hourly value for 13:00–14:00 was not stored (first half had no source); not rechecked. Proposed close. | `.claude/skills/history-management/tasks/storage-groups.md` §4 (done); `knowledge/manuals/IM36K10C40-01EN.md` §3 (done); `examples/CI-Eng-Sample/03_his_group_df.qli`, `README.md` (done) |
|
| ISS-040 | 2026-10-01 | HISTORY (aggregation) | Aggregation group `CIENG_AGG` (30 min + hour, `TANK1.LEVEL` max/min/avg) ran (`ithsag.log`: *Aggregation Completed*) but stored no values: retrieval gave `0x09 = ITM error` per period. `TANK1.LEVEL` was in `CIENG_EVENT` and `CIENG_SCAN10S`, both priority 0. Also `INTERPOLATION = "30 minutes"` is refused by `dssqld`; the installed name is `30Minutes`. | closed | Closed 2026-10-01 (confirmed by user). 2026-10-01 14:02: after `CIENG_SCAN10S` got `PRIORITY` 10, the 13:30–14:00 period stored max 77, min 33, avg 52.7, quality 1000 (`ithdbg` 20 and `dssqld` with `INTERPOLATION = "30Minutes"`). Cause: equal source priorities (C40 §2.1 says the highest-priority group is the source, but not that a tie gives nothing). Sample fixed (priority 10). The hourly value for 13:00–14:00 was not stored (first half had no source); not rechecked. Proposed close. | `.claude/skills/history-management/tasks/storage-groups.md` §4 (done); `knowledge/manuals/IM36K10C40-01EN.md` §3 (done); `examples/CI-Eng-Sample/03_his_group_df.qli`, `README.md` (done) |
|
||||||
| ISS-041 | 2026-10-01 | GRAPHICS (HTML trend) | In the HTML display (`localhost:8080/mobileoperator/?d=CIENG_Tank`) the trend shows the pen legend `CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]` and time axis but draws no line, although `ITEM_HISTORY` has 420 samples in the shown hour. Browser console: `Mismatch between number of labels (Time,CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]) and number of columns in array (51)`. The trend has 4 further empty pens. 2026-10-01 later: the trend also had the property `chart.attribute[00]` connected to `TANK1.LEVEL` (added by mistake with the pen); the Operator Interface (desktop) showed *Short attribute name ( 61.0) is invalid*. After removing it the desktop trend draws the line, but the HTML trend still logs the mismatch error. | open | HTML only: try a trend with one pen (remove the empty ones) or a Micro Trend; check the HTML-supported trend properties (IM 36K10R30 §4.8.7); check whether the browser still uses a cached copy (`MO_CACHE_DISPLAYS` in `jwuiisg.sup`). | `.claude/skills/graphics/tasks/create-display.md`; `knowledge/manuals/IM36K10R30-01EN.md` §4 |
|
| ISS-041 | 2026-10-01 | GRAPHICS (HTML trend) | In the HTML display (`localhost:8080/mobileoperator/?d=CIENG_Tank`) the trend shows the pen legend `CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]` and time axis but draws no line, although `ITEM_HISTORY` has 420 samples in the shown hour. Browser console: `Mismatch between number of labels (Time,CI-Eng-Sample.TANK1.LEVEL [CIENG_SCAN10S]) and number of columns in array (51)`. The trend has 4 further empty pens. 2026-10-01 later: the trend also had the property `chart.attribute[00]` connected to `TANK1.LEVEL` (added by mistake with the pen); the Operator Interface (desktop) showed *Short attribute name ( 61.0) is invalid*. After removing it the desktop trend draws the line, but the HTML trend still logs the mismatch error. | open | HTML only: try a trend with one pen (remove the empty ones) or a Micro Trend; check the HTML-supported trend properties (IM 36K10R30 §4.8.7); check whether the browser still uses a cached copy (`MO_CACHE_DISPLAYS` in `jwuiisg.sup`). | `.claude/skills/graphics/tasks/create-display.md`; `knowledge/manuals/IM36K10R30-01EN.md` §4 |
|
||||||
| ISS-042 | 2026-10-01 | GRAPHICS (layouts) | Installed vs `Layouts.readme`: the factory layouts use status line item types `displayName`, `playbackIndicator` and `dateTime` and the commands `reload <frame>` / `reload all`, none of which the readme lists (readme: `statusText`, `userName`, `progresBar`, `graphicsQueueLevel`, `connectionState`); the readme also writes `zooom` for the zoom command (factory files use `zoom`). | open | Installed software is the reference (standing user decision). Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §2 |
|
| ISS-042 | 2026-10-01 | GRAPHICS (layouts) | Installed vs `Layouts.readme`: the factory layouts use status line item types `displayName`, `playbackIndicator` and `dateTime` and the commands `reload <frame>` / `reload all`, none of which the readme lists (readme: `statusText`, `userName`, `progresBar`, `graphicsQueueLevel`, `connectionState`); the readme also writes `zooom` for the zoom command (factory files use `zoom`). | open | Installed software is the reference (standing user decision). Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §2 |
|
||||||
|
| ISS-043 | 2026-10-01 | REPORT (system reports) | IM 36K10C30 App. 1.3 names two system reports `ALM_ATTS_CUR` and `ALM_ATRS_HIS`; the installed reports are `ALM_ATTRS_CUR` and `ALM_ATTRS_HIS`. The other 26 names match. | open | Installed software is the reference (standing user decision). Close when the user confirms. | `knowledge/manuals/IM36K10C30-01EN.md` §8 (done) |
|
||||||
|
| ISS-044 | 2026-10-01 | REPORT (scheduling) | Behaviour not in the manuals, found by quick load: a generation interval below 10 minutes is refused (`HIS-E-ROLLTOFAST`, the interval is the rollover of the report's storage group); a scheduled report cannot be deleted (`RPT-E-ACTIVE`) until `ACTIVATION_TIME` and `GENERATION_INTERVAL` are cleared; `CORRECT_DAYLIGHT` 0 counts intervals in UTC (06:00 set for January ran at 05:00 in October); a past activation time moves to the next slot - once (modify, past time within the lifetime) a single report labelled with the old time was generated, at insert with an older time none. | open | Documented as verified behaviour; the one-off generation for a past activation time is not fully understood. Close when the user confirms. | `.claude/skills/reporting/tasks/define-reports.md` §1, §5, §6; `knowledge/manuals/IM36K10C30-01EN.md` §2; `examples/CI-Eng-Sample/83a_stop_report_df.qli`, `18_report_df.qli` |
|
||||||
|
| ISS-045 | 2026-10-01 | REPORT (ad hoc from `dssqld`) | Generating ad hoc with `REPORT_DF.GENERATE` = 1 from `dssqld` (user `FULL AUTHORIZATION`) on a report without `ADHOC_DEST` logs `FSL-E-PRT_UNKUSER, Job submitted by unknown user (FULL AUTHORIZATION)` and `RPT-I-TRYPRINT` in `umhlog.log`; the generated report is stored normally. With `ADHOC_DEST` set no error appears and the device gets the output. Related to the R1.03 known issue on report generation and default printers (IM 36K01A50, REPORT 1.11). | open | Workaround documented (set `ADHOC_DEST`). 2026-10-01: generating from the Engineering Module as user `ADMIN` with destination `CIENG_FILE` printed without errors, so it only affects runs from `dssqld`. Close when the user confirms. | `.claude/skills/reporting/tasks/define-reports.md` §2; `knowledge/manuals/IM36K10C30-01EN.md` §6 |
|
||||||
|
| ISS-046 | 2026-10-01 | DATABASE (`dssqld` memo) | A memo field loaded from a file (`@"<file>"@`, IM 36K10L50 §3.10) fails with a relative name (`CRL-E-ENOENT`, the file is read on the server side) and with a long absolute path (`DSSG-E-STRBUFSMAL`, buffer 83); a short absolute path works. The manual gives no limits. | open | Documented: use inline memos, or an absolute path ≤ 82 characters. Close when the user confirms. | `.claude/skills/system-management/tasks/dss-tools.md` §2; `knowledge/manuals/IM36K10L50-01EN.md` §4 |
|
||||||
|
| ISS-047 | 2026-10-01 | REPORT (RQL manuals) | The manuals disagree: default `@WORKSPACE` 500 KB (IM 36K10R40 §2.2.2) vs 16 KB (IM 36K10C30 table 2.1-1, IM 36K10P20 §9.6); maximum `@WIDTH` 512 (R40, P20 §4) vs 5000 (P20 §9.6); `@FORMFEED` described with opposite meanings (C30: not 1 = form feed; P20: 0 = blank lines, default 1). Installed set-up files set `@workspace` explicitly (500 in `rptge1.rpt`, 100 in `rptgen.rpt`) and `@formfeed 0` for the interactive generator. | open | Not tested (no printer); the set-up files make the defaults irrelevant in practice. | `knowledge/manuals/IM36K10R40-01EN.md` §2; `knowledge/manuals/IM36K10P20-01EN.md` §3 |
|
||||||
|
| ISS-048 | 2026-10-01 | REPORT (ad-hoc parameters) | The prompt `[ITEM:NAME like "CI-Eng-Sample.TANK1.*"]Item for statistics:` (filter form as in IM 36K10C30 §2.1) gives an item tree browser in the Engineering Module generate dialog, but the tree shows all sections, not only `TANK1` items (checked by the user). | open | Try other filter forms (`%` wildcard, `SECTION = …`, `[ITEM:TAG="…"]`) and the display report component. | `.claude/skills/reporting/tasks/define-reports.md`; `knowledge/manuals/IM36K10C30-01EN.md` §2; `examples/CI-Eng-Sample/18_report_df.qli` comment |
|
||||||
|
|
|
||||||
146
knowledge/manuals/IM36K10C30-01EN.md
Normal file
146
knowledge/manuals/IM36K10C30-01EN.md
Normal file
|
|
@ -0,0 +1,146 @@
|
||||||
|
---
|
||||||
|
manual: IM 36K10C30-01EN
|
||||||
|
title: Engineering Module - Reporting
|
||||||
|
edition: 3rd Edition, Sep. 2023
|
||||||
|
version: R1.03
|
||||||
|
status: report definitions (ad hoc with parameters, schedule, item trigger, HTML, logbook), generated reports, file device and destination verified by quick load on CI-Eng-Sample 2026-10-01; Engineering Module forms, generate and view checked by the user; report component in displays and hardcopy printers from docs
|
||||||
|
---
|
||||||
|
|
||||||
|
# Engineering Module - Reporting (R1.03)
|
||||||
|
|
||||||
|
Defining, generating and viewing reports. Language: `IM36K10P20-01EN.md`; REPORT Service
|
||||||
|
processes: `IM36K10R40-01EN.md`. Section numbers refer to the manual; dataset fields were read
|
||||||
|
with `dssqld -f` on the installed system.
|
||||||
|
|
||||||
|
## 1. Flow (§1)
|
||||||
|
|
||||||
|
Define (Engineering Module *Configuration > Reporting > Reports*, or quick load `REPORT_DF`) →
|
||||||
|
generate (schedule, item trigger, or ad hoc from the Engineering Module, a display or
|
||||||
|
`REPORT_DF.GENERATE`) → output (destination device: file, printer, application; or `SPOOL` in
|
||||||
|
the query) → kept as a generated report (`REPORT_VAL`) in the report's own storage group for its
|
||||||
|
lifetime.
|
||||||
|
|
||||||
|
## 2. Report definition (§2.1, dataset `REPORT_DF`)
|
||||||
|
|
||||||
|
| Form field | `REPORT_DF` field | Notes (installed) |
|
||||||
|
|---|---|---|
|
||||||
|
| Name | `NAME` | max 16 characters |
|
||||||
|
| Description | `DESCRIPTION` | max 80; printed in the default header |
|
||||||
|
| Report destination | `DEST_NAME` | a `PRINTER_DEST_DF` name; used by scheduled/triggered runs |
|
||||||
|
| Ad-hoc destination | `ADHOC_DEST` | a `PRINTER_OPER_DEST_DF` name; used by ad-hoc runs |
|
||||||
|
| Priority | `PRIORITY` | 0–9, higher first; generators only take reports ≥ their login priority |
|
||||||
|
| Lifetime | `LIFE_TIME` | interval, e.g. `"1 Weeks"`; empty = keep forever (manual); also the storage group's lifetime |
|
||||||
|
| Logbook information | `LOGBOOK_ENABLED`, `LOGBOOK` (memo) | operator memo stored in `%TLS_DAT_PATH%\<report>.lbk`; read in RQL with `LOGBOOK_TEXT('<report>')` |
|
||||||
|
| Process area | `PROCESS_LIST` | e.g. `3 5 8 10-19`; empty = everyone |
|
||||||
|
| Ad-hoc generation | `ADHOC_ENABLED` | |
|
||||||
|
| Ad-hoc parameters | `PARAM_PROMPT_1`–`8`, answers `PARAM_VALUE_1`–`8` | prompts → `@P0`–`@P7` (strings) |
|
||||||
|
| Query | `QUERY` (memo) | RQL |
|
||||||
|
| Time scheduling | `ACTIVATION_TIME`, `GENERATION_INTERVAL`, `CORRECT_DAYLIGHT` | see below |
|
||||||
|
| Item triggering | `TRIGGER_ITEM`, `TRIGGER_CON_1/2`, `TRIGGER_VAL_1/2`, `TRIGGER_COMB` (`And`/`Or`), `TRIGGER_STAT_1/2` (status names), `DELAY` | |
|
||||||
|
| — | `GENERATE`, `CANCEL` | set 1 to generate / cancel; back to 0 when done |
|
||||||
|
| — | `CONTAINS_HTML` | read-only, set automatically when the query writes HTML (verified) |
|
||||||
|
| — | `DESTINATION` (hidden) | old field: `File Only`, `Printer 1`, `Message`, `Printer mgmnt` |
|
||||||
|
|
||||||
|
Parameter prompt meta-information (makes a pick list in the generate dialog): `[ITEM:<filter>]`,
|
||||||
|
`[OBJECT:<class>:<filter>]`, `[DATE]`, `[TIME]`, `[DATE:TIME]`, `[LIST:a:b:c]`, followed by the
|
||||||
|
prompt text, e.g. `[ITEM:NAME like "CI-Eng-Sample.TANK1.*"]Item for statistics:`. **Installed:** the
|
||||||
|
`[ITEM:…]` prompt opens an item tree browser in the generate dialog, but the filter did not limit
|
||||||
|
the tree (ISS-048). The installed
|
||||||
|
system reports use lower case (`[item]`, `[date:time]`, `[list:Days:Hours:Minutes]`).
|
||||||
|
|
||||||
|
Query editor: *Ctrl+Space* lists keywords, datasets and fields. Basics of RQL (§2.1) are
|
||||||
|
summarised in `IM36K10P20-01EN.md`.
|
||||||
|
|
||||||
|
### Scheduling — verified behaviour (not in the manual)
|
||||||
|
|
||||||
|
- `GENERATION_INTERVAL` is also the rollover interval of the report's storage group, so it must
|
||||||
|
be at least **10 minutes** (`HIS-E-ROLLTOFAST`).
|
||||||
|
- `ACTIVATION_TIME` is the first run; after each run CI Server moves it on by the interval. An
|
||||||
|
activation time in the past is moved to the next future slot (no catch-up). One test (past time
|
||||||
|
within the lifetime, set by modify) generated a single report labelled with the old time; at
|
||||||
|
insert with a time older than the lifetime nothing was generated.
|
||||||
|
- `CORRECT_DAYLIGHT 0` counts intervals in UTC: a daily 06:00 set for January (summer time) ran at
|
||||||
|
05:00 in October. Use `1` for fixed local times.
|
||||||
|
- **A scheduled report cannot be deleted** (`RPT-E-ACTIVE`): clear `ACTIVATION_TIME` and
|
||||||
|
`GENERATION_INTERVAL` first (`dssqld -m`), then delete.
|
||||||
|
|
||||||
|
### Item triggering — verified behaviour
|
||||||
|
|
||||||
|
The report is generated `DELAY` after the condition **becomes** true (edge): writing 420 then 430
|
||||||
|
above a limit of 400 gave one report; going below and above again gave a second one.
|
||||||
|
|
||||||
|
## 3. Devices and destinations (§2.2)
|
||||||
|
|
||||||
|
| Dataset | Form | Fields (installed) |
|
||||||
|
|---|---|---|
|
||||||
|
| `PRINTER_DEV_DF` | *Reporting > Printers > Device* | `NAME`, `DESCRIPTION`, `OUTPUT_TYPE` (`<node>:FILE`, `<node>:HARDCOPY`, `<node>:APPLICATION` from `PRINTER_TYPE_DF`), `PARAMETERS`, `STATUS_ITEM` (0 initial, 1 ready, 2 busy, 3 warning, 4 unavailable), `SUSPEND` |
|
||||||
|
| `PRINTER_DEST_DF` | *Reporting > Printers > Destinations* | `NAME`, `PRIMARY_DEVICE`, `SECONDARY_DEVICE`, `POLICY` (`None` primary only, `Both`, `Automatic` = secondary when primary unavailable), `ALLOW_OPERATOR` (appears in `PRINTER_OPER_DEST_DF`), `PRIORITY` (high) |
|
||||||
|
|
||||||
|
Parameters, written `NAME,"value",NAME,"value"`: FILE `PATH`, `FILE`, `OVERWRITE` (`Yes`/`No`);
|
||||||
|
HARDCOPY `TYPE` (`WINDOWS` on Windows), `QUEUE` (e.g. `\\PrintServer\prt001`), `FONT`, `POINT`,
|
||||||
|
`LINES` (76), `ORIENTATION`, `N-UP`; APPLICATION `PROGRAM`, `ARGUMENTS`.
|
||||||
|
|
||||||
|
**Installed:** `OUTPUT_TYPE` must include the node name (plain `FILE` is refused,
|
||||||
|
`DSSP-E-NORELV`); the path must be literal (`%TLS_LST_PATH%` gave `FSL-E-PRT_PAR` in the log while
|
||||||
|
the job still showed *Finished*). Factory destinations `ALARMS`, `AUDIT_TRAIL`, `DEFAULT`,
|
||||||
|
`MESSAGES`, `PRINTER_1`, `SCREEN_CAPTURE` exist with no device. Job and device status:
|
||||||
|
`PRINTER_JOB_OVV`, `PRINTER_DEV_OVV` (printer manager `FMFPRT`).
|
||||||
|
|
||||||
|
## 4. Report storage groups (§2.3.1)
|
||||||
|
|
||||||
|
Creating a report creates a storage group of type *Report* with the same name (*Historisation >
|
||||||
|
Other storage groups*); its lifetime is linked to the report's lifetime; *Exclude from archive*
|
||||||
|
is available. **Installed:** deleting the report deletes the group, its generated reports and its
|
||||||
|
`.lbk` file. Generated reports are stored in `tls\his\h…*.his` unit files.
|
||||||
|
|
||||||
|
## 5. Report component in displays (§2.3.2)
|
||||||
|
|
||||||
|
The Edit Module report component has a report list, a generated-report list, a *Generate* form
|
||||||
|
(report, destination, logbook text, parameters) and a *View* form (report, generated report,
|
||||||
|
printer). Properties: show/hide and enable/disable each part; *Advanced*: a variable that starts
|
||||||
|
generation (back to false when done), logbook variable (string), report and selection filter.
|
||||||
|
Logbook on a display needs *Logbook Enabled* and *Visible* in the report. Not practiced.
|
||||||
|
|
||||||
|
## 6. Generating and viewing (§3)
|
||||||
|
|
||||||
|
- Engineering Module: right-click a report › *Generate* (choose destination - preset `<None>`, the
|
||||||
|
report's `ADHOC_DEST` is not pre-selected - and answer parameters) › right-click a generated report › *View* (*Scroll Form-Feeds* for multi-page).
|
||||||
|
- Operator interface: display with the report component (*Generate* / *View* tabs, print).
|
||||||
|
- Command line: `REPORT_DF` `NAME,PARAM_VALUE_1,GENERATE` = `"<report>","<answer>",1` with
|
||||||
|
`dssqld -m`; read `REPORT_VAL` (`NAME` = `<report>.<DD-MON-YY hh:mm:ss>`, `REPORT` memo,
|
||||||
|
`USER_NAME`, `ACTION_PROCESS`, `DELETION_TIME`); print with `NAME,DEST_NAME,PRINT`; delete with
|
||||||
|
`dssqld -r` (needs `REPORT_DELETE_GENERATED_REPORT`; users only delete their own ad-hoc ones).
|
||||||
|
- `rptgen -s rptgen.rpt` for trying RQL (`IM36K10R40-01EN.md` §6).
|
||||||
|
|
||||||
|
**Verified:** ad-hoc runs from `dssqld` are made by user `FULL AUTHORIZATION`; without an ad-hoc
|
||||||
|
destination `RPTMAN` then logs `FSL-E-PRT_UNKUSER, Job submitted by unknown user` (the report is
|
||||||
|
still stored; ISS-045). With `ADHOC_DEST` set the output went to the device without errors.
|
||||||
|
Scheduled and triggered runs are made by `RPTMAN` and print to `DEST_NAME`. Generated from the
|
||||||
|
Engineering Module the run is made by the logged-in user (`ADMIN`, process `JHMISET…`) and printed
|
||||||
|
to the chosen destination without errors; *View* lists generated reports by local time and has a
|
||||||
|
*Destination* box and *Export…*.
|
||||||
|
|
||||||
|
## 7. Tuning (§4)
|
||||||
|
|
||||||
|
`rptman.sup`, generator `.rpt` files and `report_start.cmd` as in `IM36K10R40-01EN.md`; one
|
||||||
|
generator `RPTGE1` by default; add generators for priorities, large reports or load; restart CI
|
||||||
|
Server after changes. Query tip: filter on the primary key `NAME` (e.g. `NAME > (@obj || ':') AND
|
||||||
|
NAME < (@obj || ';')` on `object_attr_val`) instead of other fields.
|
||||||
|
|
||||||
|
## 8. Formats and system reports (Appendix 1)
|
||||||
|
|
||||||
|
- HTML: write the HTML with `SELECT '…';` lines, `HEADER ''; FOOTER ''; SET @PAGE_SIZE 0; SET
|
||||||
|
@WIDTH 512;`. The Engineering Module and displays render it; a destination receives the HTML
|
||||||
|
source.
|
||||||
|
- CSV: `SPOOL '<file>'; SET @EXPORT 1; SELECT …; SPOOL;`.
|
||||||
|
- System reports (installed, 28, all ad hoc, lifetime 1 week): `ALARM_COUNT`, `ALARM_CURRENT`,
|
||||||
|
`ALARM_EXT_CURR`, `ALARM_HISTORY`, `ALARM_SHELVE`, `ALM_ATTRS_CUR`, `ALM_ATTRS_HIS` (manual:
|
||||||
|
`ALM_ATTS_CUR`, `ALM_ATRS_HIS`, ISS-043), `AUDIT_TRAIL`, `AUTH_GROUP`, `ITEM_ACK`, `ITEM_ALM`,
|
||||||
|
`ITEM_EQP`, `ITEM_FO`, `ITEM_HISTORY`, `ITEM_HISTORY_AG`, `ITEM_ID`, `ITEM_ITM`, `ITEM_OTH`,
|
||||||
|
`ITEM_TYPE`, `ITEM_VAL_STA`, `ITM_VAL_CSV`, `STATION`, `STATION_STATS`, `SYSTEM_LOG`,
|
||||||
|
`SYSTEM_LOG_HTML`, `UA_SERVER_AUDIT`, `USER`, `USER_VAL`. Their queries are good RQL examples
|
||||||
|
(`dssqld -e` on `REPORT_DF` with `QUERY`). Enterprise engineering servers add `EES_*` reports.
|
||||||
|
|
||||||
|
Known issues (IM 36K01A50): with Active Directory and printer management, generation can fail
|
||||||
|
looking for the user's default printer (use a destination without device as the user's
|
||||||
|
default); report features of schemes need an Engineering Module restart.
|
||||||
55
knowledge/manuals/IM36K10E10-01EN.md
Normal file
55
knowledge/manuals/IM36K10E10-01EN.md
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
---
|
||||||
|
manual: IM 36K10E10-01EN
|
||||||
|
title: Excel Add-in Data Analysis and Reporting
|
||||||
|
edition: 3rd Edition, Sep. 2023
|
||||||
|
version: R1.03
|
||||||
|
status: from docs only — Microsoft Excel and the add-in are not installed on the test system (checked 2026-10-01)
|
||||||
|
---
|
||||||
|
|
||||||
|
# Excel Add-in — DART (R1.03)
|
||||||
|
|
||||||
|
DART (Data Analysis and Reporting Tool) is a Microsoft Excel add-in that reads CI Server data into
|
||||||
|
worksheets for reports and analysis. It connects through CI Portal (web ports 8080 local /
|
||||||
|
8443 remote) and logs in as a CI Server user, so the user's authorizations limit what it sees.
|
||||||
|
Section numbers refer to the manual.
|
||||||
|
|
||||||
|
## 1. Install (§2)
|
||||||
|
|
||||||
|
Admin rights; close Excel; run `Windows\EngineeringTools\ExcelAddIn\ExcelAddInfoForReports_x64.exe`
|
||||||
|
from the CI Server DVD (SmartScreen: *More info › Run anyway*), accept the licence, *Install*. A
|
||||||
|
*CI Server* ribbon tab appears. Uninstall: *Programs and Features › CI Server Excel Add-in*.
|
||||||
|
Remote CI Portal on another machine needs SSL certificates.
|
||||||
|
|
||||||
|
## 2. Ribbon functions (§3)
|
||||||
|
|
||||||
|
| Group | Command | Gives |
|
||||||
|
|---|---|---|
|
||||||
|
| Connections | Connection Manager | Connect (server name/IP, default `localhost`; login dialog depends on the `dssana.sup` login method) / disconnect |
|
||||||
|
| Item Search | Item Search | Items by name and description filters (`*`, `?`, both filters ANDed); paste vertically or horizontally |
|
||||||
|
| Current Data | Current Data / Item Attribute Value | Latest value (optional time stamp left or above); description, data type, engineering unit, status, quality, update time (one attribute per call) |
|
||||||
|
| History Data | Single / Constant Interval / Timestamp Based / Fixed Duration–Fixed Count | Value at a time; values at an interval (optional slope interpolation); values at another item's sample times; all samples in a period or N samples |
|
||||||
|
| Calculated Data | Aggregation Data | Values of an Aggregation storage group: maximum, minimum, average, standard deviation, counter, integration, differential summation per 30 min, hour, shift, day, week, month, year (only what the group stores; time stamp = start of the period) |
|
||||||
|
| Refresh Data | Refresh UDF / Refresh Workbook | Re-create the array formula at the cursor (needed when the number of values changes) / recalculate all |
|
||||||
|
| Others | Settings, About, Help | Number and date formats, interpolation (previous or next value), ports |
|
||||||
|
|
||||||
|
Cells hold user-defined array functions, so workbooks refresh themselves (Excel calculation
|
||||||
|
*Automatic*). Fetch options when no sample exists at a time: *Next*, *Actual* ("No Data"),
|
||||||
|
*Interpolated* (previous/next per Settings); edge options for periods: *Actual*, *Nearest*,
|
||||||
|
*Interpolated*.
|
||||||
|
|
||||||
|
## 3. Times (§5)
|
||||||
|
|
||||||
|
Absolute: `n` now, `t` today 00:00, `y` yesterday, `b` first of the month, weekday names,
|
||||||
|
`MM/dd/yyyy H:mm:ss`, `dd`, `HH:`, `dd HH:`, `H:mm:ss` (type a leading `'` in a cell). Relative:
|
||||||
|
`+/-` with `s`, `m`, `h`, `d`, `w`, `M` (months), `y` units, one unit per term (`t+2h`, `y+23h`,
|
||||||
|
`n-15s`). Intervals for constant-interval history use the same units. A daily report of yesterday:
|
||||||
|
start `y`, end `y+23h`, interval `1h`.
|
||||||
|
|
||||||
|
## 4. Tips and errors (§4, §6, §7)
|
||||||
|
|
||||||
|
Keep the number of values per formula constant (fixed start/end relative to `y`) so the workbook
|
||||||
|
refreshes without *Refresh UDF*; format time cells as text or `H:mm` for charts. The manual's
|
||||||
|
error list explains connection, login, item and time-format errors.
|
||||||
|
|
||||||
|
Known issue (IM 36K01A50): Excel via ODBC cannot write to CI Server R1.03; the add-in (read) is
|
||||||
|
the supported Excel route.
|
||||||
126
knowledge/manuals/IM36K10L50-01EN.md
Normal file
126
knowledge/manuals/IM36K10L50-01EN.md
Normal file
|
|
@ -0,0 +1,126 @@
|
||||||
|
---
|
||||||
|
manual: IM 36K10L50-01EN
|
||||||
|
title: Data Set Service Engineering
|
||||||
|
edition: 3rd Edition, Sep. 2023
|
||||||
|
version: R1.03
|
||||||
|
status: process layout, dss.sup, dssqld directives (macro, include, memo from file), dssutl read and the dataset notes checked on the test system 2026-10-01; dssana.sup tabs from docs (covered by skill authorization); dsschk see IM36K10J10 notes
|
||||||
|
---
|
||||||
|
|
||||||
|
# Data Set Service Engineering (R1.03)
|
||||||
|
|
||||||
|
DSS (Data Set Services) is the layer through which every CI Server tool and user interface reads
|
||||||
|
and changes configuration and run-time data: items, alarms, classes, users, history, reports …
|
||||||
|
all appear as **datasets** (tables of records with fields). `dssqld`, the Engineering Module,
|
||||||
|
REPORT Service, ODBC and the Java/PROCESS APIs are all DSS clients. Section numbers refer to the
|
||||||
|
manual; "installed" means checked on the R1.03.00 test system.
|
||||||
|
|
||||||
|
## 1. Building blocks (§1)
|
||||||
|
|
||||||
|
| Part | Process / file | Job |
|
||||||
|
|---|---|---|
|
||||||
|
| API | linked into every client | Opens datasets, talks to the core over the BUS Service (DUR/MDUR) |
|
||||||
|
| Manager | `DSSMAN` (one per node) | Hands each client a `DSSSDA`/`DSSEVT` instance (the one it already uses, else the least loaded) and cleans up when clients or servers disappear |
|
||||||
|
| Data access | `DSSSDA` (several, `-n <name>`) | Executes read / insert / update / delete through the mapping layer |
|
||||||
|
| Events | `DSSEVT` (several, `-n <name>`) | Event channels (change notifications, flow control) to clients |
|
||||||
|
| Locks | `DSSLCK` (`-c` clears all locks) | Record locks on the dataset's primary node; frees locks of vanished processes/nodes |
|
||||||
|
| Watch | `DSSWTH` | Creates the DSS shared memory and the authorization/user files, copies dictionary changes from the host node to other nodes, cleans up after crashed clients, moves memo "file containers" |
|
||||||
|
| Mapping layer | PML + data access servers (`dsilib:dsid_das_*`) | Maps a dataset onto ISAM files or another service (ITEM, HISTORY, ALARM …) |
|
||||||
|
| Data dictionary | `%TLS_DAT_PATH%\tlsdic_dss.dic` | Description of every dataset and field; built by the DSS compiler (`IM36K10P30-01EN.md`) on the host node only |
|
||||||
|
| Tools | `dssqld`, `dssutl`, `dsschk`, `dssxdb` | Quick load/export, interactive read/modify, consistency check/repair, debugger (service use) |
|
||||||
|
|
||||||
|
DSS processes start with DATABASE Service (`tls\com\database_start.cmd`). **Installed:** besides
|
||||||
|
`DSSWTH`, `DSSANA`, `DSSANC`, `DSSADB`, `DSSLCK`, `DSSMAN` and the `dsschk -s` server, the script
|
||||||
|
starts `DSSSDA00`–`03` (count from `%TLS_MAX_SDA_ID%`, default 3), `DSSSDAOPC00`–`03`,
|
||||||
|
`DSSSDAPRC`, `DSSSDAOPX` (and `DSSSDAEEM` on an enterprise engineering server) and `DSSEVT00`–`03`,
|
||||||
|
`DSSEVTOPC`, `DSSEVTPRC`, `DSSEVTFTE` — 10 `dsssda.exe` and 7 `dssevt.exe` on the test system,
|
||||||
|
more than the manual's "about 5 per node" advice. On the very first start (`database.new`) the
|
||||||
|
script compiles all `tls\src\*.dss` into the dictionary (`dss -d -q -u`).
|
||||||
|
|
||||||
|
## 2. Tuning — `dss.sup` (§2.2)
|
||||||
|
|
||||||
|
Heartbeats and DUR queue sizes per process (`DSSEVT_HBEAT`, `DSSSDA_QUESZ` …), PML dataset cache
|
||||||
|
time (`DATASET_CACHE_TIME`, 600 s), client event slots (`EVENT_Q_SLOTS`, 100), flow-control
|
||||||
|
interval (`FLOWC`). `DSSSDA_SRV = <node|-1>, "<client>", "<DSSSDA name>"` ties clients to a
|
||||||
|
dedicated `DSSSDA` (start that instance in the start script first).
|
||||||
|
|
||||||
|
**Installed `dss.sup`:** `DSSEVT_QUESZ = 1000`, `DSSSDA_QUESZ = 252`, `FLOWC = 120`; `DSSSDA_SRV`
|
||||||
|
routes `OPCEXE1`–`4`, `OPCACT`, `OPCJACT`, `OPCLOA`, `ALNMGR` to `DSSSDAOPC00`–`03`, `OPX*` to
|
||||||
|
`DSSSDAOPX`, `PRC*` to `DSSSDAPRC`, everything else (`*`) to `DSSSDA00`–`03`; `DSSEVT_SRV` lines do
|
||||||
|
the same for events. Further undocumented keywords: `EXCL_ACC_EXCEPTION_PROCESS`,
|
||||||
|
`CLOG_EXCEPTION_PROCESS`, `CLOG_EXCEPTION_DATASET` (a long list of run-time datasets).
|
||||||
|
|
||||||
|
## 3. Authentication — `dssana.sup` (§2.3)
|
||||||
|
|
||||||
|
`DSSANA` keeps the list of logged-in users and decides who may start which user interface from
|
||||||
|
where. The Setup File Editor tabs: **General** (logout retain time 1440 min, max logged-in /
|
||||||
|
logged-out users, max 5 UIs per remote client, password hashing *Maximal*), **User Interfaces**
|
||||||
|
(each UI, e.g. `JWUIGED` = Edit Module, with the hosts/logins allowed and the authorization
|
||||||
|
action needed), **Clients System Trust** (host/IP list, *Always* or *Deny*, top-down, `<remote>` /
|
||||||
|
`<local>` last), **Login control** (per client and UI: *Automatic*, *Manual CI Server*, *Manual
|
||||||
|
OS*, *No*, *SSO*, *Deny*; profile for *No* login; failed-login delay 5 s), **Active Directory**
|
||||||
|
and **Single Sign On** (phase 13), **Password rules** (length, digits, punctuation, mixed case;
|
||||||
|
all off by default), **Logging** (*Basic*/*Extended*/*Maxima* into `tls\log\dssana.log`, cyclic,
|
||||||
|
10 MB). Practical use: skill `authorization` (`users-groups.md`, login methods).
|
||||||
|
|
||||||
|
## 4. Quick load files and `dssqld` (§3)
|
||||||
|
|
||||||
|
File format (`.qli`): `!` comment lines; marker lines starting with `@` (`@<DATASET>`, `@MACRO`,
|
||||||
|
`@INCLUDE`, `@LANGUAGE`, `@SELECT`, `@FIELDS`); data lines with comma-separated fields; `\` at the
|
||||||
|
end of a line continues it. Unquoted text is upper-cased, quoted text kept; `""` inside a string
|
||||||
|
is a quote. Escape character, separator and continuation character can be changed in
|
||||||
|
`dssqld.sup`.
|
||||||
|
|
||||||
|
| Directive | Use | Verified |
|
||||||
|
|---|---|---|
|
||||||
|
| `@FIELDS` | Field list for the **next** dataset block only; missing fields get defaults (`dssqld -f`) | yes (all phases) |
|
||||||
|
| `@SELECT` | Filter for the next dataset on export only, in single quotes, strings in double quotes | yes (ISS-003) |
|
||||||
|
| `@MACRO` | `<name>,<text…>`; later occurrences of the name are replaced (nesting ≤ 10); must come before the data | yes: field list as macro |
|
||||||
|
| `@INCLUDE` | One file name per line (`.qli` default), nesting ≤ 10 | yes |
|
||||||
|
| `@LANGUAGE` | `ENGLISH` makes a file load on any language version | yes (all sample files) |
|
||||||
|
|
||||||
|
Field types: string, number, date/time (exported as `"dd-mm-yyyy hh:mm:ss"`, the form to load),
|
||||||
|
interval (`"10 Minutes"`, `"1 Days"`, `"1 Weeks"`), **memo** (`@""@` empty, `@"` … `"@` inline
|
||||||
|
text, or `@"<file>"@` text from a file).
|
||||||
|
|
||||||
|
**Installed — memo from a file:** the file name is read on the server side, so a relative name
|
||||||
|
fails (`CRL-E-ENOENT`); an absolute path works but is limited to 82 characters
|
||||||
|
(`DSSG-E-STRBUFSMAL`). Inline memos are the safer choice (ISS-046).
|
||||||
|
|
||||||
|
Options: `-i` insert, `-m` modify, `-r` remove, `-e <out> [<qli>]` export (all datasets except the
|
||||||
|
`NO-EXPORT` list in `dssqld.sup`, or what the qli names), `-c` CSV, `-a` concealed fields, `-d`
|
||||||
|
one dataset, `-f` dictionary report, `-l` listing, `-s` setup file. Exports may need reordering
|
||||||
|
before re-import (circular references: stations ↔ items, first-out groups, classes).
|
||||||
|
`%TLS_DAT_PATH%\dss_export.qli` is a ready-made export list. Task files: skill `system-management`
|
||||||
|
(`export-dataset.md`, `load-remove-records.md`).
|
||||||
|
|
||||||
|
## 5. `dssutl` (§4)
|
||||||
|
|
||||||
|
Interactive menu tool to read and modify single records via the primary index: choose a dataset
|
||||||
|
(numbered list), a field set (*Primary index only*, *All fields* or a saved selection of ≤ 20
|
||||||
|
fields), then *Read equal*, *Read sequential* or *Modify* (change fields, *Perform update*).
|
||||||
|
**Installed:** works with piped answers; values are shown raw (dates as seconds since 1970 in
|
||||||
|
local time, intervals as `<count>.<unit>`, e.g. `10.1` = 10 minutes, `1.3` = 1 day; memos as their
|
||||||
|
file path). Modifying data on a running system affects running applications — prefer `dssqld -m`.
|
||||||
|
Task: skill `system-management`, `dss-tools.md`.
|
||||||
|
|
||||||
|
## 6. Consistency (`dsschk`, §5)
|
||||||
|
|
||||||
|
`dsschk -s` (server, started per node) and the client `dsschk [-d <set>] [-n <node>] [-e] [-r]
|
||||||
|
[-v]` (extended test, repair, verbose). See `IM36K10J10-01EN.md` and task
|
||||||
|
`consistency-check.md`.
|
||||||
|
|
||||||
|
## 7. Dataset notes (Appendix 1)
|
||||||
|
|
||||||
|
Special behaviour per dataset (only the ones not covered elsewhere): `ALARM_ASA_DF` compiles when
|
||||||
|
`COMPILE` is set; `ALARM_CURRENT` only `ACK` can change; `ARCHIVE_COMMAND` drives the archive
|
||||||
|
engine (initialise/mount/register tape, manual archive, retrieve, cancel; phase 9 notes);
|
||||||
|
`AUDIT_EVENT_CLAS_DF` only `STORAGE` changes; `AUTH_ACTION_DF`, `DATASET_*`, `HOST_NODE_DF`,
|
||||||
|
`LOCAL_NODE_DF` read-only; `CLASS_DF` `COMPILE`/`RESET`; `DISPLAY_DF` / `SYMBOL_DF` names only,
|
||||||
|
insert copies a template, `REBUILD`; `FOLDER_DF` deletable only when empty; `HIS_GROUP_DF` only
|
||||||
|
item groups can be added, `FORCE_ROLLOVER`; `HIS_UNITS` deleting a record deletes the unit;
|
||||||
|
`ITEM_HISTORY` always needs `ITEM_NAME`, inserts only into *Direct* groups, no events; `ITEM_VAL`
|
||||||
|
value/status/quality (`BLOCKED_UPDATE` for blocked items, status must be written too over ODBC);
|
||||||
|
`OBJECT_DF` prompts via `ATTR_VALUE_n`, `DEBUG`; `OPC_SERVER_DF` / `OPC_STATION_TAG_DF` read with
|
||||||
|
mandatory filter; `PRINTER_*` devices/destinations (written by the printer manager for `_OVV`
|
||||||
|
and `_TYPE`); `REPORT_DF` / `REPORT_VAL` see `IM36K10C30-01EN.md`; `SEQUENCE_DF` `COMPILE`;
|
||||||
|
`STATION_DF` `REDUN_LINE`.
|
||||||
134
knowledge/manuals/IM36K10P20-01EN.md
Normal file
134
knowledge/manuals/IM36K10P20-01EN.md
Normal file
|
|
@ -0,0 +1,134 @@
|
||||||
|
---
|
||||||
|
manual: IM 36K10P20-01EN
|
||||||
|
title: Report Generation Language
|
||||||
|
edition: 3rd Edition, Sep. 2023
|
||||||
|
version: R1.03
|
||||||
|
status: SELECT/WHERE/ORDER/GROUP BY, COLUMN, HEADER/FOOTER, SET, IF, LOOP, cursors, SPOOL with @EXPORT, functions (GPV_*, CHAR, DECODE, SUBSTR, NUMBER, DRAW, LINE, LOGBOOK_TEXT, TO_GMT …) and dates verified in the interactive generator and in loaded reports on the test system 2026-10-01; SEND/RECEIVE, BREAK, INCLUDE, FLAG PAGE, SPV_* from docs
|
||||||
|
---
|
||||||
|
|
||||||
|
# Report Generation Language — RQL (R1.03)
|
||||||
|
|
||||||
|
RQL is the SQL-like language of REPORT Service. A report definition (`REPORT_DF.QUERY`) is a list
|
||||||
|
of RQL statements, each ending with `;`. Data comes from datasets (`IM36K10L50-01EN.md`).
|
||||||
|
REPORT Service setup: `IM36K10R40-01EN.md`; report definitions in the Engineering Module:
|
||||||
|
`IM36K10C30-01EN.md`. Section numbers refer to the manual.
|
||||||
|
|
||||||
|
## 1. Basics (§1, §2, §9.2–9.5)
|
||||||
|
|
||||||
|
- A report description: layout statements, calculations, queries, end. A **set-up description**
|
||||||
|
(`tls\sup\rptge1.rpt` etc.) runs once when a generator starts and sets defaults for every report
|
||||||
|
(layout, header/footer, dictionary, `LOGIN`). Output of a SELECT in it goes to the system log.
|
||||||
|
- Names: letters, digits, `_`; variables start with `@` (≤ 32 characters); report names ≤ 16.
|
||||||
|
Reserved words (list with `SHOW RESERVED;`) can be used as field names in double quotes.
|
||||||
|
- Data types: string (`'text'`, `''` for an apostrophe, max 512 characters), integer, real
|
||||||
|
(needs a decimal point: `12.`). **Dates are integers**: seconds since 1970 in **local time**
|
||||||
|
(verified: `@DATE` was 10 h ahead of Unix time on a UTC+10 system; `TO_GMT()` gives Unix time).
|
||||||
|
Date constants without quotes: `01-Oct-2026 15:00`, `12:00` (today), `12-Jan-90` (years < 70
|
||||||
|
are 20xx).
|
||||||
|
- Dataset field types become: char → string; boolean/short/ushort/long/ulong/ubyte → integer;
|
||||||
|
float/double → real. Hidden fields need `SET @CONCEAL 0;`.
|
||||||
|
- Errors in a statement stop that statement (some stop the report); they are written into the
|
||||||
|
report (`RPT-E-…`, with a caret under the position in interactive mode). Fatal errors go to the
|
||||||
|
system log.
|
||||||
|
|
||||||
|
## 2. Queries (§3, §9.12 SELECT)
|
||||||
|
|
||||||
|
```
|
||||||
|
SELECT [DISTINCT] <expr> [<alias>], … [FROM <dataset> [<alias>], …]
|
||||||
|
[WHERE <conditions>] [ORDER BY <col|n> [ASC|DESC]] | [GROUP BY <n>… [HAVING <cond>]];
|
||||||
|
```
|
||||||
|
|
||||||
|
- Operators: `= != <> > >= < <= LIKE` (`%` any, `_` one character; change with `@WC_ANY`,
|
||||||
|
`@WC_SINGLE`), `AND`, `OR`, parentheses. String values are case-sensitive.
|
||||||
|
- Joins: list several datasets; the first is primary; join conditions (`a.f = b.f`) come first in
|
||||||
|
WHERE, joined by `AND`.
|
||||||
|
- `SELECT 'text', @var;` without FROM just prints (no headings).
|
||||||
|
- Group functions `AVG COUNT MAX MIN STDDEV SUM VARIANCE` (null values ignored, `DISTINCT`
|
||||||
|
allowed) cannot be mixed with plain columns without GROUP BY and cannot be used in WHERE; put
|
||||||
|
their result into a variable first (`SELECT SET @max MAX(item_value) FROM …;`).
|
||||||
|
- **Verified:** an alias may appear only once per SELECT (`RPT-E-ALIASSEL`); with no matching
|
||||||
|
rows a group function prints the count 0 and blanks.
|
||||||
|
- Reading history: `FROM item_history WHERE item_name = '<item>' AND sample_time > @date - 3600`;
|
||||||
|
add `group_name = '<group>'` to read one storage group (else rows of all groups the item is in);
|
||||||
|
aggregates with `interpolation = '30Minutes'|'Hour'|…` and `attribute = 'Maximum'|…`
|
||||||
|
(`IM36K10C40-01EN.md` §5). Do not use `OR` with `item_name` (DSS appendix).
|
||||||
|
|
||||||
|
## 3. Layout (§4)
|
||||||
|
|
||||||
|
| Statement / variable | Effect |
|
||||||
|
|---|---|
|
||||||
|
| `COLUMN <alias> [AT n] [AS '<format>'] [HEADING 'a|b'];` | Format of a column (`|` splits the heading) |
|
||||||
|
| `HEADER` / `FOOTER <expr> [AT n|LEFT|CENTER|RIGHT] [AS '<fmt>'] [SKIP n], …;` | Page header/footer; empty `HEADER '';` removes it |
|
||||||
|
| `BREAK <alias> [SKIP n|SKIP PAGE] [CALCULATE SUM|AVG|… <aliases>];` | Group breaks with subtotals |
|
||||||
|
| `FLAG PAGE '<file>';` | Text file printed before everything |
|
||||||
|
| `@PAGE_SIZE` (0 = no page breaks), `@WIDTH` (40–512 per R40; 40–5000 per §9.6), `@TOP_MARGIN`, `@BOTTOM_MARGIN`, `@LEFT_MARGIN`, `@RIGHT_MARGIN` | Page geometry |
|
||||||
|
| `@EXPORT 1` | Comma-separated output: only rows, strings quoted |
|
||||||
|
| `@DECIMAL 44` | Decimal comma |
|
||||||
|
|
||||||
|
Formats: numbers `9` digit, `0` leading zero, `+` sign, `.` decimal point, `EEEE` exponent;
|
||||||
|
dates `D DD DDD M MM MMM Y YY YYYY hh mm ss` (e.g. `'DD-MMM-YYYY hh:mm:ss'`); strings `A…`, `R`
|
||||||
|
right, `C` centre, `A20`; `\` copies the next character; C formats (`%5d`, `%.1f`, `%s`). An integer
|
||||||
|
with a real format prints oddly (e.g. `+99.9` on 12 → `+12.12`); formats are minimum widths.
|
||||||
|
|
||||||
|
## 4. Flow control and cursors (§5)
|
||||||
|
|
||||||
|
`IF <cond> THEN … [ELSE …] ENDIF;` (no field names in the condition), `LOOP … ENDLOOP;` with
|
||||||
|
`EXIT;` — loops only work in stored reports (verified: typed or piped into the interactive
|
||||||
|
generator they give `RPT-E-LPNOTAL, LOOP only allowed in report definition FILES and DIRECT
|
||||||
|
mode`). Cursors:
|
||||||
|
|
||||||
|
```
|
||||||
|
SET @n ''; SET @v 0.;
|
||||||
|
DECLARE @c IS SELECT name, item_value FROM item_val WHERE name LIKE 'CI-Eng-Sample.TANK1.%';
|
||||||
|
OPEN @c;
|
||||||
|
LOOP FETCH @c INTO @n, @v; IF @rqlcount = 0 THEN EXIT; ENDIF; SELECT @n, @v; ENDLOOP;
|
||||||
|
CLOSE @c; DECLARE; /* DECLARE without arguments removes all cursors - always end with it */
|
||||||
|
```
|
||||||
|
|
||||||
|
Variables used in `FETCH … INTO` must exist first (`SET`). `@RQLCOUNT` = rows of the last
|
||||||
|
SELECT/FETCH; `@RQLERROR` counts errors. Verified in `CIENG_HTML`.
|
||||||
|
|
||||||
|
## 5. Data manipulation (§6, §9.11)
|
||||||
|
|
||||||
|
Arithmetic `+ - * /` (integer arithmetic until a real appears: `12/5+10.0` = 12, `12/5.0+10.0` =
|
||||||
|
12.4, verified), `||` concatenation, variables (`SET @v <expr>;`, type follows the value; some
|
||||||
|
system variables are read-only). Functions verified on R1.03: `GPV_VALUE(<item>, 0)` (second
|
||||||
|
argument non-zero **resets the item to 0** after reading — use 0), `GPV_STATUS` (status number,
|
||||||
|
e.g. 9), `GPV_QUALITY`, `CHAR(<n>[, '<fmt>'])`, `NUMBER('<text or date>')`, `DECODE`, `SUBSTR`,
|
||||||
|
`UPPER`, `LOWER`, `LENGTH`, `LINE(n)`, `DRAW(n, '*')`, `MONTH_DAYS`, `TO_GMT`, `LOGBOOK_TEXT('<report>')`.
|
||||||
|
Also documented: `ABS`, `ADD_MONTHS`, `ASCII_FILE` (≤ 511 characters), `BAND/BOR/BXOR/BNOT/BSHIFT`,
|
||||||
|
`CHR`, `TO_LCT`, `TO_INTEGER`, `TO_REAL`, `SPV_VALUE/SPV_STATUS/SPV_QUALITY` (**write** an item —
|
||||||
|
only with approval).
|
||||||
|
|
||||||
|
System variables: `@DATE`/`@TIME` (now), `@GEN_TIME` (scheduled time of this generation),
|
||||||
|
`@PAGE`, `@LINE`, `@CUSTOMER`, `@VERSION` (`'1.03.00'`), `@NAME`, `@DESCRIPTION`, `@P0`–`@P7`
|
||||||
|
(ad-hoc parameters, strings, not available in the interactive generator), `@NEXT` (1 = pause each
|
||||||
|
page in interactive mode), `@WORKSPACE`, `@SORTSPACE`, `@FORMFEED`.
|
||||||
|
|
||||||
|
## 6. Output to files (§6, §9.12 SPOOL)
|
||||||
|
|
||||||
|
```
|
||||||
|
SPOOL 'C:\Users\Public\Yokogawa\tls\lst\cieng_levels.csv';
|
||||||
|
SET @EXPORT 1;
|
||||||
|
SELECT name, item_value, status FROM item_val WHERE name LIKE 'CI-Eng-Sample.TANK1.%';
|
||||||
|
SPOOL;
|
||||||
|
SET @EXPORT 0;
|
||||||
|
```
|
||||||
|
|
||||||
|
Verified: the file gets `"name",value,"status"` lines; the output also still appears in the
|
||||||
|
report. File name ≤ 79 characters, overwritten if it exists, never deleted by CI Server.
|
||||||
|
Environment variables are not expanded.
|
||||||
|
|
||||||
|
## 7. Communication and miscellaneous (§7, §8)
|
||||||
|
|
||||||
|
`SEND [<node>:]<process> [REPLY] [CODE n] [NO] PACKING <expr> AS 'I1|I2|I4|F4|F8|Ann', …;` and
|
||||||
|
`RECEIVE [FROM …] [CODE n] [NO] PACKING [TIMEOUT s] @v AS '…', …;` exchange BUS Service messages
|
||||||
|
with applications (system integrators). `DICTIONARY rpidis.'tlsdic';` (default),
|
||||||
|
`INCLUDE '<report>' | FILE '<file>';`, `LOGIN rptman[, <prio>];` (set-up files only, last
|
||||||
|
statement), `QUIT;`, `SHOW [FULL] VARS|COLUMN|CURSOR|HEADER|FOOTER|BREAKS|RESERVED|STAT|WORKSPACE|*;`.
|
||||||
|
|
||||||
|
## 8. Building queries (Appendix 1)
|
||||||
|
|
||||||
|
Field names: `dssqld -f -d <DATASET>`, the `.dss` files in `tls\src`, or *Ctrl+Space* in the
|
||||||
|
Engineering Module query editor (keywords, datasets, fields). Example in the appendix: current
|
||||||
|
alarms from `alarm_current` with a header.
|
||||||
64
knowledge/manuals/IM36K10P30-01EN.md
Normal file
64
knowledge/manuals/IM36K10P30-01EN.md
Normal file
|
|
@ -0,0 +1,64 @@
|
||||||
|
---
|
||||||
|
manual: IM 36K10P30-01EN
|
||||||
|
title: Data Set Service Language
|
||||||
|
edition: 3rd Edition, Sep. 2023
|
||||||
|
version: R1.03
|
||||||
|
status: compiler run as a syntax check on a copy of the installed DSS files and on a deliberately broken test file (2026-10-01); defining new datasets and updating the dictionary from docs only
|
||||||
|
---
|
||||||
|
|
||||||
|
# Data Set Service Language (R1.03)
|
||||||
|
|
||||||
|
The DSS language describes datasets; the DSS compiler (`dss.exe`) checks the descriptions and
|
||||||
|
builds the data dictionary (`%TLS_DAT_PATH%\tlsdic_dss.dic`) and C include files. It is a system
|
||||||
|
integrator's tool: **changing the dictionary changes CI Server itself** and is only needed for
|
||||||
|
custom datasets, custom report destinations (`IM36K10R40-01EN.md` §3.3) or custom data access
|
||||||
|
servers. Section numbers refer to the manual.
|
||||||
|
|
||||||
|
## 1. DSS files (§2)
|
||||||
|
|
||||||
|
- Plain text, one dataset per file recommended, extension `.dss`. The installed descriptions are
|
||||||
|
in `%TLS_ROOT_PATH%\tls\src\` (253 `.dss` files on the test system, plus `.c` sources of the
|
||||||
|
data access servers and `.umh` message files). Reading them is the best way to learn a
|
||||||
|
dataset's fields, ranges, lists and defaults (`dssqld -f` shows the same information).
|
||||||
|
- Syntax: `<KEYWORD value>` or `<KEYWORD <SUB …> …>`; keywords case-insensitive; strings in
|
||||||
|
double quotes with `""` for a quote; `/* */` and `//` comments.
|
||||||
|
- Order in a file: includes (`<INCLUDE "dss_global.dss">`), constants
|
||||||
|
(`<DEFINE_CONSTANT <LABEL …> <VALUE …>>`), macros, field templates, storage nodes, then
|
||||||
|
`<DATASET <NAME …> <DESCRIPTION …> <FIELD …>… <PHYSICAL_FIELD …>… <INDEX …>… <DATA_FILE …>
|
||||||
|
<DATA_ACCESS <SERVERNAME "dsilib:…">> <OPERATIONS> <STORAGE <NODES …>> …>`.
|
||||||
|
- A dataset needs a name (not an SQL keyword, unique), at least one field and one unique index.
|
||||||
|
- Texts (descriptions, headings, list entries) can carry translations (English, Dutch, German,
|
||||||
|
French).
|
||||||
|
- Field properties: data type or field template, description, heading, format, transformation,
|
||||||
|
basic operations, range/step, list (`<ENTRY <NUMERIC n> <STRING "text">>`), required, hidden,
|
||||||
|
concealed, default, character restrictions/operations, password-encrypted, "maps upon"
|
||||||
|
(relational field to another dataset), enabled, validate, group. Relational and compound
|
||||||
|
(composed) fields and physical fields have their own sentences; indexes may be unique.
|
||||||
|
|
||||||
|
## 2. Compiler (§3)
|
||||||
|
|
||||||
|
Run `dss` in the folder that holds the `.dss` files; it compiles **all** of them.
|
||||||
|
|
||||||
|
| Flag | Effect |
|
||||||
|
|---|---|
|
||||||
|
| none | Syntax check only (errors on screen) |
|
||||||
|
| `-d[<dict>]` | Create/update a dictionary (default `tlsdic_dss.dic` in `%TLS_DAT_PATH%`) — host node only; other nodes get the change through `DSSWTH` |
|
||||||
|
| `-i` | Write C include files (`.dsh`) |
|
||||||
|
| `-l[<list>]` | List file (default `tlsdic_dss.lst` next to the files) |
|
||||||
|
| `-q` / `-w` / `-b` | Quiet / no warnings / no boundary check |
|
||||||
|
|
||||||
|
**Installed (verified):** a copy of the 253 installed files compiled in 2 s with no errors
|
||||||
|
(`dss -l -w`, 251 files plus the two include files) and `tlsdic_dss.dic` was not touched. A test
|
||||||
|
file with a missing `>` gave `cieng_test_df.dss (15,2): EOF is not expected, expected 1
|
||||||
|
end-of-sentence characters ('>')` and `1 errors found.` The start script uses an undocumented
|
||||||
|
`-u` (compile without the DSS shared memory) on the first start. `dssxdb` has a "beautify DSS
|
||||||
|
dictionary source" function to find unbalanced `<` `>` (`IM36K10L50-01EN.md` §1.2).
|
||||||
|
|
||||||
|
To add a value to an existing list (e.g. a report destination, R40 §3.3): edit the `.dss` in
|
||||||
|
`tls\src`, run `dss -d` in that folder, restart CI Server. Not practiced (would change the test
|
||||||
|
system's dictionary).
|
||||||
|
|
||||||
|
## 3. Include files (§4)
|
||||||
|
|
||||||
|
The `.dsh` output holds constants, dataset information, a C record structure and index
|
||||||
|
information for programs that use the DSS API. Not needed for engineering work.
|
||||||
77
knowledge/manuals/IM36K10R40-01EN.md
Normal file
77
knowledge/manuals/IM36K10R40-01EN.md
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
---
|
||||||
|
manual: IM 36K10R40-01EN
|
||||||
|
title: Report Server Setup
|
||||||
|
edition: 3rd Edition, Sep. 2023
|
||||||
|
version: R1.03
|
||||||
|
status: processes, start/stop scripts, rptman.sup and the generator set-up files checked on the test system; interactive generator and rptstp verified 2026-10-01; separate server processes, extra generators and custom destinations from docs
|
||||||
|
---
|
||||||
|
|
||||||
|
# Report Server Setup (R1.03)
|
||||||
|
|
||||||
|
How REPORT Service is built and configured. Writing reports: `IM36K10P20-01EN.md` (RQL) and
|
||||||
|
`IM36K10C30-01EN.md` (Engineering Module). Section numbers refer to the manual.
|
||||||
|
|
||||||
|
## 1. Parts (§1)
|
||||||
|
|
||||||
|
| Block | Process | Job |
|
||||||
|
|---|---|---|
|
||||||
|
| Manager | `RPTMAN` | Stores report definitions, schedules (through HISTORY Service), event triggers and ad-hoc requests; hands generation to a generator; manages generated reports |
|
||||||
|
| Generator | `RPTGE1` (executable `rptgen`) | Runs the RQL of a report and writes the result; ad-hoc queries use copies of the generator |
|
||||||
|
| Report stopper | `rptstp <generator>…` | Cancels the report a generator is working on |
|
||||||
|
| Info servers (RPI) | `rpidic`, `rpidis` (DSS dictionary), `rpidix` (DSS data), `rpifil`, `rpiitm`, `rpihis`, `rpialm`, `rpievt`, `rpiopc`, `rpicif` | Fetch data for the generator; **linked into the generator by default** — separate processes only when the data lives on another node |
|
||||||
|
|
||||||
|
Default layout (installed): one node, servers linked into `rptgen`; `report_start.cmd` (in
|
||||||
|
`tls\com`) refuses to start when HISTORY Service is not running, then starts `rptman` and
|
||||||
|
`rptgen -n rptge1`. The separate `rpi*` lines and a second generator (`rptge2`) and `rptgsp`
|
||||||
|
are present but commented out. `report_stop.cmd` stops `rpt*` and `rpi*` with `durstp`.
|
||||||
|
Full functionality needs BUS, DATABASE, HISTORY, ITEM, AUDIT, PROCESS Services and INTEGRATION.
|
||||||
|
|
||||||
|
## 2. Setup files (§2.2)
|
||||||
|
|
||||||
|
- `tls\sup\rptman.sup` (manager): `HIS = <node>, <name>, <task>` (default `0, HIS, 0`),
|
||||||
|
`DUR_QUEUE_SIZE` (500 KB). `FPATH`/`SPATH` are not used. **Installed:** `his = 0, HIS, 0`,
|
||||||
|
`dur_queue_size = 500`. Also present: `rptini.sup` (only a licence-like value, undocumented).
|
||||||
|
- Generator set-up descriptions are RQL files with extension `.rpt`, named after the instance:
|
||||||
|
- `rptge1.rpt` (background generator) — installed: `@workspace 500`, `@page_size 66`,
|
||||||
|
`@width 120`, `@left_margin 1`, `@top_margin 1`, header (line, customer name centred,
|
||||||
|
description right, `Report of DD-MMM-YY`, line), footer (line, report name, `page n`, line),
|
||||||
|
`dictionary rpidis.'tlsdic';`, `login rptman;` (priority 0). Every background report gets
|
||||||
|
this layout unless its query overrides it.
|
||||||
|
- `rptgen.rpt` (interactive) — no `LOGIN` (that is what makes the generator interactive),
|
||||||
|
`@page_size 23`, `@formfeed 0`, `@workspace 100`.
|
||||||
|
- `rptgsp.rpt` — a spare generator with `login rptman, 9` (not started by default).
|
||||||
|
Documented defaults when a variable is not set: top 3, bottom 6, left/right 0, width 80
|
||||||
|
(40–512), page 72 (20–255), sort space 100 KB, workspace 500 KB (C30 and P20 say 16 KB, ISS-047).
|
||||||
|
- `DICTIONARY` in the set-up file chooses the dictionary server/node; default `rpidis.'tlsdic'`
|
||||||
|
(file `%TLS_DAT_PATH%\tlsdic_dss.dic`).
|
||||||
|
|
||||||
|
## 3. More generators (§2.4)
|
||||||
|
|
||||||
|
Add `start /B /NORMAL %TLS_ROOT_PATH%\tls\exe\rptgen -n rptge2` to `report_start.cmd` and a
|
||||||
|
`tls\sup\rptge2.rpt` ending with `LOGIN rptman, <p>;`. A generator only takes reports with a
|
||||||
|
priority ≥ its own; one generator must keep priority 0. Higher-priority reports are generated
|
||||||
|
first. Admin rights and a restart needed (not practiced).
|
||||||
|
|
||||||
|
## 4. Layout defaults (§3.1, §3.2)
|
||||||
|
|
||||||
|
Put shared header/footer/margins in the set-up file (or a new `.rpt` given with `-s`).
|
||||||
|
`@export 1` gives comma-separated output (for files read by other programs). Memory: `@workspace`
|
||||||
|
(strings, records), `@sortspace` (ORDER/GROUP BY; spills to `tls\lst` when too small).
|
||||||
|
|
||||||
|
## 5. Destinations (§3.3)
|
||||||
|
|
||||||
|
The Engineering Module offers file, printer and system log destinations; R1.03 adds printer
|
||||||
|
management devices and destinations (`IM36K10C30-01EN.md` §3). Adding a new built-in destination
|
||||||
|
means changing `rpt_print.c` (not shipped as buildable on the test system), re-linking `rptman`
|
||||||
|
and adding a list entry to `report_val.dss` (`dss -d`) — system integrator work, not practiced.
|
||||||
|
|
||||||
|
## 6. Interactive mode (§4) and stopping (§5)
|
||||||
|
|
||||||
|
`rptgen -s rptgen.rpt` starts a foreground generator (prompt `RPT>`); end with `QUIT;`. Useful to
|
||||||
|
try RQL and inspect datasets without defining a report. `rptstp rptge1` cancels the running
|
||||||
|
report of `RPTGE1` (also the *Cancel* button / `REPORT_DF.CANCEL`).
|
||||||
|
|
||||||
|
**Verified 2026-10-01:** piped input works (`rptgen -s rptgen.rpt < query.rql`), set
|
||||||
|
`SET @NEXT 0;` first or every page waits for Enter. `rptstp rptge1` stopped an endless loop
|
||||||
|
report within seconds; `GENERATE` went back to 0, an empty generated report was stored, the
|
||||||
|
generator stayed running and took the next report normally. Task: skill `reporting`.
|
||||||
|
|
@ -56,12 +56,12 @@ AID is not needed.
|
||||||
| 10 | IM 36K10R30 | Graphic Display Setup | done for HTML display, folders and layouts (phase 10b: desktop and web); dataset forms, form language, dual screen from docs ([notes](manuals/IM36K10R30-01EN.md)); skill `graphics` |
|
| 10 | IM 36K10R30 | Graphic Display Setup | done for HTML display, folders and layouts (phase 10b: desktop and web); dataset forms, form language, dual screen from docs ([notes](manuals/IM36K10R30-01EN.md)); skill `graphics` |
|
||||||
| 10 | IM 36K10C50 | Edit Module | done for one display (built by the user) and `jwuiutl` validate/search/export; other components, symbols, actions from docs ([notes](manuals/IM36K10C50-01EN.md)) |
|
| 10 | IM 36K10C50 | Edit Module | done for one display (built by the user) and `jwuiutl` validate/search/export; other components, symbols, actions from docs ([notes](manuals/IM36K10C50-01EN.md)) |
|
||||||
| 10 | IM 36K10C60 | Advanced Operating Graphics | summarized, from docs (AOG displays checked read-only) ([notes](manuals/IM36K10C60-01EN.md)) |
|
| 10 | IM 36K10C60 | Advanced Operating Graphics | summarized, from docs (AOG displays checked read-only) ([notes](manuals/IM36K10C60-01EN.md)) |
|
||||||
| 11 | IM 36K10L50 | Data Set Service Engineering | not started |
|
| 11 | IM 36K10L50 | Data Set Service Engineering | done for DSS processes, `dss.sup`, quick load directives (macro, include, memo from file), `dssutl` read; `dssana.sup` covered by skill `authorization` ([notes](manuals/IM36K10L50-01EN.md)); task `system-management/dss-tools.md` |
|
||||||
| 11 | IM 36K10P30 | Data Set Service Language | not started |
|
| 11 | IM 36K10P30 | Data Set Service Language | summarized; compiler used as syntax check on a copy (no dictionary change) ([notes](manuals/IM36K10P30-01EN.md)) |
|
||||||
| 11 | IM 36K10P20 | Report Generation Language | not started |
|
| 11 | IM 36K10P20 | Report Generation Language | done for queries, layout, cursors/loops, functions, SPOOL/CSV, HTML; SEND/RECEIVE, BREAK, INCLUDE, FLAG PAGE from docs ([notes](manuals/IM36K10P20-01EN.md)); skill `reporting` |
|
||||||
| 11 | IM 36K10R40 | Report Server Setup | not started |
|
| 11 | IM 36K10R40 | Report Server Setup | done for processes, set-up files, interactive generator, `rptstp`; extra generators, separate RPI servers, custom destinations from docs ([notes](manuals/IM36K10R40-01EN.md)) |
|
||||||
| 11 | IM 36K10C30 | Engineering Module - Reporting | not started |
|
| 11 | IM 36K10C30 | Engineering Module - Reporting | done by quick load for report definitions (ad hoc + parameters, schedule, item trigger, HTML, logbook), generated reports and a file device/destination; Engineering Module forms, generate and view checked by the user; report component in displays and hardcopy printers from docs ([notes](manuals/IM36K10C30-01EN.md)) |
|
||||||
| 11 | IM 36K10E10 | Excel Add-in | not started |
|
| 11 | IM 36K10E10 | Excel Add-in | summarized, from docs (Excel not installed on the test system) ([notes](manuals/IM36K10E10-01EN.md)) |
|
||||||
| 12 | IM 36K10L25 | Audit Trail Management | not started |
|
| 12 | IM 36K10L25 | Audit Trail Management | not started |
|
||||||
| 13 | IM 36K10J20 | High Availability Computing | not started (needs two servers) |
|
| 13 | IM 36K10J20 | High Availability Computing | not started (needs two servers) |
|
||||||
| 13 | IM 36K10J40 | Active Directory Integration | not started (needs a domain) |
|
| 13 | IM 36K10J40 | Active Directory Integration | not started (needs a domain) |
|
||||||
|
|
@ -109,7 +109,7 @@ now come before classes and objects (phase 6), and the other interfaces follow a
|
||||||
| C10 | Integrator time unit: integration granule `itm_int_secs` in `itm.sup` ([task](../.claude/skills/item-engineering/tasks/sub-items.md)) | passed | passed | 60 → `RUN_SECONDS` +1 per minute; restored to 1 (file identical to backup), +1 per second again ([ISS-010](issues.md)). Elevated restarts run by the user. |
|
| C10 | Integrator time unit: integration granule `itm_int_secs` in `itm.sup` ([task](../.claude/skills/item-engineering/tasks/sub-items.md)) | passed | passed | 60 → `RUN_SECONDS` +1 per minute; restored to 1 (file identical to backup), +1 per second again ([ISS-010](issues.md)). Elevated restarts run by the user. |
|
||||||
| G10 | Displays, symbols, Operator Interface test | display done (phase 10); symbols not practiced | display added | Display `CIENG_Tank` built in the Edit Module and checked in the HTML display. |
|
| G10 | Displays, symbols, Operator Interface test | display done (phase 10); symbols not practiced | display added | Display `CIENG_Tank` built in the Edit Module and checked in the HTML display. |
|
||||||
| L41/C10 | Modbus TCP line, station, scan type, points, connected items by quick load ([task](../.claude/skills/equipment/tasks/modbus-station.md)) | passed | passed | Loopback to CI Server's own Modbus slave (`eqpmdcmem` + `eqpmdcslvtcp` on 5020, started by hand). Line load created and started `EQPCIENG`; removal stopped it and deleted its files. Write/read-back, off-scan/on-scan checked; full remove/reload from sample files. Protocol must be Open Modbus/TCP ([ISS-024](issues.md)). Mirror start files copied to `tls\com` by the user; after a restart everything came back under the CI Service and the setpoint was re-sent on connect. |
|
| L41/C10 | Modbus TCP line, station, scan type, points, connected items by quick load ([task](../.claude/skills/equipment/tasks/modbus-station.md)) | passed | passed | Loopback to CI Server's own Modbus slave (`eqpmdcmem` + `eqpmdcslvtcp` on 5020, started by hand). Line load created and started `EQPCIENG`; removal stopped it and deleted its files. Write/read-back, off-scan/on-scan checked; full remove/reload from sample files. Protocol must be Open Modbus/TCP ([ISS-024](issues.md)). Mirror start files copied to `tls\com` by the user; after a restart everything came back under the CI Service and the setpoint was re-sent on connect. |
|
||||||
| G10 | Alarms, reports, audit, RDBMS, history | alarms done (phase 8); others not practiced | alarms added | Covered in their own phases (7–12). |
|
| G10 | Alarms, reports, audit, RDBMS, history | alarms (phase 8), history (phase 9), reports (phase 11) done; audit, RDBMS not practiced | alarms, history, reports added | Covered in their own phases (7–12). |
|
||||||
| R10/R20 | Read a setup file: active settings and keyword help ([task](../.claude/skills/portal-setup/tasks/read-setup-file.md)) | passed | n/a | Read-only. Compared with the Setup File Editor GUI for `wfla_display.sup`, `wflgdi.sup` and all 9 tabs of `jwuiisg.sup`: fields and values identical. Manual differences logged as ISS-012 to ISS-017 (installed software taken as the reference). |
|
| R10/R20 | Read a setup file: active settings and keyword help ([task](../.claude/skills/portal-setup/tasks/read-setup-file.md)) | passed | n/a | Read-only. Compared with the Setup File Editor GUI for `wfla_display.sup`, `wflgdi.sup` and all 9 tabs of `jwuiisg.sup`: fields and values identical. Manual differences logged as ISS-012 to ISS-017 (installed software taken as the reference). |
|
||||||
| R10 | Check web access for CI View: ports, Remote Connect page, `DEPLOY` folder ([task](../.claude/skills/portal-setup/tasks/check-web-access.md)) | passed | n/a | 8080/8443 listening, page 200, six `DEPLOY` folders. |
|
| R10 | Check web access for CI View: ports, Remote Connect page, `DEPLOY` folder ([task](../.claude/skills/portal-setup/tasks/check-web-access.md)) | passed | n/a | 8080/8443 listening, page 200, six `DEPLOY` folders. |
|
||||||
| R10/R20 | Change a setup file safely ([task](../.claude/skills/portal-setup/tasks/change-setup-file.md)) | passed | n/a | `jwuiisg.sup` HTTP port 8080 → 8081 (text edit, elevated restart): 8081 served the page, 8080 refused; restored, hash identical to backup. Editor: *OK* writes at once, *Reset Field* restores the default (ISS-016). |
|
| R10/R20 | Change a setup file safely ([task](../.claude/skills/portal-setup/tasks/change-setup-file.md)) | passed | n/a | `jwuiisg.sup` HTTP port 8080 → 8081 (text edit, elevated restart): 8081 served the page, 8080 refused; restored, hash identical to backup. Editor: *OK* writes at once, *Reset Field* restores the default (ISS-016). |
|
||||||
|
|
@ -135,3 +135,10 @@ now come before classes and objects (phase 6), and the other interfaces follow a
|
||||||
| R30/C50 | Operator layout `CIENG_Operator` (menu, toolbar, navigation/main/banner frames, status line) added with `layout.ps1`; navigation display `CIENG_Menu`; open displays in frames, layouts and the `popup` layout ([task](../.claude/skills/graphics/tasks/layouts.md)) | passed | passed | Desktop: second 1600 x 900 window, frame navigation and Back, popup on top and minimised with its parent, F11 within taskbar limits; the Operator Interface must be restarted after `Layouts.xml` changes; factory `default` layout unchanged for Admin. Web: `?d=CIENG_Tank&l=CIENG_Operator`. Status line/command names not in the readme (ISS-042). A stray trend property connection caused a desktop error (ISS-041 update). |
|
| R30/C50 | Operator layout `CIENG_Operator` (menu, toolbar, navigation/main/banner frames, status line) added with `layout.ps1`; navigation display `CIENG_Menu`; open displays in frames, layouts and the `popup` layout ([task](../.claude/skills/graphics/tasks/layouts.md)) | passed | passed | Desktop: second 1600 x 900 window, frame navigation and Back, popup on top and minimised with its parent, F11 within taskbar limits; the Operator Interface must be restarted after `Layouts.xml` changes; factory `default` layout unchanged for Admin. Web: `?d=CIENG_Tank&l=CIENG_Operator`. Status line/command names not in the readme (ISS-042). A stray trend property connection caused a desktop error (ISS-041 update). |
|
||||||
| J10/C50 | Restart CI Server with the Edit Module open | observed | n/a | Start aborted: `JWUIGED<pid>` still attached to the BUS Service (`ci_start.log`); closing the Edit Module fixed it (skill `system-check`). |
|
| J10/C50 | Restart CI Server with the Edit Module open | observed | n/a | Start aborted: `JWUIGED<pid>` still attached to the BUS Service (`ci_start.log`); closing the Edit Module fixed it (skill `system-check`). |
|
||||||
| R30/C50/C60 | Dataset forms, symbols, AOG library, dual screen, per-user layouts | not practiced | n/a | GUI work; user profiles not changed. |
|
| R30/C50/C60 | Dataset forms, symbols, AOG library, dual screen, per-user layouts | not practiced | n/a | GUI work; user profiles not changed. |
|
||||||
|
| R40/C30 | REPORT Service checks: processes, set-up files (`rptman.sup`, `rptge1.rpt`, `rptgen.rpt`), system reports, `rptstp` ([task](../.claude/skills/reporting/tasks/report-checks.md)) | passed | n/a | Read-only plus one cancel: `rptstp rptge1` stopped the endless-loop test report `CIENG_LOOP` (removed). 28 system reports; two names differ from the manual (ISS-043). |
|
||||||
|
| R40/P20 | RQL in the interactive generator (`rptgen -s rptgen.rpt`), CSV with `SPOOL` ([task](../.claude/skills/reporting/tasks/rql-interactive.md)) | passed | passed | Piped query files (bash `<`, PowerShell via `cmd /c`); `@NEXT 0` needed; dates are local-time seconds; LOOP refused interactively (`RPT-E-LPNOTAL`); aggregated history empty on the test system. |
|
||||||
|
| C30/P20 | Report definitions by quick load: ad hoc with parameters, daily schedule, item trigger, HTML with cursor loop, logbook; generate, read, print, delete; remove ([task](../.claude/skills/reporting/tasks/define-reports.md)) | passed | passed | `CIENG_TANK1`, `CIENG_INFLOW_HI`, `CIENG_HTML` + destination `CIENG_FILE`; full sample remove/reload 0 errors. Schedule ≥ 10 min, scheduled report not deletable until the schedule is cleared, `CORRECT_DAYLIGHT` (ISS-044); `dssqld` ad hoc without `ADHOC_DEST` logs a print error (ISS-045). User checked the Engineering Module: forms, generate dialog (item browser not filtered, ISS-048), view of text and HTML reports. |
|
||||||
|
| C30 | File printer device and destination ([task](../.claude/skills/reporting/tasks/output-devices.md)) | passed | passed | Output type needs the node name (`<node>:FILE`); literal path only (`%TLS_LST_PATH%` failed). Sample builds the file at load (`17_printer_df.ps1`). |
|
||||||
|
| L50/P30 | DSS tools: processes, `dss.sup`, quick load macro/include/memo file, `dssutl` read, DSS compiler syntax check ([task](../.claude/skills/system-management/tasks/dss-tools.md)) | passed | n/a | Memo from file: absolute path ≤ 82 characters only (ISS-046). Dictionary untouched. |
|
||||||
|
| C30 | Report component on a display, hardcopy printer, extra report generators | not practiced | n/a | GUI / no printer / admin restart. |
|
||||||
|
| E10 | Excel Add-in (DART) | not practiced | n/a | Excel not installed on the test system. |
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue