PLC中的BCD码是什么?
字电路采用的基本数制是二进制,而人们熟悉和习惯使用的数制是十进制,因此有必要在二进制与十进制之间建立一种转换机制,以方便数字电路的解读和分析。
BCD码就是一种用二进制数表示十进制数的码制。
BCD是英文"Binary-Coded Decimal"的缩写,直译的意思是“二进制编码的十进制数”,这种编码的数制本质上是十进制。BCD码用4个二进制数表示一个十进制数,每一位允许的范围是2#0000~2#1001(注1),也就是十进制的0~9,采用“逢十进一”的规则。
BCD码是有符号的,用最高位来表示符号,“0”表示正数,“1”表示负数。对于一个四位的BCD码而言(16个二进制位),能表示的范围是 “-999~+999”。为什么呢?其实比较好理解,你想,最高位是符号位,那么就剩下了三位,由于每一位BCD码,其本质是十进制数,所以每一位最大的数都是9,所以三位数最大就是999,加上符号,所以四位BCD码能表示的十进制数的范围是 “-999~+999”。同样的道理,八位BCD码(32个二进制位)能表示的十进制数的范围是“-9999999~+9999999”。
在西门子S7-300/400/1200/1500中,BCD16表示的十进制数范围为-999到+999。位15为“0”,则符号为正,为“1”,则符号为负。位12至位14不使用。BCD32表示的十进制数范围为-9999999 到 +9999999。
施耐德PLC中,如Unity Pro XL平台,BCD16表示的十进制数范围为0到9999。BCD32表示的十进制数范围为0到99999999。
三菱PLC中,如GX Works2平台,BCD16表示的十进制数范围为0到9999。BCD32表示的十进制数范围为0到99999999。
PLC内部总是按HEX格式(十六进制)进行数据计算的,在驱动非智能的显示设备(如数码管)显示数据之前,往往需要将PLC内部的HEX格式数据先转换为BCD码,然后进行显示输出;将用户以十进制方式设置的参数存入PLC内存之前,则往往需要将该BCD码转换为十六进制(HEX)格式。
人们在电脑显示器上看到的十进制读数,都是经过了计算机自动作BCD转换后才显示的;监控时修改的参数,则是电脑软件作了HEX转换后写入的,无需人为干预而已。
BCD码可以有多种编码方式,例如8421码、5421码、2421码、余3码、格雷码等。
8421码是最常用的一种BCD编码方式,在这种编码方式中,每个十进制数字都由对应的四位二进制值表示,二进制值每一位的“1”都代表一个固定数值。将每位“1”所代表的十进制数加起来就可以得到它所代表的十进制数字。因为代码中从左至右看每一位“1”分别代表数字“8”“4”“2”“1”,故得名8421码。
以上是进制转换的手动计算方法,在我们实际应用中,一般都是使用转换工具的,微软自带的计算器,就带这个功能。下面给大家介绍一下微软自带的计算器如何进行数据类型转换:
Windows键+R,然后输入“calc”回车,就能打开系统自带的计算器。
点击左上角的查看,然后选择程序员模式,就能进行各个数进制之间的转换了。
*注释1:在PLC中,二进制数据通常以”2#”作为前缀,十六进制数据通常以”16#”作为前缀,十进制数据只需正常书写即可。
免责声明:本文转自网络,版权归原作者所有,如涉及作品版权问题,请及时与我们联系删除,谢谢!
如何获取 电气热门资料?
操作指引如下!
你真的会用BCD码指令么?
在我前天发表的文章《图说西门子特殊寄存器之SM1.0-SM1.7》中讲到SM1.6处,我留了一个问题给朋友们,就是:“使用BCD码转整数指令时候,为何输入参数是1113指令运行无错误,而当输入参数是1114时指令运行出错了?”,以这个为引子,开始我今天的文章。
说到BCD码可能会立马想到8421码,读书的时候应该接触的就是这个。其实BCD码还可以分为有权码、无权码,还有什么5421码,但这些都不是我要讲的,本人要说的是西门子200PLC中关于BCD码的指令,特别是BCD码转换指令出错的原因分析。
BCD码(Binary-Coded Decimal)也叫二-十进制码,是用4位二进制数表示十进制数中0-9这10个数字的一种码。这个是BCD码的基础定义,不管是什么PLC都要遵守的,所以特意再提出来。
首先来看2张监控截图:
BCD指令错误监控图1
BCD指令错误监控图2
从上边这2张图上,我们可以看到BCD_I指令的输入端输入整数10-15和输入十六进制的ABCDEF时候,该指令都出错了(此时SM1.6会被置1,可以去看前一篇文章),因此后边的ENO都无法输出了,后边的监控线头是灰色,因为没有能流。同时,还可以看到输入整数值16的时候,程序没有出错,为什么呢?
根据BCD码的基础定义“用4位二进制数表示十进制数中0-9这10个数字”,从这句话可知十六进制的ABCDEF就是十进制的10-15,这明显超出了基础定义的0-9,因此16进制下的ABCDEF用作输入参数时指令出错的原因就找到了。
那么为何输入整数16处理的时候就没有出错呢?BCD_I指令的输入端这里,在指令处理的时候BCD端的参数,是以怎样的真实格式化去处理的?
Micro/WIN软件中对指令的解释
根据帮助文件的解释和实际的程序,我猜测可能有2种可能:
①是以直接以2进制BCD码的格式来处理的(也就是说16已经被看作一个BCD码数,那他的二进制应该是BCD 2#0001 0110 == 16#16)?
②是以16进制下的值看作BCD的格式来处理的(也就是说将整数16自动转换为16#10,BCD 16#10)?
--为了探明这问题,继续看下一个图片。
BCD指令监控图3
BCD指令监控之状态表图
从监控图3可以看到,BCD端输入整数16,被转换为整数10。而将VW0也就是整数10再次作为BCD_I指令的输入端时,指令又出错了。按照上边猜测①的思路16是当做一个BCD码看待的,即BCD 2#0001 0110,那么转化后的结果应该是16才对,而监控中VW0的结果是10,由此可见,思路①的猜测是错误的。
那么只有按照思路②来看,输入端的整数16先是被转换为16进制下的16#10后看作一个BCD码再去转换的,也就是将16#10即2#0001 000看作了BCD码,因此转化为十进制数就是10。以这样的解释来看结果,那么结果就对了,再来多试验看看:
BCD指令监控图4
从这个图片可以看到整数17被转换为了11,整数18被转换为了12。
17的16进制表示就是16#11,即BCD 16#11==2#0001 0001,因此转化BCD转化为整数就是11。
18的16进制表示就是16#12,即BCD 16#12==2#0001 0010,因此转化BCD转化为整数就是12。(请忽略本文中的==用法的不准确性,仅为说明问题,谢谢)
所以,到这里BCD_I指令,BCD输入端其实是16进制下的BCD值,BCD_I指令更加准确的描述应该是将16进制BCD码转化为为整数,不知道帮助文件或者西门子200的手册为何没有强调这个16进制。下图是手册上的解释:
BCD码指令在系统手册上的解释
但是我在西门子找答案网页上发现了西门子的专家置评,见下图:
BCD_I指令的官方评价
所以,文章写到此,可以得出一个结论:BCD_I指令就是将16进制的BCD码转化为整数的一个指令,其在BCD参数输入端的值为16进制数时最好,不为16进制数时系统将自动将其转化成16进制数,而后才对其进行运算。
再进一步来说一下BCD端是要求16进制的问题,下边看一个西门子300的程序切图:
M20.0不为1时切图
这个图片是值运行程序第2行,整数16通过BCD_I指令后结果也是10,证明是和西门子200中的算法一样的。
M20.0为1时切图
这个图片是将M20.0置1,程序第1行也接通,从这个图片上看到PLC还是在运行,ENO还是输出了,这是和西门子200系统不一样的地方,但是MW2的值此时为0,显然是不对的,所以PLC还是给出了提示:
300系统指示灯报错了
诊断报告说BCD转换错误
这两个图详细说明了,因为程序第一行的BCD_I指令出现错误,所以系统报错了。报错的真是原因是什么呢?就是整数10被转为了16#0a,而BCD码的基本概念是用4位二进制数表示0-9这10个十进制数,因此BCD #160a是非法的,它不能被看作是一个BCD码。
写到这里,再回头看我在之前的文章中留下的问题:“使用BCD码转整数指令时候,为何输入参数是1113指令运行无错误,而当输入参数是1114时指令运行出错了?”,我想有的朋友已经有答案了。
答案就是:BCD_I指令是要求16进制的BCD码格式,整数1113转化为16进制是16#459,整数1114转化为16进制是16#45A,而出现A就是非法的BCD码。这就是最终的答案。
整数1114转化为16进制是16#45A
本篇文章结束,可能有点费理解,但是提高就是不断的越过障碍,希望通过本文能让朋友们对BCD相关指令编程时候的错误情况有一个更深入的了解,不至于出错了还要想很久才知道哪里错了。
最后,感谢大家的支持,有不明白的地方,敬请关注留言,我会及时回复,谢谢。
相关问答
plc中bcd码作用?
BCD码是一种数据编码方式,是用二进制数字表示十进制数字的一种方式。目的在于人看上去简单容易理解。BCD码在PLC中使用也是为了让人容易看懂数据,比如一个时间...
谁知道PLC里的BCD码是什么意思呀?
也就是8421,用四位表示一个十进制数,例如最左边位为1时表示8,10的话就是最左边位和从左到右数第三位为1来表示.25的话用BCD表示的话需用00100101,...也就...
西门子PLCs7-200时钟读取时为什么要BTI和BCDI连用我知道BTI...
[回答]BTI是一个字节数据转成一个整数数据,而BCDI是一个字的以BCD编码数据转成一个字的以BIN编码的数据.当然有差别,因为数值对应的编码不同.第1条BTI指令...
PLC中怎样把BCD码转为十进制?-懂得
BCD码就是十进制了,PLC内部只能处理二进制。将BCD码以十进制的形式转换成二进制,再将每4位二进制数转换成对应的一位十进制数。如BCD码K873,写成二...
plc的bin是什么?
bin是二进制文件,其用途依系统或应用而定。也就是说,一般来讲是机器代码,汇编语言编译后的结果,(DOS下汇编语言编译后与.com文件相类似),用debug、WINHEX...b...
为什么PLC要运用到浮点数运算-POPPIN_CHAXILY的回答-懂得
如果PLC总是用16进制(二进制),或者BCD码,是难以满足越来越复杂的控制需要的。如果是单纯的逻辑控制当然用到的都是开关量,一般的数据采集和PID控制...
欧姆龙PLC定时器怎么输入。100msBCD类型的,要设定3秒,怎么打呀,知道的说下,谢谢?
设定值可以是常数,也可以是通道号。当是常数时,必须是BCD码,前面要加#;是通道号时,该通道内的数字也须是BCD码。欧姆龙PLC定时器时间设定范围为0~9999.9秒...
学习PLC怎么还要学习计算机的进制?有点懵?
当然要了,PLC实际也是一台微电脑,许多功能指令离不开进制转换,通常用的二进制,八进制,十进制,十六进制后BCD码。当然要了,PLC实际也是一台微电脑,许多功能指...
bin指令使用方法?
指令用法:BIN指令是将源软元件中的BCD码转换成二进制数并传送道目标软元件中,此作用与BCD指令正好相反。四则运算(加减乘除)与加1指令、减1指令等PLC内的运...
哪位能帮我解释一下西门子300plc.WOR_W怎么用?我看了帮助还是不理解用在时间设定怎么用?
...其用在时间设定上?非也,它不是用于时间设定的,在西门子的官方例子中,其用在S5TIME数据类型的时基设定。因为或操作常常用于对二进制位的置位操作,所以例子...