# Simulated

> ハードウェアなしで試験、訓練、ダッシュボード作りを行うための、アプリ内の合成信号。

Simulated のドライバーは、設備もネットワークも使わずに、アプリの中で合成した信号を作ります。間に合わせの仕組みではなく、れっきとしたドライバーです。その機器は、実機とまったく同じランタイムの道筋で登録され、読み出され、保持されるので、グラフ、データ型、品質の表示、書き込みの振る舞いは、現場と同じように働きます。[Connector](connector) の仕組みを試すとき、設備が届く前にダッシュボードを組むとき、実演の準備をするときに使ってください。

## 機器 {#device}

Simulated の機器には接続の項目がありません。名前と既定の**読み出し周期（ms）**（既定は 1000）だけです。基準 URI は `simulated://<device>` で、機器の部分は参考のためのものです。振る舞いはすべてタグにあるからです。

## 機器検出 {#discovery}

**機器検出**は対象を必要とせず、組み込みのカタログを並べます。各モデルの、すぐ追加できる実体を 1 つずつ、タグ付きで出します。いらないチャネルは、追加する前にチェックを外してください。

| モデル | 実体 | チャネル |
| --- | --- | --- |
| Universal Controller | UC-01 | ProcessValue（sine）、SetPoint（書き込める設定値、既定は 50）、Output（ramp）、RunStatus（Run/Stop/Pause/Fault） |
| Electrical Power Meter | PM-01 | Voltage、Current、ActivePower、Frequency（230、10、2300、60 のまわりのランダムウォーク。250 ms で読み出し）、PowerFactor（sine） |
| Production Counter | CNT-01 | Count（Int32 のカウンター）、Rate（100 のまわりのランダムウォーク）、Running（切り替わるブール値） |
| Status Panel | STS-01 | State（Run/Stop/Pause/Fault）、Alarm（切り替わるブール値）、Uptime（Int64 のカウンター） |
| Type Showcase | SHOW-01 | OPC UA の組み込みの型ごとに 1 チャネル、全部で 15 個。値の表示をひととおり試すのに便利です |

カタログから追加した機器は、外したチャネルを自分のページから取り戻せます。「タグ」のカードの見出しにある**タグ検出**は、モデルのチャネルのうち、まだタグがないものを一覧にします。手で作った機器はモデルを持たないので、タグ検出は出ません（[機器のタグを検出する](connector-discovery#discovering-a-devices-tags)を参照）。

## タグ {#tags}

Simulated のタグには入力するアドレスがありません。タグの名前がその点だからです。OPC UA の組み込みのデータ型はすべて使え、アクセスの 3 つの方式もすべて使えます。タグが何を作るかは「信号源」のカードの**信号の種類**で選びます。選択肢には、そのタグのデータ型と両立する形だけが出ます。データ型を変えると、両立しない形は妥当な既定に置き換わります。アクセスが書き込みを許すタグには、書き込みを受け付ける形、つまり設定値の保持とパルスだけが出ます。アクセスを変えたときも、形は同じように置き換わります。

| 信号の種類 | 作るもの | 両立する型 | 書き込み |
| --- | --- | --- | --- |
| **正弦波** | なめらかな波に軽いさざ波を乗せたもの。タグの名前を種にするので、名前が違うタグは違う動きをし、再起動しても同じ曲線を再現します | 数値 | なし |
| **ランプ** | 三角波（上ってから下ります）。周期はタグの名前を種にした 10 から 59 秒 | 数値 | なし |
| **ランダムウォーク** | 現実的な計器のゆらぎ。直前の値から歩き、既定値（未設定なら 50）へ向かって戻る性質を持ちます。1 歩の大きさは中心の 1%（最低 0.5） | 数値 | なし |
| **カウンター** | 単調に増える整数。既定値（未設定なら 0）から始まり、読み取りごとに 1 ずつ増えるので、増える速さは読み出し周期に従います | 数値 | なし |
| **ブールの反転** | 1 秒ごとに入れ替わるブール値 | ブール値 | なし |
| **列挙テキスト** | 決まった状態の並びを 3 秒ごとに 1 つずつ巡る文字列 | 文字列 | なし |
| **時計** | 読み取りのたびに取った現在時刻 | 日時 | なし |
| **ランダムな GUID** | 読み取りのたびに新しい乱数の Guid | Guid | なし |
| **ランダムなバイト列** | 読み取りのたびに 8 バイトの乱数の中身 | バイト列 | なし |
| **設定値の保持** | 書き込まれるまで既定値を保ちます。書き込むと、以降の読み取りが答える値がそれに置き換わります | どの型でも | あり |
| **パルス** | 一瞬だけの点。ふだんは基準値にいて、書き込むとその値を決められた秒数だけ保ち、そのあと自分で基準値に戻ります | どの型でも | あり |

種類を指定せずに作ったタグには、動きのある既定が入ります。書き込めるタグは **設定値の保持**（書き込みが残るように）になり、読み取り専用のタグは型に合った生成器（数値は正弦波、ブール値はブールの反転、文字列は列挙テキスト、日時は時計、Guid はランダムな GUID、バイト列はランダムなバイト列）になります。**パルス** が既定になることは決してありません。書き込まれた値をいったん返してから手放す点は、意図して選ぶものだからです。例外は、アドレスで `default` の値を示している読み取り専用のタグです（たとえば `?default=true`）。このタグも **設定値の保持** になり、その値を答えます。生成器ではその値が無視されるからです。

### パネルで編集するパラメーター {#parameters-in-the-panel}

「信号源」のカードで直接編集するパラメーターは 2 つです。

| 項目 | 出る種類 | 意味 |
| --- | --- | --- |
| **既定値** | ランダムウォーク、カウンター、設定値の保持 | 歩きの中心、カウンターの開始値、または何か書き込まれるまで設定値が答える値です。入力の形はタグの型に合わせます（ブール値ではチェックボックス、日時では日付の選択、それ以外はテキスト）。 |
| **状態** | 列挙テキスト | 巡回するセミコロン区切りの並びです。たとえば `Run;Stop;Pause`。空や中身のない並びは `Run;Stop;Pause` に戻ります。 |

### 詳しい信号のパラメーター {#advanced-signal-parameters}

残りの形のパラメーターは、タグの保存されたアドレスにクエリの引数として付いて運ばれます（たとえば `ProcessValue?min=20&max=80&period=30`）。パネルはそれらを編集しませんが、どの編集をしても保ったままにします。同梱の例はそれらを使いますし、エージェントは[エージェント](agent)の面のタグのツールから設定できます。

| 引数 | 効く種類 | 意味 | ないときは |
| --- | --- | --- | --- |
| `min`、`max` | 正弦波 | 波が動く帯。出力はそこに頭打ちされます | タグの名前を種にした帯（20 から 49 のずれのまわりに振幅 10 から 49）で、頭打ちなし |
| `period` | 正弦波 | 波の周期（秒） | タグの名前を種にした周波数（0.05 から 0.24 Hz） |
| `phase` | 正弦波 | 位相のずれ（度） | タグの名前を種にします |
| `default` | ランダムウォーク、カウンター、設定値の保持 | パネルの既定値の項目が編集するのと同じ値 | 50 / 0 / 型の既定 |
| `values` | 列挙テキスト | パネルの状態の項目が編集するのと同じ並び | `Run;Stop;Pause` |
| `baseline` | パルス | 保持と保持のあいだに点が留まる値。タグの型として解釈されます | 型のゼロ値（日時なら現在時刻、文字列なら空） |
| `hold` | パルス | 1 回の書き込みの保持が何秒続くか | 10 秒 |
| `warmup` | どの種類でも | 接続してから最初の読み取りが答えるまでの秒数。落ち着くまで待つ計器のような振る舞いで、待ち時間は読み出しの繰り返しが吸収します | なし |
| `outage` | どの種類でも | 各周期の終わりで、点が読み取りに失敗する秒数。応答しなくなった機器のような振る舞いです。その機器のほかのタグは答え続け、書き込みも届きます | なし |
| `outageEvery` | どの種類でも | 1 回の停止周期が何秒続くか。接続から数えます。点は各周期の始めに答え、最後の `outage` 秒のあいだ失敗します。周期と同じ長さの停止では失敗し続けます | 60 秒 |

`outage` を使うと、機器がなくても、機器が応答しないときにタグが何をするかを見られます。`?outage=5&outageEvery=30` は 25 秒答え、5 秒読み取りに失敗し、また始めから繰り返します。タグは [機器が応答しなかったとき](connector-value-pipeline#the-device-did-not-answer) にあるとおり自分の選んだ方針を適用し、読み取りの失敗は宣言された停止を原因として示します。

## 書き込み {#writes}

- **設定値の保持**は書き込みを受け付け、それ以降は書き込まれた値を答えます。保持された値は、機器が接続しているあいだメモリーの中にあります。構成には保存されないので、機器を無効にするかアプリを再起動すると、その点は既定値に戻ります。
- **パルス**は書き込みを 1 回の保持として扱います。保持が切れるまで書き込まれた値を答え、そのあと基準値に戻ります。保持の途中で 2 回目を書き込むと、それが丸ごと置き換わるので、ボタンを押し続けても 2 つ積み上がるのではなく保持が始め直されます。
- ほかの種類はすべて書き込みを拒否します。試みられた書き込みは、読み出しのたびに記録があふれないよう、タグごとに一度だけ診断ログに残ります。

ほかのドライバーと同じで、書き込みの入力欄は工業値を取り、生値が信号に届く前に[値の変換経路](connector-value-pipeline)が逆にたどられます。

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

- 値は 1 回の実行ごとに合成されます。決まった形（正弦波、ランプ、時計）は再起動後も同じ曲線を再現しますが、状態を持つもの（カウンター、ランダムウォーク、設定値の保持、パルス）は最初からやり直します。
- 両立しないデータ型と信号の種類を組み合わせると（プログラムからの設定でのみ可能です。パネルは選択肢を絞ります）、そのタグはどの読み取りにも失敗し、警告が一度だけ診断ログに残ります。
