雖不支持格雷碼轉(zhuǎn)換,但是搞清格雷碼的轉(zhuǎn)換原理就可以了。
下面是富士SPH系列的格雷碼轉(zhuǎn)換程序。
自然二進制碼與格雷碼互換在富士SX系列PLC中的實現(xiàn)方法:
1. 自然二進制碼轉(zhuǎn)換為格雷碼:
根據(jù)自然二進制碼轉(zhuǎn)換為格雷碼的轉(zhuǎn)換規(guī)則,實際上就是將轉(zhuǎn)換數(shù)右移一位后與轉(zhuǎn)換數(shù)做異或操作。程序流程圖如下:
保存輸入數(shù) TEMP
將TEMP右移一位,保存SHILETEMP
將移位后的數(shù)據(jù)與原數(shù)據(jù)作異或
返回異或后的數(shù)據(jù)
功能塊中的程序如下:
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. 格雷碼轉(zhuǎn)換為自然二進制碼
根據(jù)格雷碼轉(zhuǎn)換為自然二進制碼的轉(zhuǎn)換規(guī)則,實際上就是不斷的將格雷碼與二進制數(shù)做異或操作,也就是說,不斷的和本身的不同位數(shù)做異或操作,如原數(shù)據(jù)為32位的A,那么先將A向右移動一位,與本身進行異或,然后保留值為B,那么繼續(xù)將A向右移動一位,與B進行異或,保留為C,依次類推,直到A=1為止。程序流程圖如下:
保存輸入數(shù) TEMP,INPUT1
如果輸入數(shù)為0,那么直接返回數(shù)據(jù)0后退出
如果TEMP不等于1,那么循環(huán),否則返回數(shù)據(jù)
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代碼方式的編程,因此基本上可以不做修改的應(yīng)用在西門子的S7系列的PLC中。
由于三菱的PLC中已經(jīng)包含了自然二進制碼轉(zhuǎn)換為格雷碼指令GRY以及格雷碼轉(zhuǎn)換為自然二進制碼指令GBIN,因此上述代碼應(yīng)用于三菱系列的PLC已經(jīng)沒有意義,請使用三菱PLC本身附帶的指令,因為西門子以及富士的SX系列PLC并沒有附帶轉(zhuǎn)換指令,因此本人書寫了上述代碼用于補充SX系列的指令不足。