- SFC要素とFC言語の実行ルールはどのように違いますか?
FCとSFC言語の実行ルールを比較すると、以下のようになります。
<<最初のサイクル>>
FC
'Begin' アクションの活性化
FC言語は必ずBeginアクションからはじまりますが、ここにはプログラム処理を記述することはできません。
また、Beginアクションの活性化で1サイクル消費します。
SFC
イニシャルステップを活性化
イニシャルステップの中のパルスアクション(P1アクション)を1回だけ実行します。
同じくイニシャルステップの中に記述されたノンストアードアクション(N)も実行します。
<<2
番目のサイクル>>
FC
以下の条件が成立する箇所まで、全ての要素(アクションとテスト)を実行します。
FCサブプログラムがコールされる
ループ処理の中で、既にこのサイクルで1回実行されたアクションに再度到達
SFC
(1)イニシャルステップの直後のトランジション条件が不成立の場合
イニシャルステップのノンストアードアクションをもう一度実行します。
(2)イニシャルステップの直後のトランジション条件が成立した場合
直後のステップが活性化され、イニシャルステップは非活性になります。
イニシャルステップのパルスアクション(P0アクション)を1回だけ実行します。
直後のステップのパルスアクション(P1)を1回だけ実行します。
活性化されたステップのノンストアードアクション(N)を1回実行します。
<<そ
の次のサイクル>>
FC
以下の条件が成立する箇所まで、全ての要素(アクションとテスト)を実行します。
FCサブプログラムがコールされる
ループ処理の中で、既にこのサイクルで1回実行されたアクションに再度到達
SFC
(1)現在活性化しているステップの直後のトランジションの条件が成立しない場合
現在活性化しているステップのノンストアードアクションが再度実行されます
(2)トランジションの条件が成立した場合
現在活性化しているステップが非活性化し、直後のステップが活性化します
非活性化したステッップのパルスアクション(P0)を1回実行します。
活性化したステップのパルスアクション(P1)を1回実行します。
活性化したステップのノンストアードアクションを1回実行します。
<<サ ブプログラムコール方法の違いについて>>
FC
親FCプログラムの処理は、チャイルドFCプログラムの実行が終わるまでは待たされ
ます。
1つの親FCプログラムは同時に1つのチャイルドFCプログラムしか実行できません。
SFC
親SFCプログラムとチャイルドSFCプログラムは同時に実行されます。
複数のチャイルドSFCプログラムを同時に実行することができます。
親プログラムからチャイルドSFCプログラムを停止することができます。
<<プログラム要素の名前の対応について>>
FC アクション
FC テスト/コンディション
SFC ステップ (プ
ログラムの実行を行う部分)
SFC トランジション (条件の判断を行う部分)
...
- SFCのステップに記述するP(パルス)アクションとN(ノーマル)アクションの違いはなんですか?
Pアクションは、ステップがアクティブ=活性化状態になったとき、最初の1回だけ実行する部分です。
微分接点の出力のようなものです。
Nアクションは、ステップがアクティブの間は、サイクルタイム毎に繰り返し実行する部分です。
...
- SFCプログラムはチャイルドSFCや並列分岐を使用して、同時に複数のプログラムを処理できるが、DOSのようなシングルタスクOSでも使用できるか?
SFCプログラムの実行には、マルチタスクシステムは必須ではありません。
ISaGRAFでは、全てのプログラムが「トリガ」によって同期的に実行されます。SFCの
並行処理とは実際には「同一サイクル内」で処理が実行されることを意味します。つまり、処理のプロセスとしては並行して行われますが、最初の入力の読み取りや最終的な出力の書きこみはこのサイクルの外で一元的に実行されます。
ISaGRAF Ver.4/5の場合は異なるコンフィグレーション上で複数のターゲットサイクルの処理が同時に実行可能です。
...
- SFCのステップやトランジションの内部を、複数の言語を混合して記述できるか?
ISaGRAF Ver.4/5の場合
ステップ
アクション単位で1種類の言語(LD、ST、ILのいずれか)で記述します。1個のステップに複数のアクションを記述することができます。
トランジション
ST言語またはLD言語で記述します。混合することはできません。
...
- SFC要素とFC言語の実行ルールはどのように違いますか?
FCとSFC言語の実行ルールを比較すると、以下のようになります。
<<最初のサイクル>>
FC
'Begin' アクションの活性化
FC言語は必ずBeginアクションからはじまりますが、ここにはプログラム処理を記述することはできません。
また、Beginアクションの活性化で1サイクル消費します。
SFC
イニシャルステップを活性化
イニシャルステップの中のパルスアクション(P1アクション)を1回だけ実行します。
同じくイニシャルステップの中に記述されたノンストアードアクション(N)も実行します。
<<2番目のサイクル>>
FC
以下の条件が成立する箇所まで、全ての要素(アクションとテスト)を実行します。
FCサブプログラムがコールされるループ処理の中で、既にこのサイクルで1回実行されたアクションに再度到達
SFC
(1)イニシャルステップの直後のトランジション条件が不成立の場合
イニシャルステップのノンストアードアクションをもう一度実行します。
(2)イニシャルステップの直後のトランジション条件が成立した場合
直後のステップが活性化され、イニシャルステップは非活性になります。イニシャルステップのパルスアクション(P0アクション)を1回だけ実行します。直後のステップのパルスアクション(P1)を1回だけ実行します。活性化されたステップのノンストアードアクション(N)を1回実行します。
<<その次のサイクル>>
FC
以下の条件が成立する箇所まで、全ての要素(アクションとテスト)を実行します。
FCサブプログラムがコールされるループ処理の中で、既にこのサイクルで1回実行されたアクションに再度到達
SFC
(1)現在活性化しているステップの直後のトランジションの条件が成立しない場合
現在活性化しているステップのノンストアードアクションが再度実行されます
(2)トランジションの条件が成立した場合
現在活性化しているステップが非活性化し、直後のステップが活性化します非活性化したステッップのパルスアクション(P0)を1回実行します。活性化したステップのパルスアクション(P1)を1回実行します。活性化したステップのノンストアードアクションを1回実行します。
<<サブプログラムコール方法の違いについて>>
FC
親FCプログラムの処理は、チャイルドFCプログラムの実行が終わるまでは待たされます。1つの親FCプログラムは同時に1つのチャイルドFCプログラムしか実行できません。
SFC
親SFCプログラムとチャイルドSFCプログラムは同時に実行されます。複数のチャイルドSFCプログラムを同時に実行することができます。親プログラムからチャイルドSFCプログラムを停止することができます。
<<プログラム要素の名前の対応について>>
FC アクション
FC テスト/コンディション
SFC ステップ (プログラムの実行を行う部分)
SFC トランジション (条件の判断を行う部分)
...
- SFC要素の「ステップ」と「トランジション」の意味と役割を教えてください。
ステップは,いくつかの処理を記述した,「状態」です。これに対して、トランジションはステップ(いわば状態)を切り替えるための「条件判断」です。
SFC言語は、複数の「状態」=ステップを用意しておき、変数の状態や経過時間などの「条件」=トランジションで現在稼働させるステップを選びます。つまり、
SFC要素・・・条件に合わせて動かすプログラム内容を切り替えるためのチャート
LD,FBD,ST,IL言語・・・実際にI/O操作を記述するための言語
となります。ただし、ISaGRAFでは,次の制限があります。
ISaGRAF Ver.4/5の制限事項
ステップやトランジションに記述できるのはST,IL,LD言語のみです。
...
- SFCのプログラムで、トランジション条件に GSn.t>t#1s; (* nはステップ番号 *)
のように記述している。モニタリングすると、いつまでたっても条件を通過しないようだ。使用方法に誤りがあるのだろうか?
文法上の誤りはなくても、ずっと同じステップだけを実行しているように見える場合があります。これはシミュレーションやデバッグ時のワークベンチの画面更新が遅いためです。
たとえば、複数のステップを通過して成立するようなループのあるプログラムを記述すると、問題のトランジション以外のトランジション条件が常にTRUEの場合、
ステップ N を実行している時間=1秒 ≫ 他のステップを実行している時間
となってしまうため、デバッガーでは他のステップがアクティブの時の表示の機会がほとんどありません。そのため、画面表示に反映されず、他のステップが実行されていないようにみえる場合があります。
...
- SFCプログラムからファンクションをコールするにはどうすればよいでしょうか?
また、SFCとFBD言語を組み合わせて使用するにはどうすればよいのですか?
SFCプログラムとFBD言語を組み合わせて使用する方法のサンプルです。
SFCのメインプログラムからFBDで記述したファンクションをコールするイメージです。
1-プログラムを作成します。
SFCプログラム-シーケンシャルセクション、メインプログラム
FBDプログラム-ファンクション
2-FBDのファンクションのパラメータインタフェースを定義します。
一般にファンクションの出力パラメータは1つで、プログラム名と同じ名前出なければなりません。
3-以下がFBDのファンクションのプログラム例です。
ファンクション名:"called"
出力パラメータ名:"called"(ファンクション名と同じ)
4-メインのSFCプログラムのステップの中でFBDプログラムをコールします。
...
- SFC要素、親プログラムからチャイルドプログラムを起動する際、必ず初期ステップから実行させる=自動的にチャイルドプログラム自身で自分を停止させる にはどのようにしたらよいか
まず、前提条件として、次のようなものがあります。
プログラムの起動・停止は親SFCからのみ行えます。言い換えると、プログラムは自分自身を停止できません。プログラムの起動はgstart命令で行うが、その際プログラムがすでに活動中であれば、命令は無意味になります。
そこで、ご希望の動作をさせるには次のような工夫が必要です。
(1)まず、グローバル変数
child_flag:論理値、チャイルドプログラムを動作・停止させるフラグを定義します。
(2)次に、チャイルドプログラムの内容を下記のようにします。
(3)親プログラムを下記のように記述します。
(a)初期ステップ
チャイルドプログラムをgstartする。
(b)チャイルドの処理を見かけ上起動するとき
パルスアクションで変数 Child_flagをtrueにする。
(c)チャイルドの処理を見かけ上停止するとき
1.変数 Child_flagをfalseにし、
2.gkill(チャイルドプログラム)し、
3.gstrat(チャイルドプログラム)する。
このようにすれば、実際にはチャイルドは常に動作しているものの、処理そのものを止めたり初期ステップから起動することが出来ます。
注意事項
ISaGRAF ver.4/5では gkill,gstart 命令はサポートしていません。
...
- SFCプログラムは1サイクル内で複数のステップを実行することができますが、その数に制限はありますか?
ターゲットのバージョンによって異なります。
ISaGRAF Ver.4/5
※注意
この記述をISaGRAF Ver.4/5のユーザーズマニュアルのワークベンチの章の以下のセクションと置き換えてください。
ワークベンチ-プロジェクトマネージャ-リンクアーキテクチャの表示-リソースのプロパティ-設定-詳細
ターゲットの起動時に、SFCのダイナミックな動作にかかわるメモリの割り当てを行います。このメモリの量は、リソースプロパティの設定の「詳細」で決定することができます。
ここでいう動的な動作とは、トークンの移動=活性化ステップの変移を意味します。
メモリ量はSFCのプログラム数に比例した値になります。
NbElmt = (比例係数 × SFCプログラム数 + オフセット値)
必要なメモリサイズ[バイト] = N × NbElmt × sizeof(typVa)
ここで、
N = 5 (SFC エンジンの設定によって決定される定数)typVa :ミディアムメモリモデルの場合、2 (16ビット)
ラージメモリモデルの場合、4 (32ビット)NbElmt は結果として、1サイクルで処理可能なトランジションの最大数です。
処理中のトランジションの前には、少なくとも1つの活性化したステップがあるはずですから、NbElmtはおおよそ以下のように定義できます。
1サイクルで活性化できるステップの最大数1サイクルで実行することの出来るアクションブロックの最大数
ここでいうアクションブロックとは、1ステップにリンクされているN(ノンストアード)、P1,P0(パルス)アクションを指します。
もし、ある瞬間に割り付けられているメモリが不足=上記の値をオーバーすると、以下のような状況が考えられます。
ターゲットが「チェックモード」でビルドされている場合
ターゲットカーネルはSFCトークンの移動エラーかアクションの実行エラーを発生します。その後リソースは「エラー」モードとなります。この結果、次のサイクルは実行されなくなります。
なお、「チェックモード」は、ターゲットソース ...
- SFCプログラムで、1サイクル内で活性化したステップが同時に複数存在する場合、それぞれが同じファンクションをコールしていた場合問題はないのか。
つまり、ファンクションのコードが再入してしまうが問題はないか?
ISaGRAFの1アプリケーション中のSFCステップは、それぞれ別のスレッドで実行されるわけではありません。例えば、2つのステップが1サイクル中で同時に活性化した場合、ステップ中の該当するアクションブロックはそのターゲットサイクル中に順番に実行されていきます。
したがって、ファンクションやサブプログラム類の呼び出しも、厳密には同時にコールされることはないので、問題はありません。
ただし、ISaGRAFのファンクションやサブプログラム自体のコードは再入可能ではありません。ファンクション内の全てのローカル変数はスタティックなデータで、メモリ上の決められた位置に保存され、ターゲット実行中は値が保持されます。
したがって、ファンクション内でファンクションをコールするような場合は問題が起きる場合もあります。
...
- SFCプログラムは1サイクル内で複数のステップを実行することができますが、その数に制限はありますか?
ターゲットのバージョンによって異なります。
ISaGRAF Ver.4/5
※注意
この記述をISaGRAF Ver.4/5のユーザーズマニュアルのワークベンチの章の以下のセクションと置き換えてください。
ワークベンチ-プロジェクトマネージャ-リンクアーキテクチャの表示-リソースのプロパティ-設定-詳細
ターゲットの起動時に、SFCのダイナミックな動作にかかわるメモリの割り当てを行います。このメモリの量は、リソースプロパティの設定の「詳細」で決定することができます。
ここでいう動的な動作とは、トークンの移動=活性化ステップの変移を意味します。
メモリ量はSFCのプログラム数に比例した値になります。
NbElmt = (比例係数 × SFCプログラム数 + オフセット値)
必要なメモリサイズ[バイト] = N × NbElmt × sizeof(typVa)
ここで、
N = 5 (SFC エンジンの設定によって決定される定数)typVa :ミディアムメモリモデルの場合、2 (16ビット)
ラージメモリモデルの場合、4 (32ビット)NbElmt は結果として、1サイクルで処理可能なトランジションの最大数です。
処理中のトランジションの前には、少なくとも1つの活性化したステップがあるはずですから、NbElmtはおおよそ以下のように定義できます。
1サイクルで活性化できるステップの最大数1サイクルで実行することの出来るアクションブロックの最大数
ここでいうアクションブロックとは、1ステップにリンクされているN(ノンストアード)、P1,P0(パルス)アクションを指します。
もし、ある瞬間に割り付けられているメモリが不足=上記の値をオーバーすると、以下のような状況が考えられます。
ターゲットが「チェックモード」でビルドされている場合
ターゲットカーネルはSFCトークンの移動エラーかアクションの実行エラーを発生します。その後リソースは「エラー」モードとなります。この結果、次のサイクルは実行されなくなります。
なお、「チェックモード」は、ターゲットソース ...
- STACKINTファンクションブロックはどのような場合に使用するのか?
STACKINTは、コンピュータのスタックのような働きをします。いわゆる「先入れ後出し」バッファです。利用方法としては、例えば現在のグローバル変数を保存しておいて、何かの処理(グローバル変数を書き換える可能性がある処理)をし,その後グローバル変数を元に戻す・・・といった場合に使用します。
"STACKINT" では、入力のリセットパラメータ "R1" の値が立ち上がった場合のみ、スタックサイズの入力パラメータ "N" にセットされた新しいスタックサイズが有効となります。
この場合(R1=TRUEとなり、続いてFALSEに変化した場合)、もしプッシュされた変数の数がスタックサイズよりも大きいと、オーバーフロー(出力パラメータ "OFLO")がTRUEとなります。
...
- SFCエディタの文字のフォントを変更するには、どのようにすればよいでしょうか?
SFCプログラムのフェイスフォントの変更は、以下の手順で可能です:
ISaGRAF Ver.4/5 のインストールフォルダの "bin" フォルダの下に、"diamond.ini" ファイルがあります。このファイルの以下の部分で設定してください:
[FONT]
SFCFont=<フォント名>
※ここではSFCの第2レベルのフォントの変更はできません。
...
- SFC要素とFC言語の実行ルールはどのように違いますか?
FCとSFC言語の実行ルールを比較すると、以下のようになります。
<<最初のサイクル>>
FC
'Begin' アクションの活性化
FC言語は必ずBeginアクションからはじまりますが、ここにはプログラム処理を記述することはできません。
また、Beginアクションの活性化で1サイクル消費します。
SFC
イニシャルステップを活性化
イニシャルステップの中のパルスアクション(P1アクション)を1回だけ実行します。
同じくイニシャルステップの中に記述されたノンストアードアクション(N)も実行します。
<<2 番目のサイクル>>
FC
以下の条件が成立する箇所まで、全ての要素(アクションとテスト)を実行します。
FCサブプログラムがコールされる
ループ処理の中で、既にこのサイクルで1回実行されたアクションに再度到達
SFC
(1)イニシャルステップの直後のトランジション条件が不成立の場合
イニシャルステップのノンストアードアクションをもう一度実行します。
(2)イニシャルステップの直後のトランジション条件が成立した場合
直後のステップが活性化され、イニシャルステップは非活性になります。
イニシャルステップのパルスアクション(P0アクション)を1回だけ実行します。
直後のステップのパルスアクション(P1)を1回だけ実行します。
活性化されたステップのノンストアードアクション(N)を1回実行します。
<<そ の次のサイクル>>
FC
以下の条件が成立する箇所まで、全ての要素(アクションとテスト)を実行します。
FCサブプログラムがコールされる
ループ処理の中で、既にこのサイクルで1回実行されたアクションに再度到達
SFC
(1)現在活性化しているステップの直後のトランジションの条件が成立しない場合
現在活性化しているステップのノンストアードアクションが再度実行されます
(2)トランジションの条件が成立した場合
現在活性化しているステップが非活性化し、直後のステップが活性化します
非活性化したステッップのパルスアクション(P0)を1回実行します。
活性化したステップのパルスアクション(P1)を1回実行します。
活性化したステップのノンストアードアクションを1回実行します。
<<サ ブプログラムコール方法の違いについて>> ...
- SFCプログラムからFBD言語のサブプログラムを起動するには、どのように記述するのか?
例として、以下のように記述すると、エラー008-0035(変数の型の不一致)が発生してしまう。
action(P):
sw:=output();
end_action;
(* sw...論理値型変数、output....FBDサブプログラム *)
上記のプログラムは、文法的には問題はありません。上記のエラーは、文法以外の所にエラーがあります。
考えられる原因
プログラムの2行目の,代入時の型が異なっている可能性があります。左辺swが論理値型であるのに、右辺のサブプログラムが論理値型でないからかもしれません。
とくに、ISaGRAF Ver.3では新規にサブプログラムやファンクションを作ると、出力パラメータの型(タイプ)は、デフォルトでは整数型になりますので注意が必要です。
対処
サブプログラムの出力パラメータの型を修正します。サブプログラムの編集時に,メニューの「ファイル」-「パラメータ」を実行してください。パラメータのなかに、サブプログラムと同じ名前のものがあります。これを正しい型にします。
今回の例では,outputを「論理値」にしてください。
下の図を見てください。サブプログラムは、デフォルトの出力パラメータが整数型になっています。出力のパラメータが重要でない(親プログラムで必要としない)プログラムを作る場合、型の変更を忘れがちですので注意が必要です。
...
- SFCプログラムからファンクションをコールするにはどうすればよいでしょうか?また、SFCとFBD言語を組み合わせて使用するにはどうすればよいのですか?
SFCプログラムとFBD言語を組み合わせて使用する方法のサンプルです。
SFCのメインプログラムからFBDで記述したファンクションをコールするイメージです。
1-プログラムを作成します。
SFCプログラム-シーケンシャルセクション、メインプログラム
FBDプログラム-ファンクション
2-FBDのファンクションのパラメータインタフェースを定義します。
一般にファンクションの出力パラメータは1つで、プログラム名と同じ名前出なければなりません。
3-以下がFBDのファンクションのプログラム例です。
ファンクション名:"called"
出力パラメータ名:"called"(ファンクション名と同じ)
4-メインのSFCプログラムのステップの中でFBDプログラムをコールします。
...
- SFCプログラムで、1サイクル内で活性化したステップが同時に複数存在する場合、それぞれが同じファンクションをコールしていた場合問題はないのか。つまり、ファンクションのコードが再入してしまうが問題はないか?
ISaGRAFの1アプリケーション中のSFCステップは、それぞれ別のスレッドで実行されるわけではありません。例えば、2つのステップが1サイクル中で同時に活性化した場合、ステップ中の該当するアクションブロックはそのターゲットサイクル中に順番に実行されていきます。
したがって、ファンクションやサブプログラム類の呼び出しも、厳密には同時にコールされることはないので、問題はありません。
ただし、ISaGRAFのファンクションやサブプログラム自体のコードは再入可能ではありません。ファンクション内の全てのローカル変数はスタティックなデータで、メモリ上の決められた位置に保存され、ターゲット実行中は値が保持されます。
したがって、ファンクション内でファンクションをコールするような場合は問題が起きる場合もあります。
...
- SFC要素とFC言語の実行ルールはどのように違いますか?
FCとSFC言語の実行ルールを比較すると、以下のようになります。
<<最初のサイクル>>
FC
'Begin' アクションの活性化
FC言語は必ずBeginアクションからはじまりますが、ここにはプログラム処理を記述することはできません。
また、Beginアクションの活性化で1サイクル消費します。
SFC
イニシャルステップを活性化
イニシャルステップの中のパルスアクション(P1アクション)を1回だけ実行します。
同じくイニシャルステップの中に記述されたノンストアードアクション(N)も実行します。
<<2 番目のサイクル>>
FC
以下の条件が成立する箇所まで、全ての要素(アクションとテスト)を実行します。
FCサブプログラムがコールされる
ループ処理の中で、既にこのサイクルで1回実行されたアクションに再度到達
SFC
(1)イニシャルステップの直後のトランジション条件が不成立の場合
イニシャルステップのノンストアードアクションをもう一度実行します。
(2)イニシャルステップの直後のトランジション条件が成立した場合
直後のステップが活性化され、イニシャルステップは非活性になります。
イニシャルステップのパルスアクション(P0アクション)を1回だけ実行します。
直後のステップのパルスアクション(P1)を1回だけ実行します。
活性化されたステップのノンストアードアクション(N)を1回実行します。
<<そ の次のサイクル>>
FC
以下の条件が成立する箇所まで、全ての要素(アクションとテスト)を実行します。
FCサブプログラムがコールされる
ループ処理の中で、既にこのサイクルで1回実行されたアクションに再度到達
SFC
(1)現在活性化しているステップの直後のトランジションの条件が成立しない場合
現在活性化しているステップのノンストアードアクションが再度実行されます
(2)トランジションの条件が成立した場合
現在活性化しているステップが非活性化し、直後のステップが活性化します
非活性化したステッップのパルスアクション(P0)を1回実行します。
活性化したステップのパルスアクション(P1)を1回実行します。
活性化したステップのノンストアードアクションを1回実行します。
<<サ ブプログラムコール方法の違いについて>> ...
- SFCのステップに記述するP(パルス)アクションとN(ノーマル)アクションの違いはなんですか?
Pアクションは、ステップがアクティブ=活性化状態になったとき、最初の1回だけ実行する部分です。
微分接点の出力のようなものです。
Nアクションは、ステップがアクティブの間は、サイクルタイム毎に繰り返し実行する部分です。
...
- SFCプログラムはチャイルドSFCや並列分岐を使用して、同時に複数のプログラムを処理できるが、DOSのようなシングルタスクOSでも使用できるか?
SFCプログラムの実行には、マルチタスクシステムは必須ではありません。
ISaGRAFでは、全てのプログラムが「トリガ」によって同期的に実行されます。SFCの
並行処理とは実際には「同一サイクル内」で処理が実行されることを意味します。つまり、処理のプロセスとしては並行して行われますが、最初の入力の読み取りや最終的な出力の書きこみはこのサイクルの外で一元的に実行されます。
ISaGRAF Ver.4の場合は異なるコンフィグレーション上で複数のターゲットサイクルの処理が同時に実行可能です。
...
- SFCのステップやトランジションの内部を、複数の言語を混合して記述できるか?
ISaGRAF Ver.4の場合
ステップ
アクション単位で1種類の言語(LD、ST、ILのいずれか)で記述します。1個のステップに複数のアクションを記述することができます。
トランジション
ST言語またはLD言語で記述します。混合することはできません。
...
- SFC要素とFC言語の実行ルールはどのように違いますか?
FCとSFC言語の実行ルールを比較すると、以下のようになります。
<<最初のサイクル>>
FC
'Begin' アクションの活性化
FC言語は必ずBeginアクションからはじまりますが、ここにはプログラム処理を記述することはできません。
また、Beginアクションの活性化で1サイクル消費します。
SFC
イニシャルステップを活性化
イニシャルステップの中のパルスアクション(P1アクション)を1回だけ実行します。
同じくイニシャルステップの中に記述されたノンストアードアクション(N)も実行します。
<<2番目のサイクル>>
FC
以下の条件が成立する箇所まで、全ての要素(アクションとテスト)を実行します。
FCサブプログラムがコールされるループ処理の中で、既にこのサイクルで1回実行されたアクションに再度到達
SFC
(1)イニシャルステップの直後のトランジション条件が不成立の場合
イニシャルステップのノンストアードアクションをもう一度実行します。
(2)イニシャルステップの直後のトランジション条件が成立した場合
直後のステップが活性化され、イニシャルステップは非活性になります。イニシャルステップのパルスアクション(P0アクション)を1回だけ実行します。直後のステップのパルスアクション(P1)を1回だけ実行します。活性化されたステップのノンストアードアクション(N)を1回実行します。
<<その次のサイクル>>
FC
以下の条件が成立する箇所まで、全ての要素(アクションとテスト)を実行します。
FCサブプログラムがコールされるループ処理の中で、既にこのサイクルで1回実行されたアクションに再度到達
SFC
(1)現在活性化しているステップの直後のトランジションの条件が成立しない場合
現在活性化しているステップのノンストアードアクションが再度実行されます
(2)トランジションの条件が成立した場合
現在活性化しているステップが非活性化し、直後のステップが活性化します非活性化したステッップのパルスアクション(P0)を1回実行します。活性化したステップのパルスアクション(P1)を1回実行します。活性化したステップのノンストアードアクションを1回実行します。
<<サブプログラムコール方法の違いについて>>
FC
親FCプログラムの処理は、チャイルドFCプログラムの実行が終わるまでは待たされます。1つの親FCプログラムは同時に1つのチャイルドFCプログラムしか実行できません。
SFC
親SFCプログラムとチャイルドSFCプログラムは同時に実行されます。複数のチャイルドSFCプログラムを同時に実行することができます。親プログラムからチャイルドSFCプログラムを停止することができます。
<<プログラム要素の名前の対応について>>
FC アクション
FC テスト/コンディション
SFC ステップ (プログラムの実行を行う部分)
SFC トランジション (条件の判断を行う部分)
...
- SFC要素の「ステップ」と「トランジション」の意味と役割を教えてください。
ステップは,いくつかの処理を記述した,「状態」です。これに対して、トランジションはステップ(いわば状態)を切り替えるための「条件判断」です。
SFC言語は、複数の「状態」=ステップを用意しておき、変数の状態や経過時間などの「条件」=トランジションで現在稼働させるステップを選びます。つまり、
SFC要素・・・条件に合わせて動かすプログラム内容を切り替えるためのチャート
LD,FBD,ST,IL言語・・・実際にI/O操作を記述するための言語
となります。ただし、ISaGRAFでは,次の制限があります。
ISaGRAF Ver.4の制限事項
ステップやトランジションに記述できるのはST,IL,LD言語のみです。
...
- SFCのプログラムで、トランジション条件に GSn.t>t#1s; (* nはステップ番号 *) のように記述している。モニタリングすると、いつまでたっても条件を通過しないようだ。使用方法に誤りがあるのだろうか?
文法上の誤りはなくても、ずっと同じステップだけを実行しているように見える場合があります。これはシミュレーションやデバッグ時のワークベンチの画面更新が遅いためです。
たとえば、複数のステップを通過して成立するようなループのあるプログラムを記述すると、問題のトランジション以外のトランジション条件が常にTRUEの場合、
ステップ N を実行している時間=1秒 ≫ 他のステップを実行している時間
となってしまうため、デバッガーでは他のステップがアクティブの時の表示の機会がほとんどありません。そのため、画面表示に反映されず、他のステップが実行されていないようにみえる場合があります。
...
- SFCプログラムからファンクションをコールするにはどうすればよいでしょうか?また、SFCとFBD言語を組み合わせて使用するにはどうすればよいのですか?
SFCプログラムとFBD言語を組み合わせて使用する方法のサンプルです。
SFCのメインプログラムからFBDで記述したファンクションをコールするイメージです。
1-プログラムを作成します。
SFCプログラム-シーケンシャルセクション、メインプログラム
FBDプログラム-ファンクション
2-FBDのファンクションのパラメータインタフェースを定義します。
一般にファンクションの出力パラメータは1つで、プログラム名と同じ名前出なければなりません。
3-以下がFBDのファンクションのプログラム例です。
ファンクション名:"called"
出力パラメータ名:"called"(ファンクション名と同じ)
4-メインのSFCプログラムのステップの中でFBDプログラムをコールします。
...
- SFC要素、親プログラムからチャイルドプログラムを起動する際、必ず初期ステップから実行させる=自動的にチャイルドプログラム自身で自分を停止させる にはどのようにしたらよいか
まず、前提条件として、次のようなものがあります。
プログラムの起動・停止は親SFCからのみ行えます。言い換えると、プログラムは自分自身を停止できません。プログラムの起動はgstart命令で行うが、その際プログラムがすでに活動中であれば、命令は無意味になります。
そこで、ご希望の動作をさせるには次のような工夫が必要です。
(1)まず、グローバル変数
child_flag:論理値、チャイルドプログラムを動作・停止させるフラグを定義します。
(2)次に、チャイルドプログラムの内容を下記のようにします。
(3)親プログラムを下記のように記述します。
(a)初期ステップ
チャイルドプログラムをgstartする。
(b)チャイルドの処理を見かけ上起動するとき
パルスアクションで変数 Child_flagをtrueにする。
(c)チャイルドの処理を見かけ上停止するとき
1.変数 Child_flagをfalseにし、
2.gkill(チャイルドプログラム)し、
3.gstrat(チャイルドプログラム)する。
このようにすれば、実際にはチャイルドは常に動作しているものの、処理そのものを止めたり初期ステップから起動することが出来ます。
注意事項
ISaGRAF ver.4では gkill,gstart 命令はサポートしていません。
...
- SFCプログラムは1サイクル内で複数のステップを実行することができますが、その数に制限はありますか?
ターゲットのバージョンによって異なります。
ISaGRAF Ver.4
※注意
この記述をISaGRAF Ver.4のユーザーズマニュアルのワークベンチの章の以下のセクションと置き換えてください。
ワークベンチ-プロジェクトマネージャ-リンクアーキテクチャの表示-リソースのプロパティ-設定-詳細
ターゲットの起動時に、SFCのダイナミックな動作にかかわるメモリの割り当てを行います。このメモリの量は、リソースプロパティの設定の「詳細」で決定することができます。
ここでいう動的な動作とは、トークンの移動=活性化ステップの変移を意味します。
メモリ量はSFCのプログラム数に比例した値になります。
NbElmt = (比例係数 × SFCプログラム数 + オフセット値)
必要なメモリサイズ[バイト] = N × NbElmt × sizeof(typVa)
ここで、
N = 5 (SFC エンジンの設定によって決定される定数)typVa :ミディアムメモリモデルの場合、2 (16ビット)
ラージメモリモデルの場合、4 (32ビット)NbElmt ...
- SFCプログラムで、1サイクル内で活性化したステップが同時に複数存在する場合、それぞれが同じファンクションをコールしていた場合問題はないのか。つまり、ファンクションのコードが再入してしまうが問題はないか?
ISaGRAFの1アプリケーション中のSFCステップは、それぞれ別のスレッドで実行されるわけではありません。例えば、2つのステップが1サイクル中で同時に活性化した場合、ステップ中の該当するアクションブロックはそのターゲットサイクル中に順番に実行されていきます。
したがって、ファンクションやサブプログラム類の呼び出しも、厳密には同時にコールされることはないので、問題はありません。
ただし、ISaGRAFのファンクションやサブプログラム自体のコードは再入可能ではありません。ファンクション内の全てのローカル変数はスタティックなデータで、メモリ上の決められた位置に保存され、ターゲット実行中は値が保持されます。
したがって、ファンクション内でファンクションをコールするような場合は問題が起きる場合もあります。
...
- SFCプログラムは1サイクル内で複数のステップを実行することができますが、その数に制限はありますか?
ターゲットのバージョンによって異なります。
ISaGRAF Ver.4
※注意
この記述をISaGRAF Ver.4のユーザーズマニュアルのワークベンチの章の以下のセクションと置き換えてください。
ワークベンチ-プロジェクトマネージャ-リンクアーキテクチャの表示-リソースのプロパティ-設定-詳細
ターゲットの起動時に、SFCのダイナミックな動作にかかわるメモリの割り当てを行います。このメモリの量は、リソースプロパティの設定の「詳細」で決定することができます。
ここでいう動的な動作とは、トークンの移動=活性化ステップの変移を意味します。
メモリ量はSFCのプログラム数に比例した値になります。
NbElmt = (比例係数 × SFCプログラム数 + オフセット値)
必要なメモリサイズ[バイト] = N × NbElmt × sizeof(typVa)
ここで、
N = 5 (SFC エンジンの設定によって決定される定数)typVa :ミディアムメモリモデルの場合、2 (16ビット)
ラージメモリモデルの場合、4 (32ビット)NbElmt は結果として、1サイクルで処理可能なトランジションの最大数です。 ...