はじめまして。りかけいのしゃちくです。
仕事でつまづいたりしたところを忘備録がてら公開していこうと思います。
今回投稿する内容は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減算を行う場合に使用できます。
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値の大小を比較して-を出さないように計算した後キャリーフラグを付けるという簡単なものです。