# Omron

> Omron の PLC に接続します。CJ、CS、CP は FINS（UDP、TCP、またはシリアル回線上の Host Link）でメモリアドレスを、NJ、NX、NY は EtherNet/IP で変数名を指して読みます。FINS の設定、アドレスの書き方、データ型、読み取り、書き込み、機器検出。

**Omron** のドライバーは、Omron の PLC とその 2 つの言葉のどちらかで話します。どちらを使うかは機器ごとに選びます。CJ、CS、CP のコントローラーと、CJ メモリモードに設定した NJ や NX は、FINS でメモリアドレスを指して読みます。アドレスは Omron のプログラミングソフトと同じ書き方で、`D100`、`W0.01`、`CIO100.05` のようになります。NJ、NX、NY のコントローラーは、ネットワークに公開した変数の名前、たとえば `Level` や `Motor.Speed` を指して EtherNet/IP で読みます。1 台のステーションが、両方の種類を 1 つのドライバーの下で並べて読みます。[Connector](connector) の Omron のドライバーの下に機器を追加し、その**プロトコル**を選んでください。パネルは、そのプロトコルが使う項目だけを見せます。

## プロトコル {#protocols}

| プロトコル | コントローラー | タグのアドレスの指し方 | ポート |
| --- | --- | --- | --- |
| **FINS** | CJ1、CJ2、CS1、CP1 など、Ethernet のポートかユニットを持つ CJ、CS、CP のコントローラー。CJ メモリモードの NJ や NX も含みます | **メモリアドレス**。`D100` や `W0.01` など | 既定は 9600 |
| **NJ/NX のタグ（名前で指定）** | NJ、NX、NY のコントローラー。NJ501、NJ301、NJ101、NX1P2、NX102、NX502、NX701、NY5 など | **変数名**。`Level` や `Motor.Speed` など | なし。EtherNet/IP は標準のポート 44818 で応答します |

既定は FINS で、新しい機器は FINS から始まります。プロトコルは機器の設定なので、CJ2 と NX1P2 が同じドライバーの下に並び、それぞれ自分の言葉で読まれます。プロトコルを切り替えても、FINS の設定は残したときのまま保たれ、FINS に戻したときに使われます。機器のタグはどれも、その時点から新しいプロトコルでアドレスを読みます。タグの**データ型**は、そのアドレスが新しいプロトコルで扱える型に合わせて変わり、新しいプロトコルで読めないアドレスは、直すまでタグのページに印が付きます。

## 接続 {#connection}

| 項目 | 意味 | 既定 |
| --- | --- | --- |
| **ホスト** | PLC の Ethernet のポートかユニットの IP アドレスかホスト名。 | 空 |
| **プロトコル** | **FINS** か **NJ/NX のタグ（名前で指定）**。その下の行が、選んでいるプロトコルが何を読むかを示します。「CJ、CS、CP コントローラーのメモリ領域と、CJ メモリモードの NJ/NX のメモリ領域です。」または「NJ、NX、NY コントローラーがネットワークに公開する変数を、名前で EtherNet/IP 越しに読みます。」 | FINS |
| **ポート** | FINS だけです。PLC が FINS に応答するポートで、UDP と TCP で共通、1 から 65535 です。欄が空のときは 9600 が灰色で表示され、機器はそのポートで呼び出されます。名前で読む機器にはポートの欄がありません。 | 9600 |
| **読み出し周期（ms）** | 自分の周期を持たないタグを読む、機器全体の周期です。 | 1,000 |

機器の見出しは、組み立てられた接続先を見せます。FINS の機器は設定をすべてそこに書き込み、ノードの 0 は自動を表します。たとえば `omron://192.168.250.1:9600?protocol=fins&transport=udp&network=0&node=0&unit=0&source=0&timeoutMs=2000` です。名前で読む機器は、ホストとプロトコルだけを書きます。`omron://192.168.250.1?protocol=njnx` です。タグごとに独自の**読み出し周期（ms）**を設定できます。タグの値を 0 にすると機器の周期に戻ります。

## コントローラーの準備 {#prepare-the-controller}

名前で読む NJ、NX、NY のコントローラーが提供するのは、ネットワークに公開したグローバル変数だけです。公開は変数ごとの属性で、Sysmac Studio で設定してコントローラーに転送します。FINS で読むコントローラーには、このような設定は要りません。

| 設定 | Sysmac Studio での場所 | 設定がないと |
| --- | --- | --- |
| ステーションが読み書きするすべてのグローバル変数で、**Network Publish** を **Publish Only** に（タグデータリンクでも使う変数なら Input か Output） | **Programming > Data > Global Variables** の、その変数の **Network Publish** 列。プロジェクトをコントローラーに転送します（**Controller > Synchronize**）。 | コントローラーは、その名前の変数を提供していないと、存在しない名前とまったく同じように答えます。タグは品質が悪いものとして読まれ、機器のほかのタグは読み続けます。 |

プログラムの変数（ローカル変数）は公開できません。グローバル変数として宣言するか、プログラムの中でグローバル変数にコピーします。

タグの名前の変数を提供していないとコントローラーが答えたときは、機器のページがその変数とそれを読むタグを挙げ、2 つの原因（存在しない名前か、公開されていない変数）とこの手順を通知で示します。通知は変数が読めるようになると自然に消えます。タグ自身のページにも同じ通知が出ます。診断ログとエージェントも同じ手順を読みます。

## FINS のカード {#the-fins-card}

FINS で読む機器には、「接続」のカードの下に **FINS** のカードが付きます。要求を何に載せて送るか、だれに宛てるか、それぞれの要求が応答をどれだけ待つかを決めます。名前で読む機器には、このカードはありません。

| 項目 | 意味 | 既定 |
| --- | --- | --- |
| **トランスポートプロトコル** | **UDP**：「要求ごとに 1 つのデータグラムを送り、送信元のポートに応答が返ります。Omron の Ethernet ポートの既定です。」**TCP**：「接続は 1 本で、その中で PLC がこのステーションに FINS ノードを割り当てます。」 | UDP |
| **ネットワーク** | 「PLC の FINS ネットワークです。このステーションのネットワークなら 0、PLC のルーティングテーブルを経由するなら 1 から 127 です。」 | 0 |
| **PLC のノード** | PLC の FINS ノードで、1 から 254 です。空欄のときは「自動」と表示され、UDP では PLC の IP アドレスの最後の数（`192.168.250.1` の PLC はノード 1）、TCP では接続を開くときに PLC が知らせるノードになります。 | 自動 |
| **ユニット** | 「PLC の中で応答するユニットです。CPU ユニットなら 0 です。」255 まで。 | 0 |
| **ステーションのノード** | UDP だけです。このステーションの FINS ノードで、1 から 254 です。空欄のときは「自動」と表示され、PLC に届くネットワーク上でのこのステーションの IP アドレスの最後の数になります。TCP ではこの欄は描かれません。PLC が接続の中でノードを割り当てるからです。 | 自動 |
| **応答のタイムアウト（ms）** | 「FINS の要求が応答を待つ時間です。」100 から 60,000。 | 2,000 |

範囲の外の数は欄の下で拒否されます。たとえば「0 から 127 までの数値を入力してください。」と表示され、欄は今の値に戻ります。トランスポートを TCP に切り替えても UDP 用に入れたステーションのノードは残りますが、機器はそれを使いません。

## シリアル回線上の Host Link {#host-link-on-a-serial-line}

シリアルポートしかない CP1E、CP1L、CP1H、CJ、CS のコントローラー（RS-232C、またはオプションボードや変換器を介した RS-485、RS-422A）は、Omron ドライバーのシリアル回線を通して Host Link 上の FINS で読みます。1 つの COM ポートを最大 32 台の PLC が共有し、それぞれが自分のユニット番号で応答します。ドライバーのページのシリアル回線の表にある**回線を追加**で回線を追加し、**シリアルポート**、**ボーレート**、**シリアルの形式**を PLC のシリアルポートの設定に合わせ（回線のページのほかの部分は[シリアル回線](connector-lines)にあります）、回線を有効にしてから、回線のページの**機器を追加**で PLC を 1 台ずつ追加します。

| 設定 | 場所 | 値 |
| --- | --- | --- |
| ポートのモード | PLC の PLC Setup、回線をつないだシリアルポートの設定 | Host Link |
| ボーレートと形式 | 回線 | PLC のポートの設定どおり。Host Link のポートの出荷時の設定は 9600 ボーと `7E2` です |
| **ユニット ID** | 機器の「接続」のカード、**シリアル回線 · 固定**の横 | PLC Setup で設定した、PLC の Host Link のユニット番号で、0 から 31 までです。新しい機器は回線で空いている最初の番号を取ります。回線のほかの PLC が使っている番号は受け付けません |
| **応答のタイムアウト（ms）** | 機器の FINS のカード | 100 から 60,000。既定は 2,000 |

回線上の機器はずっと FINS で読みます。**プロトコル**、**ホスト**、**ポート**の欄はなく、FINS のカードには「このシリアル回線上で Host Link により FINS を送ります。宛先は、ユニット番号（PLC Setup でシリアルポートに設定した値）が上のユニット ID と同じ PLC です。」と**応答のタイムアウト（ms）**だけが表示されます。要求はバスが指す PLC の CPU ユニットに届き、ネットワークの項目は使わないためです。ネットワークへ移ることはなく、ネットワークの機器が回線へ移ることもありません。タグはネットワークのときと同じようにアドレスを書き（`D100`、`W0.01`）、接続先は回線とユニットを指します。たとえば `omron://serial/<line id>/COM5/9600/7E2?protocol=fins&transport=hostlink&hostLinkUnit=0&timeoutMs=2000` です。

| シリアル回線で | 起きること |
| --- | --- |
| 1 本の回線に複数の PLC | 回線全体で、要求とその応答を 1 つずつ扱います。ほかのユニットの応答やノイズは読み飛ばします |
| タイムアウトまでに応答しない PLC | その機器は接続し直します。回線のほかの PLC は読み続けます |
| PLC がフレームを壊れていると判断し、`13 (FCS error)` のような Host Link の終了コードで応答する | その機器は接続し直します |
| アダプターが抜かれたときなど、ポートが使えなくなる | 回線のすべての機器が接続し直します。ポートは 1 秒の間隔のあとに開き直し、間隔は最長 1 分まで倍になっていきます |
| 文字列のタグ | 最大 534 文字で、Host Link のフレーム 1 つに載る分です |

スキャンはシリアル回線を探しません。PLC は 1 台ずつユニット番号で追加してください。

## アドレス指定 {#addressing}

タグのアドレスは、タグの「信号源」のカードにある 1 つの欄で指します。欄の名前は機器のプロトコルで決まり、FINS では**メモリアドレス**、名前で読む機器では**変数名**になり、その下にプロトコルのヒントが出ます。ドライバーが読めないアドレスは、入力したその場でタグのページが理由とともに拒否します。「信号源」のカードの読み取り専用の行**取得元のアドレス（バス上）**が、ドライバーに渡るアドレスを示します。

### メモリアドレス（FINS） {#memory-addresses-fins}

メモリアドレスは、領域の文字、10 進数のワード番号、そして 1 つのビットならドットとビット番号（00 から 15）で書きます。文字の大文字と小文字は区別せず、古い書き方も読みます。

| 領域 | 例 | ワード | ほかの書き方 |
| --- | --- | --- | --- |
| CIO | `CIO100`、`CIO100.05`、`100.05` | 0 から 6143 | 数だけでも CIO のアドレスになります |
| ワーク（W） | `W0`、`W0.01` | 0 から 511 | `WR` |
| 保持（H） | `H10`、`H10.00` | 0 から 1535 | `HR` |
| 補助（A） | `A100`、`A100.03` | 0 から 1471 | `AR` |
| データメモリ（D） | `D100`、`D100.15` | 0 から 32767 | `DM` |
| 拡張データメモリ（E） | `E0_100`、`EA_0`、`E18_0` | 0 から 32767 | E とアンダースコアの間に 16 進数のバンク番号（0 から 18） |

各領域の上限は、CJ、CS、CP のどれかが持つ最も大きいものに合わせています（CJ2 には保持ワードが 1,536 あり、拡張データメモリのバンクは 18 まであります）。小さいコントローラーにないワードやバンクは、その PLC 自身が答えることで、タグを最初に読んだときのエラーになります（[読み取り](#reading)を参照）。タグのページが入力したその場で拒否するもの：

| 入力したもの | タグのページの表示 |
| --- | --- |
| 領域、ワード、ビットの形になっていないもの。`X100` や `D100.` など | 「FINS のメモリアドレスは、領域とワード、ビットならさらにドットとビット番号で書きます（例：D100、W0.01、CIO100.05、H10、A100、E0_100）。」 |
| 領域の終わりを越えたワード。`D40000` や `W512` など | 「そのワードは、どの CJ、CS、CP コントローラーでも、その領域の最後のワードより後ろにあります。」 |
| 15 を越えたビット。`W0.16` など | 「ワードのビット番号は 00 から 15 までです。」 |
| 18 を越えたバンク。`E19_0` など | 「拡張データメモリのバンク番号は 16 進数で 0 から 18 までです。」 |

バス上のアドレスは、ビットを 2 桁にした 1 つの書き方にそろえたアドレスです。`100.5` は `CIO100.05` として、`DM100` は `D100` として送られます。文字列のタグは `?` の後ろに占める文字数を付けるので、D200 にある 16 文字の文字列は `D200?16` として送られます。

### 変数名（NJ/NX） {#variable-names-njnx}

NJ、NX、NY のコントローラーは、ネットワークに公開したグローバル変数の名前で読みます。Sysmac Studio でいえば、Network Publish の属性が Publish Only、Input、Output のいずれかになっている変数です（[コントローラーの準備](#prepare-the-controller) を参照）。コントローラーが公開していない変数は、名前では読めません。名前は ASCII の英字、数字、アンダースコアで書き、数字では始めず、構造体のメンバーの前にはドットを付け、インデックスは角かっこで囲みます。`Level`、`Motor.Speed`、`Temps[3]`、`Grid[1,2]` のようになります。ほかの形はタグのページが拒否します。「変数名は英字、数字、アンダースコアで書き、数字では始めません。メンバーの前にはドットを、インデックスは角かっこで囲みます（例：Level、Motor.Speed、Temps[3]）。」Sysmac Studio が許すほかの文字で書いた名前も同じように拒否されます。EtherNet/IP の要求がそれを運べないからです。

コントローラーは、このドライバーが読まない方法で変数の一覧を出すので、名前で読む機器のタグはどれも手で入力します。コントローラーがその名前を公開しているかどうかは、コントローラー自身が、タグを最初に読んだときに答えます。オフセットの欄はありません。メンバーや要素はそれ自体の名前で指し、BOOL 配列の要素も `Flags[5]` のように自分の名前で読みます。バス上のアドレスは名前の後ろに `?0` を付けたもので、たとえば `Motor.Speed?0` です。

## データ型 {#data-types}

FINS では、選べる**データ型**がアドレスによって決まります。

| アドレスが指すもの | データ型 | 読むもの |
| --- | --- | --- |
| ビット。`W0.01` など | Boolean | そのビットだけ。 |
| ワード。`D100` など | Int16 か UInt16 | そのワード。 |
| ワードとその次のワード | Int32、UInt32、Float | 2 ワード。アドレスに下位のワード、その次に上位のワードを置きます。Omron 自身の命令がダブルワードを置く並びです。領域の最後のワードは組の先頭になれないので、Int16、UInt16、String だけを選べます。 |
| ワードとそれに続くワードを文字列として | String | タグが宣言する**長さ（文字数。空欄なら 16）**で、1 から 1998 文字、1 ワードに 2 文字、先の文字を上位バイトに置きます。文字列は最初の NUL で終わります。シリアル回線上では 1 から 534 文字です。 |

タグの型を扱えないアドレスを入力すると、型はそのアドレスがいちばん自然に読む型に変わります。ビットなら Boolean、ワードなら Int16 です。アドレスが扱えない型は、扱える型を並べて拒否されます。たとえば「アドレス D100 は次のいずれかのデータ型として読みます：Int16, UInt16, Int32, UInt32, Float, String。」です。バイト順やワード順の選択肢はありません。FINS はどのワードも上位バイトを先に置き、ドライバーがそれを扱います。

名前で読む機器は、そのコントローラーのアトミックな型をすべて選べます。

| データ型 | Sysmac Studio の変数の型 |
| --- | --- |
| Boolean | BOOL |
| SByte | SINT |
| Byte | USINT |
| Int16 | INT |
| UInt16 | UINT |
| Int32 | DINT |
| UInt32 | UDINT |
| Int64 | LINT |
| UInt64 | ULINT |
| Float | REAL |
| Double | LREAL |

WORD の変数は UInt16 として、DWORD の変数は UInt32 として読みます。STRING の変数は読まず、String は選べません。一覧にない型は、一覧を添えて拒否されます。「NJ/NX コントローラーの変数は次のいずれかのデータ型として読みます：Boolean, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Float, Double。」

## 読み取り {#reading}

FINS では、機器は PLC と 1 本の会話を保ち、要求を 1 つずつ送ります。タグ 1 つが、そのワードのメモリ領域の読み出し 1 回です。応答として受け取るのは、その要求自身の番号を持つ返事だけなので、遅れて届いた返事を次の要求の返事として読むことはありません。タグを読む前に、PLC はコントローラーのデータの読み出しに、どの終了コードでもよいので応答しなければなりません。PLC が名乗る機種は診断ログに書かれます。その後は、PLC の答えがそれぞれの読み取りの行方を決めます。

| PLC の答え | 読み取り |
| --- | --- |
| 正常終了 | 値。 |
| その点についての終了コード。PLC にないアドレスなど | そのタグは値を持たず、エラーが終了コードと Omron のマニュアルでの意味を示します。たとえば `end code 0x1103 (address range error)` です。機器のほかのタグは読み続けます。 |
| PLC までの経路についての終了コード（0x01xx、0x02xx、0x03xx、0x05xx）、途中の中継ノードでの時間切れ、または**応答のタイムアウト（ms）**の間に何も返らないこと | 機器はつなぎ直し、PLC がまた応答するまでタグの読み取りは失敗します。何を表示するかは、[機器が応答しなかったとき](connector-value-pipeline#the-device-did-not-answer)のタグごとの方針が決めます。 |

名前で読む機器は、どのプログラムも宣言しない変数をコントローラーに尋ねて確かめます。その名前はないというコントローラーの返事が、コントローラーからの返事だからです。この機器の要求は [Rockwell EtherNet/IP](driver-rockwell) のドライバーと同じ EtherNet/IP のコードを通り、10 秒でタイムアウトします。

## 書き込み {#writes}

**アクセス**が読み書きか書き込みのみのタグは書き込めます。新しいタグは読み取りのみから始まります。書き込みは機器の待ち行列で読み取りと一緒に順番を待ち、頼まれた値だけを送り、それ以外は何も送りません。

| タグが読むもの | 書き込みが送るもの |
| --- | --- |
| FINS のビット（`W0.01`） | そのビットだけ。PLC はそのビットをその場で変え、ワードのほかのビットはそのままにします。 |
| FINS のワードかダブルワード | 値の全体。アドレスと、2 ワードならその次のワードへ。 |
| FINS の文字列 | 宣言した長さの全体。前に文字列、後ろに NUL を置くので、前に書いた長い文字列の残りが後ろに読み戻されることはありません。長さに収まらない文字列は、切り詰めずに拒否します。 |
| NJ/NX の変数 | 値を、その名前の変数へ。BOOL 配列の要素は、その BOOL だけとして書きます。 |

| FINS の書き込みへの PLC の答え | 書き込み |
| --- | --- |
| 正常終了 | 配達済み。 |
| 書き込みを断る終了コード | 拒否。理由は終了コードとその意味を示します。たとえば `end code 0x2101 (read-only)` です。 |
| **応答のタイムアウト（ms）**の間に何も返らない、または途中の中継ノードでの時間切れ（0x0205） | 応答なし。 |

タグの型が収められない値の FINS の書き込みは、何も送る前に拒否されます。

## 機器検出 {#discovery}

Omron のドライバーのページには **スキャンの範囲** のカードがあり、任意の欄が 1 つあります。「FINS で問い合わせる PLC のアドレス、例：192.168.250.1（空欄ならブロードキャストで NJ/NX だけを探します）」です。機器検出は、次の問いを最大 2 つ、順に行います。

| 問い | いつ | 見つけるもの |
| --- | --- | --- |
| FINS と UDP によるコントローラーのデータの読み出し。ノードはすべて自動で、欄に書いた PLC に送ります。欄には IP アドレスか名前を書き、PLC が 9600 以外のポートで FINS に応答するなら `:port` を付けます。進み具合の行は「192.168.250.1 に FINS で識別情報を問い合わせています…」と表示します。 | 欄にアドレスがあるときだけ。 | その PLC を、応答した機種の名前を付けた FINS の機器として、`omron://<host>:<port>?protocol=fins&transport=udp&network=0&node=0&unit=0&source=0&timeoutMs=2000` で出します。何も応答しない PLC は何も出しません。 |
| EtherNet/IP の識別要求。このコンピューターがつながっているすべてのネットワークにブロードキャストします。進み具合の行はそのネットワークを示します。「192.168.0.255 で Omron の NJ/NX コントローラーを探しています…」 | 毎回。新しい応答がないまま 5 秒たつまで聞き続けます。 | 応答した NJ、NX、NY のコントローラーをそれぞれ、名前で読む機器として、製品名（たとえば NX1P2）を付けて出します。製品名が `NX-` で始まる NX の I/O カプラーは変数を持たないので飛ばし、ほかの Omron の製品も同じく飛ばします。 |

どちらの問いもタグは見つけません。FINS の PLC はアドレスの一覧を公開せず、NJ/NX はこのドライバーが読まない方法で変数の一覧を出すので、候補にはどれも「タグの報告はありませんでした。機器を追加してから、その編集画面でタグを設定してください。」と表示されます。欄の中身がホストでなければその下で拒否され、機器検出は灰色になります。「Omron のスキャンは、ここに書いた PLC に FINS で識別情報を問い合わせます。IP アドレスか名前を、必要ならポートを付けて書きます（例：192.168.250.1 や 192.168.250.1:9600）。ブロードキャストで NJ/NX コントローラーだけを探すには空欄のままにします。」このコンピューターがつながっていないネットワークのコントローラーはブロードキャストに応答しないので、手で追加してください。Rockwell EtherNet/IP のスキャンも同じブロードキャストを聞きますが、Omron のコントローラーはすべてこちらに任せます。スキャンのそのほかの振る舞いは[機器検出](connector-discovery)にあります。

## エージェントのツール {#agent-tools}

`driver_capabilities` は、このドライバーを `omron` の下に説明します。2 つのプロトコルのそれぞれについて受け付ける機器の項目、アドレスの書き方、データ型と、FINS のトランスポートと範囲、書き込み、機器検出です。`device_upsert driver=Omron` は `omronProtocol`（`Fins` か `NjNx`）を受け付け、FINS では `finsTransport`（`Udp` か `Tcp`）、`finsNetwork`、`finsNode`（0 で自動）、`finsUnit`、`finsSourceNode`（UDP だけ、0 で自動）、`finsResponseTimeoutMs` も受け付けます。名前で読む機器は、ポートも FINS の項目も受け付けません。`tag_upsert` は、メモリアドレスか変数名を `address` で、型を `opcUaType` で（省くとビットは Boolean、ワードは Int16 になります）、FINS の文字列の長さを `wireQuantity` で受け付けます。`device_discover driver=Omron` がスキャンを行い、FINS の問い合わせ先は `target` で渡します。UDP で読む CJ2 と、名前で読む NX1P2 の例です。

```
device_upsert driver=Omron name=Press host=192.168.250.1 omronProtocol=Fins finsTransport=Udp
tag_upsert device=Press name=Level address=D100 opcUaType=Float
device_upsert driver=Omron name=Filler host=192.168.250.2 omronProtocol=NjNx
tag_upsert device=Filler name=Speed address=Motor.Speed opcUaType=Float
```

シリアル回線上の PLC は、このドライバーの回線にぶら下がります。`serial_line_upsert driver=Omron` で回線を作り、`device_upsert driver=Omron serialLineId=<id>` で PLC を Host Link で追加します（回線から `finsTransport=HostLink` になります）。`unitId` にはユニット番号を 0 から 31 で渡し（省くと空いている最初の番号）、`finsResponseTimeoutMs` も渡せます。ネットワークの項目は受け付けません。COM5 のユニット 0 にある CP1L の例です。

```
serial_line_upsert driver=Omron name=HostLink serialPort=COM5 baudRate=9600 serialFormat=7E2
device_upsert driver=Omron name=Mixer serialLineId=<the line's id> unitId=0
tag_upsert device=Mixer name=Level address=D100 opcUaType=Int16
```

ほかのツールは[エージェントのツール](agent-tools)にあります。

## 知っておきたい制限 {#limits-worth-knowing}

- 古い C モードの Host Link コマンドしか話さないコントローラー（CPM1、CPM2、CQM1、C200HS など）は、[シリアル回線](#host-link-on-a-serial-line)でも変換器経由でも読めません。ドライバーは FINS のコマンドしか送りません。
- タイマーとカウンターは FINS では選べません。現在値は PLC の設定しだいで BCD かバイナリで保たれ、FINS の応答にはどちらなのかが含まれないからです。そうした値は、プログラムがコピーする先のワードを通して読んでください。
- NJ/NX のコントローラーの変数は、タグのページでもスキャンでも一覧になりません。名前はどれも入力します。
- 名前で読む機器は、タグ 1 つにつきアトミックな値を 1 つ読みます。STRING の変数、構造体の全体、配列の全体は読みません。メンバーや要素は名前で読みます。
- ドライバーが送る FINS のコマンドは、メモリ領域の読み出し、メモリ領域の書き込み、コントローラーのデータの読み出しの 3 つだけです。PLC の運転モード、時計、プログラムを変えることはありません。

## 知っておくとよいこと {#good-to-know}

- UDP では、ステーションは要求のたびに自分のポートから送り、PLC はそのポートに応答します。これが Omron の Ethernet ポートの出荷時の設定です。静的なアドレス変換に設定した Ethernet ユニットは、代わりにステーションのポート 9600 に応答しますが、ドライバーはそこで聞いていません。そうした PLC は TCP で読んでください。
- 0 以外の FINS ネットワークには、PLC に設定したルーティングテーブルを通って届きます。ステーション自身は何も中継しません。
- NJ/NX のコントローラーには、まず CIP の経路 `1,0` で尋ね、応答がなければ 18 にコントローラー自身の IP アドレスを続けた経路、たとえば `18,192.168.250.1` で尋ねます。応答した経路は、次の回に最初に試します。経路の欄はありません。
- FINS のタグは 1 つずつが独立した要求で、機器はそれを 1 つずつ送ります。そのため、ひと回りの読み取りにかかる時間はタグの数とともに伸びます。
