Logic

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

Markdown で表示

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

この節にあるページ

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

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

「アドレス空間」の欄

この欄は、アドレス空間の最上位を 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 の並びの空いている最初の名前で置かれます。新しい定義は開きません(作成と複製を参照)。新しいフォルダーは、ツリーのその行で名前の入力欄を開きます。Logic の構成を持つロールにだけ描かれ、ステーションがロックされている間は理由を添えて灰色になります。
すべて展開/すべて折りたたむ すべての枝を開くか(開くたびにその段を読み込みます)、最上位まですべて閉じます。
右クリック 節の最上位、自分で作ったフォルダー、定義の行、または Images、Icons、Colors、Symbols の行の上で押すと、その行を選んでメニュー(下記)を開きます。ほかのページのノードでは何も開きません。

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

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

コマンドバー

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

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

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

作成と複製

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

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

フォルダー

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 つが移り先でぶつかるときは、削除が拒否されます。

ロジックの周期とキュー

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

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

値を書き込む

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

権限とロック

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

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

このページがしないこと

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