はじめに
ここまで「いわゆる構造化プログラミング」として4回に分けて記事にしました。
しかし、良いことばかりでは無く、従来型プログラムに慣れていると引っかかるポイントがいくつかあったので雑多ですがオマケとして紹介します。
- オマケ1~構造体型ラベルの転送について
- オマケ2~ラベルプログラムでの一括処理の違いについて
- オマケ3~ラッチラベルで注意することと全変換への対応について
あたりについて書きたいと思いますが、気が変わって歴史修正するかもしれません。
構造体型ラベルの転送について
1.構造体で多点数を転送する方法
- ST又はインラインSTを使用する
- 型が同じ構造体のインスタンス同士の代入で記述できます
- 構造体型ラベルにデバイスが割り付けられているとステップ数が増大します
- 汎用ファンクションの算術ファンクションを使用する
- 算術ファンクション 「MOVE」を使用する
- 構造体型ラベルにデバイスが割り付けられているとステップ数が増大します
- CPUユニット命令を使用する
2.デバイス割り付けた構造体型ラベルを転送する際のステップ数の増大に対する考え方と対応
デバイスを割り付けた構造体型グローバルラベルを転送すると、内部ではデバイス1点ずつのMOV命令に変換され、ステップ数が増大します。
この事がどのようにプログラミングに影響するか考えます
プログラム容量について
ハッキリしたことは言えませんが、従来1万ステップ程度で収まるプログラムであれば2,3倍のステップ数が必要になる可能性があります。
私の場合は48,000~64,000ステップの間に収まる事はほぼ確実なので問題視していませんが、皆さんの場合はどうなのか正直分かりません。
スキャンタイムについて
プログラムを全てMOV命令で埋め尽くしたとして概算します。
MOV命令4ステップ、命令実行時間(高速命令)として
- FX5S ON 0.1μsec
- 命令実行時間 0.1μsecx48,000/4=1.2msec
- FX5U ON 0.034μsec
- 命令実行時間 0.034μsecx64,000/4=0.544msec
私の場合はこの程度のスキャンタイムの増加は全く問題の無いプログラムしか組みませんが、影響がある方は事前に詳細な検討が必要かと思われます。
BMOVやBLKMOVBを使用してステップ数を削減できる
主にデバイスを割り付けてあるラベル同士での転送に使用します。
以前、構造体のメンバを8とか10とか連番で決まった数用意するというのはこれを行うためでもあります。
転送数の指定を間違えると思わぬバグを招くので十分注意してください。
構造体型ラベルにデバイスを割り付けてある場合はデバイス転送と同じ考えでBMOV系の命令を使用し、割付が無い場合はCPU命令以外でのSTなどでの転送を行うのが定石でしょうか。
ステップ数が許容できる範囲ならデバイスを割り付けていてもSTやMOVEでの転送でも良いでしょう。
マクロ型ファンクションブロックを使用する
マクロ型ファンクションブロックを使用すると、FBへの入出力は転送では無くFBのロジック内へ直接書き込まれる形で変換されるので転送によるステップ数の増加はありません。
但し、処理の方がプログラム中に配置したFBのインスタンスの数だけステップを費やす事になります。
三菱で用意しているユニットFBが全てマクロ型ファンクションブロックなのは、FBの入力に用いる巨大なユニットラベルの転送を行わないためです。
おわりに
構造体型ラベルの転送について、プログラムをしていてステップ数の増加に驚いたので記事にしてみました。
この辺はプログラムの本質に関係ない小賢しい話ではありますが、過渡期として必要なテクニックと考えて諦めています。