 シミュレータの使い方

プログラム管理ウィンドウの「デバッグ」－「シミュレーション」コマンドにより、ISaGRAFシミュレータがデバッガとともに起動されます。シミュレーションはオフラインデバッグと言えます。このシミュレーションではISaGRAFのターゲットシステムをウィンドウズ上で完全にシミュレーションします。　ただし、ファンクションブロックやＣ言語関数などに関しては標準セットに関してのみサポートされています。（ユーザ定義の関数などをシミュレーションに取り入れる場合はワークベンチ開発キット：オプションソフトによりカスタマイズする必要があります。）　Ｉ／Ｏボードは仮想Ｉ／Ｏパネルとしてグラフィカルにウィンドウズ上にシミュレーションされます。どの種類のＩ／Ｏボード（バーチャルＩ／Ｏも含めて）に関してもグラフィカルシミュレーションされます。

デバッガとのリンク

Ｉ／Ｏ シミュレーション

ライブラリコンポーネント

オプション

また、ISaGRAFシミュレータにはアプリケーションのシミュレートや診断の為の便利なツールも含まれています。

入力信号状態の保存／読み出し

サイクルプロファイラ

シミュレーション スクリプト


デバッガとのリンク

シミュレーションはISaGRAFデバッガーとの間の通信を完全にサポートします。オンラインデバッグで考えられる操作が可能になっています。ただし、「ファイル」－「アプリケーションのスタート」、「アプリケーションのストップ」、「ダウンロード」、「アプリケーションの更新」コマンドに関しては無効となります。

シミュレーションが行えるためには前もって、シミュレーション用のアプリケーションコードが必要です。このためには、プログラム管理ウィンドウの「コード生成」－「コンパイラーオプション」の設定でシミュレーション用のコードが選択されていることを確認した上で、「アプリケーションのコード生成」を実行する必要があります。

カーネルシミュレーションウィンドウ（仮想Ｉ／Ｏパネル）やデバッグウィンドウを閉じることで、デバッグセッションで開かれているウィンドウは全て閉じます。


Ｉ／Ｏ シミュレーション

スロット番号毎にＩ／Ｏボードが仮想Ｉ／Ｏパネルウィンドウにグラフィカルにシミュレーションされます。ISaGRAF標準のＩ／Ｏボード（ブール型、整数・実数型、可変長文字列型）を扱うことができます。ボード上にはスロット番号、Ｉ／Ｏボード名、チャネル番号が表示されます。

入力ボードはボタンあるいはフィールドとともに表示され、出力ボードはＬＥＤあるいはフィールドとともに表示されます。Ｉ／Ｏ接続エディタでバーチャルＩ／Ｏボードとして設定されている場合も、ボードはグラフィカルにシミュレーションされます。

 	ブール型入力ボードブール型入力ボードは小さなボタンと一緒に表示されます。チャネル番号がボタン横に表示されます。ボタンが押されるとＴＲＵＥ状態となり、再度押されるとＦＡＬＳＥ状態となります。右マウスをクリックすると、押されている間だけＴＲＵＥ状態になります。

 	ブール型出力ボード: ブール型出力ボードはＬＥＤ表示と一緒に表示されます。チャネル番号がＬＥＤ横に表示されます。値がＴＲＵＥ状態の時ＬＥＤが点灯します。

 	整数型入力ボード: 整数型入力ボードは入力用数値フィールドと一緒に表示されます。数値フィールドをクリックして数字を入力することで対応した変数名にアナログ値を代入することができます。ＥＮＴＥＲキーの入力は必要ありません。あるいは、上下ボタンをクリックすることで入力することもできます。アナログ値は１０進数、１６進数いずれでも入力可能です。

 	整数型出力ボード: 整数型出力ボードは出力用数値フィールドと一緒に表示されます。数値フィールドには変数の値が１０進数あるいは１６進数表示されます。この値の変更はできません。

 	可変長文字列型入力ボード: 文字列入力ボードはテキスト入力フィールドと一緒に表示されます。テキスト入力フィールドにカーソルを移動し、文字列入力を行うことで対応した変数への文字列入力ができます。ＥＮＴＥＲキーの入力の必要はありません。

 	可変長文字列型出力ボード: 文字列出力ボードはテキスト出力フィールドと一緒に表示されます。この文字列の変更はできません。


ライブラリコンポーネント

ISaGRAFシミュレータは標準変換関数、関数、標準ファンクションブロックをサポートしています。以下にサポートされているオブジェクトのリストを行います。

 変換関数:

DCB	ＢＣＤコードのバイナリ変換（Decimal Coded Binary）

SCALE	ＬＥＤのメータ表示（Volt meter led indicator）

 関数::

abs	絶対値（absolute value）

acos	アークコサイン（arc cosine calculation）

ArCreate	整数配列生成（create array of integer）

ArRead	実数配列生成（read array of integers）

ArWrite	整数配列書き込み（write array of integers）

ascii	アスキーコードに変換（character => ascii code）

asin	アークサイン（arc sine calculation）

atan	アークタンジェント（arc tangent calculation）

char	キャラクター変換（ascii code => character）

cos	コサイン（cosine calculation）

delete	文字列の一部削除（delete sub-string）

expt	エキスポネンシャル（exponent calculation）

find	文字列検索（find sub-string）

insert	文字列挿入（insert sub-string）

left	文字列左側抽出（extract left sub-string）

limit	値制限フィルタ（bound value between limits）

log	ログ（logarithm (base 10)）

max	最大値（maximum of two integers）

mid	文字列抽出（extract middle sub-string）

min	最小値（minimum of two integers）

mlen	メッセージ長さ（length of a message）

mod	余り（modulo calculation）

mux4	４入力マルチプレクサ（multiplexer 4 entries）

mux8	８入力マルチプレクサ（multiplexer 8 entries）

odd	奇数パリティ（odd parity）

rand	ランダム整数値（random integer value）

replace	文字列置き換え（replace sub-string）

right	文字列右側抽出（extract right sub-string）

rol	ビット左回転（rotate left）

ror	ビット右回転（rotate right）

sel	セレクタ（binary selector）

shl	ビット左シフト（shift left）

shr	ビット右シフト（shift right）

sin	サイン（sine calculation）

sqrt	平方根（square root）

tan	タンジェント（tangent calculation）

trunc	切り捨て（truncate decimal part）

 ファンクションブロック（ＦＢ）:

average	平均値（running average）

blink	ブリンク（blinking signal）

cmp	比較（full comparison）

ctd	ダウンカウンタ（down dounter）

ctu	アップカウンタ（up counter）

ctud	アップ・ダウンカウンタ（up/down counter）

derivate	微分器（derivative regulation）

f_trig	立ち下がり検出（falling edge detection）

hyster	ヒステリシス（hysteresis）

integral	積分器（integral regulation）

lim_alrm	リミットアラーム（alarm on limits）

pid	ＰＩＤ積分器（PID regulation）

pid_cj	ＰＩＤ積分器（PID regulation）

r_trig	立ち上がり検出（rising edge detection）

rs	dominant bistableのリセット（reset dominant bistable）

sema	セマフォ（semaphore）

sr	dominant bistableのセット（set dominant bistable）

stackint	整数スタック（stack of integer values）

tof	オフタイマー（off-delay timer）

ton	オンタイマー（on-delay timer）

tp	パルスタイマー（pulse timer）

ユーザ定義のＣ言語関数、ファンクションブロックはISaGRAFシミュレーションには標準では組み込まれません。ユーザ定義関数などはターゲットシステムに依存していてＷｉｎｄｏｗｓで実現できない場合があります。

ISaGRAFシミュレータはユーザ定義の変換関数、関数、ファンクションブロックに対して以下の標準的な振る舞いを提供します。

•	新しい変換関数が実行されたとき、ＮＵＬＬ変換となります。即ち、入力信号が全く変換されないで出力されます。

•	Ｃ言語関数が実行中は一切の処理をしません。出力値は常にゼロ（あるいはＮＵＬＬ文字列）となります。

•	Ｃファンクションブロックが実行中は一切の処理をしません。リターンパラメータは常にゼロ（あるいはＮＵＬＬ文字列）となります。

ただし、ワークベンチ開発ツールキット（オプションソフト）によりシミュレーションにユーザ定義の関数などの表示を組み込むことも可能です。


Options
オプション

  「オプション」メニューにより仮想Ｉ／Ｏパネル表示を変更することができます。シミュレーション中にいつでもコマンドをセット、リセットできます。

「カラーモード」コマンドにより、Ｉ／Ｏチャネル表示はカラービットマップ表示となります。モノクロディスプレーの場合は白黒表示にするためにこのオプションをはずして下さい。

「変数名」コマンドにより、Ｉ／Ｏチャネル右横に変数名のラベルが表示されます。Ｉ／Ｏボードのシミュレーションパネルのサイズを小さくするためにはこのオプションをはずして下さい。

「１６進数値」コマンドにより、入力・出力アナログチャネルが１６進数で表示、入力されます。

「常に前面」コマンドにより、仮想Ｉ／Ｏパネルが常に画面の前面で表示されます。


サイクルプロファイラ

サイクルプロファイラは、アプリケーション中で使用されている複数のプログラム、関数、ファンクションブロックのそれぞれの実行時間がどのように分布しているかを表示する事ができる非常に便利な診断機能です。このツールには、アプリケーションのパフォーマンスのチェック機能や、どの部分のコードを最適化すべきかを調べるような時にも役立ちます。

サイクルプロファイラの起動は、シミュレータウィンドの「ツール－サイクルプロファイラ」のメニューコマンドで行います。そして、プログラム、関数、ファンクションブロックのそれぞれの実行にかかる時間をパーセンテージで表示します。

「表示－平均」のオプションをチェックすると、アプリケーションがスタートしてから、あるいは、最後に「表示－リセット」コマンドを実行してからの平均を計算して表示します。

「表示－平均」のオプションがチェックされていない時は、直前のサイクル実行中に測定された情報を表示します。アプリケーションの実行モードを「サイクル」に設定してこの機能を使用すると、アプリケーションのそれぞれのコンテキストによる実行時間の測定をすることも可能です。

「表示－コピー」コマンドで、プログラム名とパーセンテージをクリップボードにテキスト形式でコピーすることができます。このデータを、ドキュメントやスプレッドシートに貼り付けることができます。

注意：	これは、精密な計測ではありません。パーセンテージの計算はTICコードの命令数のカウントによって行われます。C言語で記述された関数やファンクションブロックの処理時間は含まれていません。

関数、ファンクションブロックに表示される値は、１サイクル中に呼び出される全ての処理時間の合計値となっています。

また、Cソースジェネレータを使用して作成されたターゲットの場合は、信頼できるデータを表示することはできません。


シミュレーション　スクリプト

ISaGRAFシミュレータには、シミュレーションスクリプトを作成し実行するツールがあります。スクリプトは、ST言語に似たテキスト言語で記述します。

スクリプトの編集

スクリプトの実行

スクリプト記述言語

シミュレーション・スクリプト・エディタは、「ツール－シミュレーションスクリプト」コマンドで起動します。下記がスクリプトエディタのウィンドです。

上側のウィンドは、スクリプトを入力するテキストエディタです。使用方法は、他のISaGRFAテキストエディタと同様です。また、オプションメニューからは、タブ設定を行うことができます。

下部のウィンドには、スクリプトが実行されたときの出力メッセージが表示されます。ウィンドのセパレータは自由にドラッグできサイズ変更が可能です。スクリプトの編集時は、このウィンドは隠れている場合がありますが、スクリプトが実行されると自動的に表示されます。


スクリプトの編集

スクリプトファイルに関する操作は「ファイル」メニューから行います。

新規作成	無題の新規スクリプトファイルの作成

開く	既存のスクリプトファイルを開きます

上書き保存	スクリプトテキストと出力ウィンドの内容を保存します

名前を付けて保存	スクリプトテキストと出力ウィンドの内容を別の名前で保存します

それぞれのスクリプトに対し、２つのファイルがプロジェクトディレクトリに作成されます。

<ｽｸﾘﾌﾟﾄ名>.SCC	スクリプト　テキスト (命令)

<ｽｸﾘﾌﾟﾄ名>.SCO	出力ウィンドの内容

ここで、<ｽｸﾘﾌﾟﾄ名>は、スクリプトの名前を指しています。これらのファイルは、通常のテキストファイルで、一般のテキストエディタでオープンすることができます。

 スクリプトの編集中、「編集－シンボルの挿入」コマンドで宣言された変数名をカーソル位置に挿入することが可能です。


スクリプトの実行

スクリプトは実行する前に文法チェックとコンパイルする必要があります。「実行」コマンドが選択されたとき必要に応じて文法チェックが自動的に行われます。下記の「スクリプト」メニューコマンドを使用します。

チェック	スクリプトの文法チェックとコンパイル

ｽｸﾘﾌﾟﾄ実行	スクリプトの実行

無題のスクリプトの場合、文法チェックを行う前に名前をつけて保存しなければなりません。名前が付けれれたスクリプトの場合は、文法チェックの前に自動的にファイルへの保存が行われます。

スクリプトが実行されているときは、その内容は編集できません。スクリプトの実行が終了したときはメッセージが表示されます。また、下記の「スクリプト」コマンドで実行中のスクリプトを中断することも可能です。

ｽｸﾘﾌﾟﾄ中断	実行中スクリプトの中断

スクリプトの実行はターゲットサイクルの間で実行されます。サイクル中に無限ループがある場合は、シミュレータはこの無限ループを分割して実行し、サイクル実行が引き続き実行され、他のISaGRAFアプリケーションがブロックされないようにしています。ISaGRAFのスクリプトインタープリタは、１サイクル中に同じ“ラベル”が２回カウントされたらスクリプトの実行を中断します。また、スクリプトの実行はCycleやWaitのインストラクションによっても中断されます。


スクリプト記述言語

スクリプト記述言語は、シンプルなST言語に似たテキスト言語です。しかし、各行末のセミコロン（；）は不要です。ツールバー上の下記のボタンを使用して、使用可能なインストラクションを調べ、カーソル位置に挿入することが可能です。

インストラクションの挿入（キーワードとコメント付）

いろいろのインストラクションがあります。

値を変数に代入するインストラクション：

:=	代入

出力ウィンドにメッセージを出力するインストラクション：

Print	テキストや変数の値の出力

PrintTime	現在時刻の出力

ISaGRAFのサイクルとの同期を取るためのインストラクション：

Cycle	１サイクル実行

Wait	指定時間待ち

スクリプトの流れを制御する為のインストラクション：

ラベル	スクリプト中のどこにでも配置できる

Goto	ラベルへの無条件ジャンプ

If goto	ラベルへの条件付ジャンプl

End	スクリプトの終了

スクリプト言語にはcase文はありません。コメントは、ST言語同様に"(*" と"*)"で囲むか、; セミコロンを初めに付けて記述します。


":=" 代入

意味：	変数に値を強制的に代入します。内部変数、入力変数、出力変数に対して有効です。

文法：	<varname> := <constant_expression>

<varname> = <constant_expression>

説明：	<varname>は、変数辞書に登録された変数名、あるいは%の文字を接頭字として使用する直接表現変数です。

<constant_expression>は、指定した変数に応じた定数値です。ブール型変数に対しては１／０を使用します。また、タイマー変数に対しては、T#やTIME#の接頭文字は省略可能です。

メモ：	スクリプトによる入力変数に対する値の代入の場合は、変数のロックは不要です。

注意：変換関数の設定をしている入出力変数に対しての値の代入は行ってはなりません。スクリプトでは、変換関数や変換テーブルをサポートしていません。

例：	MyBooVar := 1         (* same as TRUE *)

MyIntVar := 1234

MyRealVar := 1.2345

MyMsgVar := 'Hello'

MyTmrVar := t#12s


Print

意味：	出力ウィンドへの文字列や変数の値の出力。出力ウィンドの最後の文字から、改行されて新しい行に表示が行われます。

文法：	Print '<text>'

Print <varname>

説明：	<text>は、シングルクォーテーションで囲まれた文字列。

<varname>は、変数辞書に登録された変数名、あるいは%の文字を接頭字として使用する直接表現変数です。

メモ：	変数の値の出力は、IEC規格に応じたフォーマットで行われます。

例：	Print 'Hello'

Print MyBooVar

出力：	Hello

MyBoovar = TRUE


PrintTime

意味：	出力ウィンドに、現在時刻を表示します。出力ウィンドの最後の文字から、改行されて新しい行に表示が行われます。

文法：	PrintTime

メモ：	現在時刻の出力フォーマットは、Windowsのシステムの設定に依存しています。

例：	Print 'Time now is:'

PrintTime

出力：	Time now is:

15:45:22


Cycle

意味：	次のISaGRAFのサイクルが実行されるまで、スクリプトの実行を一時停止します。

文法：	Cycle

メモ：	スクリプトの実行は、ISaGRAFのサイクルの最初に行われます。もしシミュレータがサイクルモードの場合、このCycle命令はサイクル実行の後に行われます。それ以降のスクリプトは、デバッガの「１サイクル実行」コマンドが実行された後、実行されることになります。

例：	(*ISaGRAFのプログラムには、AをBにコピーするプログラムがあります*)

A := 0

Cycle

Print B

A := 1

Print B (* no cycle performed / B not set to 1 *)

Cycle

Print B

Output:	B = 0

B = 0

B = 1


Wait

意味：	指定した時間が経過するまでスクリプトを一時停止します。

文法：	Wait <delay>

説明：	<delay> は、ディレイ値で、時間の定数を示すIEC規格に応じた表現方法で記述します。 "T#" や "TIME#" の接頭文字は省略可能です。この値は、10mSから１時間の間の値でなければなりません。

メモ：	"Wait"インストラクションの精度は、ホストシステムのWindowsに依存していますので、精密なものではありません。また、±１サイクル実行時間分の誤差を考慮する必要があります。

"Wait"インストラクションが実行されると、指定された時間が経過するまでISaGRAFサイクルが実行され、その後スクリプトの実行が継続されます。

例：	PrintTime

Wait 2s

PrintTime

Output:	15:45:27

15:45:29


ラベル

意味：	ラベルは、スクリプト中のどこにでも配置できます。ラベルはGotoインストラクションのジャンプ先として使用し、スクリプトの流れを制御することが可能です。

文法：	<labelname>:

説明：	<labelname> は、英文字で始まり、英数字とアンダースコアなどの１６文字以内のユニークな文字列です。宣言時には、コロン（:）を後に付けなければなりません。

メモ：	ラベルを宣言した行に、他のインストラクションは記述できません。

ラベル名は、変数辞書に宣言された変数名と同一のものが有ってはいけません。

例：	(* example of a script with an infinite loop *)

loop:

PrintTime

Wait 1s

Goto loop


Goto

意味：	ラベルへの無条件ジャンプ

文法：	Goto <labelname>

説明：	<labelname> は、スクリプト中に宣言されたラベル名。

メモ：	逆方向ジャンプも可能です。無限ループの場合は、ISaGRAFのサイクル実行を維持する為に、スクリプトの実行はループ毎に分割されて実行されます。

例：	Print 'Before Jump'

Goto MyLabel

Print 'Within Jump' (* instruction never performed *)

MyLabel:

Print 'After Jump'

Output:	Before Jump

After Jump


If Goto

意味：	ラベルへの条件ジャンプ。条件には、変数と変数の比較および、変数と定数の比較を使用します。

文法：	If <var1> test <var2> Goto <labelname>

If <var1> test <constant_expression> Goto <labelname>

testに使用可能なものは、下記です。

=	両辺の値が同じ場合に真。

<>	両辺の値が等しくない場合に真。

<	左辺が右辺より小さい場合に真。

<=	左辺が右辺以下の場合に真。

>	左辺が右辺より大きい場合に真。

>=	左辺が右辺以上の場合に真。

説明：	<var1> <var2> は、変数辞書に登録された変数名、あるいは%の文字を接頭字として使用する直接表現変数です。

<constant_expression> は、指定した変数に応じた定数値です。ブール型変数に対しては１／０を使用します。また、タイマー変数に対しては、T#やTIME#の接頭文字は省略可能です。

<labelname> は、スクリプト中に宣言されたラベル名です。

メモ：	逆方向ジャンプも可能です。無限ループの場合は、ISaGRAFのサイクル実行を維持する為に、スクリプトの実行はループ毎に分割されて実行されます。

例：	(* This script loops until MyVar is TRUE *)

Loop:

If MyVar = TRUE Goto TheEnd

Print MyVar

Goto Loop

TheEnd:


End

意味：	スクリプトの終了。

文法：	End

メモ：	スクリプトの最終行にEndインストラクションを記述することは必須条件ではありません。

例：	(* This script loops until MyVar is TRUE *)

Loop:

If MyVar = FALSE Goto Continue

End

Continue:

Print MyVar

Goto Loop


入力信号状態の保存／読み込み

ISaGRAFシミュレータを使用して、IOシミュレーションパネルのトグルボタンやエディットコントロールボックスを使用した操作によって、入力チャネルの強制入力を行うことが可能です。これらの入力チャネル状態を保存したり、読み込んだりする為に下記のコマンドが、「ツール」メニューにあります。

入力ﾊﾟﾀｰﾝのﾛｰﾄﾞ	ファイルに保存された入力チャネルの値を入力チャネルに設定します。

入力ﾊﾟﾀｰﾝのｾｰﾌﾞ	入力チャネルの状態をファイルに保存します。ファイルはプロジェクトディレクトリに保存されます。

メモ： 名前が付けられている入力チャネル（変数の割り付けが行われている入力）のみが保存されます。