格雷码转换成二进制c语言程序,各位老师格雷码和二进制有什么区别,怎么转换....
我使用富士的SPH系列編輯的程式,因爲富士的SPH符合IEC61131-3編程規範,因此依據如此改爲其它品牌的PLC也十分之方便。
在精确定位控制系统中,为了提高控制精度,准确测量控制对象的位置是十分重要的。目前,测量位置的方法主要有2种,其一是使用位置传感器,此方法精度高,但是在多路,长距离位置监控系统中,由于成本昂贵且安装困难,因此并不实用。其二是采用光电轴角编码器进行精确位置控制,光电轴角编码器根据其刻度方法及信号输出形式,可分为增量式、绝对式以及混合式三种。而绝对式编码器是直接输出数字量的传感器,它是利用自然二进制或循环二进制(格雷码)方式进行光电转换的,编码的设计一般是采用自然二进制码、循环二进制码、二
进制补码等。特点是不要计数器,在转轴的任意位置都可读出一个固定的与位置相对应的数字码;抗干扰能力强,没用累积误差;电源切断后位置信息不会丢失,但分辨率是由二进制的位数决定的,根据不同的精度要求,可以选择不同的分辨率即位数。目前有10 位、11 位、12 位、13 位、14 位或更高位等多种。其中采用循环二进制编码(即格雷码)的绝对式编码器,其输出信号是一种数字排序,不是权重码,每一位没有确定的大小,不能直接进行比较大小和算术运算,也不能直接转换成其他信号,要经过一次码变换,变成自然二进制码,在由上位机读取以实现相应的控制。而在码制变换中有不同的处理方式,本文着重介绍富士SX系列中使用编程的方法对二进制格雷码与自然二进制码的互换。
一、格雷码(又叫循环二进制码或反射二进制码)介绍
在数字系统中只能识别0 和1,各种数据要转换为二进制代码才能进行处理,格雷码是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,自然二进制码可以直接由数/模转换器转换成模拟信号,但某些情况,例如从十进制的3 转换成4 时二进制码的每一位都要变,使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它是一种数字排序系统,其中的所有相邻整数在它们的数字表示中只有一个数字不同。它在任意两个相邻的数之间转换时,只有一个数位发生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。另外由于最大数与最小数之间也仅一个数不同,故通常又叫格雷反射码或循环码。下表为几种自然二进制码与格雷码的对照表:
十进制数
自然二进制
格雷码
十进制
自然二进制
格雷码
0
0000
0000
8
1000
1100
1
0001
0001
9
1001
1101
2
0010
0011
10
1010
1111
3
0011
0010
11
1011
1110
4
0100
0110
12
1100
1010
5
0101
0111
13
1101
1011
6
0110
0101
14
1110
1001
7
0111
0100
15
1111
1000
二、二进制格雷码与自然二进制码的互换
1、自然二进制码转换成二进制格雷码
自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似。
例如:
自然二进制编码如下:
1
0
0
1
那么转换为格雷码的方法是:保留最高位1,然后将第二位0与第一位1做异或操作,第三位的0与第二位的0做异或操作,第四位的1与第三位的0做异或操作,得到结果如下:
1 1 0 1 Gray
2、二进制格雷码转换成自然二进制码
二进制格雷码转换成自然二进制码,其法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似。
例如将格雷码1000转换为自然二进制码:
1
0
0
0
1
1
1
1
上排为格雷码,下排为自然二进制,从左到右分别为1~4位
将上排的第一位高位作为自然二进制的最高位,因此在下排的第一位填入1,然后以上排第二位与下排第一位做异或操作,得到下排第二位结果为1,将上排第三位与下排第二位做异或操作,得到下排第三位的结果为1,同理,下排第四位的结果为1,因此,我们得到了转换结果 如下:
1 1 1 1 Bin
三、自然二进制码与格雷码互换在富士SX系列PLC中的实现方法:
1. 自然二进制码转换为格雷码:
根据自然二进制码转换为格雷码的转换规则,实际上就是将转换数右移一位后与转换数做异或操作。程序流程图如下:
保存输入数 TEMP
将TEMP右移一位,保存SHILETEMP
将移位后的数据与原数据作异或
返回异或后的数据
功能块中的程序如下:
INPUT 输入变量类型为DWORD
TEMP 局部变量类型为DWORD
SHILETEMP 局部变量类型为DWORD
BIN_TO_GRAY 功能块返回变量返回类型为DWORD
BIN_TO_GRAY:
TEMP:=INPUT;
SHILETEMP:=SHR_DWORD(TEMP,UNIT#1);
BIN_TO_GRAY:=SHILETEMP XOR INPUT;
2. 格雷码转换为自然二进制码
根据格雷码转换为自然二进制码的转换规则,实际上就是不断的将格雷码与二进制数做异或操作,也就是说,不断的和本身的不同位数做异或操作,如原数据为32位的A,那么先将A向右移动一位,与本身进行异或,然后保留值为B,那么继续将A向右移动一位,与B进行异或,保留为C,依次类推,直到A=1为止。程序流程图如下:
保存输入数 TEMP,INPUT1
如果输入数为0,那么直接返回数据0后退出
如果TEMP不等于1,那么循环,否则返回数据
TEMP右移1位,与输入值作不断异或
功能块中的程序如下:
INPUT 输入变量类型为DWORD
TEMP 局部变量类型为DWORD
INPUT1 局部变量类型为DWORD
GRAY_TO_BIN 功能块返回变量返回类型为DWORD
GRAY_TO_BIN:
TEMP:=INPUT;
INPUT1:=INPUT;
IF TEMP=DWORD#0 THEN
INPUT1:=DWORD#0;
GRAY_TO_BIN:=INPUT1;
RETURN;
END_IF;
WHILE TEMP<>DWORD#1 DO
TEMP:=SHR_DWORD(TEMP,UINT#1);
INPUT1:=TEMP XOR INPUT1;
END_WHILE;
GRAY_TO_BIN:=INPUT1;
上述代码在富士的SX系列PLC中试验没有问题,由于富士的SX系列PLC完全支持ST代码方式的编程,因此基本上可以不做修改的应用在西门子的S7系列的PLC中。
由于三菱的PLC中已经包含了自然二进制码转换为格雷码指令GRY以及格雷码转换为自然二进制码指令GBIN,因此上述代码应用于三菱系列的PLC已经没有意义,请使用三菱PLC本身附带的指令,因为西门子以及富士的SX系列PLC并没有附带转换指令,因此本人书写了上述代码用于补充SX系列的指令不足。
格雷码转换成二进制c语言程序,各位老师格雷码和二进制有什么区别,怎么转换....相关推荐
- 二进制转换为十进制c语言编程,将二进制IP地址转换成十进制(C语言程序实现)
将二进制IP地址转换成十进制(C语言程序实现) /* * Name: IP Address * Funcion: To convert binary numbers to decimal number ...
- 八进制转换成十进制c语言程序,C语言程序 十进制、八进制、十六进制的相互转化...
#include #include void main() { //*************************************** // 把十进制转化为十六进制与八进制 //***** ...
- c语言中输入字符转换成整数,c语言数字字符串转换成整数 C语言中如何将数字变成字符串啊?...
C语言:把数字字符串转换成整型数字不懂时,别乱说:懂得时,别多说:心乱时,慢慢说:没话时,就别说. 运行环境:TC2. 把数字字符串转换成整型数字.比如说小编输入一个数字字符当你年轻时,你以为什么都有 ...
- Android录屏并利用FFmpeg转换成gif(二)交叉编译FFmpeg源码
Android录屏并利用FFmpeg转换成gif(二) 写博客时经常会希望用一段动画来演示app的行为,目前大多数的做法是在电脑上开模拟器,然后用gif录制软件录制模拟器屏幕,对于非开发人员来讲这种方 ...
- Java黑皮书课后题第5章:5.4(将英里转换成千米)编写程序,显示下面的表格(注意:1英里为1.609千米)
5.4(将英里转换成千米)编写程序,显示下面的表格(注意:1英里为1.609千米) 题目 题目概述 破题 代码 题目 题目概述 5.4(将英里转换成千米)编写程序,显示下面的表格(注意:1英里为1.6 ...
- Java黑皮书课后题第5章:5.3(将千克转换成磅)编写程序,显示下面的表格(注意:1kg为2.2磅)
5.3(将千克转换成磅)编写程序,显示下面的表格(注意:1kg为2.2磅 题目 题目概述 破题 代码 感谢 题目 题目概述 5.3(将千克转换成磅)编写程序,显示下面的表格(注意:1kg为2.2磅) ...
- 格雷码转换成二进制c语言程序,格雷码与二进制的转换程序
/* 格雷码与二进制的转换程序 * 本程序采用递推的方法进行推导,可以转换0~2147483647之间的数(1~31位) * 推导方式如下(以三位格雷码为例): * 序号 格雷码 格雷码实值 二进制码 ...
- js 中转换成list集合_程序员:java集合介绍-List,具说很详细,你不来看看?
Java集合介绍 作为一个程序猿,Java集合类可以说是我们在工作中运用最多.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加方便开发. Java集合就像一个容器,可以存储任何类型的数 ...
- java如何把汉字转换成机内码_java语言如何将汉字转化成五笔
java语言如何将汉字转化成五笔 [2021-01-31 08:32:59] 简介: php将汉字转ascii的方法:首先创建一个php示例文件:然后通过封装好的"public funct ...
- c语言整数除法转换成浮点型,C语言中的类型转换
在C语言中不同类型的数据也可以使用二元运算符进行运算,不过如果不明白其中的规律的话,编出来的程序就会有些危险了. 强制类型转换 自动转换类型 举个例子: /*测试数据的类型转换*/ #include ...
最新文章
- 帝国cms二次开发之文件夹的功能说明
- 怎么判断网络回路_电源纹波要怎么测?
- 单行、多行文本超出显示省略号
- linux常用计划任务,浅谈:linux cron 计划任务常用符号小结
- python 人脸关键点检测_opencv+python+dlib人脸关键点检测、实时检测
- 成功解决 ProxyError: Conda cannot proceed due to an error in your proxy configuration
- 爬虫分页爬取猎聘_想把python爬虫了解透彻吗?一起盘它 ! !
- JavaScript基本资料
- 2015年计算机维修记录表,2015年 主题教学记录表.doc
- java window.onload_JavaScript window.onload
- oracle 查询月份
- steam linux不能运行,ubuntu 16.04下不能启动Steam的解决方法
- 计算机专业,25岁成985高校博导,13篇顶会!入职半年发ICML,网友:万点暴击...
- PerfDog性能狗实测智能手表性能
- 韩松手机摄影笔记第八课--手机人物摄影
- jQuery动态增加/删除select下来框的option中的selected属性
- JDK,JRE以及JVM三者之间的关系
- linux安装intel驱动
- python学习笔记——tkinter模块
- Parse 控制面板