Compare commits

..

No commits in common. "668a1d2e31d7c8882716765cb8cf6d0b0a64861e" and "c761b202576789661ab0eae3215f4cf93e2a1cef" have entirely different histories.

27 changed files with 12 additions and 1323 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 and reports; ODBC | C40 summary §5; reports: skill `reporting` | verified for reports (`rql-interactive.md`); ODBC from docs | | Reading history from classes, reports, ODBC | C40 summary §5 | from docs (phases 6, 11) |

View file

@ -1,45 +0,0 @@
---
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

@ -1,140 +0,0 @@
---
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

@ -1,75 +0,0 @@
---
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

@ -1,68 +0,0 @@
---
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

@ -1,77 +0,0 @@
---
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,10 +83,6 @@ 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,10 +8,7 @@ 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), or work with DSS / Data Set Services (dsssda, BUS Service queues (adaptive queues, dur.sup). Sources IM 36K10J10-01EN, IM 36K10L30-01EN.
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)
@ -37,4 +34,3 @@ 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

@ -1,81 +0,0 @@
---
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,2 +1 @@
*.qlo *.qlo
17_printer_df.qli

View file

@ -1,16 +0,0 @@
# 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

@ -1,23 +0,0 @@
@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

@ -1,82 +0,0 @@
@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

@ -1,15 +0,0 @@
@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

@ -1,13 +0,0 @@
@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

@ -1,19 +0,0 @@
@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,10 +73,6 @@ 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`.
@ -100,11 +96,8 @@ 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 (reports and printer `83`/`84` first, alarm definitions last, `93`) | | `76_`…`93_remove_*.qli` | Names to delete, in reverse order (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`) |
@ -178,26 +171,12 @@ 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,8 +37,3 @@ 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,17 +1,10 @@
@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: reports, printer, OPC UA, Modbus, auth group, object, class, trigger group, storage links, stop + delete storage groups, items, sections (children first). rem Order: 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,9 +62,3 @@ 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

@ -1,146 +0,0 @@
---
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

@ -1,55 +0,0 @@
---
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

@ -1,126 +0,0 @@
---
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

@ -1,134 +0,0 @@
---
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

@ -1,64 +0,0 @@
---
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

@ -1,77 +0,0 @@
---
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 | 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 36K10L50 | Data Set Service Engineering | 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 36K10P30 | Data Set Service 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 36K10P20 | Report Generation Language | 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 36K10R40 | Report Server Setup | 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 36K10C30 | Engineering Module - Reporting | not started |
| 11 | IM 36K10E10 | Excel Add-in | summarized, from docs (Excel not installed on the test system) ([notes](manuals/IM36K10E10-01EN.md)) | | 11 | IM 36K10E10 | Excel Add-in | not started |
| 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 (phase 8), history (phase 9), reports (phase 11) done; audit, RDBMS not practiced | alarms, history, reports added | Covered in their own phases (7–12). | | G10 | Alarms, reports, audit, RDBMS, history | alarms done (phase 8); others not practiced | alarms 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,10 +135,3 @@ 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. |