スクリプト

In-Sight スクリプト関数を使用して、セル内に JavaScript ソースコードを作成してアクセスします。

:  これらの関数は、In-Sight ファームウェア 5.1.0 以降を搭載している In-Sight ビジョンシステムでのみ使用可能です。モデル一覧およびサポートされているファームウェアバージョンについては、ファームウェアのバージョンをご参照ください。 モデル一覧およびサポートされているファームウェアバージョンについては、ファームウェアバージョンをご参照ください。

In-Sight スクリプト関数について

In-Sight Script 関数を使用してスクリプトを作成し、JavaScript ソースコードをセル内に格納すると、カスタム設計のソースコードをジョブの一部にすることができます。

:  

Script 関数は、基本的なプログラミングの原則に関する知識を必要とします。この概要のトピックに記載されている情報は、すでに基本的なプログラミングの原則を熟知しているユーザを対象としています。JavaScript プログラミング言語の詳細については、次を参考にしてください (インターネットへのアクセスが必要です)。

概要

In-Sight スクリプトでは、ダイナミックコンピュータプログラミング言語である JavaScript を使用します。スクリプトには、反復的な処理ルーチン、文字列の解析とフォーマッットの操作、検査とは別に実行されるスクリプトを処理するバックグラウンドイベント、カスタムグラフィックス、およびファイルシステム上に格納された共有 JavaScript モジュールを作成する機能が備えられています。

この概要は、JavaScript 言語を In-Sight アプリケーションで使用する場合の重要な側面を詳細に説明する簡潔なセクションとなっています。

基本的な語彙構造

In-Sight Explorer 内へ JavaScript を実装するには、欧州電子計算機工業会によって承認されているオープンスタンダードのバージョン 5 (ECMAScript 5 (ECMA5) としても知られています) に従います。ECMAScript 5 は Unicode 3 (またはそれ以降) の文字セット (UTF-8) を使用します。また、次の点で C、C++、C#、および Java シンタックスと似ています。

  • この言語は大文字と小文字の区別があり、言語キーワード、変数、関数の名前を必要とし、その他の識別子は一貫した大文字/小文字の設定を使用します。
  • 識別子を使用して変数および関数に名前を付けます。この名前の先頭は文字、アンダースコア (_)、またはドル記号 ($) である必要があります。数字は先頭では使用できません。
  • 複合ステートメントは中かっこ ({}) で囲みます。
  • 空白は無視されるので、コードをクリーンにフォーマットすることができ、読みやすく、理解しやすいものとなります。
  • セミコロン (;) でステートメントを区切ります。行の末尾ではオプションとなっていますが、ステートメントの末尾を明示的に区別することを強く推奨します。ステートメントが複数行に分割される場合は、セミコロンを省略することができます。ただし、JavaScript は常に改行をセミコロンとして解釈するので、returnbreak、または continue と、これらのキーワードの後の式との間には改行を挿入しないでください。

コメント

JavaScript でコメントを示すには、2 つのスタイルがあります。行の末尾の 2 つのスラッシュ (//) 以降の文字がコメントとなり、/**/ の内側にある文字もコメントとして扱われます (/* JavaScript comments */)。

次の図は、コメントを示す 2 つのスタイルを表しています。

/* JavaScript コメント */
var x; // Java、C# および
	   // C++ コメントのような外観
/*
* そしてこれらは複数行
* にわたって使用できる。
*/

変数

変数を使用して、オブジェクトまたは値のシンボリック名を定義し、そのシンボリック名で参照できるようにします。JavaScript には、プリミティブ型とオブジェクト型の 2 つの型があります。各変数はプリミティブな値 (数値、文字列、true/false、null、または undefined) またはオブジェクト (プリミティブでない値として定義されます) を参照します。

下記の例に示すように、変数は var キーワードで宣言されます。

            var aBc, zz32;
var q = "abc", r = 'def';
var p = true, q = false

変数のスコープはグローバルまたは関数のいずれかです。グローバルスコープでは、変数は関数の外に宣言され、宣言される Script セルまたはモジュール内のすべてのコードに使用可能ですが、その他の Script セルまたはモジュール内のコードには使用できません。関数スコープでは、変数は関数内のどこにでも配置され、関数内でのみ使用可能です。

オブジェクトと配列

JavaScript では、プリミティブでない値はオブジェクトであると見なされます。プロパティに名前と値を含んでいる場合は、プリミティブな値または別のオブジェクトのいずれかである可能性があります。オブジェクトは、基本的には名前と値の順序付けされていないコレクションであり、配列は名前と値の順序付けされたコレクションです。

オブジェクトのプロパティ

JavaScript では、オブジェクトは動的に型指定されます。

  • 各オブジェクトはプロパティの辞書です。
  • 各プロパティは名前と値の組です。
  • プロパティは実行時に追加および削除されます。

プロパティはプロトタイプオブジェクトから継承されます。

  • 新しいオブジェクトはそれぞれ、そのプロトタイプのコピーです。
  • プロトタイプは独自のプロパティから次々に派生することができます。

プロパティシンタックス

JavaScript では、プロパティアクセスの定義に 2 つの型のシンタックスを使用します。プロパティの場合、次のシンタックスを最初に入れる必要があります (いずれの型にも該当、ドットの前後の式または角かっこは先に評価されます)。

  • ドット表記:
    • a.prop = 123;	// プロパティを追加
    • b = a.prop;	// 123 
    • delete a.prop;	// プロパティを削除
    • c = a.prop;	// 未定義
  • 名前/文字列を含む角かっこ:
    • a ["break 1"] = 123	// プロパティを追加
    • b = a["break 1"];	// 123
    • nm = "break 1";		// 変数を使用可
    • c = a[nm];		// 123
    • delete a[nm]		// プロパティを削除

オブジェクトのリテラルシンタックス

新しいオブジェクトを作成するには、下記に示すように name:value の組のカンマで区切ったリストを使用します。

            var myrectangle = {
	width: 100, height: 50,
	"return": {a:1, b:2, c:3},
	getArea: function() {
	   return this.width * this.height;
	}
}; 

配列

JavaScript では、配列はちょうど標準のオブジェクトのようですが、下記に示すように、数値のプロパティ名を使用します。

:  length プロパティは 1 + 一番大きな番号の要素です。
            var a = []; 	// 空
var b = [9.5, "Fred", true];
var c = b[1];	// "Fred"
var d = b["1"]	// "Fred"
var e = b[9]	// 未定義
b[4491] = 2;	// 1 つの要素を追加
b.newProperty = "hello" 

JavaScript ビルトインクラス

次は JavaScript ビルトインクラスの例です。

  • 配列: sort, reverse, concat, slice, push, pop, shift, unshift
  • 演算: abs, min, max, sqrt, ceil, floor, sin, cos, tan, asin, acos, atan
  • 文字列: indexOf, match, replace, split, substring, toUpper, toLower, trim
  • 日付: new Date(), toString, add, subtract

数値

JavaScript では、すべての数値を IEEE 754 で定義された 64 ビット浮動小数点形式を使用して表します。JavaScript プログラムで数値が表示されている場合は、数値リテラルと呼ばれます。JavaScript で数値および数値リテラルを表す方法を次に示します。

  • 10 進法: 1、47、3.14、-24e-13
  • 16 進法: 0x7fff

文字列リテラル

JavaScript で使用される文字列リテラルの例を次に示します。

            "Hello I'm Fred"
'I am "Sam", I am'
"Hello\t\ "World\"\x0D\u000A"
"Hello \
big \
world" (EC5)

関数

関数は特殊な型のオブジェクトであり、これに関連付けられた実行可能コードを含んでおり、呼び出してコードを実行し、値を返すことができます関数は、配列のようにオブジェクトとは異なった動作をし、使用するための特殊な言語のシンタックスがあります。最も重要なこととして、関数は true の値であり、プログラムでは標準のオブジェクトのように扱うことができます。

関数は function キーワードを使用して定義し、引数および return はオプションです。次の書式は同等です。

            function  sum(x, y) {
  return x + y;
}
var sum = function (x, y) {
  return x + y;
} 

可変長引数関数

JavaScript では、どの関数も可変数引数を取得することができます。引数キーワードは現在の関数の引数の配列です。これを次の例に示します。

            function sum() {
  var i, total = 0;
  for (i=0; i<arguments.length; i++) {
    total += (+arguments[i]);
  }
  return total;
}
var z = sum(1,2, "3.14");	// 6.14 

式と演算子

JavaScript でよく使用される式と演算子を次に示します。

  • プライマリ: (x) x.y f(x,y,z) a[x]
  • 単項: +x -x !x ++x -x x++ x-- ~x32
  • 倍数詞: * / %
  • 付加: - + (+ は文字列の結合にも使用されます)
  • シフト32: << >> (符号拡張) >>> (ゼロ拡張)
  • リレーショナル: < > <= >= (文字列ではアルファベット順)
  • 等値: == != === !== (厳格な等式/不等式)
  • ビット32
    • AND: &
    • OR: |
    • XOR: ^
    • 条件付き AND: &&
    • 条件付き OR: ||
    • 条件付き if: ?:
  • 割り当て: = *= /= %= += -= &= ^= |= <<= >>= >>>=

型の変換

必要な場合には (および可能であれば) いつでも自動的に値が変換され、演算子は左結合的です。変換時に、次のような弱い等式ステートメントに留意してください。

            if ("4" == 2 * 2)	// true
if ("4" === 2 * 2)	// false 

「False と思われる」値は false に変換され(undefined, null, 0, -0, NaN, "")、その他のすべての値は true に変換されます(if ("false") {…} // true)。

typeof 演算子

typeof 演算子はその演算数の方を識別する文字列を返します。

typeof value ==
Null "null"
未定義 "undefined"
任意の数値 (NaN) "number"
文字列 "string"
True/False "boolean"
任意の関数 "function"
任意のオブジェクト "object"

if ステートメント

JavaScript では、if ステートメントは C と同じシンタックスを使用します。

            if (x>0) {
  y = Math.Sqrt(x);
}
else if (x == 0) {
  y = 0;
}
else
  y = undefined;	// 中かっこはオプション
			// (ただし推奨される) 

switch ステートメント

JavaScript では、switch ステートメントは C と似ていますが、文字列も使用することができます。

 switch (name) {
  case "Fred": 
    processFredReport();
    break;
  case "Sam": 
  case "Samantha": 
    processSamReport();
    break;
  case 911: 	// "911" とも一致
    emergencyAlert ();
		// フォールスルー (推奨されない)
  default: 
    return "Unable to process report!";
}

ループ

JavaScript ではループを作成するメソッドがいくつかあります。

  • For
    • for (var x = 0; x < 100; x++) {...}
  • While
    • while (!inputFile.isAtEnd()) {...}
  • Do While
    • do {...}while (foundItem==0);
  • For/in
    • for (var propName in myObject) {...}
      :  プロパティの順序は保障されません。
  • Break
    • これを使用して閉じているループを終了します。
    • if (foundRecord) break;
  • Continue
    • これを使用して次のループイテレーションを開始します。
    • if (skipThisItem) continue;

例外

例外を使用して、例外的な条件またはエラーの発生を示します。スローによってエラー発生の信号が送信され、一方で、例外またはエラーを処理するために、try/catch/finally ステートメントが JavaScript によって使用されます。

例外のスロー

JavaScript で例外をスローする方法を次に示します。

            if (area <= 0) {
  throw new Error("area must be positive");
  --or--
  throw 'Invalid argument';
  --or--
  throw radius * 3.14;	// 通常は使用されないが合法

Try/Catch/Finally ブロック

try 句は、処理する例外を含んでいるコードのブロックを定義し、その後に catch または finally 句のいずれかが続きます。これら 2 つはオプションですが、try ブロックの後にこれらの句の少なくとも 1 つが続く必要があります。JavaScript で例外またはエラーを処理する方法を次に示します。

            try {
  sendAllOutput (stream);
}
catch (ex) {				// オプション (ただし 1 つは必要)
  console.log  (ex);
}
finally {				// オプション (ただし 1 つは必要)
  stream.close ();
} 

正規表現

JavaScript でよく使用される正規表現の例を次に示します。

            var x1 = new RegExp("[a-z].*");
            var x2 = /[a-z].*/;

このテストメソッドはマッチに対して true を返します。

valid = x1.test(input);

exec メソッドは複数の結果を返します。

            var x3 = /Tool\d*;
while (r = x3.exec(text))
{
  console.log("Found" + r[0] +
    "at" + r.index +
    "now at" + x3.lastIndex);
} 

In-Sight Explorer JavaScript サンプル

In-Sight Explorer 開発環境内で JavaScript の開発と実装を支援するため、ジョブのサンプルとスニペットが含まれています。これらは適切な機能のモデリングに使用できる例を備えています。

ジョブのサンプルとスニペットはコード内にコメントを含むように設計されており、コードを構築する方法と目的を詳細に示し、さらにサンプル内に含まれている対象とする機能について説明しています。

ジョブのサンプルは次のディレクトリに含まれています。C:\Users\Public\Documents\Cognex\In-Sight\In-Sight Explorer 5.1.0\Sample Jobs\Spreadsheet\Scripting

スニペットは、パレット[スニペット] タブにある [スクリプト] フォルダに含まれています。