Compare commits

..

4 commits

Author SHA1 Message Date
0bff3698c2 Record the Engineering Module check of the phase 11 reports
User checked the report forms, the generate dialog and viewing text and
HTML reports. The [ITEM:...] prompt filter does not limit the item
browser (ISS-048). system-check: Stop-Service error while CI Server
still restarts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 16:47:49 +10:00
5e77aada8e Record phase 11 manuals, progress and issues ISS-043 to ISS-047
Summaries of IM 36K10L50, P30, P20, R40, C30 and E10 (R1.03).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 16:17:02 +10:00
d7e30fa46e Add reporting skill and DSS tools task
New skill reporting: REPORT Service checks, interactive RQL, report
definitions by quick load, file output devices. New task
system-management/dss-tools.md: DSS processes, dss.sup, quick load
directives, dssutl, DSS compiler syntax check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 16:17:02 +10:00
84228490dd Add report device, destination and three reports to CI-Eng-Sample
CIENG_FILE (file device built for the node at load time), CIENG_TANK1
(ad hoc with item parameter, daily 06:00), CIENG_INFLOW_HI (item trigger)
and CIENG_HTML (HTML, cursor loop, logbook). remove.cmd clears the
schedule first, since a scheduled report cannot be deleted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 16:17:02 +10:00
27 changed files with 1323 additions and 12 deletions

View file

@ -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 |

View 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) |

View 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.

View 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.

View 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`.

View 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`).

View file

@ -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`

View file

@ -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 |

View 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).

View file

@ -1 +1,2 @@
*.qlo *.qlo
17_printer_df.qli

View 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"

View 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

View 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>';
"@

View 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"

View 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","",""

View 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"

View 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

View file

@ -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

View file

@ -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

View file

@ -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 |

View 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.

View 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.

View 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`.

View 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.

View 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.

View 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`.

View file

@ -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. |