内容 デジタルスイッチの時分割読込みと BCD ⇔ Binary 相互変換を自前で書いてみます。 |
●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を表示 ●コードをダウンロード ●登録モニタをダウンロード |