--- manual: IM 36K10P11-01EN title: Class Description Language - Java edition: 3rd Edition, Sep. 2023 version: R1.03 status: 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.03) 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, "