你真的会用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是英文"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#”作为前缀,十进制数据只需正常书写即可。
免责声明:本文转自网络,版权归原作者所有,如涉及作品版权问题,请及时与我们联系删除,谢谢!
如何获取 电气热门资料?
操作指引如下!
相关问答
PLC中的BCD码是怎么一回事?
BCD码是二进制编码的一种,它是将十进制数的每一位分别转换为4位二进制数表示。在PLC中,BCD码常用于数字量输入输出和计数器等模块中。例如,数字6的BCD码为011...
PLC中怎样把BCD码转为十进制?-yfTblqRw6的回答-懂得
BCD码就是十进制了,PLC内部只能处理二进制。将BCD码以十进制的形式转换成二进制,再将每4位二进制数转换成对应的一位十进制数。如BCD码K873,写成二...
欧姆龙PLC编程里BIN型和BCD型具体是什么数据?
BIN是二进制的,16进制的是BCD的。转换指令直接用BINXXXXDMXXX就行了。表示把XXXX这个数转换为BIN格式的,存储到DMXXX这个数据存储区里面。如果是要转换成BCD...
PLC为什么要把BCD码转为二进制?
在数字电路中只有两种信号高电平和低电平(也就是0和1两种状态),PLC只能识别二进制数,程序里的十进制,十六进制,都要转为二进制。程序写入PLC就是把二进制...
bcd码是什么?BCD码用在哪方面?-NGDob8wDm的回答-懂得
一、BCD码BCD码进数或二-十进制代码。用4位二进制数来的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。二、BCD码的应用1、这种编码技巧...
bcd是什么指令?
BCD码(Binary-CodedDecimal)亦称二进码十进数或二-十进制代码。用4位二进制数来表示1位十进制数中的0~9这10个数码。是一种二进制的数字编码形式,用二进制...
PLC中,BIN变换和BCD码究竟怎么用,2者之间的关系?
BIN10进制编码,其使用二进制方式BCD16进制编码例如:整数15如果是BIN方式那么其二进制为1111而如果是BCD方式,那么其16进制表示为15,二进制表示为00...
三菱plc的segd指令怎么输入?
三菱PLC的SEGD指令用于读取数据寄存器的内容,并将其保存到指定的数据区域中。以下简单描述一下输入SEGD指令的方法:1.首先打开编程软件(例如:GXDeveloper...
BCD码和二进制码有什么区别呀-懂得
两者的区别为:1、当用来表示十进制数字0——9时,用二进制代码与8421BCD代码完全相同。而当表示的十进制数字大于9时,用二进制代码与8421BCD代码表达...
PLC里面的BIN值是什么意思?bin值有什么用?BINK2M0D0BCDD0K2Y...
[最佳回答]第一条指令,是将K2MO的数据转换为二进制,放入D0第二条指令,是将D0的数据转换为BCD码,放入K2Y0你那么写BMOV,得到的结果K2Y0里面是2进制第一条指令,...