【GX Works3】データ変換命令の使い方|BCD/BIN・整数⇔実数(INT2FLT/FLT2INT)まで総まとめ

概要

PLCの内部では、D0のようなワードデバイスに入っている数値は基本的にBIN(2進数)として扱われ、四則演算も比較もこのBIN形式のまま行われます。ところが現場でPLCとつなぐ相手が、7セグ表示器やサムホイールスイッチのようなBCD入出力タイプの機器だったり、A/D変換値をmm単位や%といった小数点付きの物理量に換算したい計算だったりすると、そのままのBIN整数では話が噛み合いません。こうした「接続先の都合」や「計算の都合」に合わせて数値の形を変えるのが、データ変換命令の役割です。まずはどんな場面でどの命令を使うのか、対応表から見ていきます。

やりたいこと使う命令
7セグ表示器(BCD入力タイプ)に数値を出すBCDP
サムホイールスイッチの設定値を読み込むBINP
5桁以上(〜8桁)の表示器・設定器とつなぐDBCDP / DBINP(32bit版)
整数を実数にして小数点付きの計算をしたいINT2FLTP(32bitはDINT2FLTP
実数の計算結果を整数に戻すFLT2INTP(四捨五入・32bitはFLT2DINTP

BCD / BIN(4桁・表示器と設定器の接続)

書式

出典: MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226 / ops/refs/instructions/07_conversion.md より転記。

命令記号実行条件主なオペランド/データ型動作
BCD / BCDP常時実行/立上り(s) BINデータ 0〜9999/(d) BCD4桁BIN16→BCD4桁変換(表示器への出力)
BIN / BINP常時実行/立上り(s) BCD4桁 0〜9999/(d) BIN16BCD4桁→BIN16変換(設定器からの入力)

BCDは1桁を4bitで表す形式(4桁で16bit)。BCDは(s)が0〜9999以外、BINは(s)の各桁に0〜9以外があるとエラー(3401H・SD0に格納)。BIN/DBINはSM754をONするとこのエラーを検出しない設定にできる。

動作

BCD D0 K4Y0 のラダー図(D0の値を4桁BCD形式でY0〜YFへ出力)。4桁表示器に繋がるイメージをコメントで示す
図1:BCD D0 K4Y0を実行すると、D0に入っている数値が4桁のBCD形式に変換され、Y0〜YFの16点へ出力されます。Y0〜YFはそのまま4桁の7セグメント表示器につながり、D0の値が現場の表示器にそのまま数字として映し出されるイメージです。
BIN K4X0 D0 のラダー図(X0〜XFの4桁BCD入力をBINに変換してD0へ格納)。サムホイールSWからの入力をコメントで示す
図2:BIN K4X0 D0を実行すると、X0〜XFの16点に入ってきた4桁のBCD入力がBIN形式に変換され、D0へ格納されます。X0〜XFにはサムホイールスイッチがつながっているイメージで、オペレーターがダイヤルで設定した数値が、そのままD0の数値としてプログラムで使えるようになります。

BCD入出力タイプの表示器やサムホイールスイッチは、1桁を4bit(8421コード)で表すBCD形式で信号をやり取りします。一方でPLC内部の演算は基本的にBIN(2進数)で行われるため、境界であるY0〜YFやX0〜XFの手前でBCD⇔BINの変換を挟む必要があります。ラダー上では、変換先・変換元のBCD側をK4Y0やK4X0のように「K4」(4桁分=16点)という桁数指定とセットで書くのが定番の組み方です。この桁数指定を間違えると、必要な桁数分の点数が確保されず、意図しないY・Xまで巻き込んでしまうので注意してください。

サンプルコード

①BCDPで生産数カウント値を4桁表示器へ出力する

[X0  BCDP  D0  K4Y0 ]

D0に生産数のカウント値(例:1234)が入っているとして、X0の立上りでD0の値を4桁のBCD形式に変換し、Y0〜YFへ出力します。Y0〜YFに4桁の7セグメント表示器をつないでおけば、D0の生産数がそのまま現場の表示器に映し出されます。

②BINPでサムホイールの設定値を取り込む

[X1  BINP  K4X0  D10 ]

X0〜XFにサムホイールスイッチがつながっているとして、X1の立上りでX0〜XFの4桁BCD入力をBIN形式に変換し、D10へ格納します。取り込んだD10の値はすでにBIN(普通の整数)になっているので、そのままタイマの設定値や比較命令の相手として使えます。BCDのまま比較しようとすると数値として正しく扱えないので、この変換を挟むのがポイントです。

DBCD / DBIN(8桁・32bit版)

書式

出典: MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226 / ops/refs/instructions/07_conversion.md より転記。

命令記号実行条件主なオペランド/データ型動作
DBCD / DBCDP常時実行/立上り(s) BIN32 0〜99999999/(d) BCD8桁BIN32→BCD8桁変換
DBIN / DBINP常時実行/立上り(s) BCD8桁 0〜99999999/(d) BIN32BCD8桁→BIN32変換

BCD/BIN(4桁)の32bit版。各オペランドはデバイス2点をペアで使用。範囲外はエラー3401H。

動作

DBCD D0 K8Y0 のラダー図(32bitデータを8桁BCD形式でY0〜Y1Fへ出力)
図3:DBCD D0 K8Y0を実行すると、D0・D1の2ワードで表す32bitの値が8桁のBCD形式に変換され、Y0〜Y1Fの32点へ出力されます。4桁(最大9999)では収まらない桁数の値を、8桁表示器へそのまま出す場合の形です。

BCD/BIN(4桁)だけでは最大9999までしか表せないため、生産数の累計のように桁数が足りなくなる値には、8桁まで扱えるDBCD/DBINを使います。オペランドの書き方は4桁版と同じくD0のように1つのデバイス番号を書くだけですが、D付き命令なのでD0を指定した時点でD0・D1の2ワードがペアで使われる点は32bit演算と同じです。BCD側もK8Y0のように8桁分(32点)の桁数指定とセットで使います。

整数→実数変換(INT2FLT / DINT2FLT)

書式

出典: MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226 第11章 実数処理 11.1 浮動小数点命令(PDF pp.890-895)/ ops/refs/instructions/07_conversion.md(2026-07-15追記分)より転記。

命令記号実行条件主なオペランド/データ型動作
INT2FLT / INT2FLTP常時実行/立上り(s) 符号付きBIN16(-32768〜32767)/(d) 単精度実数(先頭デバイス)BIN16→単精度実数変換
UINT2FLT / UINT2FLTP常時実行/立上り(s) 符号なしBIN16(0〜65535)/(d) 単精度実数符号なしBIN16→単精度実数変換
DINT2FLT / DINT2FLTP常時実行/立上り(s) 符号付きBIN32/(d) 単精度実数BIN32→単精度実数変換
UDINT2FLT / UDINT2FLTP常時実行/立上り(s) 符号なしBIN32/(d) 単精度実数符号なしBIN32→単精度実数変換

演算エラーなし。(d)はデバイス2点使用。単精度実数の有効桁は2進24bit(10進約7桁)のため、32bit整数が±16777215を超えると変換値に誤差が出る(25ビット目を0捨1入・26ビット目以降切り捨て)。STはエンジニアリングツール1.035M以降対応。

動作

X0 → INT2FLTP D0 D100 のラダー図(整数D0 → 単精度実数D101,D100へ変換)。コメントに「整数100 → 実数100.0」を記載
図4:X0の立上りでINT2FLTP D0 D100を実行し、D0に入っている整数値を単精度実数に変換してD100へ格納するラダー図です。ラダー上ではD100しかオペランドに書きませんが、単精度実数は2ワード分のデータのため、実際にはD100とD101の2ワードにまたがって格納されます。
アナログ入力値(0〜4000)を0.0〜100.0%にスケーリングするラダー図。INT2FLTで実数化→実数除算→結果格納 の一連の処理
図5:A/D変換したアナログ入力値(0〜4000)をINT2FLTPでいったん単精度実数に変換し、実数の除算・乗算で0.0〜100.0%の百分率に変換する一連のラダー図です。整数のまま4000で割って100を掛けようとすると、途中の除算で小数点以下が切り捨てられてしまいますが、先に実数化しておくことでこの精度落ちを避けられます。

整数のままでは割り算のたびに小数点以下が切り捨てられてしまいます。例えば125を60で割ると、整数のBIN演算では商2・余り5という「割り切れない部分は余りに追い出す」世界になりますが、アナログ値のスケーリングや単位換算のように小数点以下の精度が欲しい場面では、これでは困ります。そこでいったんINT2FLTP(32bitならDINT2FLTP)で実数に変換してから割り算・掛け算を行うのが、この手の換算処理の定番の流れです。ただしDINT2FLTでは、単精度実数の有効桁が約7桁しかないため、±16777215を超える大きな32bit整数を実数化すると変換結果に誤差が生じる点は覚えておく必要があります。

実数→整数変換(FLT2INT / FLT2DINT)

書式

出典: MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226 / ops/refs/instructions/07_conversion.md より転記。

命令記号実行条件主なオペランド/データ型動作
FLT2INT / FLT2INTP常時実行/立上り(s) 単精度実数(-32768〜32767)/(d) 符号付きBIN16単精度実数→BIN16変換。小数点以下1桁目を四捨五入
FLT2DINT / FLT2DINTP常時実行/立上り(s) 単精度実数(-2147483648〜2147483647)/(d) 符号付きBIN32単精度実数→BIN32変換。四捨五入

(s)が変換先の範囲外のときエラー3401H、-0・非正規化数・非数のときエラー3402H。例: -1234.5 → -1235(四捨五入)。

動作

計算そのものは実数のまま進め、その結果を表示器へ出したり比較命令にかけたり、整数デバイスへ渡したりする直前でFLT2INTP(32bitならFLT2DINTP)を使って整数に戻す、というのが基本の流れです。ここで注意したいのは、FLT2INTPは小数点以下を切り捨てるのではなく四捨五入するという点です。マニュアルの例でも-1234.5が-1235に変換されており、単純に整数部分だけを取り出す動作ではありません。

よくある誤解

①表示器につなぐなら、とりあえずBCD変換で正解というわけではない

BCD⇔BIN変換が必要になるのは、接続する相手がBCD入出力タイプの機器のときだけです。表示器やスイッチの中には、最初からBIN値をそのまま受け取れる機種や、シリアル通信で数値をやり取りする機種もあります。「表示器につなぐから念のためBCD変換しておく」ではなく、接続する機器の仕様書でBCD入出力かどうかを先に確認してから、BCD命令が必要かどうかを判断してください。

②FLT2INTは切り捨てではなく四捨五入

FLT2INT(P)・FLT2DINT(P)は、小数点以下1桁目を四捨五入した値を整数側に格納します。マニュアルの例でも-1234.5は-1235に変換されており、小数部分を単純に切り捨てる動作ではありません。「整数化=端数を切り捨てる」というイメージのまま設計すると、変換後の値が想定と1ずれることがあるので注意してください。

③大きな32bit整数を実数化すると誤差が出る

単精度実数はデータとしては32bitですが、2進数として表現できる有効桁数は24bit(10進で約7桁)しかありません。そのため±16777215を超える32bit整数をDINT2FLT(P)で実数に変換すると、25ビット目を0捨1入し26ビット目以降を切り捨てた値になり、元の整数と完全には一致しなくなります。生産数の積算カウンタのような大きな値をそのまま実数化して精密な比較に使うのは避けてください。

④BCDは範囲外や負数でエラー停止する

BCD(P)・DBCD(P)の(s)は0〜9999(8桁版は0〜99999999)の範囲でなければならず、範囲外だとエラー(3401H)になります。特に見落としやすいのが負数で、演算結果がマイナスに振れる可能性のある値をそのままBCD変換に渡すと、範囲外としてエラーになってしまいます。BCDへ渡す前に、その値が負にならないことを確認しておくか、負にならないような計算の組み方をしておく必要があります。

関連命令

関連記事