# Logic

> Logic のページ、その「アドレス空間」の欄、フォルダー、コマンドバー、すべてのパネルの後ろにあるロジックの周期と書き込みの経路、そしてページの描き方を決める 3 つの権限。

Logic はナビゲーションバーの 3 つ目の項目です。**Logic の表示**を持つロールであれば開けて、その見出しには「アドレス空間の上に組み立てる、変数（導かれる値や書き込める値）とアクション（それらを書き込むスクリプト）を定義します。」と書かれています。マスターと詳細の形のページです（[ページの読み方](app-conventions)）。左に**アドレス空間**という見出しの欄、右にコマンドバーと詳細のパネルがあります。ここで編集したものは入力しながら自動で保存されます。ページのどこにも保存のボタンはありません。

## この節にあるページ {#in-this-area}

| ページ | 扱うこと |
| --- | --- |
| [アドレス空間](logic-address-space) | 7 つの予約された最上位、アドレスの書き方と変換のされ方、絞り込みの入力欄、そしてアドレスを入れる 3 つの方法。 |
| [変数](logic-variables) | 変数の編集画面。識別とアドレス、式と内部値の 2 つの種類、値のカード、設定する値。 |
| [式](logic-expressions) | 式の言語、ポイントの読み取りの面、評価が守らせる規則、スクリプトの編集画面。 |
| [アクション](logic-actions) | アクションの編集画面、スクリプトが何を書き込めるか、すべての検証のメッセージ、実行と有効化・無効化。 |
| [トリガー](logic-triggers) | トリガーの編集画面と、周期のスケジューラー。 |
| [警報](logic-alarms) | 警報の編集画面、状態の移り変わり、知らせ方、確認とすべて確認。 |
| [ほかのページから来たもの](logic-from-other-pages) | System、Server、Connector、Process の最上位、ポイントのパネル、そしてそれらを編集するページを名指しする通知。 |

同じ欄の **Assets** の最上位は、それ自体で 1 つのまとまりです。[素材](logic-assets)が、Images、Icons、Colors、Symbols、Connection types を扱います。

## 「アドレス空間」の欄 {#the-address-space-column}

この欄は、アドレス空間の最上位を 2 つの見出しの下に並べます。**ここで定義したもの**には、このページが作って編集するもの、つまり**Variables**、**Alarms**、**Actions**、**Triggers**、**Assets**が入ります。**ほかのページから来たもの**には、このページが見せるだけのもの、つまり **System**、**Server**、**Connector**、**Process** が入ります。前の見出しの下の最上位はどれも件数を持ち（Variables と Alarms はその定義の数、Actions と Triggers もその定義の数、Assets は 5 つの分類の合計）、Alarms の最上位、警報のフォルダー、警報の行はどれも、その中で発生中か確認待ちのもののうち、いちばん重い優先度の色の点を持ちます。その点は、警報に応えた瞬間に消えます。

ツリーは遅れて読み込みます。枝は、展開したときに読み込まれます。実時間の値がツリーに描かれることは決してありません。選んだノードの詳細のパネルがそれを見せ、1 秒に 2 回更新します。

| 操作部 | 何をするか |
| --- | --- |
| 絞り込み… | 名前に入力した文字を含む行だけにツリーを絞ります。大文字と小文字は問いません。子孫のどれかが一致するフォルダーは残り、一致したところまで開きます。Assets の最上位は、名前が一致する分類だけに絞られ、その最上位自身の名前だけが一致したときは丸ごと出ます。名前が一致したアドレス空間の最上位は一覧に残り、展開したときに枝を読み込みます。Actions と Triggers の節は、一致した行だけを並べます。 |
| 新規…（欄のフッター） | 作成のメニューを開きます。**新しい変数**、**新しいアクション**、**新しいトリガー**、**新しい警報**、そして**新しいフォルダー**は、節（Variables、Alarms、Actions、Triggers）ごとに 1 つずつの行き先を持ちます。ここで作ったものはすべて、その節の最上位に、`Variable1`、`Action1`、`Trigger1`、`Alarm1`、`Folder1` の並びの空いている最初の名前で置かれます。新しい定義は開きません（[作成と複製](#creating-and-copying)を参照）。新しいフォルダーは、ツリーのその行で名前の入力欄を開きます。**Logic の構成**を持つロールにだけ描かれ、ステーションがロックされている間は理由を添えて灰色になります。 |
| すべて展開／すべて折りたたむ | すべての枝を開くか（開くたびにその段を読み込みます）、最上位まですべて閉じます。 |
| 右クリック | 節の最上位、自分で作ったフォルダー、定義の行、または Images、Icons、Colors、Symbols の行の上で押すと、その行を選んでメニュー（下記）を開きます。ほかのページのノードでは何も開きません。 |

右クリックのメニューは、行とロールに応じて次のものを持ちます。**新しい変数／新しいアクション／新しいトリガー／新しい警報**（押したフォルダーか最上位の中に作ります）、**新しいフォルダー**（すでに 3 段目のフォルダーでは、理由を添えて灰色になります）、**実行**（アクションの行）、**確認**（警報の行）、**すべて確認**（Alarms の最上位）、**有効化**または**無効化**（アクション、トリガー、警報）、**移動先**（節の最上位と、その行を入れられるすべてのフォルダーが並ぶ下位のメニュー）、**複製**、バーと同じ名前の削除（**変数を削除**など）、そしてフォルダーでは**フォルダー名を変更**と**フォルダーを削除**。Images、Icons、Colors、Symbols の行では、そのバーのもの、つまり**画像を取り込む…**、**新しいユーザーアイコン**、**新しい色**、**新しいユーザーシンボル**、**シンボルを取り込む…**、**チャット用の指示をコピー**を持ちます。Logic の構成を持たないロールには、Logic の操作を持つときの実行、確認、すべて確認と、Symbols の行のチャット用の指示をコピーだけが出ます。そのどれもない行では、メニューは開きません。

詳細の側は、何かを選ぶまで空です。「ノードを選ぶと内容を見られます。変数、アクション、トリガー、警報はその編集画面が開きます。「新規」で作成できます。」

## コマンドバー {#the-command-bar}

このバーは、選んだノードの動詞を描きます。ロールが決して許さないものは描かれません。今の状況が拒んでいるだけのものは描かれたまま灰色になり、ツールチップに理由が出ます。エンジニアリングの操作の最中は「ユニットが実行中の間は構成がロックされます。」、ステーションが読み取り専用で動いている間は「ランタイム停止中」です。

| 選んだもの | 先頭のまとまり | 末尾（危険）のまとまり |
| --- | --- | --- |
| 自分で作ったフォルダー | 新しい変数／アクション／トリガー／警報（その節が持つ種類）、新しいフォルダー（深さの限界では「このフォルダーは、入れ子にできる深さの限界です。」で灰色）、フォルダー名を変更 | フォルダーを削除 |
| 変数 | 複製 | 変数を削除 |
| アクション | 実行、有効化または無効化、複製 | アクションを削除 |
| トリガー | 有効化または無効化、複製 | トリガーを削除 |
| 警報 | 確認、有効化または無効化、複製 | 警報を削除 |
| Alarms の最上位 | すべて確認 | |
| Assets、Images | 画像を取り込む… | |
| Assets、Icons | 新しいユーザーアイコン | |
| Assets、Colors | 新しい色 | |
| Assets、Symbols | 新しいユーザーシンボル、シンボルを取り込む…、チャット用の指示をコピー | |
| System、Server、Connector、Process のノード | [ほかで編集する通知](logic-from-other-pages#the-edited-elsewhere-notice)と、その開くのボタン | |

**複製**は、選んだ定義をその節の最上位に写します。元の名前が空いていればその名前で、空いていなければ `Name (2)`、`Name (3)` のように付けて、複製は開かず、その最上位の表で強調表示します（[作成と複製](#creating-and-copying)を参照）。複製した警報は正常から始まり、複製したトリガーは周期が設定されていない状態で始まり、複製したアクションには実行の記録がありません。**有効化**と**無効化**は、ほかのどの入力欄とも同じ自動保存で、その定義の有効の印を切り替えます。**削除**はどれも先に尋ね（「「X」を削除しますか？ … この操作は元に戻せません。」）、操作ログ帯に「削除しました。」と伝えます。変数や警報を削除すると、そのアドレスを名指ししていた式、スクリプト、条件、ダッシュボードのバインドはすべて解決できないままになり、それを[検証](validation)が並べます。削除のあとは、削除したものの親に移ります。画面は定義を入れていたフォルダー、またはその節の最上位に移り、ツリーで選ばれて開き、残ったものを並べた表が見えます。**フォルダーを削除**も同じように、一つ上のフォルダーか節の最上位に移ります。

## 作成と複製 {#creating-and-copying}

作成は、作ったものを開きません。複製も作成のひとつです。**新しい変数**、**新しいアクション**、**新しいトリガー**、**新しい警報**は、欄の**新規…**から作っても、節の最上位やフォルダーの右クリックメニューから作っても、開いているフォルダーのコマンドバーから作っても、その並びの空いている最初の名前で行を作り、画面をその親のページに移します。親とは、その行を入れたフォルダー、またはその節の最上位です。ツリーはその親を選んで展開し、ページの表は新しい行を強調表示して見える位置までスクロールし、操作ログ帯には「「Variable1」を作成しました。編集するには、開いてください。」と出ます。フォルダー自身のコマンドバーから作ったときは、画面はそのフォルダーのままです。**複製**もその節の最上位で同じことをし、操作ログ帯には「「Setpoint (2)」に複製しました。編集するには、複製を開いてください。」と出ます。**絞り込み…**の入力欄に入れた絞り込みは、到着のときに消されます。親と新しい行がツリーの中にあって、選択され展開された姿で示せるようにするためです。

節の最上位や自分で作ったフォルダーのページは、それが持つものの表で、**名前**、**アドレス**、**値**があり、各行の末尾には**開く**があって、ツリーのその行とまったく同じようにその定義を開きます（Alarms の最上位では、**Logic の操作**を持つロールには、そこに**確認**も出ます）。出力タイプがアイコン、画像、色の変数は、値のセルに、そのアイコン、画像、色見本を行に収まる小ささで描きます（色は 16 進数の値も添えます）。セルがアイコンのソースを書き出すことはありません。行を押すとその行を選んだことになり、選んだ行が強調表示された行です。強調表示は、ほかの行を選ぶか、欄をほかの場所へ移すまで残ります。新しいフォルダーは例外で、ツリーのその行で名前の入力欄を開きます。

## フォルダー {#folders}

4 つの節はそれぞれフォルダーで整理できます。フォルダーは 1 つの節に属し、その節の項目だけを持ちます。入れ子は 3 段までです。フォルダーは整理のためだけのもので、権限も、評価も、状態も持ちません。

**Variables**と**Alarms**では、フォルダーの連なりがアドレスを組み立てます。`Forno` の中の変数は `Variables.Forno.Setpoint` として読まれ、その `Zona1` の下位フォルダーの中のものは `Variables.Forno.Zona1.Setpoint` です。1 つの節の 1 つの段は、そのフォルダーとその定義が共有する 1 区切りの名前空間です。2 つのフォルダーがそれぞれ `Setpoint` を持つのはかまいませんが、同じ段に入れたもの同士が同じ区切りに変換されてはいけません。編集画面は、入力しているそばからそういう名前を拒否し、すでに使われているアドレスを名指しします。**Actions**と**Triggers**は識別で参照されるので、そのフォルダーはツリーを整理するだけで、パネルはアドレスの代わりに置き場所の行を見せます。

| コマンド | 何が起きるか |
| --- | --- |
| 新しいフォルダー | `FolderN` という名前の空のフォルダーを作り、ツリーの行の上でその名前の入力欄を開きます。空のまま、あるいは変えずに離れると、その名前のままになります。 |
| フォルダー名を変更 | 行の上で名前の入力欄を開きます。そのフォルダーの下のアドレスはすべて一緒に動き、参照はすべて書き換えられ、操作ログ帯がその数を伝えます（「フォルダーの名前を変え、参照 3 件を更新しました。」）。 |
| 移動先 | フォルダーや定義を、同じ節の別のフォルダーの下、あるいは節の最上位に戻して入れます。アドレスと参照も付いてきます。一覧に出るのは行ける先だけです。そのフォルダー自身、その下位フォルダー、別の節、下位フォルダーが深さの限界を越えてしまう段は、決して出ません。 |
| フォルダーを削除 | 先に尋ね、何が動くのかを述べます。「中の 3 件は Variables に移り、何も削除されません。移るアドレスへの参照は更新されます。」中の項目と下位フォルダーは 1 段上に入れ直されます。そのうちの 2 つが移り先でぶつかるときは、削除が拒否されます。 |

## ロジックの周期とキュー {#the-sweep-and-the-queue}

ランタイムは 2 つのレーンの上で走り、そのどちらも機器を待つことはありません。**周期**は、1 本の順番待ちのキューの上で 100 ms ごとに走ります。まずすべての式の変数を評価し、次に有効なすべての警報の条件を、その順で評価するので、条件はこの周期の変数の値を読みます。ほかから届く内部値とタグの書き込み、そして警報の確認も、この周期が運びます。**アクションのレーン**は、アクションのスクリプトを、頼まれた順に 1 つずつ走らせます。もう 1 つの走査も 100 ms ごとに走り、時刻の来た[トリガー](logic-triggers)をアクションのレーンに投げます。

2 つのレーンは互いに独立なので、周期がスクリプトの途中で起きることがあり、1 つのスクリプトの中の 2 つの読み取りが別の周期を見ることもあります。その代わり、機器を待って止まるスクリプトが足止めするのは、その後ろのアクションだけで、式も警報も操作者も止めません。書き込みがそれで競うこともありません。順番は電線のあるところ、つまり機器ごとに 1 本のキューで守られます（下記を参照）。読む側（ダッシュボード、チャネル、このページ）は公開された状態を読みます。このページの何かが手で評価を起こすことはありません。

## 値を書き込む {#writing-values}

書き込みは、何が始めたものであっても、1 つの経路を通ります。スクリプトの代入や `Write(...)`、内部値の変数の**設定する値**の入力欄、ダッシュボードの操作部、Process のレシピ、エージェント、公開ノードに書き込む外部の OPC UA のクライアント、[Modbus サーバー](connector-modbus-server)のマップで書き込みを許可した行に書き込む Modbus のクライアント、どれもです。この経路は、有限でない値や、対象の型に変換できない値を拒み、実行中のレシピやインターロックが押さえている信号源を（押さえている相手を名指しして）拒み、書き込みを古い値から新しい値へという形で、その出どころ（操作者、MCP、その実行）とともに記録し、そして適用します。この経路が決めることは、どこにも尋ねずに決まります。値、相手、ロック、そして機器がそもそも接続しているかどうかです。通したタグへの書き込みは、そのあと Connector にあるその機器自身の送り出しのキューへ渡されます。そこでは、その機器に渡された値が届いた順に 1 つずつ送られ、ほかの機器へは並行して送られます。同じタグへの新しい書き込みがそこで追い越した値は、キューから出ていくことなく終わり、機器に伝えられるのは新しいほうです。答えを待つのは頼んだ側で、ロジックの外の、それぞれ自分のコードの中で待ちます。ダッシュボードのコンポーネント、[タグのページ](connector-tags#the-live-value-card)の手での書き込み、エージェントのツール、外部の OPC UA のクライアント、Modbus のクライアント、実行中のレシピ、そしてスクリプトは `WriteAndWait` と書いたところだけです。出どころがアクションである書き込みだけは例外で、[詳細記録](events-console#detailed-capture)にだけ入り、イベントのコンソールには決して出ません。周期のたびに書き込むスクリプトは値を何千も生むので、ステーションの知らせをその下に埋めてしまうからです。アクションについてコンソールが運ぶのは、その失敗です。タグへの書き込みは工業値を受け取り、機器が受け取る生値まで、そのタグの[値の変換経路](connector-value-pipeline)を逆にたどります。詳しくは[変数](logic-variables#set-value)と[アクション](logic-actions#what-an-action-may-write)にあります。

## 権限とロック {#permissions-and-locks}

| 権限 | ここで何ができるか |
| --- | --- |
| Logic の表示 | ページを開き、実時間の値も含めて、そこにあるものをすべて読めます。 |
| Logic の構成 | 変数、アクション、トリガー、警報、フォルダーの作成、編集、名前の変更、移動、複製、有効化、無効化、削除と、素材のライブラリの手入れができます。 |
| Logic の操作 | 内部値の書き込み、アクションの実行、警報の確認が、ここでも、ダッシュボードでも、イベントのページでもできます。 |

Logic の表示だけのロールは、ページ全体を読むだけです。編集画面は「お使いのロールは Logic を見られますが、構成（変数、アクション、トリガー、警報、素材）はできません。」という注意の下で動かず、構成や操作の動詞は 1 つも描かれません。操作は持つが構成は持たないロールでは、実行、確認、すべて確認、設定する値が生きたままです。Process のユニットがステーションを押さえている間、ページはエンジニアリングロックの通知を出し、構成の動詞と編集の入力欄はすべて灰色になります。実行、確認、設定する値は使えたままです。ランタイムが停止している間は、構成も操作も「ランタイム停止中」で拒否されます。ツリーとパネルは読めたままですが、実時間のデータは持ちません。権限の一覧は[権限](users-permissions)にあります。

## このページがしないこと {#what-the-page-does-not-do}

保存も、元に戻すもありません。1 回のキー入力が、そのまま保存された変更です（操作ログ帯が「保存しました。」と伝えます）。拒否された保存は、その入力欄をステーションが持っている内容に読み直します。エージェントが自分のツールで作成、変更、削除した定義や、別のウィンドウが変えた定義は、開いている欄にひとりでに反映されます。そうして削除された定義を開いている編集画面は閉じ、操作ログ帯がその名前と、編集画面の外で削除されたことを伝えます。警報の履歴、イベントのコンソール、ダッシュボードは、それぞれ自分のページにあります。
