虽不支持格雷码转换,但是搞清格雷码的转换原理就可以了。
下面是富士SPH系列的格雷码转换程序。
自然二进制码与格雷码互换在富士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系列的指令不足。