diff --git a/.claude/skills/data-access/SKILL.md b/.claude/skills/data-access/SKILL.md index c502820..e83ca54 100644 --- a/.claude/skills/data-access/SKILL.md +++ b/.claude/skills/data-access/SKILL.md @@ -1,24 +1,27 @@ --- name: data-access description: >- - CI Server R1.03 ACCESS Service: OPC UA, OPC DA, OPC A&E and ODBC. Use when the user wants to - connect CI Server to an OPC UA server (OPC UA client line, station, subscription, points, - certificates, node IDs, browse), let another application read CI Server data over OPC UA, OPC - DA or OPC A&E (CI Server as OPC server, OPC visible / read / write, port 34493, endpoints, - security policy, trusting client certificates, UaExpert), check why an OPC connection fails - (BadCertificateUntrusted, BadSecurityChecksFailed, item stays NOT INIT), configure DCOM or DCOM - tunnelling for OPC Classic, use ODBC / SimbaClient / SQL on datasets, or check the ODBC server - (odbsrv, port 1583, SSL certificate), or copy item values and timestamps into Microsoft SQL - Server with RDBMS data exposure (dbc.sup, DEM_CONNECTION, DBCSND, DBCDEM, DATA_EXPOSURE_DF, - data exposure aggregation interval AGG_INTERVAL, ITEM_VALUES, SQL login, DSS-E-FLT_SYN_ERR). - Sources IM 36K10L45-01EN, IM 36K10E20-01EN, IM 36K10G10-01EN ch. 10. + CI Server R1.05 ACCESS Service: OPC UA, OPC DA, OPC A&E, ODBC and the RESTful API. Use when + the user wants to connect CI Server to an OPC UA server (OPC UA client line, station, + subscription, points, certificates, node IDs, browse, OPC UA methods MTD_KEY / MTD_TRG, + OPCUAC_METHOD_CALL2_DF), let another application read CI Server data over OPC UA, OPC DA or + OPC A&E (CI Server as OPC server, OPC visible / read / write, port 34493, endpoints, security + policy, trusting client certificates, UaExpert, extended OPC UA functions for alarms, history + and PubSub, OPC UA Information Model Mapper, NodeSet / imported information model), check why + an OPC connection fails (BadCertificateUntrusted, BadSecurityChecksFailed, item stays NOT INIT, + certificate expiry warning), configure DCOM or DCOM tunnelling for OPC Classic, use ODBC / + SimbaClient / SQL on datasets, or check the ODBC server (odbsrv, port 1583, SSL certificate), + use the RESTful API (jrstsrv, port 34597, API key, x-api-key), or copy item values and + timestamps into Microsoft SQL Server with RDBMS data exposure (dbc.sup, DEM_CONNECTION, DBCSND, + DBCDEM, DATA_EXPOSURE_DF, data exposure aggregation interval AGG_INTERVAL, ITEM_VALUES, SQL + login, DSS-E-FLT_SYN_ERR). Sources IM 36K10L45-01EN, IM 36K10E20-01EN, IM 36K10G10-01EN ch. 10. --- -# Data access: OPC, ODBC and RDBMS data exposure (R1.03; RDBMS exposure tested in R1.05 only) +# Data access: OPC, ODBC, RESTful API and RDBMS data exposure (R1.05; first written for R1.03) -Background: `knowledge/manuals/IM36K10L45-01EN.md` (ODBC, OPC DA/A&E/UA client and server, -setup files), `IM36K10E20-01EN.md` (Engineering Module forms, certificates, PubSub). Equipment -lines/stations/points in general: skill `equipment`. +Background: `knowledge/manuals/IM36K10L45-01EN.md` (ODBC, RESTful API, OPC DA/A&E/UA client and +server, setup files), `IM36K10E20-01EN.md` (Engineering Module forms, certificates, Information +Model Mapper, PubSub). Equipment lines/stations/points in general: skill `equipment`. Rules: - Run `system-check` first; follow the user's chosen way of working. @@ -26,20 +29,30 @@ Rules: common name) and let the user trust it (Engineering Module or moving the file); do not move certificate files yourself. - Making items OPC visible / writable exposes them to every OPC client on the network: only - with the user's approval, and prefer read-only. + with the user's approval, and prefer read-only. The same applies to the RESTful API (keep its + read-only mode, the product default, unless the user decides otherwise). - Never connect a CI Server OPC **DA or A&E** client to the same node's (or a DURM-connected - node's) DA/A&E server: deadlock (manual §5.3). The OPC **UA** loopback is fine. -- Changing `opxsys.sup`, `opxuas.sup`, `odbsrv.sup` or `ServerConfig.xml` needs admin rights and - a restart: hand it to the user (skill `portal-setup`, task `change-setup-file.md`). + node's) DA/A&E server: deadlock (IM 36K10L45 5th ed. §6.3). The OPC **UA** loopback is fine. +- **Extended OPC UA functions are off by default since R1.04.** The OPC UA server offers only + Data Access and methods unless `OPXUAS_ENABLE_EXTENDED_FUNC = YES` in `opxuas.sup` (needed for + Alarms & Conditions, HistoryRead and PubSub); the OPC UA client receives no alarms unless + `OPXC_ENABLE_EXTENDED_FUNC = YES` in its `.sup`. Both are `NO` on the R1.05 test + server (verified 2026-10-08). Source: IM 36K10L45 5th ed. ch. 11 intro, §10.4, §10.11, + §11.6.2, App. 1.3. +- Changing `opxsys.sup`, `opxuas.sup`, `.sup`, `odbsrv.sup`, `jrstsrv.sup` or + `ServerConfig.xml` needs admin rights and a restart: hand it to the user (skill + `portal-setup`, task `change-setup-file.md`). - The same applies to `dbc.sup` (RDBMS data exposure). SQL Server changes (mixed mode, logins, jobs) are on another system: only with the user's and the SQL Server owner's agreement. | Task | File | Status | |---|---|---| -| OPC UA client to an OPC UA server (sample: loopback to CI Server's own server): line, station, subscription, points, certificate exchange, node IDs, browse via dataset | `tasks/opcua-client.md` | verified | -| Make CI Server data available to OPC clients (OPC visible / Read / Write); CI Server OPC UA server endpoints, node IDs, certificates | `tasks/opcua-client.md` §1, §5 | verified (UA); DA/A&E from docs | -| Read-only checks: ACCESS processes, ports, OPC UA server config and PKI, ODBC server state | `tasks/access-checks.md` | verified | +| OPC UA client to an OPC UA server (sample: loopback to CI Server's own server): line, station, subscription, points, certificate exchange, node IDs, browse via dataset | `tasks/opcua-client.md` | verified on R1.03 and R1.05 (loopback re-tested 2026-10-08) | +| Make CI Server data available to OPC clients (OPC visible / Read / Write); CI Server OPC UA server endpoints, node IDs, certificates | `tasks/opcua-client.md` §1, §5 | verified on R1.03 (UA); DA/A&E from docs | +| Read-only checks: ACCESS processes, ports (34493, 1583, 34597), OPC UA server config and PKI, extended functions, certificate validity, ODBC server state | `tasks/access-checks.md` | verified on R1.05 (2026-10-08) | +| OPC UA client methods (`MTD_*` object, method form, `CIX_UAC_MTD` point) and R1.03 → R1.04 method upgrade | `tasks/opcua-client.md` §7 | from docs | | OPC DA / A&E client and server, DCOM, DCOM tunnelling | L45 summary §3–§5 | from docs (DA loopback not allowed) | -| ODBC with SimbaClient | L45 summary §1 | from docs; ODBC server not running on the test system (ISS-008) | -| OPC UA alarms (external alarms), methods, PubSub | L45 §6, E20 §2–§4 | from docs | +| ODBC with SimbaClient | L45 summary §1 | from docs; ODBC server not running on the R1.03 and R1.05 test systems (ISS-008) | +| RESTful API (`jrstsrv`, port 34597, API key, functions) | L45 summary §9 | from docs; port and setup keywords verified on R1.05 | +| OPC UA alarms (external alarms), model change events, PubSub, imported information model / Information Model Mapper | L45 summary §6–§7, E20 summary §2–§5 | from docs | | RDBMS data exposure to SQL Server: SQL login, `dbc.sup` `DEM_CONNECTION`, `DATA_EXPOSURE_DF` (filter syntax), item aggregation interval, checks, table behaviour, SQL-side retention | `tasks/rdbms-exposure.md` | tested in R1.05 only (`ITEM_VALUES`); `ITEM_HISTORY` / `ITEM_INPUTS` not tested | diff --git a/.claude/skills/data-access/tasks/access-checks.md b/.claude/skills/data-access/tasks/access-checks.md index 0284b1a..7f45add 100644 --- a/.claude/skills/data-access/tasks/access-checks.md +++ b/.claude/skills/data-access/tasks/access-checks.md @@ -1,23 +1,26 @@ --- -task: Read-only checks of ACCESS Service (OPC UA server, OPC clients, ODBC server) -version: R1.03 -source: IM 36K10L45-01EN §1–§3, §6, §9, §10; practiced on the test system 2026-10-01 -status: verified +task: Read-only checks of ACCESS Service (OPC UA server, OPC clients, ODBC server, RESTful API) +version: R1.05 (first written for R1.03) +source: IM 36K10L45-01EN 5th ed. (Feb. 2026) §1–§3, §4.2, §7, §10, §11; IM 36K10E20-01EN 4th ed. §2.2; practiced on the R1.03 test system 2026-10-01; re-checked read-only on the R1.05 test server 2026-10-08 +status: verified on R1.05 (2026-10-08, read-only checks below); R1.03 results kept where marked --- # ACCESS Service checks (read-only) -| Check | How | Test system result | +| Check | How | Result (R1.05 test server 2026-10-08 unless marked) | |---|---|---| -| Processes | `tasklist` → `opxuas.exe` (UA server), `opxuac.exe` (one per OPC UA line + `opxuac_mon`), `opxdas12.exe` / `opxaes.exe` (only while a client is connected), `opxdac.exe`/`opxaec.exe` (per line); `durwfp -p -t 0` → 0 = attached | `opxuas`, `opxuac` (`OPXUAC_MON`) running | -| Ports | `netstat -ano` LISTENING: 34493 (OPC UA server), 1583 (ODBC), 135 (DCOM) | 34493 yes, 1583 **no** | -| Start log | `%TLS_LOG_PATH%\ci_start.log`, `umhlog.log` | `InitializeSslCtx(): SSL_CTX_use_certificate_chain_file() failed` + `Process ODBSRV exited unexpectedly` = ODBC server cannot load its certificate (ISS-008) | -| ODBC settings | `tls\sup\odbsrv.sup` (`PORT`, `USESSL`), certificate `%TLS_ROOT_PATH%\tls\pki\odbsrv\SampleServerCertificate.pem` + key | `USESSL YES`, folder missing | -| OPC UA server settings | `tls\sup\opxuas.sup`; endpoints and user tokens in `tls\exe\ServerConfig.xml` (ignore commented XML) | Endpoint `opc.tcp://[NodeName]:34493`; Basic256Sha256 / Aes128_Sha256_RsaOaep / Aes256_Sha256_RsaPss with Sign or SignAndEncrypt; anonymous, user/password, certificate tokens on | -| OPC UA certificates | `%TLS_ALLUSERS_PATH%\pki\opxuas\pkiserver\{own,trusted,rejected,issuers}`; client `…\pki\opxuac\pkiclient\{own,trusted,rejected,deleted,issuers}`; dataset `OPCUAC_PKI_CERTIFICATES_DF` | Server own `ciserveruaserver.der` | -| OPC Classic settings | `tls\sup\opxsys.sup` (tabs Alarm and Event Client, Data Access Server, Alarm & Event Server) | Defaults; `OPXAEC_SAFE_CON NO` | -| OPC UA client config | export `OPCUAC_LINE_DF`, `…_STATION_DF`, `…_SUBSCRIPTION_DF`, `…_POINT_DF` | Only the sample loopback | -| Logs | `%TLS_LOG_PATH%\OPXUAS.log`, `OpxUas_Sdk*.log`, `.log` | | +| Processes | `tasklist` → `opxuas.exe` (UA server), `opxuac.exe` (one per OPC UA line + `opxuac_mon`), `opxdas12.exe` / `opxaes.exe` (only while a client is connected), `opxdac.exe`/`opxaec.exe` (per line), a `javaw.exe` for the RESTful API server; `durwfp -p -t 0` → 0 = attached | `opxuas`, `opxuac` (`OPXUAC_MON`) running; no `odbsrv` (same on R1.03) | +| Ports | `netstat -ano` LISTENING: 34493 (OPC UA server), 1583 (ODBC), 34597 (RESTful API, R1.04+), 135 (DCOM) | 34493 yes, 34597 yes, 135 yes, 1583 **no** (R1.03: same, no 34597) | +| Start log | `%TLS_LOG_PATH%\ci_start.log`, `umhlog.log` | `InitializeSslCtx(): SSL_CTX_use_certificate_chain_file() failed` + `Process ODBSRV exited unexpectedly` = ODBC server cannot load its certificate (ISS-008; R1.03 and R1.05) | +| ODBC settings | `tls\sup\odbsrv.sup` (`PORT`, `USESSL`), certificate `%TLS_ROOT_PATH%\tls\pki\odbsrv\SampleServerCertificate.pem` + key | `odbsrv.sup` identical to R1.03, `USESSL YES`, folder missing | +| OPC UA server settings | `tls\sup\opxuas.sup`; endpoints and user tokens in `ServerConfig.xml` — R1.05: `%TLS_SAV_PATH%\ServerConfig.xml` (R1.03: `%TLS_ROOT_PATH%\tls\exe`; ISS-081); ignore commented XML | Endpoint `opc.tcp://[NodeName]:34493`; Basic256Sha256 / Aes128_Sha256_RsaOaep / Aes256_Sha256_RsaPss with Sign or SignAndEncrypt; anonymous, user/password, certificate tokens on (unchanged from R1.03; the R1.05 file only adds SDK sections) | +| Extended OPC UA functions | `findstr EXTENDED_FUNC` in `opxuas.sup` and in the client's `.sup` (template `epauac_eqp.sup`) | `OPXUAS_ENABLE_EXTENDED_FUNC = NO`, `OPXC_ENABLE_EXTENDED_FUNC = NO` (product defaults): no OPC UA alarms, HistoryRead or PubSub until set to YES | +| OPC UA certificates | `%TLS_ALLUSERS_PATH%\pki\opxuas\pkiserver\{own,trusted,rejected,issuers}`; client `…\pki\opxuac\pkiclient\{own,trusted,rejected,deleted,issuers}`; dataset `OPCUAC_PKI_CERTIFICATES_DF` | Server own `ciserveruaserver.der`; client own `_OPXUAC_MON.der`; server `rejected` absent until the first rejection | +| Certificate validity | `certutil -dump .der` and look at `NotAfter` | Both own certificates valid 5 years from installation. The OPC UA client warns in the Historical Alarm Overview and the UMH message log before a client or server certificate expires (IM 36K10E20 4th ed. §2.2); lead time = hidden keyword `OPXC_CERT_EXP_PERIOD_WARN`, 2 months in `epauac_eqp.sup` | +| OPC Classic settings | `tls\sup\opxsys.sup` (tabs Alarm and Event Client, Data Access Server, Alarm & Event Server) | Defaults; `OPXAEC_SAFE_CON NO`; new in R1.05: `OPXAES_DIR_ALM = YES` (A&E server, "Direct" alarm events; not in the manual, ISS-085) | +| OPC UA client config | export `OPCUAC_LINE_DF`, `…_STATION_DF`, `…_SUBSCRIPTION_DF`, `…_POINT_DF`, `OPCUAC_METHOD_CALL2_DF` | R1.03: only the sample loopback. R1.05: dataset structure of line, station, subscription and point unchanged | +| RESTful API settings | `tls\sup\jrstsrv.sup`: `JRST_NETWORK_PORT` (34597), `JRST_READ_ONLY_MODE` (product default YES), `JRST_MAX_RECORDS` (default 100), `JRST_USE_TWO_WAY_SSL` (NO), `JRST_USER_CACHE_TIME` (600 s), `JRST_CUSTOM_DATASETS`; API keys in dataset `API_KEYS_DF` (export without records in reports) | Keywords as in IM 36K10L45 5th ed. §4.2.1; compare the active values with the `!DEFAULT` block | +| Logs | `%TLS_LOG_PATH%\OPXUAS.log`, `OpxUas_Sdk*.log`, `.log` | `OPXUAS.log`, `OpxUas_Sdk*.log`, `OPXUAC_MON.log` present | Fixing the ODBC server (only if ODBC is licensed and wanted; admin): place a certificate and key with the names above in `%TLS_ROOT_PATH%\tls\pki\odbsrv\`, or set `USESSL = NO` in `odbsrv.sup` diff --git a/.claude/skills/data-access/tasks/opcua-client.md b/.claude/skills/data-access/tasks/opcua-client.md index dd0abdc..fbf7ddb 100644 --- a/.claude/skills/data-access/tasks/opcua-client.md +++ b/.claude/skills/data-access/tasks/opcua-client.md @@ -1,8 +1,8 @@ --- task: OPC UA client to an OPC UA server by quick load (loopback to CI Server's own OPC UA server) -version: R1.03 -source: IM 36K10L45-01EN §9, §10; IM 36K10E20-01EN §2; practiced on CI-Eng-Sample 2026-10-01 (station CIENG_UA; full remove/reload; point also configured in the Engineering Module by the user and compared) -status: verified +version: R1.05 (first written for R1.03) +source: IM 36K10L45-01EN 5th ed. (Feb. 2026) §10, §11; IM 36K10E20-01EN 4th ed. (Feb. 2026) §2; practiced on CI-Eng-Sample 2026-10-01 on R1.03 (station CIENG_UA; full remove/reload; point also configured in the Engineering Module by the user and compared) +status: verified on R1.03 (§1–§6). R1.05 (2026-10-08, read-only): line/station/subscription/point dataset definitions identical to R1.03, PKI folders and client setup files checked; loopback re-tested on R1.05 2026-10-08 with the reduced sample load (certificate exchange as in §4, done by the user; COMM_OK 1, SRV_STATE 0, LEVEL_COPY follows TANK1.LEVEL; removed afterwards), the new form fields were confirmed in the installed form definitions (point form `READ_NODE_INFO` / `REBROWSE`; method form node ID type, parent object node ID, manual arguments, no process-area field), the forms themselves not opened. §7 (methods) from docs. --- # OPC UA client to an OPC UA server @@ -45,13 +45,25 @@ These flags also apply to the OPC DA and A&E servers. ``` "CIENG_UA_LINE","CI-Eng-Sample OPC UA loopback line","OPXCIENG" ``` + The process reads `tls\sup\.sup` (here `opxcieng.sup`), else the template + `epauac_eqp.sup` (IM 36K10L45 5th ed. §10.11; the R1.03 manual named a non-existent + `opxuac.sup`, ISS-084). On the R1.03 test system `opxcieng.sup` appeared as an exact copy of + the template. R1.05 template changes (verified 2026-10-08, ISS-083): new + `OPXC_ENABLE_EXTENDED_FUNC` (NO; YES needed for OPC UA alarms), `OPXC_BASE_MODEL_CHANGE_EVENT` + (NO), `OPXC_DISABLE_SAV_FILE` (NO), `OPXC_ALARM_TIME_ATTRIBUTE`, hidden + `OPXC_CERT_EXP_PERIOD_WARN` (2 months), and `OPXC_SERVICE_CALL_TIME_OUT` 60 s (manual: 10 s). + A per-process file copied from R1.03 lacks these keywords, so their defaults apply. 2. **Station** (`OPCUAC_STATION_DF`), **subscription** (`OPCUAC_SUBSCRIPTION_DF`, name `:`), **points** (`OPCUAC_POINT_DF`, name `:`) — see `14_opcua_station_df.qli`: - Station: `LINE`, `USER_ANONYMOUS` 1 (or `USER_NAME`/`USER_PASSWORD`), `MSG_SECURITY_01_MODE` `SignAndEncrypt`, `MSG_SECURITY_01_POLICY` `Basic256Sha256`, - `SERVER_01_ENDPOINT` `opc.tcp://localhost:34493`, `STATUS_ITEM` (Boolean item, 1 = - connected). `SERVER_01_NAME`/`_URI` may stay empty. + `SERVER_01_ENDPOINT` `opc.tcp://localhost:34493`, `STATUS_ITEM` (1 = connected; a Boolean + item worked on R1.03). `SERVER_01_NAME`/`_URI` may stay empty. The R1.05 OPC Interface + manual (IM 36K10E20 4th ed. §2.1.2) lists states 0–5 for this item (0 preparing, + 1 connected, 2 comm error/reconnecting, 3 connect failed, 4 server shutdown received, + 5 connection recreated) while IM 36K10L45 §10.9.2 still calls it Boolean; not re-tested on + R1.05 (ISS-080). An Integer item shows all states. - Subscription: `REQUESTED_PUBLISH_INTERVAL` 1000. - Point: `SUBSCRIPTION`, `EXTERNAL_RELATION` (`Input`, `Output`, `Input + Output`), `OPC_NAMESPACE` (namespace **URI**, not index), `OPC_NODE_ID_TYPE` (`STRING`, `NUMERIC`, @@ -94,7 +106,26 @@ a filter; start with an empty path, then `Objects`: ``` Each record shows display name, namespace URI and node ID (inside `OPC_TAG_INFO`). Deeper -paths were not found yet (`Objects.CI-Eng-Sample` returned nothing). +paths were not found yet on R1.03 (`Objects.CI-Eng-Sample` returned nothing). + +R1.05: `OPCUAC_TAG_DF` (and `OPCUAC_TAG_CMPN_DF`) have two new Boolean fields, `REBROWSE` +(ask the server again) and `READ_NODE_INFO` (read node attributes while browsing; switching it +off is faster on slow links) (installed `opcuac_tag_df.dss`, verified 2026-10-08; not tried). +The point form has the matching *Read additional node information* check box, and F5 in the +expanded *Browse path* list rebrowses (IM 36K10E20 4th ed. §2.1.5). + +**Data types (IM 36K10L45 5th ed. §10.3.4, from docs):** UInt32, Int64 and UInt64 map to Real +(no negatives for unsigned, no decimals), DateTime/UtcTime to String in the form +`YYYY-MM-DDThh:mm:ss.sssZ`, ExtensionObject only for EURange / EngineeringUnits, enumerations as +their Int32 value; one array element per point. A value that cannot be converted is logged and +the item gets status Bad. + +**Model change events (IM 36K10L45 5th ed. §10.5, from docs):** the client reacts to the +server's `GeneralModelChangeEvent` (node or reference added: the point is recreated; deleted: the +item goes offline; external alarms are refreshed with ConditionRefresh). The coarse +`BaseModelChangeEvent` (recreate everything) is handled only with +`OPXC_BASE_MODEL_CHANGE_EVENT = YES`. Events within 10 s are handled once; the server must +support Read and Browse. ## 4. Certificate exchange (first connection; the user does it) @@ -116,6 +147,11 @@ again (verified: reload connected within 5 s without a new exchange). For an ext its certificate arrives the same way; the client certificate (`…\pkiclient\own\certs\_.der`) must be trusted on that server. +From R1.05 the client warns in the Historical Alarm Overview and the UMH message log before its +own or the server's certificate expires (IM 36K10E20 4th ed. §2.2; lead time +`OPXC_CERT_EXP_PERIOD_WARN`, 2 months in the installed template). The own certificates made at +installation were valid for 5 years on the R1.05 test server (verified 2026-10-08). + ## 5. Check - `itmval -g -n CI-Eng-Sample.UA.COMM_OK` → 1; `UA.SRV_STATE` → 0 status 9; @@ -128,3 +164,31 @@ its certificate arrives the same way; the client certificate Items (`76_`), then points, subscription, station (`77_`), then the line (`78_`, stops the client process). Reset the OPC flags only if they were not there before. + +## 7. Calling a method on an external OPC UA server (R1.04+, from docs) + +Source: IM 36K10L45 5th ed. §10.6, App. 1.3–1.4; IM 36K10E20 4th ed. §2.1.6. Not practiced. +Installed on R1.05 (verified 2026-10-08): dataset `OPCUAC_METHOD_CALL2_DF`, loader +`opcuac_method_u0104`, AOG displays `AOG_UAC_Method_Demo`, `AOG_UAC_Method_Call`, +`AOG_UAC_MethodArg_Call(2)` with their symbols. + +1. **Class** for the method object (sample Java class `UAC_MTD_JBASE`): attribute `MTD_KEY` + (holds the method name) and signals `MTD_TRG` (0 idle/done, 1 call, 2 failed), `MTD_RET` + (result code as text; its quality holds the numeric code), `MTD_IN_ARG_0…` and + `MTD_OUT_ARG_0…` (at most 10 each, same order and types as on the server). These names are + reserved in that class. Use a class with a unique name per method object (App. 1.4). +2. **Method** under the station (Engineering Module *Methods → Add method*, dataset + `OPCUAC_METHOD_CALL2_DF`, name `:`): `OPC_NAMESPACE`, `OPC_NODE_ID_TYPE`, + `OPC_NODE_ID`. If the server does not browse its method nodes: parent object node ID by hand + (`MANUAL_OBJ_OPC_NODE_ID`, `OBJ_OPC_NAMESPACE`, `OBJ_OPC_NODE_ID_TYPE`, `OBJ_OPC_NODE_ID`) and + argument types by hand (`MANUAL_ARGUMENT_CONFIGURATION`, `ARGUMENT_IN_n_TYPE` / `…OUT…`). +3. **Point**, one per method: *Input + Output*, namespace `CIX_UAC_MTD`, type STRING, node ID + `CIX_UAC_MTD`; connect it to the object's `MTD_TRG` signal (*Connected I/O point*). Set + `MTD_KEY` to the method name. The process area goes on `MTD_TRG` (the method form no longer + has one). `MTD_TRG` shows status UPD_OFFLINE. +4. **Symbol and display** for the class (see the AOG demo display), then trigger from there. + +Upgrade from R1.03 (App. 1.3): R1.03 methods called through dataset fields +(`OPCUAC_METHOD_CALL_IN_DF` / `…_OUT_DF`, both gone in R1.05) stop working. Rebuild the class +with the `MTD_*` members (*Extended reset enabled*, then reset), rebuild symbols and displays, +and re-save (or copy and re-add) any method with String or Boolean input arguments. diff --git a/.claude/skills/data-access/tasks/rdbms-exposure.md b/.claude/skills/data-access/tasks/rdbms-exposure.md index d24817f..b8dda57 100644 --- a/.claude/skills/data-access/tasks/rdbms-exposure.md +++ b/.claude/skills/data-access/tasks/rdbms-exposure.md @@ -11,7 +11,9 @@ status: tested in R1.05 only Edition on a separate domain-joined host). Not re-tested on R1.03 or on CI-Eng-Sample (user decision 2026-10-02). On the R1.03 development machine the files `dbc.sup`, `data_exposure_df.dss` and `item_df.dss` were checked read-only and match what is described -here (`dbc.sup` is identical in R1.03 and R1.05). +here (`dbc.sup` is identical in R1.03 and R1.05 apart from the site's `DEM_CONNECTION` line; +`data_exposure_df.dss` and `item_df.dss` identical; re-checked read-only on the R1.05 test +server 2026-10-08). **Changes live configuration on two systems** (SQL Server and CI Server): follow the user's chosen way of working. SQL Server changes on a shared server need the owner's agreement. diff --git a/.claude/skills/equipment/SKILL.md b/.claude/skills/equipment/SKILL.md index d4d824d..3ad8c1f 100644 --- a/.claude/skills/equipment/SKILL.md +++ b/.claude/skills/equipment/SKILL.md @@ -1,16 +1,21 @@ --- name: equipment description: >- - CI Server R1.03 EQUIPMENT Service: lines, stations, scan types, I/O points and conversion + CI Server R1.05 EQUIPMENT Service: lines, stations, scan types, I/O points and conversion types. Use when the user wants to connect CI Server to a PLC, RTU or other device (Modbus TCP/RTU, STARDOM FCX, FA-M3, DNP3, IEC 60870-5-104, IEC 61850, MQTT, OPC …), define or remove a line, station, scan type or point, connect an item to an I/O address, set a station off-scan or suppress outputs, add a station communication status item, run CI Server as a Modbus slave, force a faster scan (eqpfrcscn), check equipment statistics or use the - equipment debugger (eqpdbg). Sources IM 36K10L40-01EN, IM 36K10L41-01EN, IM 36K10C10-01EN §4.1. + equipment debugger (eqpdbg), or work with the IEC 60870-5-104 / IEC 61850 EQT managers + (eqt104, eqt850, eqtdbg, eqtfrcscn, IEC 61850 report control blocks, upgrade from R1.03). + Sources IM 36K10L40-01EN, IM 36K10L41-01EN, IM 36K10C10-01EN §4.1. --- -# Equipment (R1.03) +# Equipment (R1.05) + +Re-checked on R1.05 on 2026-10-08 (read-only): Modbus datasets, setup files and tools are +identical to R1.03. IEC 60870-5-104 and IEC 61850 now run as **EQT** managers (see below). Background: `knowledge/manuals/IM36K10L41-01EN.md` (line types, station parameters, conversion types, Modbus, driver table), `IM36K10L40-01EN.md` (forced scan, statistics, @@ -24,12 +29,18 @@ Rules: - Outputs write to real devices: never write to a production station's output points without the user's explicit approval. - `eqpdbg`: only the read-only actions (see L40 summary) unless the user approves. +- IEC 104 and IEC 61850 lines (R1.04 and later) run under an `EQT` manager (`eqt104`, + `eqt850`, started by `etaman`). `eqpdbg` and `eqpfrcscn` only reach `EQP*` managers; for EQT + managers use `eqtdbg` (default process `EQT`, same menu and same read-only actions) and + `eqtfrcscn` (template `tls\tpl\eqtfrcscn.tpl`). The manual does not describe these tools + (ISS-078). | Task | File | Status | |---|---|---| -| Modbus TCP station by quick load: line, station, scan type, points, connected items; test, off-scan, remove | `tasks/modbus-station.md` | verified | +| Modbus TCP station by quick load: line, station, scan type, points, connected items; test, off-scan, remove | `tasks/modbus-station.md` | verified (R1.03; re-tested on R1.05 2026-10-08) | | CI Server as Modbus slave (mirror `eqpmdcmem` + `eqpmdcslvtcp`) | `tasks/modbus-station.md` §1 | verified (by hand and via start file after a restart) | | Read-only equipment manager status with `eqpdbg` | `system-management` task `tuning-checks.md` | verified | | Forced scan (`eqpfrcscn`), hourly statistics (`eqpiostat`) | L40 summary | from docs (statistics empty, ISS-021) | | OPC UA client lines/stations/points (also OPC DA/A&E) | skill `data-access`, task `opcua-client.md` | verified (OPC UA loopback) | | Other protocols | L41 summary §3.8–3.40 | from docs (no hardware) | +| IEC 61850 / IEC 104 on R1.04 and later: EQT managers, report control blocks, upgrade from R1.03 | L41 summary §3.32 and App. 1 | from docs; installed files checked on R1.05 | diff --git a/.claude/skills/equipment/tasks/modbus-station.md b/.claude/skills/equipment/tasks/modbus-station.md index 2f59f02..da1794f 100644 --- a/.claude/skills/equipment/tasks/modbus-station.md +++ b/.claude/skills/equipment/tasks/modbus-station.md @@ -1,8 +1,8 @@ --- task: Modbus TCP station by quick load (line, station, scan type, points, items) -version: R1.03 +version: R1.05 (first written for R1.03) source: IM 36K10L41-01EN §2, §3.1–3.2, §3.6–3.7; IM 36K10C10-01EN §4.1; practiced on CI-Eng-Sample 2026-09-30 -status: verified +status: verified on R1.03 (2026-09-30); on R1.05 the datasets, setup files and start scripts were checked identical (2026-10-08, read-only), re-tested on R1.05 2026-10-08 with the reduced sample load on the shared test server (setpoint 1234 read back, COMM_OK 1, eqpdbg slave GOOD; mirror started for the test only; everything removed afterwards) --- # Modbus TCP station by quick load @@ -24,7 +24,9 @@ CI Server ships a Modbus slave "mirror" that needs no hardware: Started by hand from a normal prompt they run until logoff or CI Server restart. To start them with CI Server, an administrator copies `examples/CI-Eng-Sample/equipment/ eqpciengslv_start.cmd` and `_stop.cmd` to `%TLS_ROOT_PATH%\tls\com`: `equipment_start.cmd` -runs every `eqp*start.cmd` there. +runs every `eqp*start.cmd` there. On R1.05 (checked 2026-10-08) it also runs `eqt*start.cmd` +and, on the host node, every `?*_equipment_start.cmd` (with `?*_equipment_stop.cmd` called +from `equipment_stop.cmd`), which is a cleaner hook for such extensions. ## 2. Line (`MODBUS_LINE_DF`) @@ -112,7 +114,7 @@ on-scan (output method *On change and connect*). and `tls\sav` files. 4. The status item and section with the other items. -## Test system (2026-09-30) +## Test system (R1.03, 2026-09-30) Full cycle on CI-Eng-Sample: loaded, `SETPOINT` 1234/4321/2468 and `CMD` 1/0 read back through Modbus on `READBACK`/`FEEDBACK`, off-scan/on-scan checked, removed (manager stopped, diff --git a/.claude/skills/installation-security/SKILL.md b/.claude/skills/installation-security/SKILL.md index 5b349fb..b2b52be 100644 --- a/.claude/skills/installation-security/SKILL.md +++ b/.claude/skills/installation-security/SKILL.md @@ -1,15 +1,20 @@ --- name: installation-security description: >- - CI Server R1.03 installation, upgrade and Windows/IT security. Use when the user wants to + CI Server R1.05 installation, upgrade and Windows/IT security. Use when the user wants to prepare Windows for CI Server, check whether a machine meets the setup requirements, install, - reinstall, upgrade or uninstall CI Server, apply or extend a licence, install CI Server Remote - Connect, set up Vnet/IP drivers or network addresses, apply the IT Security Tool, check or - open firewall ports, manage the CIX_ groups and CIX_PROCESS account, or run CI Server on a - virtual machine. Sources IM 36K01C10-01EN and IM 36K01C30-01EN. + reinstall, upgrade or uninstall CI Server, merge configuration files after an upgrade + (automatic merge, jupgutl, upgrade report), apply or extend a licence, install CI Server Remote + Connect, set up Vnet/IP drivers or network addresses, apply the IT Security Tool (IT security + version 2.0 or 3.0), set up LAPS, check or open firewall ports, manage the CIX_ groups and + CIX_PROCESS account, install CI Server next to PRM, or run CI Server on a virtual machine. + Sources IM 36K01C10-01EN and IM 36K01C30-01EN (5th editions). --- -# Installation and security (R1.03) +# Installation and security (R1.05) + +First written for R1.03 (frozen on branch `r1.03`), re-checked against the R1.05 manuals +(5th editions, Feb. 2026) and the R1.05 test server on 2026-10-08. Background: `knowledge/manuals/IM36K01C10-01EN.md` (Setup) and `knowledge/manuals/IM36K01C30-01EN.md` (Security Guide). Known issues: @@ -20,13 +25,25 @@ Rules: - Installing, upgrading, changing Windows settings or IT security needs an elevated session, changes the machine and often needs restarts: follow the user's chosen way of working and confirm before each step. In *prepare only* mode, produce a checklist for the user. -- Never copy old setup files over new ones after an upgrade: compare and merge. +- Never copy old setup files over new ones after an upgrade: compare and merge. The R1.05 + automatic merge does not cover every file (Setup summary §3). +- Before a reinstall or upgrade, set the startup type of *CI Service* and *VAGW Bossd* to + Manual. From R1.04 VAGW Bossd is stopped and started with `vagwstarter.exe` (Setup summary §3). +- Read paths from the `TLS_*` variables: the manuals print the default install paths, which + may not be where CI Server is installed (ISS-086). +- IT security (IT Security Tool, CIX_ groups, LAPS) is **not tested** on R1.05 (from docs): the + R1.05 test server runs Windows Server 2025, where the tool is not supported, and it is not + installed. Vnet/IP, the upgrade merge and PRM are not tested either (see + `knowledge/r105-verification.md`). | Task | Where | Status | |---|---|---| -| Check a machine against the setup and security requirements | `tasks/setup-check.md` | verified | +| Check a machine against the setup and security requirements | `tasks/setup-check.md` | verified (R1.03; R1.05 checks run one by one) | | New installation (physical, VM, dual-redundant): order of work, Windows settings, Vnet/IP, install, IT security, licence | Setup summary §2 | from docs | -| Start/stop, reinstall, upgrade (incl. HAC), extend licence, uninstall | Setup summary §3 | from docs | +| Start/stop CI Server and VAGW Bossd, reinstall, upgrade (incl. HAC), extend licence, uninstall | Setup summary §3 | from docs | +| Upgrade with automatic merge of configuration files (installer checkbox, `jupgutl`, merge report and conflict log) | Setup summary §3 | from docs (files and merge patterns checked on the R1.05 test server) | | Install CI Server Remote Connect; web ports | Setup summary §2.4 | from docs | -| Firewall ports for CI Server and drivers | Security Guide summary §3 | from docs (web, DURM, SMDMON ports checked) | -| IT Security Tool, user management types, CIX_ groups/accounts, change service account | Security Guide summary §2, §5 | from docs | +| CI Server and PRM on one computer or connected | Setup summary §4 | from docs | +| Firewall ports for CI Server and drivers | Security Guide summary §3 | from docs (web, DURM, SMDMON, RESTful API ports checked on R1.03 / R1.05) | +| IT Security Tool (version 2.0 / 3.0), user management types, CIX_ groups/accounts, change service account | Security Guide summary §2, §5, §7 | from docs | +| LAPS (linked domain management with IT security 3.0) | Setup summary §2.1.6, Security Guide summary §7 | from docs | diff --git a/.claude/skills/installation-security/tasks/setup-check.md b/.claude/skills/installation-security/tasks/setup-check.md index 268de40..428a88e 100644 --- a/.claude/skills/installation-security/tasks/setup-check.md +++ b/.claude/skills/installation-security/tasks/setup-check.md @@ -1,27 +1,43 @@ --- task: Check a machine against the CI Server setup and security requirements -version: R1.03 -source: IM 36K01C10-01EN §1, §2.1.2, §3.2.12; IM 36K01C30-01EN §2.2, §3.2; practiced on the test system 2026-09-30 -status: verified (2026-09-30) +version: R1.05 (first written for R1.03) +source: IM 36K01C10-01EN 5th ed. §1.3.2, §1.3.3, §2.1.2, §2.1.3, §3.3.15; IM 36K01C30-01EN 5th ed. §2.2.1, §3.2, §3.5.4, §3.7; practiced on the R1.03 test system 2026-09-30 and checked read-only on the R1.05 test server 2026-10-08 +status: verified on R1.03 (2026-09-30); R1.05 checks verified one by one (R1.05 test server, 2026-10-08), script itself not yet run on R1.05 --- # Setup check (read-only) ``` powershell -NoProfile -ExecutionPolicy Bypass -File tools\setup_check.ps1 +powershell -NoProfile -ExecutionPolicy Bypass -File tools\setup_check.ps1 -Version 1.03.00 ``` -Run from the repo root, preferably elevated. Changes nothing. One line per check: +Run from the repo root, preferably elevated. Changes nothing. The default target is R1.05 +(`-Version 1.05.00`); use `-Version 1.03.00` for an R1.03 machine. One line per check: `[OK]` matches the manual, `[DIFF]` differs, `[CHECK]` needs a human decision. +The script must be on the machine being checked. On a server you reach only remotely, the +user copies it there (or runs the checks below by hand); it writes nothing. + ## What it checks | Area | Checks | |---|---| -| CI Server | Installed version (1.03.00), CI Service state, startup type and account (`.\CIX_PROCESS`), VAGW service | -| Windows | Supported OS, visual effects, processor scheduling, virtual memory (custom, 1.5 × RAM), power plan, fast startup, Windows Defender policy, automatic updates policy, scheduled defrag and component cleanup, .NET 3.5, DCOM authentication level, display scale, 8dot3 names, regional settings | -| IT security | `CIX_OPERATOR`, `CIX_ENGINEER`, `CIX_MAINTENANCE`, `CIX_OPC` groups, `CIX_PROCESS` / `CTM_PROCESS` users, IT Security Tool installed | -| Firewall | Profiles enabled; inbound allowed for TCP 8080, 8443, UDP 17001, 17101, 18002 | +| CI Server | Installed version (1.05.00 by default), CI Service (`StartCIServer`) state, startup type and account (`.\CIX_PROCESS`), VAGW service | +| Windows | Supported OS for the target version, visual effects, processor scheduling, virtual memory (custom, 1.5 × RAM), power plan, fast startup, Windows Defender policy (with the R1.05 exceptions), automatic updates policy, scheduled defrag and component cleanup, .NET 3.5, DCOM authentication level, display scale, 8dot3 names, regional settings | +| IT security | `CIX_OPERATOR`, `CIX_ENGINEER`, `CIX_MAINTENANCE`, `CIX_OPC` groups, `CIX_PROCESS` / `CTM_PROCESS` users, IT Security Tool installed (program folder or the IT security 3.0 folder under ProgramData) | +| Firewall | Profiles enabled; inbound allowed for TCP 8080, 8443, UDP 17001, 17101, 18002; on R1.05 also TCP 34597 (RESTful API) | + +R1.05 supported OS (IM 36K01C10 5th ed. §1.3.2), all 64-bit: Windows 10 Enterprise / IoT +Enterprise LTSC 2019 and 2021, Windows 11 Pro and Enterprise, Windows 11 Enterprise / IoT +Enterprise LTSC 2024, Windows Server 2019 / IoT 2019, 2022 / IoT 2022 and 2025 / IoT 2025 +(Standard). On Windows 11 Pro/Enterprise and Server 2025 the Vnet/IP drivers and the IT +Security Tool are not supported. Windows 10 Pro/Enterprise (non-LTSC), LTSB 2016 and Server +2016 are no longer listed. + +Defender (IM 36K01C10 5th ed. §2.1.2, IM 36K01C30 5th ed. §3.5.4): normally turned off by +group policy, but it must stay on with Windows 11 Pro 24H2, and it cannot be turned off on +Windows 10 LTSC 2021 or Windows 11 LTSC 2024. The script reports `[CHECK]` for those. ## Reading the result @@ -29,23 +45,58 @@ Run from the repo root, preferably elevated. Changes nothing. One line per check Setup summary's Windows settings table (`knowledge/manuals/IM36K01C10-01EN.md` §2) or by running the IT Security Tool. - The script finds the firewall rules only as "some rule allows this port"; check the rule - scope separately for production. + scope separately for production. If the active profile is switched off, no rule is needed + and every port is open: check which profile is active (`Get-NetConnectionProfile`). +- Listening ports (useful when there are no rules): `Get-NetTCPConnection -State Listen` and + `Get-NetUDPEndpoint` with the owning process. On R1.05 the RESTful API server (`jrstsrv`, + a `javaw` process) also listens on TCP 7073, which no manual mentions (ISS-087): do not open + it in the firewall. - Also read `%TLS_LOG_PATH%\ci_start.log` after a start: every service should report - `… started` and the log ends with `CI Server started`; look for `-E-` and `failed` lines. - The first lines show the version and build (e.g. `R1.03.00 … (r10200M)`). + `… started` and there should be a `CI Server started` line; look for `-E-` and `failed` + lines. The log keeps growing after the start (equipment messages), so the `CI Server + started` line is not always last. The `UMHLOGTOO` line near the top shows the version and + build (R1.03: `R1.03.00 … (r10200M)`, R1.05: `R1.05.00 … (r11609M)`). - The web ports actually used are `SECURE_PORT_NUMBER` / `NON_SECURE_PORT_NUMBER` in - `%TLS_ROOT_PATH%\tls\sup\jwuiisg.sup` (8443 / 8080 by default). + `%TLS_ROOT_PATH%\tls\sup\jwuiisg.sup` (8443 / 8080 by default); the RESTful API port is + `JRST_NETWORK_PORT` in `jrstsrv.sup` (34597 by default, R1.05). +- Installed updates: `Get-HotFix`. `wmic qfe list full` (Setup App. 1.3) fails on Windows + Server 2025 / 24H2, where WMIC is no longer installed (ISS-088). - Folder rights (not in the script): setup files can hold passwords (e.g. `dbc.sup`). Check who can read and change them: `foreach ($r in (Get-Acl "$env:TLS_ROOT_PATH\tls\sup").Access) { "{0} : {1}" -f $r.IdentityReference, $r.FileSystemRights }`. Under Program Files, Users can read; an install outside Program Files (e.g. - `C:\Yokogawa\CIServer`, seen on an R1.05 system) can inherit *Authenticated Users: Modify*, - so any signed-in user can change setup files (ISS-061). Fixing it is a site decision (IT - Security Tool). + `C:\Yokogawa\CIServer`, as on the R1.05 test server) can inherit *Authenticated Users: + Modify*, so any signed-in user can change setup files (ISS-061). Fixing it is a site + decision (IT Security Tool). +- A local group `RDC_GA_CLIENT` with member `CIX_PROCESS` can exist on a machine that is not + a dual-redundant platform and has no IT security applied (seen on R1.05). It needs no + action (ISS-089). -## Test system result (2026-09-30) +## R1.05 test server result (2026-10-08) + +Checks run one by one, read-only, then the script itself (copied to a temporary folder, +run from an elevated session, deleted again): **12 OK, 5 CHECK, 20 DIFF**. The first run +showed the CI Server ports as allowed: the script counted program-limited Windows rules with +"any port" (e.g. Remote Desktop Shadow) as a match. Fixed 2026-10-08; such rules no longer count. Windows Server 2025 +Datacenter (24H2) virtual machine, domain member, CI Server R1.05.00 (r11609M) installed in +`C:\Yokogawa\CIServer` without the IT Security Tool. + +- Matched: CI Service running, automatic, account `.\CIX_PROCESS`; fast startup off; High + performance plan; processor scheduling Programs; 8dot3 names enabled; 100 % scale; web + ports 8443/8080; RESTful API on 34597; DURM UDP 17001/17101 and SMDMON UDP 18002 listening. +- Differed: Datacenter edition is not listed (only Standard); firewall profile for the + domain network off and no CI Server inbound rules; Defender on; automatic updates, defrag + and component cleanup not disabled; virtual memory not a custom size; .NET 3.5 not + installed; no `CIX_` groups, no `CTM_PROCESS`, no VAGW Bossd service (IT Security Tool not + installed and not supported on Server 2025, so IT security is **not tested** on this server). +- `ci_start.log`: all services started; the same odbsrv SSL certificate error as on R1.03 + (ISS-008). + +## R1.03 test system result (2026-09-30) Windows 10 Pro 19045 development PC without the IT Security Tool: 16 OK, 5 CHECK, 15 DIFF. +(Run before the firewall-check fix of 2026-10-08, so "inbound allowed" lines may have counted +program-limited "any port" rules; re-run to confirm.) Differences: firewall domain/private profiles off; no `CIX_` groups or `CTM_PROCESS` (IT Security Tool not installed; not supported on Windows 10 Pro); fast startup on; Balanced power plan; automatic virtual memory; Defender on; automatic updates, defrag and cleanup not @@ -53,4 +104,4 @@ disabled. Web ports 8443/8080. `ci_start.log`: all services started, one SSL cer (`InitializeSslCtx(): SSL_CTX_use_certificate_chain_file() failed`): the ODBC server `odbsrv` has `USESSL = YES` but no certificate in `%TLS_ROOT_PATH%\tls\pki\odbsrv`, so it exits at start (harmless unless ODBC is used; fix in skill `data-access`, task `access-checks.md`; -`knowledge/issues.md` ISS-008). +`knowledge/issues.md` ISS-008). Windows 10 Pro is no longer a supported OS for R1.05. diff --git a/.claude/skills/system-management/tasks/load-remove-records.md b/.claude/skills/system-management/tasks/load-remove-records.md index 79ebb02..0a314b5 100644 --- a/.claude/skills/system-management/tasks/load-remove-records.md +++ b/.claude/skills/system-management/tasks/load-remove-records.md @@ -1,7 +1,7 @@ --- task: Load and remove dataset records with dssqld (quick load) version: R1.03 -source: IM 36K10J10-01EN §2.9.2, §5.6; IM 36K10L45-01EN §9.10–9.11; practiced with CI-Eng-Sample 2026-09-30 +source: IM 36K10J10-01EN §2.9.2, §5.6; IM 36K10L45-01EN §10.12–10.13 (5th ed.; §9.10–9.11 in the R1.03 edition); practiced with CI-Eng-Sample 2026-09-30 status: verified --- diff --git a/CLAUDE.md b/CLAUDE.md index d323fa5..b95b60e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -60,3 +60,7 @@ The R1.05 test server is shared with other projects. Never disturb their work th read-only checks unless the user approves a change, never restart CI Server, never write to other projects' records or to live plant values, and remove anything you put on the server. Fixes that also apply to R1.03 can be cherry-picked onto branch `r1.03`. + +When re-checking a manual for R1.05, compare its full text with the R1.03 edition +(`tools/manual_diff.py`), not just the revision table or release notes: R1.04 changes are +often not listed there. diff --git a/examples/CI-Eng-Sample/README.md b/examples/CI-Eng-Sample/README.md index 57e0bf0..a622a2a 100644 --- a/examples/CI-Eng-Sample/README.md +++ b/examples/CI-Eng-Sample/README.md @@ -1,11 +1,15 @@ # CI-Eng-Sample A small, invented sample project that anyone with this repo can load into a CI Server -**R1.03** test system. Skills use its names in their examples, and every skill task is +test system (R1.03 or R1.05). Skills use its names in their examples, and every skill task is re-tested against it so that no other project is needed. Built and tested on CI Server R1.03.00 (unlicensed test system), 2026-09-30; operator HMI, demo -user and live-data feed added 2026-10-06. +user and live-data feed added 2026-10-06. Reduced load (below) tested on R1.05.00 on a shared +server, 2026-10-08: loads with 0 errors (the `@VERSION 1.03.00` headers are accepted). + +**Every test ends with the system back in its original state:** remove what was loaded, stop +processes started for the test, undo certificate trust, delete scratch and temporary files. ## Load and remove @@ -30,6 +34,25 @@ cmd /c "\examples\CI-Eng-Sample\remove.cmd" has passed, so the script sets a stop time one minute ahead and waits. Removing the group also deletes its history. +### Testing on a shared server (`shared\`) + +For a server that other projects use, where CI Server must not be restarted: + +| Script | Does | +|---|---| +| `shared\snapshot.ps1 -Out ` | Read-only snapshot: record names (count, hash, `CIENG*` names) of every dataset the sample touches, file lists of `tls\com`, `sup`, `sav`, `lst`, the `pki` folders, running CI Server processes. Run before and after; compare the two files. | +| `shared\reduced_load.cmd` | `load.cmd` without the storage groups and history bindings (`03`, `04`: need a restart), the authorization group and user `CIENG` (`08`, `08b`: a password-less user on a shared server) and the layouts/displays (shared `Layouts.xml`) | +| `shared\test_r105.ps1` | Starts the Modbus slave mirror only for the test, checks classes, sub-items, Modbus loopback and OPC UA loopback with `itmval`, stops the mirror again | +| `shared\reduced_remove.cmd` | Removes exactly what `reduced_load.cmd` loaded | +| `shared\clean_dss_tmp.ps1 -Since