FINS (Factory Interface Network Service) is the message protocol of Omron PLCs. EnvisionSCADA communicates with Omron PLCs as a FINS client over FINS/TCP or FINS/UDP. This covers the CS, CJ and CP series through an Ethernet Unit or a built-in Ethernet port, and the NJ and NX series through the memory they provide for CJ-series Units: the CIO, Work, Holding, DM and EM areas. Each Omron FINS device represents one PLC connection. Variables map PLC words, bits, strings and timer or counter values into the project variable space.
Configure the device first, then add variables to it. A variable is referenced at runtime by its full name, for example Tank1_Level, or PLC1.Tank1_Level when the name is written as {Device}.Tank1_Level on the device PLC1.
The PLC answers FINS on port 9600 unless the port is changed in the unit settings. Which transports a controller offers depends on the model:
| Controller | Transport |
|---|---|
| CS1W-ETN21 and CJ1W-ETN21 Ethernet Units | FINS/TCP (up to 16 connections) and FINS/UDP |
| NJ series | FINS/TCP and FINS/UDP |
| NX701-xx20 | FINS/TCP and FINS/UDP |
| NX102, NX502 | FINS/UDP, and FINS/TCP on port 2 |
| NX1P2 | FINS/UDP |
| CJ2 CPU built-in port, CP1 series | FINS/UDP. FINS/TCP depends on the model; see the operation manual of the unit. |
No rows match the filter.
An NJ or NX controller answers FINS for the memory used for CJ-series Units, so the Auxiliary area and the timers and counters are read from CS, CJ and CP PLCs. A write to an NJ or NX controller requires FINS write protection to be turned off in the controller settings.
Variables address PLC memory in CX-Programmer notation, for example D100, CIO10.05, W20 or E0_100. EnvisionSCADA reads neighbouring addresses together in one request and combines scattered values into one multiple memory area read, which keeps the number of requests per scan low.
The Omron FINS entry is marked BETA in the configuration menu while the driver is released for evaluation.
Device Settings
Each Omron FINS device represents one PLC connection. Configure the connection endpoint, the transport, the FINS node addresses, the timing and the block scanning options.
Create a new device with the Add button in the toolbar. The Add device dialog contains all device settings organized in the sections General, Connection, FINS Node Addresses, Scanning, and Diagnostics, with default values already filled in. Enter at least the Name and IP Address and press Create. The defaults connect over FINS/TCP to port 9600 with automatic node addresses, which suits a PLC on the local network.
The device row shows Enable, Name, IP Address, Port, Transport, Scan Rate, Timeout, Template, Description, Simulation, Status and Quality, and these values can be edited in place. The other settings are available as table columns, which are shown with Columns as described in the Configuration Tables article. Press the Settings icon on a device row to open the Edit device dialog, which contains the same sections and all settings of the device. Press Save to apply the changes.
| Setting | Description | Example | Units / Format |
|---|---|---|---|
| Enable | Enables or disables this Omron FINS device. | true | Boolean |
| Simulation | Runs the device in simulation mode. The device does not open its real connection; its variables stay available and become read and write in memory like Local variables, with a Good status and a Channel State of Simulation, so the project can be tested without hardware. Written values are held in memory only and reset when the application restarts. | false | Boolean |
| Name | Unique name for this Omron FINS device. Used as the device name in runtime variable references that start with {Device}. | PLC1 | Text |
| IP Address | IP address of the Ethernet Unit or the built-in Ethernet port of the PLC. | 192.168.1.40 | IP Address |
| Port | FINS port of the PLC, used by FINS/TCP and FINS/UDP alike. | 9600 | Integer |
| Transport | FINS/TCP or FINS/UDP. FINS/TCP is the default: a lost connection is detected at once and the PLC allocates the FINS node address of EnvisionSCADA. Use FINS/UDP for a CPU or port that offers FINS/UDP only, for example an NX1P2. See FINS/TCP and FINS/UDP below. | FINS/TCP | Enum |
| Scan Rate | Polling interval. All variables of the device are read once per scan cycle. | 1000 | Milliseconds |
| Template | Optional device template name. When set, this device uses a shared variable list from the named template device. | OmronTemplate | Text |
| Description | Free text description for documentation purposes. | Packaging line PLC | Text |
No rows match the filter.
Device Advanced Settings
The following settings are available in the Connection, FINS Node Addresses, Scanning, and Diagnostics sections of the device dialog. The defaults work for a PLC on the local FINS network. A node address of 0 is automatic, as described per setting.
| Setting | Description | Default | Units / Format |
|---|---|---|---|
| Timeout | Time allowed for each request and for the connection. A request without an answer in time, after the retries on FINS/UDP, sets the device Offline and starts a reconnect. | 3000 | Milliseconds (100 to 300000) |
| Retries | FINS/UDP only. Number of times an unanswered request is sent again, each time with a new service ID (SID), before the device is set Offline. 0 sends each request once. | 1 | Integer (0 to 10) |
| Local Port | FINS/UDP only. Local UDP port EnvisionSCADA sends from. 0 uses any free port, which suits the address conversion method automatic generation (dynamic), the default of the Ethernet Unit. Set 9600 when the unit uses automatic generation (static), the IP address table method or the combined method, because these send the response to port 9600. Each enabled FINS/UDP device uses its own Local Port, except 0. | 0 | Integer (0 to 65535) |
| Destination Network (DNA) | FINS network address of the PLC. 0 is the local FINS network. Another value reaches a PLC on another FINS network through the routing tables of the PLCs. | 0 | Integer (0 to 127) |
| Destination Node (DA1) | FINS node address of the Ethernet Unit or port of the PLC. 0 is automatic: the node address the PLC reports on the FINS/TCP connection, or the last number of the IP address of the PLC for FINS/UDP. Enter the node address when it differs from the last number of the IP address. | 0 | Integer (0 to 254) |
| Destination Unit (DA2) | FINS unit address. 0 is the CPU Unit, which holds the memory areas. | 0 | Integer (0 to 255) |
| Source Network (SNA) | FINS network address EnvisionSCADA sends. 0 is the local FINS network. | 0 | Integer (0 to 127) |
| Source Node (SA1) | FINS node address of EnvisionSCADA. 0 is automatic: allocated by the PLC on the FINS/TCP connection, or the last number of the IP address of EnvisionSCADA toward the PLC for FINS/UDP. A fixed value on FINS/TCP is requested from the PLC at every connection. | 0 | Integer (0 to 254) |
| Source Unit (SA2) | FINS unit address EnvisionSCADA sends. 0 is usual. | 0 | Integer (0 to 255) |
| Allow Scanning Blocks | Reads neighbouring addresses of one memory area together in one block with MEMORY AREA READ. When disabled, each variable is read at its own addresses only: variables of up to 4 words are combined in MULTIPLE MEMORY AREA READ requests, and every longer variable is read with its own MEMORY AREA READ. | true | Boolean |
| Max Block Size Allowed | Maximum number of words in one block of neighbouring addresses, read with one MEMORY AREA READ. FINS allows up to 999 words per MEMORY AREA READ over Ethernet. The default of 700 words keeps a FINS/UDP response inside one Ethernet frame. | 700 | Words (1 to 999) |
| Allow Jumping Registers | Allows a request to span unused addresses between configured variables. | true | Boolean |
| String Byte Order | Order of the two characters in each word of a STRING. High byte first (CS, CJ, CP) is the layout of the CS, CJ and CP series, with the first character in the high byte of the first word. Low byte first (NJ, NX) is the layout of the NJ and NX series. | High byte first (CS, CJ, CP) | Enum |
| Verbose | Logging level. 0 logs connection changes and errors. 1 also logs every connection attempt, the number of requests per scan and one line per FINS request with the command, the address, the number of words, the end code and the response time. 2 also logs every frame in hexadecimal. | 0 | Integer (0 to 2) |
No rows match the filter.
FINS/TCP and FINS/UDP
With FINS/TCP, EnvisionSCADA opens a TCP connection and exchanges FINS node addresses with the PLC before the first request. With Source Node 0 the PLC allocates the node address of EnvisionSCADA from its automatic range, 239 to 254 on an Ethernet Unit, so each connection receives its own node address and a reconnect is accepted at once. An Ethernet Unit serves up to 16 FINS/TCP connections; when all of them are in use, the PLC refuses the connection and the System Log shows the error reported by the PLC.
With FINS/UDP every request is one datagram. EnvisionSCADA sends an unanswered request again up to the Retries setting and ignores a late answer to an earlier request. The PLC sends its response according to the address conversion method of the Ethernet Unit: with automatic generation (dynamic) it answers the address and port the request came from, so Local Port 0 works; with automatic generation (static), the IP address table method or the combined method it answers port 9600, so set Local Port to 9600.
In a redundant installation, only the primary server communicates with the PLC. The standby server opens no connection and sends no requests, and it takes over the devices when it becomes primary. With FINS/TCP and Source Node 0 the new primary receives its own node address, so the takeover does not wait for the connection of the former primary to expire in the PLC.
Variable Settings
Variables are added per device. Each variable maps one PLC address to the project variable space.
Create a new variable with the Add button in the toolbar. The Add variable dialog organizes all variable settings in the tabs General, Scaling, Historian, and Gateway, with default values already filled in. Enter at least the Name and Address on the General tab and press Create. When the variable is created on a template device, it is also created on all instance devices that use the template. On a template device, start the Name with the {Device} replacer, so that each instance device gets its own variable. The Name must resolve to a different variable on each device; this is checked for every instance device before anything is saved, when a variable is created and when it is renamed.
The variable row shows Enable, Name, Asset, Type, Address, and Description directly and these values can be edited in place. Press the Settings icon on a variable row to open the Edit variable dialog, which contains the same tabs and all settings of the variable. Press Save to apply the changes. Changes made on a template device are also applied to the matching variable on all instance devices, while each instance keeps its own Modbus Address value. The Gateway tab settings Modbus Address, OPC UA, Writeable, MQTT Publisher, Kafka Device, Kafka Remap Device, and Kafka Remap Variable are also available as table columns, which are shown with Columns as described in the Configuration Tables article.
| Setting | Description | Example | Units / Format |
|---|---|---|---|
| Enable | Enables or disables this variable. | true | Boolean |
| Name | Full variable name. The {Device}. replacer prefix is optional: {Device} resolves to the device name when the device loads, so the variable follows a device rename automatically, while a literal name is used exactly as written and keeps working across device renames. The resolved name must be unique across the whole project. | {Device}.Pump1_Speed | Text |
| Asset | Asset tag used to group and filter this variable. | PackagingLine | Text |
| Type | Data type of the variable: BOOL, INT, UINT, DINT, UDINT, REAL, LREAL or STRING. The type decides which address forms are valid; see the Addressing section. | INT | Enum |
| Address | PLC address in CX-Programmer notation, for example D100, CIO10.05, E0_100 or D200:20. See the Addressing section for the memory areas and their notation. | D100 | Text |
| Description | Free text description for documentation purposes. | Pump 1 speed setpoint | Text |
| User Groups | Comma-separated list of user groups that have access to this variable at runtime. | Operators,Supervisors | Text |
| Signature Required | Requires an electronic signature for each write to this variable from a page object, the Live Manager, the Runtime API or MCP while Part 11 compliance mode is enabled and Write variables marked Signature Required is selected under Signature Required Actions on the Parameters page. The write rights of the user and the value range are checked first, so a refused write does not open the Electronic Signature dialog. A variable created while Part 11 compliance mode is enabled starts with Signature Required selected. Writes by alarm, event and schedule actions, Python scripts and the gateways run without a signature. See the Electronic Signatures article. | true | Boolean |
| Recipe Targets | Recipe type name (target) this variable belongs to. Supports the {Device} placeholder, which resolves to the owning device name so one naming rule can spread a set of variables across several devices. | Line1 | Text |
| Recipe Parameter Name | Explicit name of the parameter this variable represents inside a recipe. Variables that fill the same role across different targets share the same Recipe Parameter Name, which is how values are matched on Apply and Snapshot. A variable takes part in recipes only when both Recipe Targets and Recipe Parameter Name are set. | Setpoint | Text |
| Trend Groups | Comma-separated list of trend group names this variable belongs to. A variable can be in several groups. The groups are the filter the Trend Analyst offers when picking variables. The names accept the {Device}, {DeviceName} and {VariableName} placeholders, so one UDT definition gives every instance its own group. | Pumps,{Device} | Text |
| Units | Engineering unit label displayed alongside the value. | rpm | Text |
| Format | Display format of the value on screens and in the Trend Analyst: the value of a Label or Input (unless the object uses its own Floating Point and Decimals), the value text of a Knob and a Slider, the Trend tooltip, a Data Grid Variable column, the right-click menu, Quick Trend, the current value in the Recipe Manager, variable tokens in alarm and event messages, and the Trend Analyst tooltip, summary and pen Format. An Input shows the plain value while it is being edited. 0 shows no decimals, 0.00 always shows two decimals, 0.0## shows one to three decimals and #,##0.00 adds a thousands separator, with up to 15 decimals. Values are rounded half away from zero for display only; alarms and expressions keep the full value, and so does the historian unless Round to Format is on. ReadVariable in the runtime API and MCP returns the Format beside the full value. Leave empty to show the value as received. | 0.00 | Text |
| Min Raw | Minimum raw value from the PLC, used for scaling. | 0 | Number |
| Max Raw | Maximum raw value from the PLC, used for scaling. | 32767 | Number |
| Min Scaled | Minimum engineering value corresponding to Min Raw. | 0 | Number |
| Max Scaled | Maximum engineering value corresponding to Max Raw. | 3000 | Number |
| Converter | Name of a Converter defined in the Converters configuration to apply a custom read/write expression. | RawToPressure | Text |
| Historian | Enables logging of this variable's values to the historian database. | true | Boolean |
| Round to Format | Stores the historian samples of this variable rounded to the decimals of its Format, as a plain number: with Format 0.00 the value 34.30487 is stored as 34.3. The deadband compares the rounded values, so with Deadband 0 a sample is written only when the rounded value changes. On a variable without scaling the Raw value is stored empty, since it equals the value. The live value, alarms, expressions and all interfaces keep the full value. Applies to new samples only; samples already stored keep their values. Requires a Format. | false | Boolean |
| Deadband | Minimum change in value required before a new historian record is written. | 0.5 | Number |
| Minimum Time (s) | Minimum time in seconds between historian records for this variable. | 0 | Seconds |
| Sample Group | Name of the Sample Group that controls the historian sampling rate for this variable. | Text | |
| History Source | Where the trends read the history of this variable: Project default (the History Source with Project default enabled on the History Sources page, or the EnvisionSCADA Historian when no source has it), EnvisionSCADA Historian (the samples recorded while Historian is on) or a History Source of the History Sources page (a query on a Database Connection or the fetch() function of a Python Module script). In the table, an empty History Source is Project default and Historian is the EnvisionSCADA Historian. Live values always come from the variable itself. Test reads the last 24 hours with the settings in the dialog. See the History Sources article. | Project default | Enum |
| History Reference | What the History Source reads for this variable: the reference passed to fetch(), or @Variable of the History Query. When empty, the History Reference of the source is used, by default the full name of the variable; the field shows it in italics. {Name} is replaced by the full name of the variable. Browse lists the references that a Script source offers. | CDT158 | Text |
| History Parameters | Shown for a Script source: optional key=value pairs separated by ;, added to the History Parameters of the source. A key set here replaces the same key of the source. The field shows the History Parameters of the source in italics. | scale=0.1 | Text |
| Modbus Address | Optional address on the built-in Modbus TCP and Modbus RTU servers where this variable is exposed. The servers are enabled in the Gateways section of the Parameters page. Each instance device keeps its own value. | %MW0 | See Modbus TCP Addressing |
| OPC UA | Exposes this variable as an OPC UA node. When Historize is also ticked, the Historian data of the variable is readable through OPC UA Historical Access. | true | Boolean |
| Writeable | Allows external systems to write this variable through the gateways: the OPC UA Server, the Modbus TCP and Modbus RTU servers, the MQTT publisher when Subscribe is enabled on the publisher, and Kafka when Consumer is enabled on the Kafka device. Writes from pages, actions, scripts and the API are independent of this setting. A0 to A447 and timer and counter completion flags are read only and cannot be marked Writeable. | false | Boolean |
| MQTT Publisher | Name of the MQTT publisher that publishes this variable, typed or chosen with the ... button. A variable is published by one publisher, and the name must match a publisher on the MQTT Publishers page. Leave empty to keep the variable unpublished. Writes from the broker need Subscribe on the publisher and Writeable on the variable. See the MQTT Publishers article. | CloudIoT | Text |
| Kafka Device | Name of the Kafka device this variable is linked to, typed or chosen with the ... button. Every value change of a linked variable is produced to the Producer Topic of the Kafka device while the device is enabled. Writes from the Consumer Topic need Consumer on the Kafka device and Writeable on the variable. Leave empty to keep the variable unlinked. See the Kafka Devices article. | KafkaBroker1 | Text |
| Kafka Remap Device | Device name used for this variable in Kafka messages instead of the name of the device that owns the variable. Inbound messages from the Consumer Topic are matched on this name as well. Leave empty to use the device name. | RemotePLC1 | Text |
| Kafka Remap Variable | Variable name used for this variable in Kafka messages instead of its own name. Inbound messages from the Consumer Topic are matched on this name as well. Leave empty to use the variable name without the device name, for example Pump1_Speed for PLC1.Pump1_Speed on device PLC1. | Speed | Text |
No rows match the filter.
Addressing
Addresses use the notation of CX-Programmer: an area prefix followed by the word number in decimal. A bit address adds the bit number 00 to 15 after a period, and a STRING adds its length in characters after a colon. The EM bank number is hexadecimal, as in CX-Programmer, so EA_100 is word 100 of EM bank A (10). Upper and lower case are both accepted.
| Area | Notation | Range | Example |
|---|---|---|---|
| CIO | CIO followed by the word number. A number without a prefix is also CIO. | 0 to 6143 | CIO10, CIO10.05, 10.05 |
| Work | W | 0 to 511 | W20, W20.03 |
| Holding | H | 0 to 1535 | H5, H5.15 |
| Auxiliary | A. A0 to A447 are read only. | 0 to 959 | A448, A448.00 |
| DM | D or DM | 0 to 32767 | D100, D100.07, DM100 |
| EM | E, the bank number (hexadecimal 0 to 18), an underscore and the word number | 0 to 32767 per bank | E0_100, EA_100.03, E10_5 |
| Timer | T or TIM | 0 to 4095 | T5, TIM5 |
| Counter | C or CNT | 0 to 4095 | C7, CNT7 |
No rows match the filter.
The ranges are the largest any supported PLC offers. A PLC with less memory refuses an address beyond its memory; the variable then shows FormatError while the other variables keep reading, as described in Reading and Faults.
A value of several words must fit in its area: an LREAL at D32766 would run past D32767 and is refused when the variable is saved. A timer or counter is read as BOOL for its completion flag and as INT or UINT for its present value.
| Type | Description | Size | Address |
|---|---|---|---|
| BOOL | Single bit, read as 0 or 1. | 1 bit | A bit address such as CIO10.05, or a timer or counter (completion flag, read only) |
| INT | Signed 16 bit integer. | 1 word | A word address, or a timer or counter (present value) |
| UINT | Unsigned 16 bit integer. | 1 word | A word address, or a timer or counter (present value) |
| DINT | Signed 32 bit integer, stored in two consecutive words, low word first. | 2 words | A word address |
| UDINT | Unsigned 32 bit integer, stored in two consecutive words, low word first. | 2 words | A word address |
| REAL | IEEE 754 single precision floating point, stored in two consecutive words, low word first. | 2 words | A word address |
| LREAL | IEEE 754 double precision floating point, stored in four consecutive words, lowest word first. | 4 words | A word address |
| STRING | ASCII text with its length in characters in the address. The text ends at the first NUL character; a written text is padded with NUL characters. The character order within each word is set by String Byte Order on the device. | Length divided by 2, rounded up | A word address with :length (1 to 256), for example D200:20 |
No rows match the filter.
Variable Arrays
A variable can expand into an array by setting the Array size field to a value between 2 and 512. The variable itself is the first element and its Name must end in the first index, for example Levels[0]. The remaining elements are created automatically as Levels[1], Levels[2] and so on. Each element advances the Address by the size of the data type: INT and UINT by 1 word, DINT, UDINT and REAL by 2 words and LREAL by 4 words. A BOOL on a bit address advances by one bit and continues in the next word after bit 15, so CIO20.15 is followed by CIO21.00. A timer or counter advances by one. Arrays use the types BOOL, INT, UINT, DINT, UDINT, REAL and LREAL, and the last element must stay inside its memory area.
The element rows are managed by the first element: they follow its settings, appear locked in the variable list, and are edited by editing the first element. Changing the Array size adds or removes elements at the end. Renaming the first element or changing its address renames and re-addresses all elements. Setting Array size back to 0 while elements exist removes the elements.
To turn the elements into ordinary independent variables, use the Ungroup array action on the first element's row in the variable list, or the Configuration API (POST /API/Config/VariableArrays/Ungroup). All rows are kept and only the grouping is removed. This is one-way. The element count badge next to the first element's name folds and unfolds the element rows in the list.
Reading and Faults
EnvisionSCADA plans the reads once when the device starts. Neighbouring addresses of one area are read with MEMORY AREA READ in blocks of up to Max Block Size Allowed words. Small values spread over the memory are combined into one MULTIPLE MEMORY AREA READ of up to 167 values. With Verbose 1 the System Log shows the number of requests per scan and every request. A PLC that answers MULTIPLE MEMORY AREA READ as an unsupported command is read with MEMORY AREA READ from then on, which is logged once.
When the PLC refuses an address, for example an address beyond the memory of the CPU, EnvisionSCADA finds the variable that causes it, sets it to FormatError, logs the end code once and reads it on its own every 60 seconds. The other variables of the device keep reading. When the address reads again, the variable returns to Good and rejoins the regular reads.
When the PLC does not answer, the connection is lost or the PLC reports a communication error, the Channel State of the device becomes Offline, its Channel Quality Bad and every variable ConnectionLost. EnvisionSCADA connects again after Scan Rate and doubles the waiting time after each failed attempt, up to 30 seconds. The cause is logged once per outage; Verbose 1 and 2 log every attempt.
Every response of the PLC also reports whether the CPU Unit has a fatal or a non-fatal error, for example a battery error. EnvisionSCADA logs each change of these flags in the System Log and keeps reading the values.
Writing
A write is sent as MEMORY AREA WRITE and is complete when the PLC confirms it. When the PLC refuses the write, for example because the memory is write protected or the operating mode does not allow it, the value is not written, the variable shows FormatError until the next successful read and the System Log shows the end code. A write through the Runtime API or MCP returns this message instead of OK.
The value must match the type: a number within the range of the type for the numeric types, and true, false, 1 or 0 for a BOOL. A value outside the range, for example 40000 for an INT, or text for a number is not sent. A STRING longer than its length is cut to the length.
The Set, Reset, Toggle and Momentary On actions write to BOOL variables on a bit address. Momentary On writes the bit on, waits 1.5 seconds and writes the bit off. A0 to A447 and timer and counter completion flags are read only.
When the PLC does not answer a write within Timeout, the write is reported as failed. The PLC may have carried it out, which the next read shows.
Notes
A UDT definition maps a variable member onto an Omron FINS device through the Fins group of the member, with a Type and an Address. The Address accepts tokens and expressions, for example D{BaseAddress}, E{Bank}_100 or D{= {Base} + 2 }, so one definition serves PLCs with different memory layouts. An address without tokens is checked when the definition is saved. See the UDT Manager article.
Enable Verbose only during commissioning or diagnostics. Verbose 1 and 2 log every request and increase the log volume significantly.