HOME > ソフテックだより > 第199号(2013年12月4日発行) 技術レポート「PLCプログラムでの数値データ取り扱い 〜実数データ編〜」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ


ソフテックだより 第199号(2013年12月4日発行)
技術レポート

「PLCプログラムでの数値データ取り扱い 〜実数データ編〜」

1. はじめに

私は入社18年目の社員です。入社後からPLC(Programmale Logic Controller)及びFAVIEWの開発案件に携わっています。
ソフテックだより第189号の技術レポートで「PLCプログラムでの数値データ取り扱い」をテーマに、整数データについての実践的な形でのラダープログラムを紹介しました。
今回はその第2弾として、実数データを取り扱ったラダーブログラムを紹介します。

2. ラダープログラムで取り扱える数値データ

前回のおさらいとして、以下に主要PLCメーカー/機種で取り扱える数値データ(整数データ/実数データ)をまとめます。
ラダープログラムで取り扱える数値データは、PLCメーカー/機種によって異なります。
なお、機種は現状の最新機種を対象としています。

メーカー 機種 整数データ 実数データ
三菱電機 Qシリーズ 2バイト符号有
4バイト符号有
単精度浮動小数点(4バイト)
倍精度浮動小数点(8バイト)
横河電機 FA−M3シリーズ 2バイト符号有
4バイト符号有
8バイト符号有
単精度浮動小数点(4バイト)
倍精度浮動小数点(8バイト)
オムロン CJシリーズ 2バイト符号有
2バイト符号無
4バイト符号有
4バイト符号無
単精度浮動小数点(4バイト)
倍精度浮動小数点(8バイト)
キーエンス KV-5500/5000/3000シリーズ 2バイト符号有
2バイト符号無
4バイト符号有
4バイト符号無
単精度浮動小数点(4バイト)
倍精度浮動小数点(8バイト)

表1. 主要PLCメーカー/機種で取り扱える数値データ

3. デバイスコメントでデータ型を明確にする

ここも前回と同じですが、非常に大切なので、再度ご紹介します。
ラダープログラムに限らず、数値データを扱う上で、データ型は非常に重要です。
データ型を間違えて演算を行うと正しい結果が得られず、重大なトラブルに繋がる可能性もあります。
ソフテックでは、ラダープログラムで数値データを扱うとき、デバイスのコメントに、必ずデータ型を記載します。

データ型の記載方法ですが、演算命令に準拠すると分かりやすいと思います。
ラダープログラムの演算命令では、扱うデータ型をアルファベット1文字で表現することが一般的なので、そのアルファベットに使用する、というものです。
「アルファベット1文字+数字」で記載することができるので、デバイスコメントの文字数制限を圧迫することもありません。

図1に横河電機製FA−M3を使用した場合のデバイスコメントを示します。

デバイスコメント例
図1. デバイスコメント例

図1において、各デバイスで扱う数値データは、以下となります。

D00001
…2バイト符号有整数
D00003〜D0004
…4バイト符号有整数 (Long wordの略で“L”を使用)
D00006〜D0009
…8バイト符号有整数 (Double long wordの略で“D”を使用)
D00011〜D0012
…単精度浮動小数点 (Floatの略で“F”を使用)
D00014〜D0017
…倍精度浮動小数点 (FA-M3のプリフィックスに準拠し“E”を使用)

4. ラダープログラム作成例

4-1. モデル1(単精度浮動小数点の取り扱い)

図2のモデルは、温度コントローラから通知される温度データについて、PLCが最大/最小/平均温度を求め、パソコンに通知する、というものです。
ここでは、最大/最小/平均温度を求めるラダープログラムを作成してみます。
なおPLCは横河電機製FA-M3シリーズとします。

モデル1
図2. モデル1

モデル1のデバイスコメントを図3に示します。
D311〜に演算過程で使用するワークデバイスをマッピングしています。

モデル1 デバイスコメント
図3. モデル1 デバイスコメント

モデル1では、まず温度1、温度2の2バイト符号有整数を単精度浮動小数点データに変換します。
そのラダープログラムを図4に示します。

モデル1 データ変換
図4. モデル1 データ変換

モデル1の最大温度、最小温度を求めるラダープログラムを図5に示します。

ポイント!

比較演算を行っている回路の先頭に単精度浮動小数点データの比較を行っている事を示す「F」が表示されている事を確認して下さい。
データ転送を行っている回路の先頭にロングワードデータ(4バイトデータ)の転送を行っている事を示す「L」が表示されている事を確認して下さい。
定数で浮動小数点データを入力する場合は「%」を先頭につけます。

モデル1 最大温度、最小温度
図5. モデル1 最大温度、最小温度

モデル1の平均温度を求めるラダープログラムを図6に示します。
温度1と温度2を加算して合計温度を算出し、合計温度を2で除算して平均温度を求めています。

ポイント!

算術演算を行っている回路の先頭に単精度浮動小数点データの算術を行っている事を示す「F」が表示されている事を確認して下さい。

モデル1 平均温度
図6. モデル1 平均温度

4-2. モデル2(倍精度浮動小数点の取り扱い)

図7のモデルについて、最大/最小/平均温度を求めるラダープログラムを作成してみます。
モデル1との相違点は、パソコン側のデータ型が倍精度浮動小数点という所です。

モデル2
図7. モデル2

モデル2のデバイスコメントを図8に示します。
D421〜に演算過程で使用するワークデバイスをマッピングしています。

モデル2 デバイスコメント
図8. モデル2 デバイスコメント

モデル2では、まず温度1、温度2の2バイト符号有整数を倍精度浮動小数点データに変換します。
そのラダープログラムを図9に示します。

ポイント!

横河電機製FA-M3シリーズは2バイトデータから倍精度浮動小数点データに変換する命令が無い為、一度4バイトデータに変換してから、倍精度浮動小数点データに変換を行う必要があります。
今回は、単精度浮動小数点に変換してから倍精度データに変換しています。

モデル2 データ変換
図9. モデル2 データ変換

モデル2の最大温度、最小温度を求めるラダープログラムを図10に示します。

モデル2 最大温度、最小温度
図10. モデル2 最大温度、最小温度

モデル2の平均温度を求めるラダープログラムを図11に示します。
温度1と温度2を加算して合計温度を算出し、合計温度を2で除算して平均温度を求めています。

モデル2 平均温度
図11. モデル2 平均温度

参考

以下に、キーエンスKVシリーズでのプログラム(スクリプト記述形式)を示します。
デバイスアドレスの後に記述されているものは、サフィックスと呼ばれるものでデータ型を表します。“.DF”は倍精度浮動小数点型です。
スクリプトの場合は、ラダープログラムと違って演算子の記述が整数と浮動小数点で変わらない為、サフィックスに気を付けるだけで楽にプログラミングする事が可能です。

' ================================================================================
' モデル2 最大/最小/平均温度
' ================================================================================

'------------------------------------------
' 最大温度を求める

	D00441.DF = -32768   		' 最大温度をデータ範囲最小の-32768で初期化

	IF (D00431.DF >= D00441.DF) THEN
		D00441.DF = D00431.DF	' 最大温度を温度01とする
	END IF

	IF (D00435.DF >= D00441.DF) THEN
		D00441.DF = D00435.DF	' 最大温度を温度02とする
	END IF

	D00404.DF = D00441.DF		' パソコンIFデバイスに、最大温度を格納

'------------------------------------------
' 最小温度を求める

	D00445.DF = 32767	    	' 最小温度をデータ範囲最大の32767で初期化

	IF (D00431.DF <= D00445.DF) THEN
		D00445.DF = D00431.DF	' 最小温度を温度01とする
	END IF

	IF (D00435.DF <= D00445.DF) THEN
		D00445.DF = D00435.DF	' 最小温度を温度02とする
	END IF

	D00408.DF = D00445.DF		' パソコンIFデバイスに、最小温度を格納


'------------------------------------------
' 平均温度を求める

	D00412.DF = (D00431.DF + D00435.DF) / 2	' 温度01と温度02を足して2で割る

5. おわりに

いかがでしたでしょうか?
一見すると、整数データとあまり変わりは無いようですが、データ領域の確保が必要だったり、データ転送時に何バイトデータなのかを意識する必要があったりと、なにかと手間がかかります。
また、実数データの場合はスクリプトを使用する事も検討した方が良いと思います。
本稿が少しでも皆様のお役に立てていただければ幸いです。

(T.T.)

[参考文献]
三菱電機
−MELSEC-Q/L プログラミングマニュアル(共通命令編)
横河電機
−シーケンスCPU 説明書 命令編
オムロン
−CJ2 CPUユニットユーザーズマニュアルソフトウェア編
キーエンス
−KV-5500/5000/3000/1000 命令語リファレンスマニュアル

関連ページへのリンク

関連するソフテックだより

ページTOPへ