首页 上一页 1 2 下一页 尾页

典型格雷码与自然二进制码的互换原理及方法 点击:7534 | 回复:27



wanggq

    
  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-09 16:20:39
楼主

 

  格雷码(英文:Gray Code,又称作葛莱码,二进制循环码)是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码。因由贝尔实验室的Frank Gray于20世纪40年代提出用来在使用PCM方法传送讯号时避免出错,并于1953年3月17日取得美国专利而得名。

 

  因为,虽然Bin 码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的7 ( 0111 ) 过渡为8 ( 1000 )时, 4 bit 的Bin 码每一个bit 都要发生变化,在实际电路中数码各个bit 的状态变化是占有一点时值的,4个bit 的变化不可能绝对同时发生,系统在这期间检测到的编码就会是“误码”!如1100、1111等等。而Gray 码则没有这一缺点,它在相邻数字量间过渡时,仅有一个bit 发生变化。它克服了由一个状态到下一个状态时逻辑的混淆。

 

  Gray 码的定义是,相邻数码仅有一个bit 不同;且,一组Gray码的最大数码与最小数码也仅有一个bit  不同。(这就是它的另一个名称“循环码”的由来)

 

  由定义可知,Gray Code 的编码方式不是唯一的,我们这里讨论的是最常用的一种(典型格雷码)。为了不致发生歧义,我们约定:在不作特别提醒的情况下,我们所提到的Gray 码都是指“典型格雷码”。

 

  Gray码属于可靠性编码,是一种错误最小化的编码方式。

 

  但Gray 码不是权重码,每一位数码没有确定的大小,不能直接进行比较大小和算术运算,也不能直接转换成模拟量信号,所以需要进行 Gray 码到 Bin 码的解码变换。

 

 
  要了解 Gray 码到 Bin 码的解码原理,就得先从 Bin 码到 Gray 码的变换开始认识 Gray 码的编码原理。

 





wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-09 16:35:10
1楼

 

  (以4 bit 的编码为例)举例说明 Gray 码的编码方法:把4 bit 的 Bin 码最高位(第4位)的值直接赋给 Gray 码的第4位;用Bin 码的最高位(第4位)跟 Bin 码的次一位(第3位)相“异或”,其结果作为 Gray 码的第3位的值;用 Bin 码的第3位跟 Bin 码的第2位相“异或”,其结果作为 Gray 码的第2位的值;用 Bin 码的第2位跟 Bin 码的第1位相“异或”,其结果作为 Gray 码的第1 位的值。各位依次“异或”转换后的值就是 Bin 码转换成 Gray 码对应位的值。

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-10 13:04:30
2楼

 

  今天抽空来讲在三菱PLC上,把 Bin 码转换成 Gray 码的方法。

 

  在FX2n及以上档次的PLC上,有专用的功能指令如FNC(170) GRY,用于把 Bin 码转换为 Gray 码。如果仅仅知道“GRY”指令能把二进制编码转换成格雷码,还不能算真正懂得格雷码的编码原理,只能算是只知其一、不知其二。

 

  如果我们指定在一种比FX2n系列档次低一些的PLC(譬如:FX1s、FX0s)上实现格雷码的转换,则需要我们具有格雷码转换的理论上的知识。

 

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-10 13:14:26
3楼

 

  例程1:从“K1X0”端口输入4bit 的自然二进制码,在“K1Y0”端口输出4bit 的格雷码。



  LD  X3                             OUT     Y3

  LD  X3   ANI  X2    LDI  X3  AND  X2   ORB  OUT  Y2

  LD  X2   ANI  X1    LDI  X2  AND  X1    ORB  OUT  Y1

  LD  X1   ANI  X0   LDI  X1  AND  X0   ORB  OUT  Y0

 





wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-10 13:26:58
4楼

 

  有的网友习惯于看梯形图的表达方式,照顾一下这些网友,用梯形图来表达例程1:

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-10 14:39:22
5楼

 

  4 楼的方法只是把着眼点放在格雷码编码的一个一个的 bit 上来做转换的。如果编码的 bit 数多一点,则这种转换方法就显得笨拙!

 

  现在,我们把着眼点放在高层次上,以Word 为单位来着手格雷码的转换:

 

  前面讲的格雷码转换原理说把原码(Bin)的最高位的值直接赋给转换码(Gray)的最高位。我们可以这样来理解它:“用‘0’跟原码的最高位做‘异或’运算,把运算结果赋给转换码的最高位;用原码的最高位跟原码的次高位做‘异或’运算,其运算结果作转换码的次高位;……以此类推依次把‘异或’运算的结果作转换码对应位的值。”

 

  用图形来表达比较易于网友们领会。

 

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-10 15:02:25
6楼

 

  落实到具体的PLC(譬如:FX1s-20M)上,我们写出例程2:

 

  这个例程的“目标功能”是:用“K1Y0”端口观察外接开关(联接到PLC的输入端口X10)的接通次数(以Bin编码形式监视)再将“K1Y0”中的Bin 码转换成Gray 码从“K1Y4”端口输出。(FX1s系列是不支持“GRY”指令的!)

 

  该片断中的异或指令的“目标功能”就是替代“GRY”指令  将二进制计数器“K1Y0”中的 Bin 码转换为 Gray 码由“K1Y4” 端口输出。

 

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-10 15:08:45
7楼

 

  提醒网友们注意:6 楼的例程只是一个片断,如果要照着去实践,请务必在该片断最后写上“END”命令!

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-10 15:40:47
8楼

 

  贴一个 4bit 的 Bin 码与 Gray 码的对照表出来,方便大家在实践中比对检验第6楼的例程运行结果。

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-10 15:58:06
9楼

 

  考虑到PLC面板上的输出指示灯的排列顺序是从左至右为:从“低位”到“高位”。刚好与 8 楼的对照表格中的编码排列顺序颠倒着,为了方便大家能直观的进行比对,我将8楼的表格做一个镜象提供给大家:

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-10 17:22:52
10楼

 

  再给大家提供一个自动验证“WXOR”指令替代“GRY”指令实现编码转换的功能:

  (这是在FX2n系列的PLC上做的验证)

 

 

  该例程中,字“K4M0”是一个二进制计数器,计数内容以 Bin 编码表示。字“K4M17”的内容为计数器内容对应的“Gray 码”,它是由“WXOR”指令替代“GRY”来实现的编码转换所得到的“Gray 码”。而另一个字“K4M33”中的内容是直接用三菱的“GRY”专用功能指令得到的与二进制计数器内容对应的“Gray 码”。例程中最后一条比较指令“CMP”用来把“K4M17”跟“K4M33”这两个字的内容自动进行比较。如果这两个字的内容出现不相等,则说明由“WXOR”指令替代“GRY”来实现的编码转换是不行的。以此送给那些持否定态度的人一个有力的证据来否定这种替代!但是,事实上这个比较结果始终表明这个替代是正确的!

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-10 20:45:34
11楼

 

  上例中“CMP”比较指令的“目标操作数”是以M100起始的3个M为“标志位”。其中M100动作,标志“K4M17”>“K4M33”;“M102”动作,标志“K4M17”<“K4M33”。

 

  只要“K4M17”和“K4M33”这两个字的内容出现不等,M100 和 M102 中就有一个的闭接点会使二进制计数器停止计数。相反,只要“K4M17”和“K4M33”这两个字的内容始终是相等的,则M100 和 M102 的闭接点就始终保持为闭合的,二进制计数器“K4M0”就一直处于计数状态。M8012 以10 Hz 的频率触发二进制计数器“K4M0”计数。这个计数器最大计数值为65536,运行110分钟足以使该计数器的编码状态通走一遍。经过几百分钟的运行实践事实证明:用“WXOR”指令与“GRY”专用指令在编码转换中所起的作用完全相等!

 

  下面是该例程的运行监视图片:

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-11 13:19:33
12楼

 

  弄懂了“ Gray  Code ”的编码原理,我们就可以倒推出把“ Gray  Code ”解码成“ Bin  Code”的原理来:

 

 

间隙的距离

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 49回
  • 年度积分:0
  • 历史总积分:4
  • 注册:2010年1月03日
发表于:2010-02-11 13:40:14
13楼
好像全部的回帖都是你一个人啊!工控这真是很衰啊

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-11 14:35:51
14楼

 

  也可以换一种解释:

 

  原(格雷)码的最高位跟“0”异或,所得结果传送给待求(二进制)码的最高位,并把这一结果跟次一位的原(格雷)码数字异或,其结果传送给待求(二进制)的次一位,并把该异或结果跟再次一位的原(格雷)码数字异或……依次类推。

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-11 15:07:59
15楼

 

  有了理论,再来说把格雷码转换成二进制码的方法。

 

  在三菱中的功能指令FNC(171)GBIN 是专用的“ Gray 码转换 Bin 码 ”的指令。但是这个指令也只能在FX2n系列及以上档次的PLC上实现。如果我们指定在较低档次的PLC上把 Gray 码转换成 Bin 码,则需要我们具有相应的原理方面的知识。

 

  下面是在FX1s系列PLC上实现两种编码相互转换的练习:

 

  做这个练习需要用外连线把“K1Y4”输出端口跟“K1X0”输入端口联接起来,让“K1Y4”端口输出的格雷码送到输入端口“K1X0”。 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-11 15:24:48
16楼

 

 为了确保网友们在实践这个练习的时候不出差错,我还是把连线图也画出来:

     

 

 

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-11 15:46:05
17楼

 

  下面是从PLC面板上的输出指示灯监视两种编码的对比情况。(输出指示灯的排列顺序是:左边低位,而右边高位。可以参照第9楼的“镜象对照表格”)

 

 

  上面一行的4个输出指示灯对应“K1Y0”,用它监视由Gray 码解码而来的Bin 编码;下面一行的4个输出指示灯对应“K1Y4”,用它监视由 Bin 编码转换而来的 Gray 码。

 

  在监视过程中,如果有初学的网友感觉每秒更换一个数码来不及对比思考,那就请将例程中的条件接点“M8013”改为“X10”,用手动按钮来触发二进制计数器“K1M0”。这样就能从容的进行比对和思考。

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-02-12 09:28:48
18楼

 

  在没有“GBIN”专用指令的低档次PLC上,用通用指令实现格雷码转二进制码,第15楼的方法在编码位数不多(譬如:4 bit )的情况下是最简的。如果编码位数较多,则第15楼的方法就有些繁。

 

  在编码位数较多的情况下,我们改用“字操作”的方法来实现“用非GBIN专用指令把格雷码转换为二进制码”的功能。

 

  例程序3:

 

  (在FX0s、FX1s、FX1n等PLC平台上实践)

 

 

海阔天空

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 17回
  • 年度积分:0
  • 历史总积分:141
  • 注册:2005年1月14日
发表于:2010-02-26 11:00:59
19楼

辛苦楼主,感谢分享你的成果,谢谢

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-03-02 17:11:35
20楼

 

  不用谢!相互交流,相互学习!

 

 


热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 下一页 尾页