原文链接:汇川小型PLC梯形图编程系列教程(七):数值存储与二进制数据知识详解
PLC数据存储原理简介
H123U小型PLC内部采用的是32位的处理器,PLC中的数据处理和电脑中的数据处理基本是一致的。所有的CPU进行数据处理时,都是将其他进制的数据转换成二进制数进行加减乘除运算的。二进制数据是只有0和1两种状态的数据,在计算机内部电路中实际是以“高电平”和“低电平”来表示数据“1”和“0”的。
高电平
高电平是电工程学中的一种叫法,与低电平相对。在逻辑电平中,保证逻辑门的输入电平高于某个输入电压(Vin)时,则认为输入电平为高电平。对于不同芯片,不同逻辑的电平信号而言。这个“Vin”也不是固定的。比如对于3.3v的TTL电平而言,低电平一般认为是1.6v以下为低电平(实际使用时都是输出0v作为低电平),1.8v-3.3v认为是高电平(在工程应用中一般高电平直接输出3.3v)。
电平信号是用电压表示数字量的一种方法,只有0和1两种状态。高电平一般为“1”,低电平一般为”0″(有特殊情况,RS232电平信号是负逻辑,有兴趣的可以查一下)
低电平
和高电平相对,表示数字量“0”。
进制相关的知识
二进制
二进制”用于计算机计算则是最简捷方便的进制,对于1位数的计算有:0+0=0; 0+1=1; 1+0=1; 1+1=10(有进位,此时需用2个位来表示)这些计算只需用典型的“与”、“或”、“非”逻辑电路就可组合完成运算了。
计算机中完成数据计算的实际上是数字电路中的逻辑电路“与门”“或门”“非门”,二进制只有2种数据状态“低电平0”和”高电平1″。对于计算机来说,只认识高低电平0和1,所有的其他进制的数据都必须转换成二进制数据,计算机才能完成数据的处理运算。可以说二进制数据是计算机进行数据计算的基础,二进制对于计算机来说具有举足轻重的作用。(我们常听说计算机只认得0和1就是这个意思)。
位的概念
一个二进制位称之为bit,一个比特位,简称为位。bit位是计算机数据存储的最小数据单元。1bit位只有0或者1两种状态。我们常说的8位数据,16位数据,32位数据实际上就是指这个数据可以由那么多个二进制位组成。
8位数据
由8个二进制位组成,每一位都有0或者1两种状态,则8位数据最多可以表示的数值个数为2^8 = 256个数值。对于无符号的数据其范围就是0到255,对于有符号数据其范围就是-128-127这个数值范围(-27-(27-1))。关于有符号无符号的数值的介绍见下面。一般我们将8位数据称之为byte字节,1个8位数据称之为1个字节。有些编程语言中,1字节表示的就是字符型数据char。
十六位数据(短整型)
从右到左分别是bit0-bit15,16位数据一般我们称为1个字,由两个字节组成(2*8位)。表示的整型数值个数2^16 = 65536个数据,对于无符号数据而言,其数值范围是0到65535,对于有符号数据而言其数值范围是-32768-32767(中间包括0)也就是-215-(215-1)…一般称16位数据为1个字,在一些编程语言中将16位整型数据当成短整型数据使用(如C语言,代表short int)
32位数据(浮点型或者长整型)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
从右到左分别是bit0到bit31位数据,我们一般把32位数据称为双字数据。由4个字节组成(4*8位)。在程序中单精度浮点型数据是32位的长整型数据也是32位。(还有那种long int 64位整型数据,double双精度浮点型数据)。32位数据的数值范围进一步扩大,无符号整型数据范围:0-(232-1),有符号数据-231 到 2^31-1.
无符号数据
对于无符号数据,全部的二进制位都表示数据。是正整数
有符号数据
二进制的最高位表示符号位,其剩余位表示正常数值位。这里我懒得写的,从网上找了一下这部分的知识,是C语言的不过都是通用的。
C语言中将基本数据类型划分为signed(有符号)和unsigned(无符号)两大类。
例如,初始化变量int a = -3;其实它等价于signed int a = -3;关键字signed在这里可以省略,因为C语言默认就是有符号类型的,如果要定义无符号类型的数(也就是0和正整数)可以这样定义,unsigned int b = 5;
为了说明清楚signed和unsigned的区别,首先需要了解数据在内存中是如何存储的,在计算机中所有的数据都是按照二进制进行存储的(以下假设在字长为2个字节的机器上来表示)。
举个例子来说,unsigned int a = 1; 变量a在内存中就是以0000000000000001来存储的,用图表的形式表示:
因为这里是unsigned int,它是无符号整型,所以的它的16位全部用来表示数据。
int b = -1;
这里情况就稍微有点复杂了,注意数字1和-1在内存中的存储是完全不一样的,请看,
在计算机中,整数是以原码的形式存储的,而负数是以补码的形式存储的,原码大家都知道也就是它对应的二进制码,那什么是补码呢,就是原码的反码加1,反码就是原码的各位取反,例如-1的补码是:
首先1的原码是 00000000 00000001
其次取它的反码是 11111111 11111110
最后在其反码的基础上加上1 11111111 11111111
得到-1的补码是,11111111 11111111
上图中可以看出,int用15位来表示一个数字,第1位被符号位占用了,其实大家应该不难看出在数学中-1是负数中最大的整数,所以这里看到它的各个位都置1,对应于二进制来讲就是最大的数了,计算机就是按照符号位来识别该数是正是负,所以第一位只起到标识的作用并不作为数据位来使用,而其余的15位才是真正的数据位。以补码的形式来存储有个好处那就是计算机将负数的运算当作加法来处理了。那么将一个有符号的数赋给一个无符号的数会发现一个很有趣的现象,比如:
unsigned int a;
int b = -1;
a = b;
printf(“a=%u”,a);
输出a=65535,这个结果是怎么出来的呢?其实很简单,b=-1,根据上图-1在计算机中的数据位是1111111 11111111,注意是数据位,是要去掉符号位的,
所以是15,a是无符号类型的整数,将b赋给a,自然a就是1111111 11111111,也是15位第一位补0,转换成十进制就是65535,它也是unsigned int范围的最大上限(0~65535 216-1),-1是最大的负整数转换成正整数当然也是最大了,这个应该很好理解了。
例如:
unsigned int 类型的范围:一般较旧的机器占两个字节。最大是0—65535,16位2进制数;
signed int 类型的范围:有符号也是16位2进制,只不过第一位用来表示符号了,所以有符号的范围是-32768—32767.
本段来自****网友总结
[环宇工控博客]–专注于工业自动化领域,分享工控相关经验与教程,分享收集的百度云盘工控资料资源,记录个人生活读书感悟。期待与您的相遇~~