整型和bcd的对应关系_BCD码(8421)和整数互转算法的梯形图实现

本文详细介绍了如何在PLC中使用梯形图逻辑实现8421BCD码与整数之间的转换。通过四个步骤展示了BCD码转整数的程序实现,以及相同逻辑的简化方法。同时,也给出了整数转BCD码的程序实现,并提供了简化后的公式表达。内容适用于工业控制中需要BCD码与整数相互转换的场景。
AI助手已提取文章相关产品:

BCD码(Binary Coded Decimal‎)是用4位二进制数来表示1位十进制数中的0~9的编码方法。其中,最常使用到的是8421BCD码。8421码是一种有权码,其各位的权分别是(从最有效高位开始到最低有效位)8,4,2,1。比如,BCD码0x9234(二进制1001 0010 0011 0100)所代表的十进制数为9234。此种编码方法在很多计算机系统及现场仪表中较为常见。在工业控制中,PLC可能要和现场仪表或计算机交互数据,如果PLC没有BCD和整数互转的功能块,那么就需要工程师自行编写转换程序。本文以HORNER控制器为例,为您展示8421BCD码和整数互转的梯形图逻辑实现。

Part A. BCD码转整数的程序实现

从BCD码的原理可知,对于一个16位的BCD码而言,其数据表示范围为0~9999。故此我们利用数学运算,依次提取出千位,百位,十位,个位的数值,然后再把这些数值乘以对应的加权(1000,100,10,1)后相加,即可得到对应的整数。

在下面的例子中,待转换的BCD码位于%AQ81(16位)寄存器,下文中我们称之为Input;转换结果放置在%AQ88(16位)寄存器中,我们称之为Output。%S7为系统寄存器,始终为ON.如果要转换的数小于16(0x10), 则直接MOVE Input至Output,输出结果。

2. 如果要转换的数大于等于16(0x10),且小于256(0x100)

a. 首先把Input除以16得到十位数值A;

b. 然后把Input对16做取余运算(MOD)得到个位数值B;

c. 最后Output = (A*10) + B;

3. 如果要转换的数大于等于256(0x100),且小于4096(0x1000)

a. 把Input除以256得到百位数值A;

b. 把Input对256做取余运算得到余数Y;

c. 把余数Y除以16得到十位数值B;

d. 把余数Y对16做取余运算得到个位数值C;

e. 最后Output = (A*100) + (B*10) + C;

4. 如果要转换的数大于等于4096(0x1000)

a. 把Input除以4096得到千位数值A;

b. 把Input对4096做取余运算得到余数Y;

c. 把余数Y除以256得到百位数值B;

d. 把余数Y对256做取余运算得到余数Z;

e. 把余数Z除以16得到十位数值C;

f. 把余数Z对16做取余运算得到个位数值D;

g. 最后Output = (A*1000) + (B*100) + (C*10) +D;

整个程序的全景图如下:

我们可以将其建为自定义功能块,或者子程序,方便在程序的其他位置多次调用。

Part B. 整数转BCD码的程序实现

整数转BCD的原理同上,只不过各数位对应的加权分别变为了4096,256,16和1。

在下面的例子中,待转换的BCD码位于%AQ91(16位)寄存器,下文中我们称之为Input;转换结果放置在%AQ96(16位)寄存器中,我们称之为Output。%S7为系统寄存器,始终为ON.如果要转换的数小于10, 则直接MOVE Input至Output,输出结果。

2. 如果要转换的数大于等于10,且小于100

a. 首先把Input除以10得到十位数值A;

b. 然后把Input对10做取余运算得到个位数值B;

c. 最后Output = (A*16) + B;

3. 如果要转换的数大于等于100,且小于1000

a. 把Input除以100得到百位数值A;

b. 把Input对100做取余运算得到余数Y;

c. 把余数Y除以10得到十位数值B;

d. 把余数Y对10做取余运算得到个位数值C;

e. 最后Output = (A*256) + (B*16) + C;

4. 如果要转换的数大于1000(16位转换需要小于9999)

a. 把Input除以1000得到千位数值A;

b. 把Input对1000做取余运算得到余数Y;

c. 把余数Y除以100得到百位数值B;

d. 把余数Y对100做取余运算得到余数Z;

e. 把余数Z除以10得到十位数值C;

f. 把余数Z对10做取余运算得到个位数值D;

g. 最后Output = (A*4096) + (B*256) + (C*16) +D;

整个程序的全景图如下:

Part C. 更多

上述程序是笔者多年前编写的,后来都是直接调用,没有过多思考,在校对此文的过程中,笔者忽然发现按数值区间大小分类讨论的方式完全没有必要,上述程序其实可以简化为:

BCD码转整数

整数转BCD码

或者,如果我们不想看到这些功能块,也可以直接用一个公式来表示:

BCD码转整数(公式版)

Output = (Input / 4096) * 1000 + ((Input MOD 4096) / 256) * 100 + (((Input MOD 4096) MOD 256) / 16) * 10 + (((Input MOD 4096) MOD 256) MOD 16)

整数转BCD码(公式版)

Output = (Input / 1000) * 4096 + ((Input MOD 1000) / 100) * 256 + (((Input MOD 1000) MOD 100) / 10) * 16 + (((Input MOD 1000) MOD 100) MOD 10)

之所以没有把前边繁冗的算法删除,是希望大家能看到写作和整理资料的过程对我们的思维和工作的帮助及提高。

您可能感兴趣的与本文相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值