2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

BCDのマイナスを克服する方法

Last updated at Posted at 2019-06-23

はじめまして。りかけいのしゃちくです。
仕事でつまづいたりしたところを忘備録がてら公開していこうと思います。

今回投稿する内容はBCDの桁下がりを克服する方法です。
そもそもBCDとは?という方は下記のサイトを参考にしてください。

[シーケンス制御講座「BCD出力」] (https://news.aperza.jp/%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9%E5%88%B6%E5%BE%A1%E8%AC%9B%E5%BA%A7%E3%80%8Cbcd%E5%87%BA%E5%8A%9B%E3%80%8D/)

ふつうのプログラミングではあまり使いませんが、PLCをつかった制御だとごく普通に使います。上記サイトを見ていただくとわかりますが、BCDは4bitごとに区切って数字を表現する方法です。表現できる桁数は0~ビット数/4(32bitなら8桁)です。
例えば下記の計算

0001 0011(12 BCD)-1000 1000(88 BCD)

について単純に計算すると答えは1000 1011(8BHex)となります。これをBCD変換しても本来欲しい-76BCDにはなりません。

PLCによってはキャリー付きBCD減算(CY付BCD-)の機能がありますが、ない場合もあります。
下のコード例はCY付BCD-がなくて、反復してBCD減算を行う場合に使用できます。

qiita.rb
for i:=0 to hoge 

    if(BCD1[i] > BCD2[i]) then
        BCD減算命令(BCD1[i], BCD2[i], bcdsub); /*減算命令はメーカーによって違う*/  
    else
        BCD減算命令(BCD2[i], BCD1[i], bcdsub);
        Cyflag := true; /*キャリーフラグ*/
    end_if

    result[i] := bcdsub;

end_for

減算命令の前に2値の大小を比較して-を出さないように計算した後キャリーフラグを付けるという簡単なものです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?