如何实现bcd码到ascii码的转换?_BCD码(8421)和整数互转算法的梯形图实现

本文介绍了8421BCD码和整数之间的转换方法,以HORNER控制器为例,通过梯形图逻辑详细展示了BCD码转整数以及整数转BCD码的程序实现,并提供了简化后的公式版转换方法。
摘要由CSDN通过智能技术生成

46702420a2cdf6750a10227f0a4ab894.png

JZGKCHINA 工控技术分享平台

往期回顾

● HORNER控制器的J1939通信

 HORNER控制器和GE PLC的EGD协议通信

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.

  1.  如果要转换的数小于16(0x10), 则直接MOVE Input至Output,输出结果。

0db316e768c002a23ebaa751abdf0f35.png

2. 如果要转换的数大于等于16(0x10),且小于256(0x100)a. 首先把Input除以16得到十位数值A;b. 然后把Input对16做取余运算(MOD)得到个位数值B;c. 最后Output = (A*10) + B;

e61887fc83b51187e111b31843a0a645.png

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;

9ee54ce1d0f58637af7accb1f854d650.png

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;

7f8d9e7a682e85a1189a60f7cfcd17b3.png

整个程序的全景图如下:

f66dc93c5d328750eed3c4664faa461a.png

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

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

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

在下面的例子中,待转换的BCD码位于%AQ91(16位)寄存器,下文中我们称之为Input;转换结果放置在%AQ96(16位)寄存器中,我们称之为Output。%S7为系统寄存器,始终为ON.

  1.  如果要转换的数小于10, 则直接MOVE Input至Output,输出结果。

638d2f35991b9064bb39e1d62571c87b.png

2. 如果要转换的数大于等于10,且小于100a. 首先把Input除以10得到十位数值A;b. 然后把Input对10做取余运算得到个位数值B;c. 最后Output = (A*16) + B;

10baae84179533bec796203d01d646d5.png

3. 如果要转换的数大于等于100,且小于1000a. 把Input除以100得到百位数值A;b. 把Input对100做取余运算得到余数Y;c. 把余数Y除以10得到十位数值B;d. 把余数Y对10做取余运算得到个位数值C;e. 最后Output = (A*256) + (B*16) + C;

003bbcf00a364fb8cf5b88ad638a2987.png

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;

8a32ade87911f0de62f6c4279120e476.png

整个程序的全景图如下:

26a6ed6847bb96e44755fa58806def6a.png

Part C. 更多

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


BCD码转整数

190584e08dbf917ebac11414946e331e.png

整数转BCD码

710b5f21c2bc7a99ea134f86de352e58.png

或者,如果我们不想看到这些功能块,也可以直接用一个公式来表示:BCD码转整数(公式版)

d3f3bf274e4c895b0cffceb4aefeb766.png

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


整数转BCD码(公式版)

ffd0ae2653a00bce902d00ba7114bac0.png

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

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

作者简介

张伟宁,就职于浩纳尔(天津)自动化科技有限公司,负责美国HORNER一体化控制产品的应用和支持工作,对HORNER全系产品有深入了解。

喜欢请打赏!

00cb04b0e46a2424cfc0e54b21b85c84.png

3554bc1b9918028e1222b615bc1a07a9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值