アクション
アクションの編集画面。識別と置き場所、スクリプトの区画、スクリプトが読み書きできるもの、すべての検証のメッセージ、実行の動詞とその記録、有効化と無効化、複製と削除、そして実行の上限。
アクションは、アドレス空間を読み、内部値の変数とタグに書き込む JavaScript の文の集まりです。アクションは Logic の書き込みの道すじです。手動(実行)、トリガー、あるいはそれにつないだダッシュボードのボタンから走ります。Logic の欄のアクションの節でアクションを選ぶと(あるいは新規… > 新しいアクションで作ると)、その編集画面が開きます。読むには Logic の表示、編集するには Logic の構成、実行するには Logic の操作が必要です。
見出しは、アクションの印、名前、「手動で実行するか、トリガーが実行してくれるスクリプトです。変数やタグに書き込みます。」の行、そしてアクションが切られている間は無効のピルを見せます。入力の欄には識別とスクリプトが、右側の帯には最後の実行が入ります。
識別
| 項目 | 意味 | 受け付ける値と既定 | 効果 |
|---|---|---|---|
| 名前 | 表示の名前で、実行が記録されるときの見出しでもあります。 | 自由記述。新しいアクションは ActionN です。空の名前は Action として保存されます。 |
キーを押すたびに自動で保存されます。アクションは識別で参照されるので、名前を変えても何も書き換わらず、何も壊れません。 |
| 置き場所の行 | そのアクションがどこに入っているかを、言葉で述べます。Actions / Startup / Walk setpoint のようになります。 |
読み取り専用。 | アクションにアドレスはありません。この行は場所であって、式に入力するものでは決してありません。変えるには、ツリーの移動先を使います。 |
| 説明(任意) | 自由記述です。 | 既定は空です。 | ありません。 |
スクリプト
スクリプトのカードはスクリプトの編集画面そのもので、次の助言が付きます。「JavaScript の文(let、if、for、関数)です。内部値の変数は代入で書き込み(Variables.Setpoint = 21.5;)、タグは Connector.Driver.Device.Tag.Write(value) で書き込みます。読み取りに品質の関門はないので、.State() を確かめ、計算の前に ?? で欠測を守ってください。」スクリプトはキーを押すたびに自動で保存され、0.5 秒ごとに検証されます。メッセージは助言の下に出ます。検証がスクリプトを実行することはありません。
スクリプトは、式と同じアドレス空間と同じ読み取りの面の上に書く、ふつうの厳格モードの JavaScript(局所変数、if、繰り返し、関数、Math、Date、JSON)です。違いは 2 つあります。読み取りに品質の関門はありません。欠測は null として読まれるので、.State() を確かめ、計算は ?? で守ってください。悪い読み取りを扱うことこそ、アクションの役目です。そしてスクリプトは、式の変数を読めます(その公開された値です)。それを参照できないのは式だけです。
アクションが書き込めるもの
現場を変えるのはちょうど 2 つの書き方で、どちらも記録される書き込みの経路を通ります。
| 書き込み | 書き方 | 相手 |
|---|---|---|
| 内部値への代入 | Variables.Setpoint = 21.5; または Variables.Forno.Setpoint = 21.5; |
内部値の変数です。フォルダーの段も含みます。値はその変数の出力の型に合わせられ、その変数が保持する設定なら保持の印が付きます。 |
| タグへの書き込み | Connector.Simulated.Pump.Cmd.Write(true); |
実時間のタグです。値は工業値で、機器が受け取る生値まで、そのタグの値の変換経路を逆にたどります。 |
書き込みは、そのつど通ります。失敗する前に適用されたものは適用されたままですし、記録はそれぞれの書き込みを、出どころをアクションとして古い値から新しい値へという形で見せます。失敗した書き込みは例外を投げ、その実行を止めて、理由を結果に残します。
- 「「X」への書き込みを拒否しました:値が有限ではありません。」(NaN か無限大)
- 「「Tag」は connector に実体化されていません。」(無効な機器や、内蔵のサーバーが運んでいないタグ)
- 「「value」を「Tag」のために変換できませんでした。」
- 「「X」は「
<holder>」によって書き込みから守られています。」(レシピの実行やインターロックがその信号源を押さえています) - 「「Tag」への書き込みに失敗しました。サーバーは動いていますか。」
- 「変数「X」は見つかりませんでした。」と「「Variables.X」は式の変数です。計算される値なので、書き込むことはできません。」
検証が拒否するもの
| メッセージ | 原因 |
|---|---|
| スクリプトは必須です。 | 編集画面が空です。 |
| スクリプトのエラー:… | 文字が解析できません。 |
| アドレスは静的でなければなりません。「Root」は、計算した区切りで参照されています。 | Variables[name] など、リテラルでない区切り。 |
| アドレス「…」が不完全です。 | ポイントを名指しするには参照が短すぎる。 |
| 「X」は見つかりませんでした。 | 読み取り、または代入の相手が何にも解決しない。 |
| 変数そのものに代入してください:Variables.Name = value。 | = の左側がメンバーを指している、または変数のアドレスより深くたどっている。 |
| 「X」は式の変数です。計算される値なので、書き込むことはできません。 | 式の変数に代入している。 |
| 「Connector」のポイントは読み取り専用です。タグには Connector.Driver.Device.Tag.Write(value) で書き込んでください。 | Variables 以外の最上位に代入している(Process には専用のメッセージがあります)。 |
| Process のポイントは、アクションでは読み取り専用です。実行コマンドや、用意のための書き込みは、スクリプトでは行えません。 | Process のポイントに代入した、またはそれに対して Write を呼んだ。 |
| Process の実行コマンドは、アクションからは呼び出せません。コマンドのポイントは、読み取り専用の準備状態を公開します。 | Process.<Model>.<Unit>.Commands.Start() などのコマンドのポイントを呼んだ。コマンドのポイントは、その指令が今実行できるかどうかを読むだけのものです。 |
| ++ と -- の演算子は、ポイントには使えません。Variables.Name = Variables.Name.ValueToReal() + 1 のように書いてください。 | Variables.N++。 |
| Write(value) はタグへの書き込みです:Connector.Driver.Device.Tag.Write(value)。 | タグのアドレスではないものに対して Write を呼んだ。 |
JavaScript の局所変数(let x = 1; x = x + 1;)は、これらの規則に触れません。
実行
実行は、開いているアクションの上のバーの先頭の動詞です。Logic の操作を持つロールにだけ描かれ、ステーションが読み取り専用の間は「ランタイム停止中」で灰色になります(エンジニアリングロックはこれを灰色にしません。実行することは操作であって、構成ではないからです)。そのロールが Logic の構成も持つときは、編集画面の下書きが先に保存され、保存された定義が実行されます。持たないときは、保存されている定義が実行されます(入力欄が読み取り専用なので、2 つが食い違うことはありません)。
実行はどれも、1 本のロジックのキューの上で、新しいスクリプトのエンジンを使って走ります。ですから実行と実行の間に状態は漏れませんし、実行がロジックの周期、ほかのアクション、操作者の書き込みの間に割り込むこともありません。実行は 500 ms(「スクリプトを中止しました:500 ms の制限時間を超えました(無限ループの可能性があります)。」)、100,000 文、4 MB のメモリを超えると中止され、そのたびに超えた上限を名指しするメッセージが出ます。無効なアクションは走らずに失敗します(「このアクションは無効です。」)。ランタイムが止まっているときは「ロジックのランタイムが動いていません。」と答えます。操作ログ帯は「12 ms で正常に実行しました。」か「実行に失敗しました:<reason>」と伝えます。イベントのコンソールに届くのは失敗だけで、そのアクションの名前と、それを呼んだもの(動詞なら手動、周期による実行ならそのトリガーの名前)とともに記録されます。最初は警告として記録され、同じ原因で失敗し続けている間は要約され、回復したときにもう 1 行残ります。成功した実行がそこに書く記録は、その回復の 1 行だけです。ただ成功した実行と、そこで書き込まれたすべての値は、詳細記録にだけ書かれます。周期のたびに書き込むスクリプトは値を何千も生みますし、それで埋まったコンソールでは、誰もステーションの知らせを読めないからです。
最後の実行の帯は、そのアクションが最後に走った時刻(あるいは「まだ実行していません。」)、「所要時間:N ms」、最後のエラーを注意の形で、そして次の覚え書きを見せます。「実行は 1 本のロジックのキューで順に処理されます。イベントのコンソールに届くのは失敗した実行だけで、成功した実行と、そこで書き込まれたすべての値は詳細記録のために保たれます。トリガーは、決めた周期でアクションを呼び出します。」この帯は動いているアクションのものです。自動保存でこれが空になることはありませんが、ランタイムの再起動では空になります。
コマンド
| コマンド | 何をするか | 灰色になるとき | 描かれないとき |
|---|---|---|---|
| 実行 | 下書きを保存して(Logic の構成があるとき)、実行を 1 回キューに入れます。 | ランタイムが停止しているとき。 | ロールが Logic の操作を持たないとき。 |
| 有効化/無効化 | 有効の印を切り替えます。無効なアクションは実行を拒み、それに結び付いたトリガーをすべて何もしない状態にします。 | ステーションがロックされているか読み取り専用のとき。 | ロールが Logic の構成を持たないとき。 |
| 複製 | そのアクションを、空いている名前でアクションの最上位に写し、その複製を開きます。複製には実行の記録がなく、結び付いたトリガーもありません。 | ステーションがロックされているか読み取り専用のとき。 | ロールが Logic の構成を持たないとき。 |
| アクションを削除 | 「「X」を削除しますか?アクションが取り除かれます。この操作は元に戻せません。」と尋ねます。それに結び付いていたトリガーは、削除されずに結び付きが外れます。 | ステーションがロックされているか読み取り専用のとき。 | ロールが Logic の構成を持たないとき。 |
アクションの最上位のパネルは、すべてのアクションを、値の列にその状態とともに並べます。「有効 · 最後の実行 <when>」で、最後の実行が失敗していれば「· エラー」が付き、切られていれば「無効」です。
アクションがしないこと
Process の実行コマンドを送りませんし、手順を用意しませんし、実行のコメントも足しません(それらのポイントは、読み取り専用の準備状態と用意の値です)。警報を確認しません。並行して走りません。実行と実行の間に状態を残さず、関数も共有しません。そして、値の変化や条件で発火することはありません。実行、トリガーの周期、ダッシュボードのボタンだけがアクションを走らせます。