変数と警報の条件の後ろにある 1 つの式の言語、何を参照できるか、あらゆる種類のポイントの読み取りの面、評価が守らせる規則、検証が出すメッセージ、そしてスクリプトの編集画面と「参照…」の選択の使い方。

Markdown で表示

1 つの式の言語が、Logic のページの 2 か所で働きます。式の変数が計算するものと、警報が見張る条件です。どちらも、機械に触れられないサンドボックスの中で厳格モードで評価される 1 つの JavaScript の式で、どちらも同じスクリプトの編集画面で編集します。アクションのスクリプトは同じ語彙を使いますが、文の集まりです。その違いはアクションにあります。

式とは何か

式は、ちょうど 1 つの JavaScript の式です。リテラル、四則演算、比較、論理の演算子、条件の a ? b : c、文字列の操作、テンプレート文字列、そして JavaScript の組み込みの MathDateJSON の呼び出しです。文(letif、繰り返し)はアクションのものです。2 つ目の文は「変数が持てるのは 1 つの式だけです。文はアクションに書きます。」として拒否されます。式のどこであっても、代入と ++-- は「式は読み取り専用です。書き込みはアクションに書きます。」として拒否されます。

式は、最上位を根とするアドレスでポイントを参照します。最上位ごとに、式へ渡されるものは次のとおりです。

最上位 式に渡ってくるもの
Connector のタグ、VariablesAlarms、Process のユニットの Channels 下に挙げる型付きの読み取りの面を持つ、実時間のオブジェクトです。裸の参照(Connector.Simulated.Pump.Flow だけ)はそのポイントの値になり、裸の警報はその IsActive になります。
SystemServerAssets、そして Process のユニットの実行の状態、生産性、コマンド、用意 値そのものです。数値、文字列、ブール値、時刻のどれかです。そのまま使ってください。付け足すメンバーはありません。

System.Now は評価のその瞬間です。1 回の評価の中では、これをいくつ参照しても同じ時刻を読みます。ほかのすべての時刻と同じく JavaScript の Date として渡るので、時刻どうしは自然に比べられ、引き算もできます。(System.Now - Connector.Simulated.Pump.Run.SourceTimeStamp()) / 1000 は秒になります。

式の変数は、タグ、内部値の変数、警報、Process のポイント、Assets のポイント、System と Server の診断の値を参照できますが、ほかの式の変数だけは参照できません。編集画面がそれを拒否します(「「Variables.X」は式の変数です。式からほかの式の変数を参照することはできません。内部値の変数か、もとになるポイントを参照してください。」)。結果が評価の順番に左右されないためです。警報の条件は Alarms.* 以外のすべてを参照でき(「警報の条件から、ほかの警報を参照することはできません。」)、ブール値を返さなければなりません。

ポイントの読み取りの面

実時間のタグは、次のものを差し出します。

メンバー 返すもの 意味
.Value 型を持つ値 そのタグの値の変換経路を全部通ったあとの工業値
.ValueRaw 型を持つ値 スケーリングの前の、タグの宣言した型に正規化した生値
.ValueObject 何でも ドライバーが作ったそのままの値
.ValueScaled.ValueCalibrated.ValueLimited.ValueRounded 数値 スケール、校正、上下限、小数位の各段階を通ったあとの値
.ValueToBool().ValueToInteger().ValueToReal().ValueToString().ValueToDateTime() 変換した値 工業値をその分類に変換したもの。値なしは値なしのままです
.State() ブール値 品質です。読み取りが良好な間は true です
.SourceTimeStamp() Date 機器がその読み取りを作った時刻
.ApplicationTimeStamp() Date 内蔵のサーバーがそれを受け取った時刻
.Name.EngineeringUnit 文字列 そのタグの名前と単位

変数は、.Value、5 つの .ValueTo*() の変換、.State().ApplicationTimeStamp().Name.EngineeringUnit を差し出します。警報は、.IsActive.IsAcked.CurrentState.State()(直前の周期でその条件を評価できたかどうか)、.ActiveSince().LastTransitionAt().Name を差し出します。Process のチャネルは、タグに結び付いているときはタグの面を、変数に結び付いているときは変数の面を差し出します。結び付いていないチャネルは何も差し出しません。実時間のオブジェクトのそれ以外には手が届きません。この面の外のメンバーは undefined として読まれ、それを呼び出すと検証で失敗します。「参照…」の選択は、ポイントごとにこれと同じメンバーを並べます。どれも記憶を頼りに入力する必要はありません。

評価が守らせる規則

入力している最中の編集画面でも、100 ms ごとの周期でも、次の規則が働きます。

  • 品質の関門。評価の前に、参照しているポイントはすべて解決して読み直されます。欠けている、悪い、値を持たない、というポイントが 1 つでもあれば、式を走らせずに結果が品質の悪い欠測になります。ですから、オフラインのタグが標本を作り出すことはありませんし、null がエンジンに届いて 0 になることもありません。
  • 有限でない結果は欠測です。NaN や無限大(0 での除算、定義されない演算)が標本になることはありません。
  • 暴走の防止。評価は 250 ms、5,000 文、4 MB のスクリプトのメモリを超えると中止され、品質の悪い欠測として数えられます。エンジンは式の文字ごとに 1 つ保たれるので、ほかの式から何かが漏れることはありません。
  • 型合わせ。成功した結果は、その変数の出力の型に合わせられます。警報の条件はブール値に合わせられ、変換できない結果はその警報の状態をそのままにします。
  • エラーは例外ではなく欠測です。周期のときの実行時のエラーは欠測になり、診断ログに 1 件残ります(最初の失敗、繰り返している間は要約、回復したときに 1 行)。周期は次の変数へ進みます。

検証が拒否するもの

編集画面は 0.5 秒ごとに下書きを検証し、値か条件の下に最初の問題を出します。

メッセージ 原因
式は必須です。/条件は必須です。 編集画面が空です。
式のエラー:… 文字が解析できません。
変数が持てるのは 1 つの式だけです。文はアクションに書きます。 文が 2 つ以上ある、または式ではない文がある。
式は読み取り専用です。書き込みはアクションに書きます。 代入、または ++--
アドレスは静的でなければなりません。「Root」は、計算した区切りで参照されています。 Variables[name] など、リテラルでない区切り。
アドレス「Connector.Simulated」が不完全です。 その最上位でポイントを名指しするには、連なりが短すぎる。
「X」は見つかりませんでした。 そのアドレスが何にも解決しない。
「X」は式の変数です。… ほかの式の変数を参照している。
警報の条件から、ほかの警報を参照することはできません。 条件の中の Alarms.* の参照。
条件は Bool になる必要がありますが、「x」になりました。 条件の試しの評価が、ブール値に変換できない値を返した。
式のエラー:現在値のポイントは、ここで直接は使えません。.Value のメンバーを通して読んでください(例:Connector.Driver.Device.Tag.Value)。 基本の値が必要な場所で実時間のオブジェクトを使った(Tag + 1)。
式のエラー:<engine message> 試しの評価が例外を投げた。知らない識別子、関数として呼んだ届かないメンバーなど。

試しの評価は品質にかかわらず今の値で走るので、メッセージが映すのは式であって、悪い入力ではありません。悪い入力のほうは、参照しているポイントのカードに出ます。

スクリプトの編集画面

このページの式、条件、スクリプトは、すべて同じカードで編集します。小見出し(式、条件、スクリプト)、参照…のボタン、編集画面、助言、そして検証のメッセージです。編集画面は CodeMirror で、JavaScript の色付け、元に戻す履歴、そしてアドレスの語の補完を持ちます。裸の語には最上位の名前、次にそこまで入力した道すじの子、そしてその語がポイントを指したあとはメンバーも出ます(アドレスを入れる)。文字は少し置いてから下書きに送られ、自動で保存されます。式と条件の入力欄は最低でも 56 px、アクションのスクリプトの入力欄は 160 px の高さです。編集画面のエンジンが動き出せないときは、入力欄はふつうの文字入力の領域に落ちます。読み書きはできますが、色付け、補完、履歴はありません。そのとき参照…は、カーソルの位置ではなく末尾に選んだアドレスを足します。

参照…は、アドレス空間の全体のメンバーの段までのツリーを持つダイアログ(「参照:式に挿入」)を開きます。行を選んで挿入を押すか、その行をダブルクリックすると、そのアドレスがカーソルの位置に置かれます。編集画面はそれぞれ自分のダイアログを持つので、1 つのページの 2 つの編集画面が選択を共有することはありません。

式がしないこと

何も書き込みませんし、Process の実行コマンドを呼び出しませんし、評価と評価の間に状態を残しませんし、式どうしで共有する関数を定義できませんし、求められたときに評価されるものでもありません。周期が 100 ms ごとにそれを公開し、編集画面が下書きを 1 秒に 2 回予告します。