アドバンスト　プログラミングテクニック

本章ではISaGRAFワークベンチとターゲットシステムについてのより詳しい情報について解説を行います。本章を読まれる前にはISaGRAFの基本的な知識を備えておく必要があります。

ISaGRAFツールの詳細情報

ロックされたＩ／ＯとバーチャルＩ／Ｏの違い

通信リンク設定（ワークベンチ－ターゲット）の動作確認

ISaGRAFのディレクトリ構成

アプリケーションシンボルファイル

ISaGRAFワークベンチＩ／Ｏ無制限版（WDL）の制限


ISaGRAFツールの詳細情報

ISaGRAFのエディタツールを使っている際には、マウスの右ボタン  をクリックすることによりポップアップメニューを開くことができます。メニューはカーソルの現在位置で開かれるためマウスの動きを最小限にとどめることができるため有効です。

ISaGRAFワークベンチの各ウィンドウは最初はディフォルトの座標で開かれますが、一度、ウィンドウのサイズや場所を設定してウィンドウを閉じると、これらの情報が保管されるため次回にウィンドウを開く際には前回終了した際の状態で開くことができます。

ISaGRAFワークベンチのエディタでは異なったソースファイルの編集は同時にウィンドウを開くことで並行して作業をすすめることができます。ただし、同一のソースファイルを２つ以上は開くことはできません。

さらに、ワークベンチのツールバーの空きエリアをマウスでダブルクリックすることにより、ツールバーコマンドアイコン全体の解説のためのポップアップが開きます。また、マウスカーソルがツールバーのコマンドアイコン上にあるときはコマンドテキストの表示が可能です。


ロックされたＩ／ＯとバーチャルＩ／Ｏの違い

Ｉ／Ｏ接続エディタで、Ｉ／Ｏボードをバーチャルボードに設定することで、物理Ｉ／Ｏチャネルの処理を行わなくなります。Ｉ／Ｏボードがバーチャルと定義されていてもISaGRAFのターゲットでの処理には変化はありません。Ｉ／Ｏボードが実ボードに設定されているときとの違いは入力デバイスからの読み込みがなされないこと、出力デバイスへの書き込みがされないことのみです。入力変数の値変更はISaGRAFデバッガーを使用することにより可能となります。バーチャルの設定はボード単位で行うことになります。（個々のＩ／Ｏ変数に対してはできません。）なお、バーチャルボードの設定はＩ／Ｏ接続エディタで定義をした後に、アプリケーションコード生成を行う必要があります。バーチャルボードの設定（属性設定）はスタティックでありアプリケーションコードに含まれますので、アプリケーションがスタートするときにバーチャルの設定でスタートします。

これとは別に、Ｉ／Ｏ変数のロックをすることで物理Ｉ／Ｏと分離することも可能です。Ｉ／Ｏ変数のロック・アンロックはISaGRAFデバッガーからのコマンドとして行います。変数のロックはダイナミックな操作であり、アプリケーションコードには保存されません。変数のロック操作は、一度に一つの変数に対して行うことができます。

以下のテーブルにバーチャルボード設定、Ｉ／Ｏ変数のロックについてまとめます。

バーチャルＩ／Ｏボード	Ｉ／Ｏ変数ロック

設定ツール	Ｉ／Ｏ接続エディタ	デバッガ

定義	スタティック	ダイナミック

選択モード	ボード単位	変数単位

適用例	検証、テスト	メンテナンス

以下の図にISaGRAFのターゲットでのＩ／Ｏデータフローを示します。

入力変数のロック

入力変数がロックされているときは、入力データベースへの様々なアクセスに変更がありませんが、データベースと入力デバイスはロックされて（切り離されて）います。入力データベースへはデバッガーからのデータ書き込みが行われ、ISaGRAFランタイムカーネルによって通常通り処理されます。

入力変数のロック

出力変数がロックされているとき、ランタイムカーネルと出力データベース間はロックされて（切り離されて）います。この場合は出力データベースを通して出力デバイスへのアクセスはデバッガーにより行うことができます。

バーチャル入力ボード

入力ボードのバーチャル設定は、入力デバイスと入力データベースとの間が切り離されていることになります。バーチャルＩ／Ｏドライバが実Ｉ／Ｏドライバの代わりになります。

バーチャル出力ボード

出力ボードのバーチャル設定は、入力ボードのバーチャル設定と同様に、出力デバイスと出力データベースとの間が切り離されていることになります。カーネルは出力データベースを更新します。バーチャルＩ／Ｏドライバが実Ｉ／Ｏドライバの代わりになります。

全部の組み合わせを下図に示します。


通信リンク設定（ワークベンチ－ターゲット）の動作確認

デバッガーウィンドウのステータスメッセージが“遮断状態”になっている場合は、たいていワークベンチとターゲット間の通信エラーによることが多いです。何か具体的なプログラムのターゲット上での動作確認をする前に、必ずターゲット上で実行中のアプリケーションがない状態でワークベンチとターゲット間の通信が正常であることを確認しておく必要があります。　この場合は、デバッガーのメッセージが“アプリケーションがありません”となります。

変換関数やＣ言語関数でユーザプログラムでＣ言語が使われる場合はユーザのプログラムがターゲットシステムに直接アクセスすることでターゲットシステムエラーになることも考えられます。　ISaGRAFのＩ／Ｏ開発ツールキットでＩ／ＯドライバをＣ言語で記述したような場合、例えばボードの設定アドレスを間違えたりすることなども含まれます。

下表にデバッガーのメッセージから判断できる現象の原因例を簡単に示します。

ステータス	モード	原因（例）
"遮断状態" (ﾀﾞｳﾝﾛｰﾄﾞ前)		- ﾀｰｹﾞｯﾄｼｽﾃﾑが立ち上がっていない - 通信ケーブルがない、正常でない - 通信の設定データエラー  - ﾀｰｹﾞｯﾄが正常にｲﾝｽﾄｰﾙされていない
"遮断状態" (ﾀﾞｳﾝﾛｰﾄﾞ後)	サイクルモード 起動モード	- I/O構成エラー - ﾀｰｹﾞｯﾄｼｽﾃﾑが正常でない
	リアルタイムモード 起動モード	- I/O構成エラー - ﾀｰｹﾞｯﾄｼｽﾃﾑが正常でない   (Ｃプログラムエラー)
"ｱﾌﾟﾘｹｰｼｮﾝが 　　ありません"		- ｱﾌﾟﾘｹｰｼｮﾝがﾀﾞｳﾝﾛｰﾄﾞされていない - ｱﾌﾟﾘｹｰｼｮﾝがRUNしていない  (Ｃプログラムエラー) - Intel/Motorola のTICコードが不整合 - ﾀｰｹﾞｯﾄｱﾌﾟﾘｹｰｼｮﾝﾊﾞｰｼﾞｮﾝNo.が不一致


ISaGRAFのディレクトリ構成

ISaGRAFワークベンチは特定のディスクディレクトリ構成のもとで動作します。ルートディレクトリ名はワークベンチインストール時に設定することが可能です。ディフォルトではＩＳＡＷＩＮディレクトリとなります。以下にワークベンチインストーラが作る標準のディスクディレクトリ構成を示します。

以下にISaGRAFのサブディレクトリについて解説をします。

サブディレクトリ	内容
APL	ISaGRAFプロジェクトのためのルートディレクトリ各プロジェクトは対応した一つのディレクトリを持ちます。以下のサブディレクトリにはプロジェクトで必要なデータを全て含んでいます。
	他のプロジェクトグループを作成し、別のディレクトリにプロジェクトディレクトリを作成することも可能性です。インストーラは、サンプルのアプリケーションがはいったSMPと言うディレクトリを作成します。
COM	共通データ。 プロジェクト間で共通に扱えるデータ。
EXE	ISaGRAFプログラムとヘルプファイル
LIB	ISaGRAFライブラリデータ - ライブラリエレメント - 各エレメントに対するパラメータとインタフェース - 技術メモ
LIB\IOC	Ｉ／Ｏ構成のソースコード
LIB\FNC	ＩＥＣ言語で記述されたファンクションのソースコード
LIB\FBL	ＩＥＣ言語で記述されたファンクションブロックのソースコード
LIB\SRC	変換関数、Ｃ言語ファンクションのソースコード
LIB\DEFS	変換関数、Ｃ言語ファンクションのヘッダーファイル
LIB\RELS	変換関数、Ｃ言語ファンクションのオブジェクトコード
LIB\DEV	Ｃ言語ライブラリを作るためのコマンドファイル （ "C" libraries, makefiles, link lists, 等）
TMP	テンポラリファイル。ISaGRAFのコードジェネレーションがテンポラリファイルを保管するための領域で削除できません。

これらのサブディレクトリは別のディスク（あるいはサブディレクトリ）へ移動することができます。もし、標準以外のディスクディレクトリ構成を行う場合は、サブディレクトリのパス名はＥＸＥサブディレクトリ内のISA.iniファイルのWS001セクションに記述しなければなりません。

以下のテーブルに WS001セクションのエントリーポイントを示します。

Isa	ISaGRAFワークベンチのルートディレクトリ名
IsaExe	ISaGRAFプログラムとヘルプファイル用のルートディレクトリ名
IsaApl	ISaGRAFプロジェクト用のルートディレクトリ名
IsaTmp	テンポラリファイル用のディレクトリ名
IsaSrc	ライブラリソースコード用のディレクトリ名
IsaDefs	ライブラリソースヘッダー用のディレクトリ名

注意：もし、ISaTmpディレクトリを別のディレクトリに変更する場合は、必ず、サブディレクトリOBJS,  RELS,  DATAを下に作る必要があります。以下にWS001セクションを変更したカスタムディレクトリ構成の場合の設定例を示します。

;file c:\ISAWIN\EXE\ISA.ini

[WS001]

Isa=c:\isawin

IsaExe=c:\isawin\exe

IsaApl=c:\isawin\apl

IsaTmp=c:\isawin\tmp

IsaSrc=c:\isawin\lib\src

IsaDefs=c:\isawin\lib\defs

Ｃ言語ファンクションやファンクションブロックを追加する場合は、\ISAWIN\LIB\DEV　ディレクトリにコマンドファイル、ｍａｋｅファイル等を保存することができます。また、 \ISAWIN\LIB\RELSディレクトリにはＣコンパイラで作られたオブジェクトやリンクに必要なＣライブラリを保存することができます。


アプリケーションシンボルファイル（APPLI.TST）

ISaGRAFアプリケーションの各オブジェクトは名前（変数名）やバーチャルアドレス（コード生成時に計算されます）によって参照されます。ここでのバーチャルアドレスとは変数の宣言の時に入力数ネットワークアドレスとは異なります。バーチャルアドレスはＩ／Ｏドライバ開発キットを含むＣ言語アプリケーションからアクセスするとき等に使用されます。ISaGRAFコード生成時に、プロジェクトを構成しているオブジェクト名（変数、プログラム名、ステップ名．．．）とバーチャルアドレスとの関係が一つのＡＳＣＩＩファイルに保存されます。このファイルにはユーザアプリケーションがISaGRAFのスタティックデータをアクセスするための情報が含まれています。このファイル名は"APPLI.TST"で "\ISAWIN\APL\proname"（pronameはプロジェクト名）ディレクトリに含まれています。

以下に"APPLI.TST"の記述フォーマットについて示します。

主な用語として以下の３つがあります。

VA:	バーチャルアドレス

ATTR:	変数属性

USP:	Ｃ言語ファンクション

変数属性としては以下の４つがあります。これらは"変数属性"フィールドに書かれます。

+X	内部変数

+C	定数（リードオンリー内部変数）

+I	入力変数

+O	出力変数

バーチャルアドレス以外の全ての番号は１０進数で表現されます。バーチャルアドレス（ＶＡ）は "!"が先頭で１６進の４桁で表現されます。

例えば、

123	１０進数

!A003	１６進数のバーチャルアドレス

"APPLI.TST"のファイル構成を以下に示します。ファイルは複数のブロックから成り立っています。ブロックは複数のレコードから成り立っています。各レコードは１行のテキストで記述されます。各ブロックは１行のヘッダーから開始されます。

start block

description blocks

end block

１つのブロックの例を以下に示します。

@ <block_name> <arguments>

#record...

#record...

...

start blockにはアプリケーションの基本情報が含まれています。以下に例を示します。

@ISA_SYMBOLS,<appli_crc>

#NAME,<appli_name>,<version>

#DATE,<creation_date>

#SIZE,G=<nbprg>,S=<nbstep>,T=<nbtra>,L=0,P=<nbpro>,V=<nbvar>

#COMMENT,cj international

ここで、<   >内の略称は以下のようになります。

appli_crc	アプリケーションシンボルのチェックサム

appli_name	アプリケーション名

version	ISaGRAFワークベンチバージョンＮＯ．

creation_date	アプリケーション作成日時

nbprg	プログラム数

nbstep	ＳＦＣステップ数

nbtra	ＳＦＣトランジション数

nbpro	Ｃ言語ファンクションの数

nbvar	全変数の数

end blockにはファイルの最後の意味が含まれています。以下のようになります。

@END_SYMBOLS

description blockにはアプリケーションプログラムの記述が含まれています。以下に例を示します。

@PROGRAMS,<nbprg>

#<va>,<name>

#...

nbprg	このブロックに定義されているプログラム数

va	プログラムのバーチャルアドレス

name	プログラム名

ＳＦＣのステップを記述するブロックを以下に示します。ＳＦＣ以外のプログラムには仮想的なステップが定義されています。

@STEPS,<nbsteps>

#<va>,<name>,<father>

#...

nbsteps	このブロックに含まれるステップ数

va	ステップのバーチャルアドレス

name	ステップ名

father	親プログラムのバーチャルアドレス

ＳＦＣのトランジションを記述するブロックを以下に示します。

@TRANSITIONS,<nbtrans>

#<va>,<name>,<father>

#...

nbtrans	このブロックに含まれるトランジション数

va	トランジションのバーチャルアドレス

name	トランジション名

father	親プログラムのバーチャルアドレス

ブール型変数を記述するブロックを以下に示します。

@BOOLEANS,<nb_boo>

#<va>,<name>,<attr>,<program>,<eq_false>,<eq_true>

#...

変数の数が4095を超えた場合は、

X#(1.<varno>),<name>,<attr>,<program>,<eq_false>,<eq_true>

nb_boo	このブロックに含まれる変数の数

va	変数のバーチャルアドレス

varno	ブール型変数内でのアドレス

name	変数名

attr	変数属性

program	親プログラムのバーチャルアドレス

あるいは "!0000" （グローバル変数のとき）

eq_false	FALSEの時の文字列

eq_true	TRUEの時の文字列

数・実数型変数を記述するブロックを以下に示します。

@ANALOGS,<nb_ana>

#<va>,<name>,<attr>,<program>,<format>,<unit>

#...

変数の数が4095を超えた場合は、

X#(2.<varno>),<name>,<attr>,<program>,<eq_false>,<eq_true>

nb_ana	このブロックに含まれる変数の数

va	変数のバーチャルアドレス

varno	整・実数型変数内でのアドレス

name	変数名

attr	変数属性

program	親プログラムのバーチャルアドレス

あるいは "!0000" （グローバル変数の時）

format	= "I" （整数型変数）

= "F" （実数型変数）

unit	単位を表す文字

タイマ型変数を記述するブロックを以下に示します。

@TIMERS,<nb_tmr>

#<va>,<name>,<attr>,<program>

#...

変数の数が4095を超えた場合は、

X#(3.<varno>),<name>,<attr>,<program>,<eq_false>,<eq_true>

nb_tmr	このブロックに含まれる変数の数

va	変数のバーチャルアドレス

varno	タイマ型変数内でのアドレス

name	変数名

attr	変数属性 (常時 +X: 内部変数)

program	親プログラムのバーチャルアドレス

あるいは "!0000"（グローバル変数の時）

可変長文字列型変数を記述するブロックを以下に示します。

@MESSAGES,<nb_msg>

#<va>,<name>,<attr>,<program>,< max_len>

#...

変数の数が4095を超えた場合は、

X#(4.<varno>),<name>,<attr>,<program>,<eq_false>,<eq_true>

nb_msg	このブロックに含まれる変数の数

va	変数のバーチャルアドレス

varno	可変長文字列型変数内でのアドレス

name	変数名

attr	変数属性

program	親プログラムのバーチャルアドレス

あるいは "!0000"（グローバル変数の時）

lg_max	メッセージ最大長

Ｃ言語ファンクションを記述するブロックを以下に示します。

@USP,<nb_usp>

#<va>,<name>

#...

nb_usp	このブロックに含まれるＣ言語ファンクションの数

va	Ｃ言語ファンクションのバーチャルアドレス

name	Ｃ言語ファンクション名

Ｃ言語ファンクションブロックを記述するブロックを以下に示します。

@FBINSTANCES,<nb_fb>

#<va>,<inst_name>,<fb_name>

#...

nb_fb	Ｃ言語ファンクションブロック　インスタンスの数

va	Ｃ言語ファンクションブロック　インスタンスのバーチャルアドレス

inst_name	Ｃ言語ファンクションブロック　インスタンス名

fb_name	Ｃ言語ファンクションブロックのタイプ


ISaGRAFワークベンチＩ／Ｏ無制限版（ＷＤＬ）の制限

ISaGRAFワークベンチ（ Ｉ／Ｏ無制限版）における制限を以下の表に示します。もちろん、これ以外にはワークベンチに使用しているコンピュータのメモリ、ハードディスクなどの制限、ターゲットシステムでのメモリ、リソースなどの制限もあります。

 プロジェクト：

オブジェクト	最大値	メモ
プログラム数	255
階層レベル数	20
プロジェクト数は使用中のコンピュータのハードディスクの容量にのみ制限を受けます。

 オブジェクトの名前：

オブジェクト名	最大値	メモ
プロジェクト	8 char
プログラム	8 char
変数	16 char	コメントに対して更にプラス 60 characters
定義ワード	16 char
定義ワードの内容	255char	コメントに対して更にプラス 60 characters
変換テーブル	16 char
変数リスト	16 char
ファンクション、ＦＢ （ライブラリ）	8 char	Ｃ言語ファンクション、ＦＢ、ＩＥＣ言語ファンクション、ＦＢ
ファンクションパラメータ （ライブラリ）	16 char	Ｃ言語ファンクション、ＦＢ、ＩＥＣ言語ファンクション、ＦＢ
Ｉ／Ｏボード	8 char
Ｉ／Ｏ構成	8 char
ＯＥＭパラメータ	16 char
変換関数	8 char

 編集（一つのプログラム内で）：

オブジェクト	最大値	メモ
ＳＦＣ行	600
ＳＦＣ列	20
ＳＦＣステップ	4095	１つのプロジェクト全体で（ﾏｸﾛｽﾃｯﾌﾟ、ｲﾆｼｬﾙｽﾃｯﾌﾟ、ｴﾝﾄﾞｽﾃｯﾌﾟを含む）
ＳＦＣトランジション	4095	１つのプロジェクト全体で
ＬＤ／ＦＢＤエディタ	200 列 2000 行	セルの編集領域.
Quick LDエディタ	－	ＰＣの制限によります。
ＩＬラベル	251	同一のＩＬプログラム内
テキスト	40KB	１つのプログラム内テキストの合計が40ＫＢ以内（Win95の場合24Kとなります。）

 辞書（一つのプロジェクト内で）：

オブジェクト	最大値	メモ
ブール型変数	65535
整数・実数型変数	65535	整数型と実数型の合計
タイマ型変数	65535
可変長文字列型変数	65535
以上の最大値は各属性（内部、入力、出力、定数）の合計を示します。また、内部のテンポラリ変数や、コンパイラが自動的に生成する物も含みます。辞書ｴﾃﾞｨﾀで一度に編集できる変数は、各変数タイプ、スコープ毎に16000個を超えられません。PCのメモリの容量によっては16000以下になる場合もあります。変数の数が4095を超えるアプリケーションの場合は、V2.21以前のバージョンのターゲットでは実行できません。また、ﾈｯﾄﾜｰｸｱﾄﾞﾚｽを使用した標準のMODBUS通信は、4095を超える変数に対しては行えません。

定義ワード	4095	同一範囲（ローカル、グローバル）
定義ワード	255	１つのプログラム内
変換テーブル	127	１つのプロジェクト内
テーブル内のポイント数	32	１つの変換テーブル内

 Ｉ／Ｏ接続エディタ：

オブジェクト	最大値	メモ
Ｉ／Ｏボード	256	１つのプロジェクト内（ボードあるいは装置機器の合計）

I/Oボードの数、装置機器のアイテムは256を超えられません。

Ｉ／Ｏチャネル	128	同一のボード

 ライブラリ：

オブジェクト	最大値	メモ
ＩＥＣ言語 ファンクション	255	ライブラリに登録可能最大値
ＩＥＣ言語ＦＢ	255	ライブラリに登録可能最大値
Ｃ言語ファンクション	255	ライブラリに登録可能最大値
Ｃ言語ＦＢ	255	ライブラリに登録可能最大値
Ｃ言語ＦＢインスタンス	4095	１つのプロジェクト内で同一のタイプのＦＢに対して
ファンクション入力パラメータ	31	Ｃ言語ファンクション、ＩＥＣ言語ファンクション
関数パラメータ総数	32	少なくとも１つの出力パラメータ以外は入力、出力への割り振りが自由
変換関数	128	ライブラリに登録可能最大値
Ｉ／Ｏ構成	255	ライブラリに登録可能最大値
Ｉ／Ｏボード	255	ライブラリに登録可能最大値
Ｉ／Ｏ装置機器	255	ライブラリに登録可能最大値
Ｉ／Ｏボード ＯＥＭパラメータ	16