■ デジタルSWの読込とBCD (KV File: BCDx_xxx 

⇒ TO Home Page
内容

デジタルスイッチの時分割読込みと BCD ⇔ Binary 相互変換を自前で書いてみます。
デジタルスイッチなどを読込む場合、桁毎に入力を割当てても良いですが、桁が増えると入力点数も沢山必要です。
そこで各桁を時分割して読込む手順をサンプルで書いてみました。
PLCの命令でも4桁のデジタルスイッチを時分割で読む事ができますが、自前で書いた方が応用が効きそうです。
通常、PLCの命令語では読込んだ値はBCDの形式て保存されます。数値を読むだけではなく、4×4のマトリックススイッチとしても読込めるためです。
PLCのキー読込みの命令語は下のリファレンスマニュアルの抜粋を参照してください。
CMD Ref
「命令語リファレンスマニュアル」によれば読込み時間は80msとなっています。時定数が約10msあるので
ON-OFF、4桁で80msと言うところでしょうか。
また、この「HKEY命令」はコード中に1回しか使えない様ですので、後は自前で書くしかないようです。


BCDとは Binary Coded Decimal の略語で (2進化10進数) の事です。
   2 進化 10 進数は、16 進数と同じように 4 ビット分を 1 桁として扱います。10 進数と同じように 9 より大きくなると桁上がりするため、
   A 〜 F の記号は使用しません。
   外部 ( デジタルスイッチなど ) からのデータを扱う時に便利な表現方法です。
ただし、《KV-7500/7300》、《KV-5500/5000/3000/1000》、《KV Nano シリーズ》内で演算するにはバイ
ナリデータとして扱う必要があります。外部から読み込んだ時は TBIN 命令でバイナリデータに変換
し、外部 ( デジタル表示器など ) に出力する時は TBCD 命令で 2 進化 10 進数に変換してください。

PLC内では10進演算ができないため、バイナリデータに変換する必要が有ります。
今回はその BCD⇒Binary 変換と Binary ⇒ BCD 変換も自前で作ってみました。

このサンプルは他と 独立したプロジェクト にしました。
下の「●コードをダウンロード」からダウンロードしてください。検証用のモニタデバイスは「●登録モニタをダウンロード」からダウンロードしてください。

●PDFを表示  ●コードをダウンロード   ●登録モニタをダウンロード
◆ 初期ルーチン
このサンプルの実験用の値を定義します。


・デジタルスイッチを読込む変数のクリアとタイマーの初期状態を設定します。


・デジタルスイッチを読込む時の桁の順序を、上桁からと下桁からを選択可能にしています。
・切替スイッチ[LR000] の状態によって修飾デバイスの初期値を変えています。


・デジタルスイッチの桁選択出力のON-OFF安定時間タイマ値を設定しています。モニタで確認しやすいよう大変ゆっくりです。
・実際は入力時定数より少し長めがいいでしょう。
・シミュレーションで確認できるよう、仮想的なデジタルスイッチを実装しています。各桁の数値の初期化をしています。
・設定している数値は”1248”です。
◆ 時分割とスイッチの値の読込み

このコードではスイッチの桁選択デバイスに
10の0乗 ⇒ R500 〜 10の3乗 ⇒ R503
スイッチの値の読込みデバイスに
2の0乗 ⇒ R000 〜 2の3乗 ⇒ R003
のアドレス割り付けをしています。

実際に配線する場合は、下図の様に行ってください。
この図面の例では、デジタルスイッチの設定は”5679”になっています。






・1行で書くなら「00005行目」を使ってください。
・[@T0]がUPし、[@T1]のタイマがFの間、選択桁デバイスをONします。[@T1]がUPすると、選択桁デバイス[@R500:Z6]をOFFします。
・同時に[@MR001]をONします。
・[@T1]がUPしたので、次スキャンで[@T0]と[@MR001]はリセットされるので、[@MR001]は1スキャンのみONします。

・「0008行目」の[@MR001]を使用せず、続いて[Z6]をインクリメントするコードを記述する場合は、必ず[R500:Z6]を先にOFFしてください。
先に[Z6]がインクリメントされると一つ前の選択デバイスがOFFしません。



● [LR000] がTの時は上位桁から、Fの時は下位桁からスキャンします。



- 下位からスキャンする場合 -

・上位桁からスキャンするモードの時 ( [LR000] がTの時) はこの「条件ジャンプ」命令で「ラベル0」へ飛び、このルーチンは実行されません。
・「CJ」命令に付いては、下のリファレンスマニュアルの抜粋を参照してください。



・00012行目:[Z6]の値によって、読込んだ値をどこの位置に書込むかのビットシフト量を計算します。(2の0乗なら⇒0 2の3乗なら⇒12)
・00013行目:[R000]から16ビット分値を読込み下位4ビット以外はマスクします。(ANDA $000F)
・その読込んだ値を選択桁に応じて上位へ指定した分(TM4分)シフトします。「ビットシフト命令」については下のリファレンスマニュアルの抜粋を参照してください。

・上記シフトした値を読込み記憶デバイスに書込みます。(ORA@FM8 STA@FM8)
・できあがったBCDの値を後述するBCD ⇒ Binary 変換サブルーチンに渡し、2進数に変換しています。
・00014行目:次に修飾デバイス[Z6]をインクリメントします。[Z6] が4になると0へ戻します。( 「基本編」時分割 を参照 )
・[Z6] の値が0の時、全桁の読込が完了した事になるので、順次バイナリ変換していた[@FM9] を読込み結果デバイスの[@FM10]に代入します。
・読込完了フラグ[@MR100] をON(1スキャン)にして、スイッチ読込デバイス[@FM8] をクリアします。


- 上位からスキャンする場合 -

・00018行目:上位から読込む場合は、読込み記憶デバイス[@FM8] を先に4ビット上位へシフトしておきます。
・1回目に読込んだ2の3乗桁の値が、最終的に12ビット分上位へシフトされるからです。「ビットシフト命令」については下のリファレンスマニュアルの抜粋を参照してください。

・00019行目:[R000]から16ビット分値を読込み下位4ビット以外はマスクします。(ANDA $000F)
・上記シフトした値を読込み記憶デバイスに書込みます。(ORA@FM8 STA@FM8)
・できあがったBCDの値を後述するBCD ⇒ Binary 変換サブルーチンに渡し、2進数に変換しています。
・00020行目:[Z6] の値が0の時、全桁の読込が完了した事になるので、順次バイナリ変換していた[@FM9] を読込み結果デバイスの[@FM10]に代入します。
・00021行目:次に修飾デバイス[Z6]をインクリメントします。[Z6] が4になると0へ戻します。( 「基本編」時分割 を参照 )


- 実験用の疑似的なデジタルスイッチ -

・実験用に疑似的にデジタルスイッチを作りました。
・各桁、設定変数( [DM10] 〜 [DM13] )の値を変更して実験してください。

◆ バイナリ変換と2進化10進変換

PLCの命令語セットにはバイナリ変換やBCD変換が有ります。
同じ機能を自前で書いてみました。
変換命令の詳細は下のリファレンスマニュアルの抜粋を参照してください。

- BIN ⇒ BCD 変換 -
2進数を2進化10進数に変換します。引数は命令語と同様にレジスタを使っています。

・レジスタに渡された引数を [TM4] に代入します。
・このルーチンの変数を初期化します。


・16ビットをBCDにした場合、4桁になるので「FOR〜NEXT」ループで4回まわします。FOR〜NEXTについては下のリファレンスマニュアルの抜粋を参照してください。

・00050行目:[@FM4] はFOR〜NEXTのループ回数カウンタです。ループの最後でインクリメントしています。
・[TM6]は 0 → 4 → 8 → 12 とループを回る毎にカウントアップされます。
・00051行目:与えられた引数を10で除算し、再び[TM4]へ戻します。これで最下位桁が消去されます。
・00052行目:除算した余り (除算では [TM1] に余りが代入される) を先ほど計算した [TM6] 分上位桁へシフトします。
・答えを入れる変数 [@FM5] に書込みます。OR動作なので元にあるビットは消えません。
・最後にループ回数カウンタ [@FM4] をインクリメントします。
・4桁分処理したらループから抜けて終了です。

- BCD ⇒ BIN 変換 -
2進化10進数を2進数に変換します。引数は命令語と同様にレジスタを使っています。

・レジスタに渡された引数を [TM4] に代入します。
・このルーチンの変数を初期化します。
・BIN ⇒ BCD 変換 に加え、10進数の重み変数があります。
 

・16ビットをBCDにした場合、4桁になるので「FOR〜NEXT」ループで4回まわします。FOR〜NEXTについては上のリファレンスマニュアルの抜粋を参照してください。


・BIN ⇒ BCD 変換 同様、[TM6]は 0 → 4 → 8 → 12 とループを回る毎にカウントアップされます。


・与えられた引数を下位へ4ビットずつシフトします。初回は [TM6] が0なのでシフトしません。
・下位4ビット分(10進数の1桁分)だけを取り出します。(ANDA $000F)
・1桁分に10進数の重み( [@FM6] )を掛けます。答え変数 [@FM5] に加算します。

 
・10進数の重み( [@FM6] )を1桁分重くします。
・最後にループ回数カウンタ [@FM4] をインクリメントします。
・4桁分処理したらループから抜けて終了です。


・返値もレジスタにしていますので、演算結果をレジスタに代入します。

◆ 確認

上の画面にある登録モニタウィンドウを用意しています。 ●登録モニタをダウンロード からダウンロードしてください。
・シミュレートモードで実行してください。
・デジタルスイッチの読込みはRUNと同時に稼働します。[LR000] がFの時は10の0乗桁からスキャンします。
・桁指定デバイスのON-OFF安定タイマ [DM0] と [DM2] が変更できます。確認しやすい速さに変更してください。
・各桁の設定値は [DM10] 〜 [DM13] です。各桁を変更して試験してください。


・BCD ⇔ BIN 相互変換 は,[@MR000] をONすると確認できます。
・[EM0]に BIN で数値を入れます。サブルーチン10でBCD変換し、[EM2]に代入しています。次にサブルーチン11で元のBINに戻し[EM3] に代入しています。
・引数をレジスタにする事で、PLCの命令と同じように使用する事ができます。
・00033行目は同じ事をPLCの命令で書いてみました。
・BCDの変換結果を分かりやすくするため、[EM2] と [EM4] の表示形式を「2進数16BIT」に変更してください。


・如何でしたか。命令語にあるものも、自前で作れば応用が広がり、理解も深まると思います。

●PDFを表示  ●コードをダウンロード   ●登録モニタをダウンロード