# OPC DA

> COM/DCOM 越しの従来の OPC Data Access サーバーのクライアントです。32 ビットの補助プロセスで動き、アイテム ID でアドレスを指定し、コンピューター上のサーバーをスキャンします。

**OPC DA** ドライバーは、従来の OPC Data Access サーバー（バージョン 1.0、2.05a、3.0）のクライアントです。古い PLC のゲートウェイや SCADA システム、シミュレーターは、今もこの COM サーバーを通してデータを公開しています。サーバーは動いているコンピューターと ProgID（たとえば `Matrikon.OPC.Simulation.1`）で指定し、タグはサーバーのアイテム ID で指定します。ドライバーとその機器は [Connector](connector) のページで追加します。

## 機器 {#device}

| 項目 | 意味 | 既定 |
| --- | --- | --- |
| **ホスト** | OPC DA サーバーが動いているコンピューターの名前またはアドレス。空ならこのコンピューターで、従来のサーバーの多くはここで動いています。 | 空：このコンピューター |
| **サーバー / キー** | サーバーの ProgID。ベンダーが Windows に登録したとおりに書きます。たとえば `Matrikon.OPC.Simulation.1`。 | `OPC.Server.1` |
| **読み出し周期（ms）** | ステーションが機器のタグを読む間隔。タグが自分の間隔を決めていればそちらを使います。 | 1000 |

機器のアドレスはこの 2 つから組み立てられます（たとえば `opc.da://localhost/Matrikon.OPC.Simulation.1`）。ポートはありません。COM は Windows 自身の登録からサーバーを見つけます。

## タグのアドレス指定 {#tag-addressing}

タグは**アイテム ID** でアドレスを指定します。自由記述で入力し、書いたとおりにサーバーへ送られます（たとえば `Random.Real8` や `Channel1.Device1.Tag1`）。アイテム ID はサーバー自身のもので、サーバーの資料かスキャンで一覧できます。ステーションは、タグが初めて読むときに各アイテムを機器の 1 つのグループに加え、サーバーのキャッシュではなく現場の機器から読みます。

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

**データ型**の選択肢には、OPC DA のアイテムが持つ型が出ます。Boolean、SByte、Byte、Int16、UInt16、Int32、UInt32、Int64、UInt64、Float、Double、String、DateTime です。読み取りは毎回タグの型へ変換されるので、サーバーがそのアイテムに宣言している型、つまりスキャンが提示する型を選んでください。64 ビットの実数のアイテムは、Float で読むと精度が落ち、Double で読めば保たれます。数値でない文字列や配列のように、タグの型に収まらない値を読んだタグは値を持たないままになります。OPC DA の日付にはタイムゾーンがなく、ステーションは UTC として読み書きします。

サーバーが返す値にはそれぞれ品質が付いています。品質が良好（Good）の値はタグに届きます。不確か（Uncertain）や不良（Bad）の値ではタグは値を持たないままになり、失敗した読み取りの診断ログの行が OPC DA 仕様の言葉で品質を示します。たとえば `Bad: not connected (0x0008)` や `Uncertain: last usable value (0x0044)` です。読み取りに失敗したアイテムのタグは値を持たないままになり、機器のほかのタグは読み続けます。

## 機器検出 {#discovery}

**機器検出**は、あるコンピューターに登録されている OPC DA サーバーを一覧します。スキャンの対象にそのコンピューターの名前かアドレスを入力するか、このコンピューターなら空のままにします。各サーバーは機器として提示され、そのアドレス空間がたどられます。サーバーが持つアイテムはすべて、サーバーが宣言する型を持つ読み取りのみのタグとして提示されます。64 ビットの実数は Double、符号なし 16 ビット整数は UInt16 というように、上の型それぞれがそのまま使われ、通貨の値は Double になります。型を宣言していないアイテムは、どんな値でも読める String として提示されます。配列のように、どのタグも読めない型のアイテムは提示されず、スキャンが除外したものとして数えられます。候補の選び方と追加の仕方は[機器検出](connector-discovery)を参照してください。

スキャンは、このコンピューターに登録されている OPC DA のプロキシ／スタブ ライブラリを通じて、OPC サーバー列挙サービス（OpcEnum）にサーバーを問い合わせます。そのどちらかがない間は、スキャンは何も一覧せず、何がないかを示します。手順は [OPC Core Components のインストール](#installing-the-opc-core-components) にあります。

## 書き込み {#writes}

**アクセス**が読み書きか書き込みのみのタグは、読み取りと同じアイテムへ書き込めます。値は、サーバーがそのアイテムを持っている型で送られます（サーバーが型を示さないときはタグ自身の型です）。タグの値から文字列を経ずに変換されるので、どの言語のステーションでも同じ数値が送られます。アイテムの型の範囲を超える整数は、何も送る前に拒否され、その型に収まる最も近い値に切り詰められることはありません。サーバーが拒否した書き込みは拒否として返ります。ステーションが言える理由（書き込みを受け付けないアイテム、アイテムが受け付けない値、サーバーが知らないアイテム、アクセスの拒否）ならその理由が、それ以外ならサーバーのエラーコード（たとえば `OPC DA 0x80004005`）が付きます。どの場合もサーバーのコードは診断ログに残ります。OPC DA にはコマンドがないので、このドライバーの機器にはコマンドがありません。

## 32 ビットの補助プロセス {#the-32-bit-helper}

OPC DA サーバーへは 32 ビットの COM クライアントでつなぎますが、64 ビットのステーションはそれを読み込めません。そのため、このドライバーは専用の補助プロセス `Lab.Desktop.DriverBridge.exe` で動きます。ステーションは、OPC DA の機器かスキャンが初めて必要としたとき、またはステーションが OPC Core Components を確認するときにこれを起動し、Connector が止まるときに閉じます。ドライバーの使い方は何も変わりません。機器とタグは、ほかのドライバーと同じように読まれ、書き込まれ、スキャンされ、診断ログに残ります。

補助プロセスが止まると、その機器には「OPC DA ドライバーの32ビット補助プロセスが止まりました。ステーションが補助プロセスを起動し直し、機器はそれを通して再接続します。」というエラーが出て（終了コードはイベントページにあります）、タグは値を失います。ステーションは補助プロセスを起動し直し（止まり続けるあいだは間隔が延びていきます）、機器はそれを通して自動で再接続します。補助プロセスが止まったときに送信中だった書き込みは失敗として返り、値が現場の機器に届いたかどうかは分からないと伝えます。ほかのドライバーやステーションのほかの部分が一緒に止まることはありません。

## 始める前に {#before-you-start}

- ステーションは OPC のコンポーネントを何もインストールしません。OPC サーバー列挙サービス（OpcEnum）と OPC DA のプロキシ／スタブ ライブラリは、OPC DA サーバーか OPC Core Components に含まれています。ステーションはそれらが登録されているかを自分で確認し、どれかがない間はインストール方法を示します。[OPC Core Components のインストール](#installing-the-opc-core-components) を参照してください。
- 別のコンピューター上のサーバーへは DCOM でつなぐため、ステーションが動いている Windows アカウントに対して、両方のコンピューターが許可している必要があります（DCOM の権限、ファイアウォールの規則、同じアカウントか信頼されたドメイン）。この設定はステーションではなく Windows で行います。[リモートのサーバーの準備](#prepare-a-remote-server) を参照してください。
- このドライバーは Windows でのみ動きます。

## OPC Core Components のインストール {#installing-the-opc-core-components}

ステーションは、32 ビットの補助プロセスで、このコンピューターに OPC サーバー列挙サービス（OpcEnum）と OPC DA のプロキシ／スタブ ライブラリが 32 ビットのプログラム向けに登録されているかを自分で確認します。ドライバーのページ、その機器のページ、またはエージェントが初めて尋ねたときに確認し、どれかがない間は 30 秒ごとに確認し直します。Connector が起動するまでは、あるかどうかはわからないため、何も示しません。ない間は次のようになります。

| 場所 | 示す内容 |
| --- | --- |
| ドライバーのページ | 注意の知らせ「このコンピューターには OPC Core Components がありません」と、下の手順。そのリンクは OPC Foundation のページをコンピューターのブラウザーで開きます。 |
| 各機器のページ | 同じ知らせ。ただし、オンラインの機器には示しません。 |
| スキャン | 何も一覧せず、何がないかを示します。スキャンの最後の行は知らせを案内し、エージェントの `device_discover` は手順を英語で示します。 |
| 接続に失敗した機器の最後のエラー | 何がないかと同じ手順を、ドライバー自身の原因と同じく英語で示します。 |
| エージェント | `driver_capabilities` が `prerequisite` の下に、`installed` を false として手順を示します。 |

インストールの手順：

1. OPC DA サーバーのインストーラーをもう一度実行します。通常はこれらもインストールされます。
2. それで足りない場合は、OPC Foundation のページ [Core Components](https://opcfoundation.org/developer-tools/samples-and-tools-classic/core-components/) を開き、OPC Core Components Redistributables をダウンロードします。ダウンロードできるのは登録ユーザーだけです。ファイルをダウンロードする権限がないと表示されたら、同じページの「Login」でサインインするか、「Create Account」でアカウントを作成してください。
3. 64 ビット版の Windows では `opc-core-components-redistributable-<version>-x86-x64.msi` を選びます（32 ビットのコンポーネントも含まれています）。`-x86.msi` で終わるものは 32 ビット版の Windows 専用です。
4. 管理者として実行し、インストーラーから求められたらコンピューターを再起動します。

インストール後 30 秒以内に知らせは消え、スキャンに OPC DA サーバーが表示され、Ganter Lab を再起動しなくても、このドライバーの機器は今の設定のまま接続します。

## リモートのサーバーの準備 {#prepare-a-remote-server}

このコンピューター上のサーバーには、ほかに何も要りません。別のコンピューター上のサーバーへは DCOM でつなぎますが、DCOM は両方の準備が整うまで、ほかのコンピューターからは何も通しません。準備はステーションではなく、両方のコンピューターの Windows で、それぞれの管理者が行います。

1. 両方のコンピューターで、同じパスワードの同じ Windows アカウント（ステーションが動いているアカウント）を使うか、両方が知っているドメインアカウントを使います。
2. サーバーのコンピューターで `dcomcnfg` を実行し、**Component Services > Computers > My Computer > Properties > COM Security** を開きます。**Access Permissions** と **Launch and Activation Permissions** の **Edit Limits** と **Edit Default** の両方で、そのアカウントにリモートの権限をすべて許可します。**Access Permissions** の **Edit Limits** では、OPC サーバー列挙子（OpcEnum）が必要とする ANONYMOUS LOGON にも **Remote Access** を許可します。
3. 同じ場所の **My Computer > DCOM Config** で OPC サーバーと OpcEnum の Properties を開き、Security タブで 3 つのアクセス許可を同じアカウントでカスタマイズします。
4. ステーションのコンピューターでも `dcomcnfg` を実行し、**Access Permissions** の **Edit Limits** で、OPC サーバーが動作しているアカウントに **Remote Access** を許可します。サーバーはステーションへコールバックします。
5. サーバーのコンピューターの Windows Defender ファイアウォールで、受信の TCP ポート 135 と、OPC サーバーと OpcEnum（`OpcEnum.exe`）のプログラムを許可し、**サービス**で OpcEnum が実行中で自動で開始することを確かめます。

**Edit Limits** が権限を拒否している間は、**Edit Default** を変えても何も変わりません。両方を設定してください。DCOM はポート 135 で応答したあと、Windows が選ぶポートで呼び出しを運びます。そのため、2 台のコンピューターの間にあるファイアウォールが 135 だけを開けても、サーバーは遮断されたままです。

| Windows の応答 | 機器のページに出る内容 |
| --- | --- |
| アクセス拒否（0x80070005） | 「*ホスト* が DCOM でこのステーションを拒否しています」。ステーションが動いているアカウントと、手順 1 から 4 を示します |
| RPC サーバーを利用できません（0x800706BA） | 「*ホスト* が DCOM に応答しません」。コンピューターの電源が切れているか届かない、ファイアウォールが DCOM を遮断している、または OpcEnum がそこで動作していないことと、手順 5 を示します |

どちらの通知も機器のエラーの代わりに表示され、サーバーが接続すると自然に消えます。診断ログとエージェントも、同じ手順を英語で読みます。このコンピューター上のサーバーについて、このように示されることはありません。

プラントで DCOM が許されない場合は、サーバーのコンピューターで OPC DA サーバーを OPC UA で提供するラッパーかトンネルを使えば、DCOM をまったく使わずに済みます。ステーションはそのサーバーを [OPC UA](driver-opc-ua) ドライバーで読みます。
