本記事はラダー言語を対象として記述しています。
本記事中に登場するファンクションブロックは全てサブルーチン型を想定しています。
この記事の対象
- FX3シリーズでのラダープログラミング経験者
- 構造型では無い形式、ここではデバイスプログラムと呼ぶ
- iQ-Fシリーズのラベルをちょっと使ってみようと考えている方
はじめに
ラベルを使用したプログラムは非常に便利なのですが、デバイスプログラムから移行する際にいくつかつまづいた点があったので記事にしました。
グローバルラベルとローカルラベルの使い分けをどうするか
これは例外はありますが単純に下記で区分けしました
グローバルラベルの用途
- プログラムブロックの外部に入出力する必要があるもの
- I/Oデバイスを割り付けるもの
- GOT(HMI)に表示するもの
- ネットワーク通信など、リンクリフレッシュデバイスを割り当てるもの
- 他のブログラムブロックへ伝達する情報
大量のラベルを定義する必要がある場合、この部分はラベルを使用せず従来通りデバイスを使用する方法を好む方もいるかも知れません。
ここには記載しませんが構造体と配列を使用して先頭だけ指定すればあとは全て連番でデバイスが割付くテクニックなどを使用すれば、ラベルエディタでラベルにデバイスを割り当てた方がデバイスを入れ替える際などスムーズに行えます。
ローカルラベルの用途
- プログラムブロックの内部のみで使用する
- 外部からは参照できず、別々のプログラムブロックに同じ名前のローカルラベルが存在しても良い
- 計算の途中経過だったり、順次動作の進行状況だったりを示すラベルを配列で適当に5個とか10個とか素早く確保できるのでとっても楽ちん
ラベルでは連続したデータをどのように扱うか
配列を使用する
デバイスプログラムの場合、乗算命令など命令によって先頭になるデータデバイスを指定すれば勝手に連番で結果が出力されていました。
そのような場合、ラベルプログラミングでは配列を使用します。
複数のデバイスにまたがって結果が返ってくる命令ではラベル配列を使用すると覚えましょう。
なお、16bit乗算命令などは結果を32ビット型ラベル(配列で無い)に入れることも16ビット型配列ラベルに入れることも可能です。
構造体を使用する
配列は同じデータ型を連続した番号で扱えるようにした集合ですが、ラベルでは構造体という違うデータ型をまとめた集合も取り扱えます。
構造体はデバイスプログラムでは類似する要素が無かったので、ここではこれ以上取り扱いません。
基本データ型について
ワードについて、[符号付き]と[符号なし]のどちらを使うべきか最初は悩んでいたのですが、今はとりあえず[符号付き]を標準にしています。
クラスについて
CONSTANTの使い道
- 盤面にHMI(GOT)が無く、調節計とPLCが通信しているというシステムで設定値をまとめるために使用した
- ものの本によると数字だと置き換え操作で意図せぬ置き換えが発生するのでそれを防ぐために定数を使用すると記載あり
RETAIN(ラッチ)の注意事項
- ラッチラベルにデバイスを割り付ける場合はラッチデバイスを割り付ける
- デバイスを割り付けない場合、プログラム書き換え時に注意が必要
- SM9353 OFF時 RETAINラベルもクリアされる
- SM9353 ON時 RETAINラベルは保持
PUBLICの使い方
ファンクションブロックのみで使用できるクラスです。
構造体型ラベルとして
「ファンクションブロックのインスタンス名.PUBLICラベル名」
でファンクションブロックの外で使用することができます。
IN_OUTの使い道
ファンクションブロックのみで使用できるクラスです。
ST言語の本を読むと配列や構造体をファンクションブロックに引き渡すのが一般的な使い方みたいです。
オムロン調節計のプログラムレス通信デバイスを処理するファンクションブロックを作成したのですが、リードオンリーとリードライトが混ざっている30点の通信データを構造体で引き渡した時、便利だなと思いました。
ラベルの命名について
入力補完が効きやすいので原則はスネーク記法を採用しています。
下記を判定する記号がラベル名に入るようにしています。
- グローバルかローカルか
- 構造体か
- 基本データ型は何か
- 配列か
プログラムを組むときに見分けが付くという面より、入力時に絞り込みが効くという面でのメリットを大きく感じています。
「配列か」に関しては入力補完は関係ないのですが、添え字要るんだったっけ?と迷うことが結構発生したので付けるようにしました。
デバイス番号も人に伝えるときにIDとして非常に優秀だったので場合に応じてラベル名にもID要素が要るかなと考えています。
ラッチラベル容量の心配
初期設定では1Kと少なめですが、ラッチラベルにラッチデバイスを割り付けるとラッチラベルの容量は消費しないので心配する必要はありませんでした。
私の組み方ではラッチが必要なものはGOTに表示させるものが主なのでほぼ必ずデバイスが割り付く格好になります。
2024/05/11追記
ユーザーFBはインスタンス1ヶにつき最低でもラッチラベル16ワードが予約領域として必ず消費される仕様です。
初期設定では最大で64個までユーザーFBのインスタンスを生成ができます。
それ以上必要な場合はCPUパラメータの変更が必要になりますが、FX5UJはラッチラベルエリアの変更ができないので注意が必要です。
おわりに
ラベルを使用するにあたって心理的につまずいたことをつらつらと書きました。
新しいことに挑戦するのに
「全部オッケー大丈夫!」
とはなかなかなりませんよね。