--- manual: IM 36K10P11-01EN title: Class Description Language - Java edition: 4th Edition, Feb. 2026 (first summarized from the 3rd Edition, Sep. 2023) version: R1.05 (first written for R1.03) status: R1.05 re-check 2026-10-09: full word diff (only §10.2 reworded, see below); public API of fasttools.processfast compared with javap (identical to R1.03); JDK version read; CIENG_JFLOW compiled and ran on the R1.05 test server 2026-10-08. From docs; a Java class (attachItemToSignal, createItemForSignal with automatic name, Signal.Trigger.VALUE, signalEvent, systemMessage) compiled on quick load and run on the test system with CI-Eng-Sample class CIENG_JFLOW on 2026-09-30; everything else from docs --- # Java PROCESS Service language (R1.05) **R1.05 (4th Edition, Feb. 2026):** the revision table lists only contact information. The word diff shows that §10.2 (*Methods*) was rewritten in plainer English with one real correction: `createSection()` is now described with description, block setting and OPC visibility, without the process areas of the R1.03 text. The examples in §8 (valve, boiler, §8.6 *Create Names*) still pass five arguments (ISS-154). No other change; section numbers unchanged. **Installed API (checked 2026-10-09, `javap -public` on `tls\exe\jopcsrv.jar`):** the classes and public methods of `fasttools.processfast` are identical on R1.03 and R1.05. Facts the manual does not state: - `createSection(String path, String description, boolean blocked, boolean opcVisible)`: four arguments on both versions, so the manual's five-argument calls do not match the API (not compile-tested). - Methods not described in P11 (ISS-159): `getHistory(item, from, to, …)` returning `ValueSample[]` (five overloads), `defineIntegerAttributeForPrompt()` and `defineDoubleAttributeForPrompt()` (the manual names only the String version), `sendAndReceiveMessage(ServerAddress, Request, Reply, timeout)` (BUS messages, package `fasttools.processfast.communication`), `getDssSession()` (named in the release notes). Untested. - Java runtime: Eclipse Temurin JDK 11.0.28 on R1.05 (11.0.18 on R1.03) in `tls\jre`; the Java compiler `OPCJCOM` and the executor run on it (Java 11). Class path of the Java processes: `jopcsrv.jar`, `jtoolsclt.jar`, `jtoolslibclt.jar`, `tls\exe\*` and, on R1.05, `tls\exe\lib\*`. - New preinstalled Java classes (R1.04+): `UAC_MTD_JBASE` and `UAS_MTD_JBASE`, samples for OPC UA method objects (attribute `MTD_KEY`, signals `MTD_TRG`, `MTD_RET`, `MTD_IN_ARG_n`, `MTD_OUT_ARG_n`). Described in IM 36K10L45 §10.6 and §11.4, not in P11: see `IM36K10L45-01EN.md` and skill `class-object-engineering`, task `java-class.md` §4. Summary in own words; section numbers refer to the manual. Engineering: `IM36K10L10-01EN.md`, skill `class-object-engineering`. The full API reference is only in the Engineering Module class editor (F1). ## 1. What Java adds (§1) Arrays of signals/attributes, loops, inheritance (`extends` another PROCESS class), any Java library (TCP/IP, files, web services), and signals that need not be attached. Java and Traditional classes cannot contain each other. Compiled by `OPCJCOM`, created by `OPCJACT`, run by `OPCJEXE` (see L10 summary). ## 2. Class layout (§1.1, §3) ```java import fasttools.processfast.*; // the framework; import other packages as usual public class CIENG_JFLOW extends ProcessClass { // name = class name in CLASS_DF, exactly // definitions: class level only, no public/protected modifiers Signal sInflow = defineDoubleSignal(Signal.Trigger.VALUE); Signal sPerMin = defineDoubleSignal(); Attribute aCapacity = defineDoubleAttribute(Attribute.Scope.OBJECT); Timer tCheck = defineTimer(); public void create() { /* object created: attach or create items */ } public void destroy() { /* object deleted (items are detached automatically) */ } public void start() { /* object starts: after create and at every CI Server start */ } public void stop() { /* CI Server stops (not guaranteed, e.g. HA switch) */ } public void signalEvent(Signal signal) { } public void timerEvent(Timer timer) { } public void triggerGroupEvent(TriggerGroup triggerGroup) { } } ``` Naming advice: `s…` signals, `a…` attributes, `t…` timers, `c…` containments, `m…` locals; identifiers max 15 characters. Omit methods you do not need. **Two environments** (§3.4, important): `create()`/`destroy()` run in the *creation* environment (`OPCJACT`), everything else in the *runtime* environment (`OPCJEXE`). Signals have items only at runtime; timers only at runtime; plain Java fields and objects set in `create()` are gone at runtime — only **attributes** carry values across. Static fields are not shared between objects of different priorities. Share data through class-scope attributes or items. ## 3. Signals (§4) - `defineIntegerSignal()`, `defineDoubleSignal()`, `defineStringSignal()` (string max 79 characters); `…SignalArray(n)` or `…SignalArray(trigger, n)`; max 4095 signals per class. - Triggers: `Signal.Trigger.VALUE | STATUS | OPTION | UPDATE | FIRST | PIT | LIMIT | QUALITY` as argument of `define…Signal()`. Without it the signal never triggers. - In `create()`: - `attachItemToSignal(sig, "")` — the item must exist, else creation is cancelled and rolled back. - `createItemForSignal(sig, "