S7-300有没有格雷码转二进制功能块 点击:6757 | 回复:20



sunhl

    
  • 精华:1帖
  • 求助:1帖
  • 帖子:8帖 | 35回
  • 年度积分:0
  • 历史总积分:150
  • 注册:2004年7月26日
发表于:2005-05-16 07:37:00
楼主
S7-300有没有格雷码转二进制功能块



千万

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 33回
  • 年度积分:0
  • 历史总积分:115
  • 注册:2003年9月02日
发表于:2005-05-22 22:05:00
1楼
最近刚做了一个FC,8位的,需要的话留下您联系方式

jianchao

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 6回
  • 年度积分:0
  • 历史总积分:148
  • 注册:2007年3月19日
发表于:2007-11-27 21:17:00
2楼
能不能发给我一份,谢谢!
chaojianchao@126.com

huangbd

  • 精华:0帖
  • 求助:1帖
  • 帖子:24帖 | 103回
  • 年度积分:0
  • 历史总积分:436
  • 注册:2004年5月31日
发表于:2007-11-29 10:10:00
3楼
自己动手做吧,

yuanle

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 10208回
  • 年度积分:2747
  • 历史总积分:48332
  • 注册:2005年4月22日
发表于:2007-11-29 10:18:00
4楼
S7-300沒有現成的轉換功能塊,我使用了富士的SPH編寫了一個功能塊,由于富士的和西門子都支持IEC61131-3編程規范,那么應該很簡單的轉換為西門子的功能塊。
在精确定位控制系统中,为了提高控制精度,准确测量控制对象的位置是十分重要的。目前,测量位置的方法主要有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系列的指令不足。

因為歐姆龍的ST不能支持數據移位指令,因此如果使用歐姆龍的話,那么FB中需要使用梯形圖來做哦。

千山独步

  • 精华:0帖
  • 求助:0帖
  • 帖子:159帖 | 3098回
  • 年度积分:4
  • 历史总积分:21261
  • 注册:2007年2月02日
发表于:2007-11-29 11:26:00
5楼
不错,难得的好资料呀,收藏了!

比芭卜容

  • 精华:0帖
  • 求助:0帖
  • 帖子:24帖 | 128回
  • 年度积分:0
  • 历史总积分:123
  • 注册:2007年7月24日
发表于:2007-11-29 14:37:00
6楼
收了

lidsh2008

  • 精华:0帖
  • 求助:0帖
  • 帖子:11帖 | 129回
  • 年度积分:0
  • 历史总积分:168
  • 注册:2005年6月07日
发表于:2007-11-29 22:04:00
7楼
好资料,收了!

LUGANCHAO

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 1821回
  • 年度积分:0
  • 历史总积分:2757
  • 注册:2007年4月06日
发表于:2008-04-30 12:29:00
8楼
不错,难得的好资料呀,收藏了!

zoulemiao2006

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2008年12月10日
发表于:2009-06-23 18:48:01
9楼

好东西要与大家分享哦

sgailht

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2010年4月09日
发表于:2010-08-16 15:29:58
10楼
回复内容:
对:yuanle 的回复:


非常感谢,按照yuanle 的回复程序我自己在施奈德PLC编程软件中编写了DFB块,已经测试成功了。

mingyepan

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2010年10月04日
发表于:2010-10-04 18:10:51
11楼
回复内容:
对:千万 关于最近刚做了一个FC,8位的,需要的话留下您联系方式 内容的回复:

我刚遇到一个在SETP7中把格雷码转变成二进制码的问题,想请教专家。多谢!QQ:1031873238

高童

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 4回
  • 年度积分:0
  • 历史总积分:23
  • 注册:2006年5月16日
发表于:2011-09-25 01:46:01
12楼

FUNCTION "Cray Code" : VOID
TITLE =
AUTHOR : G
NAME : ‘格雷码‘
VERSION : 0.1


VAR_INPUT
GrayCode_In : WORD ;
END_VAR
VAR_OUTPUT
BinCode_Out : WORD ;
END_VAR
VAR_TEMP
Data_Temp : WORD ;
Loop_Numbers : INT ;
Data_Temp_1 : WORD ;
END_VAR
BEGIN
NETWORK
TITLE =
//格雷码转二进制
L #GrayCode_In;
AW W#16#FFF;
T #Data_Temp;
T #Data_Temp_1;
L 12;
NEXT: T #Loop_Numbers;
L #Data_Temp_1;
SRW 1;
T #Data_Temp_1;
L #Data_Temp;
L #Data_Temp_1;
XOW ;
T #Data_Temp;
L #Loop_Numbers;
LOOP NEXT;
L #Data_Temp;
T #BinCode_Out;

END_FUNCTION

-----------------------------------------------------------------

L 12; (把12改成你想要的位数就可以了,16位以内)。

wyb2866255

  • 精华:57帖
  • 求助:0帖
  • 帖子:148帖 | 2872回
  • 年度积分:1
  • 历史总积分:31450
  • 注册:2010年7月01日
发表于:2011-09-25 23:54:15
13楼
S7-300没有格雷码转二进制功能块,根据格雷码转换为二进制码的逻辑关系,在2010年12月份为答复一网友求助,曾用S7-200编写的梯形图。现重新贴出供参考(用此程序很易改为S7-300程序语句)。见下图:

wyb2866255

  • 精华:57帖
  • 求助:0帖
  • 帖子:148帖 | 2872回
  • 年度积分:1
  • 历史总积分:31450
  • 注册:2010年7月01日
发表于:2011-09-26 00:06:26
14楼
说明:该程序是依据格雷码转换为二进制码的逻辑运算关系编写的,二者关系如下:

      本程序就是根据上述二者的关系式编写的。

梯形图中
      1、MW0 为格雷码存数区,本图是置入格雷码值为“0001_1101”(用6进制数表示:16#3D),转换后的二进制码为“0001_0110”。在实际应用时,应将16#3D数改为将你要转换的格雷码送入MW0就可以了。
      2、MW2为二进制数存数区,即将转换后的二进制数存入此区。
      3、I1.0 为手控转换按钮,是为试验用的,T101断电延时定时器是为防按钮颤抖用的。实际应用时可不用,可选用内部的一个位信号(如M4.0)来控制程序运行就可以了。
     4、试验此程序时,应先将要转换的格雷码写入MW0中后再运行此程序,运行时可监视程序的最后一条语句,即:按下按钮(I1.0),按钮抬起时,转换后的格雷码数值将立即显示在MW2中。
     本程序,格雷码容量为一个字,即16位数。只要看懂程序,了解格雷码与二进制码的转换关系,此梯形图稍加改动,就可实现容量为字节数或双子数的格雷码转换。
     在实际应用时,可把该程序编为一个子程序(如SBR_0),在主程序中,用将M4.0置1(M4.0=1)来调用此子程序。在子程序中,将I1.0驱动T101的语句去掉,再用M4.0=1的前沿代替原语句“T101的后沿”,将原“16#3D送入MW0”,改为VW10送入MW0(VW10即为待转换的原格雷码存数区),在比较语句当MB8=0的的输出处(即将M20.1与M20.2清0处)再增加一条将M4.0清0语句,这样M4.0=0,调用此子程序自动结束。

wingwf2000

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 455回
  • 年度积分:0
  • 历史总积分:1000
  • 注册:2008年1月09日
发表于:2012-01-13 09:40:24
15楼

如果想提高速度就查表

不然就按13楼说的写

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 455回
  • 年度积分:0
  • 历史总积分:1000
  • 注册:2008年1月09日
发表于:2013-09-16 10:16:01
16楼

这个是8为格雷码转8位二进制码的程序,S7-300的程序

华夏小不点

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 34回
  • 年度积分:0
  • 历史总积分:135
  • 注册:2015年3月07日
发表于:2015-10-30 19:58:17
17楼

看看是啥情况!!!

!!!

战场骑士

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 13回
  • 年度积分:0
  • 历史总积分:6
  • 注册:2015年12月21日
发表于:2015-12-21 21:37:13
18楼

有直接下载的指令库就好啦!

DDMARE

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 2回
  • 年度积分:0
  • 历史总积分:996
  • 注册:2011年10月17日
发表于:2017-01-18 11:38:17
19楼


回复内容:

对:   这个是8为格雷码转8位二进制码的程序,S7-300的程序 内容的回复!


gk2017

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 13回
  • 年度积分:0
  • 历史总积分:96
  • 注册:2017年10月20日
发表于:2018-02-03 09:56:32
20楼

需要  479978455@qq.com

回复内容:

对: 千万 最近刚做了一个FC,8位的,需要的话留下您联系方式 内容的回复!



热门招聘
相关主题

官方公众号

智造工程师