原标题:BCD码(8421)和整数互转算法的梯形图实现
BCD码(Binary Coded Decimal?)是用4位二进制数来表示1位十进制BCD码数中的0~9的编码方法其中,最常使用到的是8421BCD码8421码是一种有权码,其各位的权分别是(从最有效高位开始到最低有效位)8,4,2,1比如,BCD码0x9234(二进制11 0100)所代表的十进制BCD码数为9234此种编码方法在很多计算机系统及现场仪表中较为常见。茬工业控制中PLC可能要和现场仪表或计算机交互数据,如果PLC没有BCD和整数互转的功能块那么就需要工程师自行编写转换程序。本文以HORNER控制器为例为您展示8421BCD码和整数互转的梯形图逻辑实现。
从BCD码的原理可知对于一个16位的BCD码而言,其数据表示范围为0~9999故此我们利用数学运算,依次提取出千位百位,十位个位的数值,然后再把这些数值乘以对应的加权(,1)后相加即可得到对应的整数。
在下面的例子中待转換的BCD码位于%AQ81(16位)寄存器,下文中我们称之为Input;转换结果放置在%AQ88(16位)寄存器中我们称之为Output。%S7为系统寄存器始终为ON.
a. 首先把Input除以16得到十位数值A;
c. 紦余数Y除以16得到十位数值B;
d. 把余数Y对16做取余运算得到个位数值C;
4. 如果要转换的数大于等于0)
c. 把余数Y除以256得到百位数值B;
d. 把余数Y对256做取余运算得到余數Z;
e. 把余数Z除以16得到十位数值C;
f. 把余数Z对16做取余运算得到个位数值D;
整个程序的全景图如下:
我们可以将其建为自定义功能块,或者子程序方便在程序的其他位置多次调用。
整数转BCD的原理同上只不过各数位对应的加权分别变为了和1。
在下面的例子中待转换的BCD码位于%AQ91(16位)寄存器,下文中我们称之为Input;转换结果放置在%AQ96(16位)寄存器中我们称之为Output。%S7为系统寄存器始终为ON.
2. 如果要转换的数大于等于10,且小于100
a. 首先把Input除以10得箌十位数值A;
b. 然后把Input对10做取余运算得到个位数值B;
3. 如果要转换的数大于等于100且小于1000
c. 把余数Y除以10得到十位数值B;
d. 把余数Y对10做取余运算得到个位数值C;
4. 如果要转换的数大于1000(16位转换需要小于9999)
c. 把余数Y除以100得到百位数值B;
d. 把余数Y对100做取余运算得到余数Z;
e. 把余数Z除以10得到十位数值C;
f. 把余数Z对10做取餘运算得到个位数值D;
整个程序的全景图如下:
上述程序是笔者多年前编写的,后来都是直接调用没有过多思考,在校对此文的过程中筆者忽然发现按数值区间大小分类讨论的方式完全没有必要,上述程序其实可以简化为:
或者如果我们不想看到这些功能块,也可以直接用一个公式来表示:
BCD码转整数(公式版)
整数转BCD码(公式版)
之所以没有把前边繁冗的算法删除是希望大家能看到写作和整理资料的过程对我們的思维和工作的帮助及提高。
张伟宁就职于浩纳尔(天津)自动化科技有限公司,负责美国HORNER一体化控制产品的应用和支持工作对HORNER全系产品有深入了解。