前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BCD码(8421)和整数互转算法的梯形图实现

BCD码(8421)和整数互转算法的梯形图实现

作者头像
剑指工控
发布2021-11-09 16:20:54
1.7K0
发布2021-11-09 16:20:54
举报
文章被收录于专栏:剑指工控

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,输出结果。

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.

  1. 如果要转换的数小于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)

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 剑指工控 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档