hengtong
级别: 略有小成
精华主题: 0
发帖数量: 225 个
工控威望: 323 点
下载积分: 617 分
在线时间: 458(小时)
注册时间: 2006-10-25
最后登录: 2024-05-27
查看hengtong的 主题 / 回贴
楼主  发表于: 2008-01-11 12:19
不支持格雷码转换指令的PLC,如何编程.(以三菱PLCO为例)
cvlsam
富士低压,POD(觸摸屏),PLC专卖
级别: VIP会员

精华主题: 3 篇
发帖数量: 6743 个
工控威望: 37098 点
下载积分: 9662 分
在线时间: 9412(小时)
注册时间: 2006-09-13
最后登录: 2024-06-01
查看cvlsam的 主题 / 回贴
1楼  发表于: 2008-01-13 10:50
虽不支持格雷码转换,但是搞清格雷码的转换原理就可以了。
下面是富士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系列的指令不足。