# 変数

> 変数の編集画面をカードごとに。識別とアドレス、式と内部値の 2 つの種類、出力の型、実時間の値のカード、設定する値、品質と保持、コマンド、そして編集画面が拒否するもの。

変数は、ステーションが計算するか保持する、型を持つ 1 つの値です。`Variables` の下に、そのフォルダーの道すじと変換した名前でアドレスを取ります。Logic の欄で変数の行を選ぶか、そのフォルダーまたは節の最上位の表でその行の**開く**を押すと、その編集画面が開きます。新規… > 新しい変数や、フォルダーの上での新しい変数で作った変数は開かれず、その表でその行が強調表示されます（[作成と複製](logic#creating-and-copying)を参照）。編集画面を読むには **Logic の表示**が、どの入力欄でも変えるには **Logic の構成**が、内部値を書き込むには **Logic の操作**が必要です。

パネルの見出しは、その行の印（式の印か内部値の印）、名前、そして種類ごとの 1 行を見せます。「このステーションがアドレス空間の式から計算する値で、ロジックの周期ごとに計算し直されます。」か、「このステーションが保持する値です。スクリプト、ダッシュボード、または操作者が書き込み、どこからでもアドレスで読めます。」です。入力の欄には識別のカード、その次に式の編集画面か内部値のカードが入ります。右側の帯には値のカードと、式のときは参照しているポイントのカードが入ります。

## 識別 {#identity}

| 項目 | 意味 | 受け付ける値と既定 | 効果 |
| --- | --- | --- | --- |
| 名前 | 表示の名前です。それを変換した区切りが、アドレスの最後の段になります。 | 自由記述。新しい変数は `VariableN` です。 | 安全な名前の変更（下記）で確定します。空の名前は拒否されます（「名前が必要です。」）。 |
| アドレスの行 | その変数が応えるアドレスで、名前の下に繰り返されます。節の最上位、フォルダーの段、区切りの順です。 | 読み取り専用。 | 入力すると名前に従います。フォルダーの部分は、ツリーの**移動先**でだけ変わります。 |
| 種類 | 値の作られ方です。 | 式（既定）か内部値。 | 内部値に切り替えると、初期値から値をまき直します。式に切り替えると、次の周期まで欠測になります。 |
| 出力の型 | すべての結果と書き込みが合わせられる分類です。 | ブール、整数、小数（既定）、文字列、日時、画像、アイコン、色。 | 変えると、内部値の変数は値をまき直し（保持する設定ならその種も保存します）、式の変数は欠測になります。プレビューは新しい型で解決し直します。 |
| 単位（任意） | 値の隣に描く工業単位です。 | 自由記述。既定は空です。 | 値のカードに出て、スクリプトからは `.EngineeringUnit` として読めます。 |
| 説明（任意） | 自由記述です。 | 既定は空です。 | 評価には効きません。 |

### 名前とアドレス {#name-and-address}

名前の入力欄は、名前の変更の入力欄です。入力している間はその場だけにとどまり、少し置くと入力欄の下の行が影響を予告します（「参照を確認しています…」のあと、「名前を変えると、このアドレスを読んでいる 3 か所が更新されます。」、「現在のアドレスを使っている参照はありません。」、あるいは新しい名前が同じ区切りに変換されるときは「実効アドレスは変わらないため、更新が必要な参照はありません。」）。Enter を押すか入力欄から離れると確定します。確定すると、変数の名前が変わり、古いアドレスを使っていた式、スクリプト、条件、ダッシュボードのバインドがすべて書き換わり、実時間の値とチャネルのバインドは保たれ（チャネルは変数の変わらない鍵で結び付いていて、名前では結び付いていません）、「変数の名前を変え、参照 N 件を更新しました。」と伝えます。その段でぶつかる名前は、その場で拒否されます。「「X」は、すでに「Variables.X」として応答します。同じフォルダーに入れる名前は、それぞれ違う区切りに変換される必要があります。」書き方と衝突の規則は[アドレス空間](logic-address-space#how-an-address-is-spelled)にあります。

## 式 {#expression}

種類が式の間に出ます。式の編集画面と、その「参照…」のボタン、そして次の助言です。「アドレス空間の上に書く、1 つの JavaScript の式です（例：Connector.Simulated.Pump.Flow.ValueToReal() * 0.1、Variables.Setpoint.Value）。出力が画像、アイコン、色のときは、Assets.Images、Assets.Icons、Assets.Colors のアドレスを返します（例：Variables.Level.Value > 50 ? Assets.Colors.Red : Assets.Colors.Green）。入力すると候補が出ます。「参照…」から選ぶこともできます。」文字はキーを押すたびに自動で保存され、0.5 秒ごとに検証されます。問題は値のカードに出ます。言語、読み取りの面、すべての規則は[式](logic-expressions)にあります。式の文字は、種類が内部値の間も保たれますが、使われません。

## 内部値 {#memory}

種類が内部値の間に出ます。

| 項目 | 意味 | 受け付ける値と既定 | 効果 |
| --- | --- | --- | --- |
| 初期値 | 種になる値を、文字列で書きます。その下には「起動時に、出力の型に沿って読み取られます。値を持たせないときは空欄にしてください。」と出ます。 | 任意の文字列。既定は空です。 | 変数を作ったとき、種類や出力の型を変えたとき、そして保持しない変数の起動のたびに、出力の型に沿って読み取られます。空は値なしという意味で、その変数は欠測から始まります。読み取れない文字列は値のカードで指摘され（「初期値を 小数 として読み取れませんでした。」）、欠測をまきます。 |
| 保持する：最後に書き込まれた値が再起動をまたいで残ります | 書き込みを保存するかどうかです。 | 既定はオフです。 | 保持する変数は、書き込みが止まってから約 1 秒後、遅くとも最初の未保存の書き込みから 5 秒後に保存されます。ランタイムを止めると、残っているものが書き出されます。次の起動では、保持した文字列が今の出力の型で読み取られ、もう読み取れないときは初期値が使われます。保持しない変数は、起動のたびに初期値に戻ります。 |

### 設定する値 {#set-value}

**設定する値**の入力欄とその**書き込み**のボタンは、**Logic の操作**を持つロールにだけ描かれ、ステーションが読み取り専用の間は「ランタイム停止中」で灰色になります。エンジニアリングロックは、この 2 つには触れません。値を入力して書き込みを押すと、その文字列が出力の型に沿って読み取られます。読み取れない文字列は拒否され（「「abc」を 整数 として読み取れませんでした。」）、何も書き込まれません。空の入力欄は値なしを書き込み、その変数を欠測に戻します。書き込みは 1 つの[経路](logic#writing-values)に乗ります。実行中のレシピやインターロックがその変数を押さえている間は拒否され（「「Variables.X」は「`<holder>`」によって書き込みから守られています。」）、出どころを操作者として古い値から新しい値へという形で記録され、ロジックのキューの上で適用され、その変数が保持する設定なら保持の印が付きます。入力欄の下の 1 行が、値が入ったときは「値を書き込みました。」と、拒否されたときはその理由（上の拒否のどれか）を伝えます。Connector のタグの書き込みと同じ答え方です。この入力欄は表示ではありません。表示は値のカードです。

内部値の変数には、ステーションの外から書き込むこともできます。[Modbus サーバー](connector-modbus-server)のマップで書き込みを許可した行がその変数を提供していれば、Modbus のクライアントの書き込みを同じ経路で受け、出どころ `Modbus client <address>:<port>` として記録されます。式の変数も読み取り専用で提供できます。

## 出力の型 {#output-types}

| 出力の型 | 運ぶもの | 備考 |
| --- | --- | --- |
| ブール | true か false | チャネルを通じて記録も作図もできます |
| 整数 | 64 ビットの整数 | 記録も作図もできます |
| 小数 | 倍精度の実数 | 記録も作図もできます。表示はステーションの小数点以下の桁数です |
| 文字列 | 自由記述の文字列 | |
| 日時 | ある時刻 | ステーションの日付と時刻の形式で出ます |
| 画像 | 素材の id を文字列として | 見せるための出力です。式は `Assets.Images.*` のアドレスを返します |
| アイコン | グリフか SVG のマークアップを文字列として | 見せるための出力です。`Assets.Icons.*` のアドレスを返します |
| 色 | 16 進数の色を文字列として | 見せるための出力です。`Assets.Colors.*` のアドレスを返します |

型合わせは、アプリのほかの場所と同じ寛容な変換です。文字列は読み取られ、数値は丸めるか変換され、変換できないものは値なしになります。見せるための型の内部値の変数は、書いたそのままのもの（素材の id、グリフ、16 進数）を持ちます。3 つの見せるための出力はダッシュボードのためにあり、そこでは結び付いた[画像](component-image)、[アイコン](component-icon)、[シンボル](component-symbol)のコンポーネントが、その変数が今解決した先を描きます。それらが返すアドレスは[素材](logic-assets#what-a-logic-address-can-name)に並べてあります。

## 値のカード {#the-value-card}

値の帯は、今の値を 1 秒に 2 回更新して見せます。数値などの型では単位を隣に置いた表示、画像では絵、アイコンではその大きさのグリフ、色では 16 進数を添えた色見本です。欠測は横線で描かれます。式の変数では、このカードが入力中の下書きを、周期が拾う前に今の値で評価して予告します。式が正しくない間、表示は横線のままで、検証のメッセージがカードに出ます（名前の衝突もここに出ますが、名前が悪くてもプレビューが止まることはありません）。数値などの表示の下で、カードは「この変数を記録するには、Process > Definition > Channels でチャネルを結び付けてください。」と述べます。結び付けは、Process のモデルの[チャネル](process-channels)の画面で行います。

式の変数では、参照しているポイントのカードが、式が名指しするすべてのアドレスを今の読み値とともに並べ、アドレスがもう解決しないものは「?」にするので、悪い入力がひと目で分かります。

## 品質 {#quality}

変数の値は、型を持つ値であるか、値がまったくない（欠測である）かのどちらかです。ポイントが良好なのは、自分の値があるときだけです。内部値の変数は値を持てば良好で、空の種は最初の本当の書き込みまで欠測です。式の変数は最後の評価の品質を運ぶので、参照しているポイントのどれかが欠けている、悪い、あるいは値を持たないとき、式は評価されず、その変数は品質の悪い欠測になります。空の読み取りが黙って 0 になることは決してありません。スクリプトはその品質を `.State()` で読みます。その変数に結び付いたチャネルは、欠測を欠測として記録します。

## 使っている場所 {#used-by}

フォームの列の下にある「使っている場所」のカードは、この変数を読み書きする、ステーションの中のすべてを並べます。名前を変えたり削除したりする前に、何がこの変数に頼っているかが分かります。変数を選んだときと、名前を変えたあとにもう一度読み取られます。

| 種類 | 場所 | 名前 |
| --- | --- | --- |
| Modbus サーバー | 空 | この変数を提供する [Modbus サーバー](connector-modbus-server)のレジスターマップの行で、レジスターの種類とマニュアル上のアドレスで示します（`保持レジスター（4xxxx） 40101`） |
| OPC UA サーバー | 空 | この変数を提供する OPC UA サーバーの[提供するノード](connector-opcua-served-nodes)の行を通じて、クライアントができること：読み取りのみ、または読み書き |
| MQTT 発行 | ブローカー | この変数を発行する、ブローカーの[発行のカード](driver-mqtt#the-publish-card)の行のトピック |
| 変数、アクション、警報 | 空 | テキストにこの変数のアドレスを書いている式の変数、アクション、警報で、しまわれているフォルダーも添えて示します |
| ダッシュボード | そのダッシュボード | アドレスのプロパティでこの変数を名指ししている部品 |

サーバーの行は変数を変わらない識別で持ちます。名前を変えても同じ変数を提供し続け、削除すると行は残って、失ったものを名指しします。ブローカーの行も同じで、トピックはそのままです。読み取っている間、カードには「参照を読み取っています…」と出ます。何も使っていないときは「この変数を使っているものは、ステーションの中にありません。」、読み取りに失敗したときは「参照を読み取れませんでした」と**もう一度試す**が出て、空の一覧には決してなりません。カードは読むだけです。編集画面を開けるどのロールにも見え、ステーションがロックされている間も見えて、コマンドは何もありません。この変数に結び付いた Process の[チャネル](process-channels)は並べません。チャネルは変数の変わらないキーで結び付くからです。

## コマンド {#commands}

| コマンド | 何をするか | 灰色になるとき | 描かれないとき |
| --- | --- | --- | --- |
| 複製 | その変数を、空いている名前（`Name (2)` など）で Variables の最上位に写し、その複製は開かずに最上位の表で強調表示します（[作成と複製](logic#creating-and-copying)を参照）。複製は新しい鍵を持つので、まだどのチャネルにも結び付いていません。 | ステーションがロックされているか読み取り専用のとき。 | ロールが Logic の構成を持たないとき。 |
| 変数を削除 | 「「X」を削除しますか？変数が取り除かれます。そのアドレスへの参照は、解決できなくなります。 この操作は元に戻せません。」と尋ね、保持していた値ごと削除します。 | ステーションがロックされているか読み取り専用のとき。 | ロールが Logic の構成を持たないとき。 |
| 移動先（右クリック） | その変数を別のフォルダーか最上位に入れます。アドレスとすべての参照が付いてきます。 | ステーションがロックされているか読み取り専用のとき。 | ロールが Logic の構成を持たないとき。 |

変数に有効化と無効化はありません。常に評価されるか、常に保持されるかのどちらかです。

## 編集画面が拒否するもの {#what-the-editor-refuses}

- 空の名前、あるいはその段で区切りがすでに使われている名前。
- 読み取り専用の JavaScript の式 1 つになっていない式、存在しないポイントやほかの式の変数を参照する式、試しの評価に失敗する式（正確なメッセージは[式](logic-expressions#what-validation-refuses)にあります）。
- 出力の型で読み取れない初期値や設定する値、そして NaN や無限大の値。
- 実行がステーションをロックしている間、あるいは停止している間のあらゆる変更。入力欄はステーションが持っている内容に読み直され、操作ログ帯が理由を述べます。

## この編集画面がしないこと {#what-the-editor-does-not-do}

作図も記録もしません（それはチャネルの仕事です）。タグに書き込みません（内部値をその先へ運ぶのはスクリプトかダッシュボードの操作部です）。ほかの式の変数を参照しません。値の履歴を持ちません。そして、保持しない値を再起動をまたいで残しません。
