在STEP7中 格雷码与二进制的怎么转换?
产品版区:SIMATIC S7-300(F)/S7-400(F/H/FH)
悬赏分:5 | 解决时间:2010-11-14 21:15:47 | 提问者: 喀嚓 - 学长  第2级
最佳答案
1100
要将它变为格蕾码:
第一位0与其左位异或结果为0
第二位0与其左位异或结果为1
第三位1与其左位异或结果为0
第四位1保留结果为1
因此最终结果为:1010,也就是原始的格蕾码。
101010100 111111110
回答者:
泛舟逆苦海
-
中级技术员  第6级
2010-11-10 19:58:53
提问者对于答案的评价:
谢谢咯
一、格雷码(又叫循环二进制码或反射二进制码)介绍
在数字系统中只能识别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、自然二进制码转换成二进制格雷码
自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似。
2、二进制格雷码转换成自然二进制码
二进制格雷码转换成自然二进制码,其法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似。
三、二进制格雷码与自然二进制码互换的实现方法
1、自然二进制码转换成二进制格雷码
A)、软件实现法(参见示例工程中的 Binary to Gray)
根据自然二进制转换成格雷码的法则,可以得到以下的代码:
static unsigned int DecimaltoGray(unsigned int x)
{
return x^(x>>1);
}
//以上代码实现了unsigned int型数据到格雷码的转换,最高可转换32位自然二进制码,超出32位将溢出。
static int DecimaltoGray( int x)
{
return x^(x>>1);
}
//以上代码实现了 int型数据到格雷码的转换,最高可转换31位自然二进制码,超出31位将溢出。
上述代码即可用于VC控制程序中,也可以用于单片机控制程序中。在单片机程序设计时,若采用汇编语言编程,可以按相同的原理设计程序;若采用C语言编程,则可以直接利用上述代码,但建议用unsigned int函数。
B)、硬件实现法
根据自然二进制转换成格雷码的法则,可以得到以下电路图:
上图所示电路图即可用异或集成电路74ls136实现,也可以利用可编程器件PLD等编程实现。
2、二进制格雷码转换成自然二进制码
A)、软件实现法(参见示例工程中的 Gray to Binary )
根据二进制格雷码转换成自然二进制码的法则,可以得到以下的三种代码方式:
static unsigned int GraytoDecimal(unsigned int x)
{
unsigned int y = x;
while(x>>=1)
y ^= x;
return y;
}
static unsigned int GraytoDecimal(unsigned int x)
{
x^=x>>16;
x^=x>>8;
x^=x>>4;
x^=X>>2;
x^=x^1;
return x;
}
static unsigned int GraytoDecimal(unsigned int x)
{
int i;
for(i=0;(1<<i)<sizeof(x)*8;i++)
{
x^=x>>(1<<i);
}
return x;
}
//以上代码实现了unsigned int型数据到自然二进制码的转换,最高可转换32位格雷码,超出32位将溢出。将数据类型改为int型即可实现31位格雷码转换。
上述代码即可用于VC控制程序中,也可以用于单片机控制程序中。在单片机程序设计时,若采用汇编语言编程,可以按相同的原理设计程序;若采用C语言编程,则可以直接利用上述代码,但建议用unsigned int函数。
B)、硬件实现法
根据二进制格雷码转换成自然二进制码的法则,可以得到以下电路图:
上图所示电路图即可用异或集成电路74ls136实现,也可以利用可编程器件PLD等编程实现。
如果看不完整你可以打开网站:http://www.vckbase.com/document/viewdoc/?id=1305来看。
回答者: zhangli0 - 超级顾问  第15级
2010-11-10 07:45:16
参考多圈编码器如何控制距离的:
http://www.ad.siemens.com.cn/service/answer/solution.asp?Q_id=39099&cid=1029
回答者: 满 - 顶级工程师  第12级
2010-11-10 07:47:13
我写过一个.
新建一个SCL的源程序,把下列代码复制到其中,编译并在其它块中调用它.
FUNCTION FC100 : WORD
// Block Parameters
VAR_INPUT
// Input Parameters
GRAY: WORD;
END_VAR
VAR_OUTPUT
// Output Parameters
BIN: WORD ;
END_VAR
VAR_TEMP
// Temporary Variables
TEMP,TEMP_SHR: WORD;
END_VAR
// Statement Section
TEMP :=GRAY;
TEMP_SHR:=GRAY;
IF TEMP = WORD#0 THEN
// Statement Section_IF
TEMP_SHR := WORD#0;
BIN := GRAY;
RETURN;
END_IF;
WHILE TEMP <> WORD#0 DO
// Statement Section
TEMP :=SHR (IN:=TEMP, N:=1);
TEMP_SHR :=TEMP XOR TEMP_SHR;
END_WHILE;
FC100 := TEMP;
BIN := TEMP_SHR;
END_FUNCTION
回答者: 临时工 - 学长  第2级
2010-11-12 07:55:58
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!