【GX Works3】アナログ入力のスケーリング回路|4-20mAを工学値に変換する実例

スケーリングとは:ユニットが返すのは「ただの数値」

アナログ入力ユニットを初めてモニタしたとき、Dレジスタに「8000」という数字が入っているのを見て「……で、これは何℃なの?」と固まった経験はないでしょうか。あれが今回のテーマです。

流れを整理します。現場の温度センサや圧力センサ(伝送器)は、測った量を4-20mAのような電気信号で送ってきます。信号の種類そのものの話はアナログ信号の種類まとめ|4-20mA・0-10V・熱電対・測温抵抗体の使い分けで解説していますが、大事なのはこの先です。アナログ入力ユニットは受け取った電流をA/D変換して、ただの整数値(デジタル値)としてPLCに渡します。ユニットは「いま12mA来てます」を「8000」という数値に置き換えるだけで、それが何℃なのか・何MPaなのかは一切関知しません。

この「ただの数値」を、現場で意味の通る単位——℃・MPa・%——に直す計算がスケーリングです。センサ→(4-20mA)→ユニット→(デジタル値)→ラダーで工学値へ→(表示・判定に使う)。この最後の一段を自分で書くのが本記事の範囲です。なお、デジタル値の受け皿になるDレジスタの基礎は三菱PLCのデバイス種類まとめ|X・Y・M・L・D・T・Cの使い分けを参照してください。

変換の考え方:比例計算1本で終わる

スケーリングと聞くと難しそうですが、中身は中学校でやった比例計算1本です。

工学値 =(デジタル値 − デジタル下限)× 工学スパン ÷ デジタルスパン + 工学下限

ここで「スパン」は上限−下限、つまりレンジの幅のことです。本記事では、4-20mA入力に対してユニットがデジタル値0〜16000を返すと仮定して話を進めます。この0〜16000という数字はあくまで例で、分解能(デジタル値がいくつからいくつまでか)はユニットの機種・レンジ設定によって異なります。実機で組むときは、必ず使うユニットのマニュアルで自分のレンジ設定の値を確認してください。ここを確認せずに他人のラダーを流用すると、表示が全部ズレるという地味に嫌な事故になります。

例として、4-20mAで0.0〜200.0℃を送ってくる温度伝送器を考えます。対応関係はこうなります。

入力電流デジタル値(仮定)工学値
4mA(下限)00.0℃
12mA(中央)8000100.0℃
20mA(上限)16000200.0℃

両方の下限が0なので、式は「工学値 = デジタル値 × 工学スパン ÷ デジタルスパン」まで簡単になります。冒頭の「8000って何℃?」の答えは、8000×200÷16000=100℃、というわけです。下限が0でないレンジ(−50〜150℃など)では、最後に工学下限を足す一手間が加わるだけで、考え方は同じです。

ラダーでの作り方:乗算が先、除算が後

式をラダーに落とすとき、絶対に守ってほしい順番があります。掛け算を先に、割り算を後にです。

理由は、PLCの四則演算が整数演算だからです。先に割ってしまうと、小数点以下がその場で切り捨てられて情報が消えます。デジタル値4123(約51.5℃相当)で試すとこうなります。

(悪い例)先に割ってしまう
[M0  D/  D110 K16000 D120 ]   ← 4123÷16000=商0(この時点で情報が消滅)
[M0  D*  D120 K2000  D130 ]   ← 0×2000=0。何℃を測っても0のまま

16000で割った商は、デジタル値が16000未満である限りずっと0です。つまり先に割った瞬間、センサが何を測っていようが答えは0になります。逆に先に掛ければ、値が一度大きく膨らむだけで情報は失われません。「掛けてから割る」は整数演算の世界の鉄則です。

先に掛けると桁あふれが心配になりますが、そこは命令の仕様がカバーしてくれます。16bitの乗算(*)は結果が(d)と(d)+1の2ワード=32bitに広がって格納され、除算(/)は商が(d)・余りが(d)+1に入る、という仕様になっています(詳細は【GX Works3】四則演算命令の使い方|+ - * /・32bit・INC/DEC・WANDマスク処理まで総まとめを参照)。今回の例は16000×2000=3200万で16bitには到底収まらないため、最初から32bit版のD*・D/で余裕を持って組みます。工学値を10倍で持つ理由は次の章で説明するとして、先に完成形を見てください。

(良い例)0〜16000 → 0〜2000(℃の10倍値)に変換する
[M0  MOV D100 D110 ]          ← ユニットからのデジタル値を作業用D110へ
[M0  MOV K0   D111 ]          ← 上位ワードD111を0に(32bit値として扱う準備)
[M0  D*  D110 K2000  D120 ]   ← ×工学スパン2000 → 結果はD120〜D123
[M0  D/  D120 K16000 D130 ]   ← ÷デジタルスパン16000 → 商がD130,D131

M0はスケーリングを回す実行条件です。デジタル値がD100に入っている前提で書いていますが、ユニットからの読出し方法(リフレッシュ設定など)は機種で異なるので、そこは各ユニットの流儀に合わせてください。ポイントを3つ補足します。

①上位ワードの0クリアを忘れない。D*は(s)に指定したデバイスを2ワード1組の32bit値として読みます。D110だけ入れてD111にゴミが残っていると、まったく別の巨大な数として計算されます。今回の例はデジタル値が0〜16000の正の値なので、上位ワードは0で埋めれば正しい32bit値になります。

②D*の結果は4ワード分書き込まれる。32bit×32bitの結果は64bit幅、つまりD120〜D123の4ワードを占有します。今回の計算結果(最大3200万)は下位2ワードに収まるので、続くD/はD120,D121を読めば正しく割れますが、D122・D123を別の用途に使ってはいけません。演算のたびに黙って上書きされます。

③P無しの常時実行で構わない。演算命令は立上り実行(P付き)が基本、と覚えている人ほど引っかかるところです。スケーリングは「入力から表示値を作り直すだけ」の上書き型の計算なので、毎スキャン実行しても値が壊れません。むしろ常に最新の測定値に追従してくれるので、常時実行が素直です。危ないのはカウントアップや加算のような「前回の結果に積み上げる」累積型の演算で、あちらは毎スキャン実行すると暴走します。この区別がついていれば、Pの要否で迷わなくなります。

結果の商は0〜2000に収まるので、下位ワードのD130だけをMOVで表示用に渡せば足ります。レンジ設計によって商が16bitを超えるなら、DMOVで2ワードのまま次へ渡してください。

よくある罠:丸め・小数・断線

①整数除算は余りを黙って切り捨てる

D/の商は整数で、割り切れなかった分は余りとして別ワード(D/なら商の後ろの2ワード)に置かれるだけです。デジタル値4123なら、4123×2000=8,246,000を16000で割って商515・余り6000。この余り6000は工学値に反映されず、静かに消えます。エラーにも警告にもならないのがポイントで、「表示が微妙に飛び飛びになる」「基準器と最後の1桁が合わない」といった形で現れます。整数演算である以上ゼロにはできない性質なので、「そういうものだ」と知った上で、必要な桁が残る持ち方をするのが対策です。それが次の話につながります。

②小数第1位まで欲しければ「10倍値」で持つ

Dレジスタの整数に25.3℃は入りません。そこで現場でよく使われるのが、工学値を10倍した整数で持ち回る方法です。先ほどの例で工学スパンを200ではなく2000(=200.0℃の10倍)にしたのはこのためで、こうすると253という値が「25.3℃」を意味するようになります。PLCの中ではあくまで253という整数のまま演算・比較し、表示器側の小数点設定で「25.3」と見せる。小数を扱っていないのに小数第1位まで表示できる、昔ながらの堅実なやり方です。1桁分解能が細かく残るので、①の切り捨ての影響も1/10に薄まります。

③断線したときの値を考えておく

4-20mAの利点は下限が0mAではなく4mAにある(ライブゼロ)ことです。線が切れて電流が0mAになると、デジタル値は正常時にはあり得ない下限割れの値になるため、「デジタル値が0付近まで落ちたら断線を疑う」という判定が組めます。0-10Vのような下限が0の信号では「断線」と「本当に測定値が下限」の区別がつかないので、これは4-20mAを選ぶ理由のひとつでもあります。断線時にデジタル値が具体的にどんな値になるか(下限に張り付くのか、負側に振れるのか、エラーフラグが立つのか)はユニットの機種と設定次第なので、ここもマニュアルで確認してから判定値を決めてください。

専用のスケーリング命令がある環境でも、この作り方は腐らない

実は、PLCの機種や環境によっては、スケーリング専用の命令や関数が用意されていることがあります。それを使えば今回の計算を1命令で済ませられる場面もあるでしょう。ただし本記事では、あえて専用命令の仕様には踏み込みません。この記事が扱うのは、MOVと乗除算だけで組む、どの機種でも通用する作り方です。

四則演算での組み方を一度自分の手で通しておくと、専用命令を使う場面でも「中で何をしているか」が読めるようになりますし、専用命令のない古い機種や他社PLCの改造案件に当たっても手が止まりません。転換の式そのものは比例計算1本、道具はMOVと乗除算——この最小構成を持っておくことが、若手のうちの何よりの資産だと思っています。使える命令の全体像は【GX Works3】命令語 早見表(iQ-R)|ラダー命令の使い方まとめで確認できます。

まとめ

アナログ入力のスケーリングを整理しました。要点です。

  • スケーリング=ユニットが返す「ただの数値」を現場の単位に直す計算:センサ→4-20mA→デジタル値→ラダーで工学値、の最後の一段
  • 中身は比例計算1本:工学値=(デジタル値−デジタル下限)×工学スパン÷デジタルスパン+工学下限
  • デジタル値の範囲は仮定しない:本記事の0〜16000は例。分解能は機種・レンジ設定で異なるので必ずユニットのマニュアルで確認する
  • 乗算が先、除算が後:先に割ると整数演算の切り捨てで情報が消える。桁の膨らみは32bit演算(D*・D/)で受ける
  • 小数は10倍値で持つ:253=25.3℃として整数のまま持ち回り、小数点は表示側で付ける
  • 4-20mAはライブゼロで断線を検出できる:断線時の具体的な値はユニットのマニュアルで確認してから判定を組む

最初の1回を自分で組んで、モニタ上の「8000」が「100.0℃」に化ける瞬間を見てください。アナログ入力への苦手意識は、たいていそこで消えます。

関連記事