我使用富士的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语言程序,各位老师格雷码和二进制有什么区别,怎么转换....相关推荐

  1. 二进制转换为十进制c语言编程,将二进制IP地址转换成十进制(C语言程序实现)

    将二进制IP地址转换成十进制(C语言程序实现) /* * Name: IP Address * Funcion: To convert binary numbers to decimal number ...

  2. 八进制转换成十进制c语言程序,C语言程序 十进制、八进制、十六进制的相互转化...

    #include #include void main() { //*************************************** // 把十进制转化为十六进制与八进制 //***** ...

  3. c语言中输入字符转换成整数,c语言数字字符串转换成整数 C语言中如何将数字变成字符串啊?...

    C语言:把数字字符串转换成整型数字不懂时,别乱说:懂得时,别多说:心乱时,慢慢说:没话时,就别说. 运行环境:TC2. 把数字字符串转换成整型数字.比如说小编输入一个数字字符当你年轻时,你以为什么都有 ...

  4. Android录屏并利用FFmpeg转换成gif(二)交叉编译FFmpeg源码

    Android录屏并利用FFmpeg转换成gif(二) 写博客时经常会希望用一段动画来演示app的行为,目前大多数的做法是在电脑上开模拟器,然后用gif录制软件录制模拟器屏幕,对于非开发人员来讲这种方 ...

  5. Java黑皮书课后题第5章:5.4(将英里转换成千米)编写程序,显示下面的表格(注意:1英里为1.609千米)

    5.4(将英里转换成千米)编写程序,显示下面的表格(注意:1英里为1.609千米) 题目 题目概述 破题 代码 题目 题目概述 5.4(将英里转换成千米)编写程序,显示下面的表格(注意:1英里为1.6 ...

  6. Java黑皮书课后题第5章:5.3(将千克转换成磅)编写程序,显示下面的表格(注意:1kg为2.2磅)

    5.3(将千克转换成磅)编写程序,显示下面的表格(注意:1kg为2.2磅 题目 题目概述 破题 代码 感谢 题目 题目概述 5.3(将千克转换成磅)编写程序,显示下面的表格(注意:1kg为2.2磅) ...

  7. 格雷码转换成二进制c语言程序,格雷码与二进制的转换程序

    /* 格雷码与二进制的转换程序 * 本程序采用递推的方法进行推导,可以转换0~2147483647之间的数(1~31位) * 推导方式如下(以三位格雷码为例): * 序号 格雷码 格雷码实值 二进制码 ...

  8. js 中转换成list集合_程序员:java集合介绍-List,具说很详细,你不来看看?

    Java集合介绍 作为一个程序猿,Java集合类可以说是我们在工作中运用最多.最频繁的类.相比于数组(Array)来说,集合类的长度可变,更加方便开发. Java集合就像一个容器,可以存储任何类型的数 ...

  9. java如何把汉字转换成机内码_java语言如何将汉字转化成五笔

    java语言如何将汉字转化成五笔 [2021-01-31 08:32:59]  简介: php将汉字转ascii的方法:首先创建一个php示例文件:然后通过封装好的"public funct ...

  10. c语言整数除法转换成浮点型,C语言中的类型转换

    在C语言中不同类型的数据也可以使用二元运算符进行运算,不过如果不明白其中的规律的话,编出来的程序就会有些危险了. 强制类型转换 自动转换类型 举个例子: /*测试数据的类型转换*/ #include ...

最新文章

  1. 帝国cms二次开发之文件夹的功能说明
  2. 怎么判断网络回路_电源纹波要怎么测?
  3. 单行、多行文本超出显示省略号
  4. linux常用计划任务,浅谈:linux cron 计划任务常用符号小结
  5. python 人脸关键点检测_opencv+python+dlib人脸关键点检测、实时检测
  6. 成功解决 ProxyError: Conda cannot proceed due to an error in your proxy configuration
  7. 爬虫分页爬取猎聘_想把python爬虫了解透彻吗?一起盘它 ! !
  8. JavaScript基本资料
  9. 2015年计算机维修记录表,2015年 主题教学记录表.doc
  10. java window.onload_JavaScript window.onload
  11. oracle 查询月份
  12. steam linux不能运行,ubuntu 16.04下不能启动Steam的解决方法
  13. 计算机专业,25岁成985高校博导,13篇顶会!入职半年发ICML,网友:万点暴击...
  14. PerfDog性能狗实测智能手表性能
  15. 韩松手机摄影笔记第八课--手机人物摄影
  16. jQuery动态增加/删除select下来框的option中的selected属性
  17. JDK,JRE以及JVM三者之间的关系
  18. linux安装intel驱动
  19. python学习笔记——tkinter模块
  20. Parse 控制面板

热门文章

  1. Ubuntu18.04下编译tslib触摸屏驱动
  2. WPF|一个比较简单带点设计的登录界面
  3. 查看DELL服务器保修期
  4. owncloud mysql_Nginx+ownCloud+PHP+MySQL搭建私有云
  5. android能播放4k视频格式,四平台六款手机4K视频播放实测
  6. Debian 8 安装BtSync
  7. 三对角矩阵行优先压缩存储---加法、减法、乘法、转置、秩、行列式值、伴随矩阵、逆
  8. 打开方式怎么用计算机程序,设置电脑默认软件打开方式的方法
  9. vant修改用户头像
  10. 弦图(Echarts)