【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) BIN16 | BCD4桁→BIN16変換(設定器からの入力) |
BCDは1桁を4bitで表す形式(4桁で16bit)。BCDは(s)が0〜9999以外、BINは(s)の各桁に0〜9以外があるとエラー(3401H・SD0に格納)。BIN/DBINはSM754をONするとこのエラーを検出しない設定にできる。
動作
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) BIN32 | BCD8桁→BIN32変換 |
BCD/BIN(4桁)の32bit版。各オペランドはデバイス2点をペアで使用。範囲外はエラー3401H。
動作
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以降対応。
動作
整数のままでは割り算のたびに小数点以下が切り捨てられてしまいます。例えば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へ渡す前に、その値が負にならないことを確認しておくか、負にならないような計算の組み方をしておく必要があります。
