我使用富士的SPH系列編輯的程式,因爲(wèi)富士的SPH符合IEC61131-3編程規(guī)範(fàn),因此依據(jù)如此改爲(wèi)其它品牌的PLC也十分之方便。
在精確定位控制系統(tǒng)中,為了提高控制精度,準(zhǔn)確測(cè)量控制對(duì)象的位置是十分重要的。目前,測(cè)量位置的方法主要有2種,其一是使用位置傳感器,此方法精度高,但是在多路,長距離位置監(jiān)控系統(tǒng)中,由于成本昂貴且安裝困難,因此并不實(shí)用。其二是采用光電軸角編碼器進(jìn)行精確位置控制,光電軸角編碼器根據(jù)其刻度方法及信號(hào)輸出形式,可分為增量式、絕對(duì)式以及混合式三種。而絕對(duì)式編碼器是直接輸出數(shù)字量的傳感器,它是利用自然二進(jìn)制或循環(huán)二進(jìn)制(格雷碼)方式進(jìn)行光電轉(zhuǎn)換的,編碼的設(shè)計(jì)一般是采用自然二進(jìn)制碼、循環(huán)二進(jìn)制碼、二
進(jìn)制補(bǔ)碼等。特點(diǎn)是不要計(jì)數(shù)器,在轉(zhuǎn)軸的任意位置都可讀出一個(gè)固定的與位置相對(duì)應(yīng)的數(shù)字碼;抗干擾能力強(qiáng),沒用累積誤差;電源切斷后位置信息不會(huì)丟失,但分辨率是由二進(jìn)制的位數(shù)決定的,根據(jù)不同的精度要求,可以選擇不同的分辨率即位數(shù)。目前有10 位、11 位、12 位、13 位、14 位或更高位等多種。其中采用循環(huán)二進(jìn)制編碼(即格雷碼)的絕對(duì)式編碼器,其輸出信號(hào)是一種數(shù)字排序,不是權(quán)重碼,每一位沒有確定的大小,不能直接進(jìn)行比較大小和算術(shù)運(yùn)算,也不能直接轉(zhuǎn)換成其他信號(hào),要經(jīng)過一次碼變換,變成自然二進(jìn)制碼,在由上位機(jī)讀取以實(shí)現(xiàn)相應(yīng)的控制。而在碼制變換中有不同的處理方式,本文著重介紹富士SX系列中使用編程的方法對(duì)二進(jìn)制格雷碼與自然二進(jìn)制碼的互換。
一、格雷碼(又叫循環(huán)二進(jìn)制碼或反射二進(jìn)制碼)介紹
在數(shù)字系統(tǒng)中只能識(shí)別0 和1,各種數(shù)據(jù)要轉(zhuǎn)換為二進(jìn)制代碼才能進(jìn)行處理,格雷碼是一種無權(quán)碼,采用絕對(duì)編碼方式,典型格雷碼是一種具有反射特性和循環(huán)特性的單步自補(bǔ)碼,它的循環(huán)、單步特性消除了隨機(jī)取數(shù)時(shí)出現(xiàn)重大誤差的可能,它的反射、自補(bǔ)特性使得求反非常方便。格雷碼屬于可靠性編碼,是一種錯(cuò)誤最小化的編碼方式,因?yàn)椋匀欢M(jìn)制碼可以直接由數(shù)/模轉(zhuǎn)換器轉(zhuǎn)換成模擬信號(hào),但某些情況,例如從十進(jìn)制的3 轉(zhuǎn)換成4 時(shí)二進(jìn)制碼的每一位都要變,使數(shù)字電路產(chǎn)生很大的尖峰電流脈沖。而格雷碼則沒有這一缺點(diǎn),它是一種數(shù)字排序系統(tǒng),其中的所有相鄰整數(shù)在它們的數(shù)字表示中只有一個(gè)數(shù)字不同。它在任意兩個(gè)相鄰的數(shù)之間轉(zhuǎn)換時(shí),只有一個(gè)數(shù)位發(fā)生變化。它大大地減少了由一個(gè)狀態(tài)到下一個(gè)狀態(tài)時(shí)邏輯的混淆。另外由于最大數(shù)與最小數(shù)之間也僅一個(gè)數(shù)不同,故通常又叫格雷反射碼或循環(huán)碼。下表為幾種自然二進(jìn)制碼與格雷碼的對(duì)照表:
十進(jìn)制數(shù)
自然二進(jìn)制
格雷碼
十進(jìn)制
自然二進(jìn)制
格雷碼
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
二、二進(jìn)制格雷碼與自然二進(jìn)制碼的互換
1、自然二進(jìn)制碼轉(zhuǎn)換成二進(jìn)制格雷碼
自然二進(jìn)制碼轉(zhuǎn)換成二進(jìn)制格雷碼,其法則是保留自然二進(jìn)制碼的最高位作為格雷碼的最高位,而次高位格雷碼為二進(jìn)制碼的高位與次高位相異或,而格雷碼其余各位與次高位的求法相類似。
例如:
自然二進(jìn)制編碼如下:
1
0
0
1
那么轉(zhuǎn)換為格雷碼的方法是:保留最高位1,然后將第二位0與第一位1做異或操作,第三位的0與第二位的0做異或操作,第四位的1與第三位的0做異或操作,得到結(jié)果如下:
1 1 0 1 Gray
2、二進(jìn)制格雷碼轉(zhuǎn)換成自然二進(jìn)制碼
二進(jìn)制格雷碼轉(zhuǎn)換成自然二進(jìn)制碼,其法則是保留格雷碼的最高位作為自然二進(jìn)制碼的最高位,而次高位自然二進(jìn)制碼為高位自然二進(jìn)制碼與次高位格雷碼相異或,而自然二進(jìn)制碼的其余各位與次高位自然二進(jìn)制碼的求法相類似。
例如將格雷碼1000轉(zhuǎn)換為自然二進(jìn)制碼:
1
0
0
0
1
1
1
1
上排為格雷碼,下排為自然二進(jìn)制,從左到右分別為1~4位
將上排的第一位高位作為自然二進(jìn)制的最高位,因此在下排的第一位填入1,然后以上排第二位與下排第一位做異或操作,得到下排第二位結(jié)果為1,將上排第三位與下排第二位做異或操作,得到下排第三位的結(jié)果為1,同理,下排第四位的結(jié)果為1,因此,我們得到了轉(zhuǎn)換結(jié)果 如下:
1 1 1 1 Bin
三、自然二進(jìn)制碼與格雷碼互換在富士SX系列PLC中的實(shí)現(xiàn)方法:
1. 自然二進(jìn)制碼轉(zhuǎn)換為格雷碼:
根據(jù)自然二進(jìn)制碼轉(zhuǎn)換為格雷碼的轉(zhuǎn)換規(guī)則,實(shí)際上就是將轉(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ìn)制碼
根據(jù)格雷碼轉(zhuǎn)換為自然二進(jìn)制碼的轉(zhuǎn)換規(guī)則,實(shí)際上就是不斷的將格雷碼與二進(jìn)制數(shù)做異或操作,也就是說,不斷的和本身的不同位數(shù)做異或操作,如原數(shù)據(jù)為32位的A,那么先將A向右移動(dòng)一位,與本身進(jìn)行異或,然后保留值為B,那么繼續(xù)將A向右移動(dòng)一位,與B進(jìn)行異或,保留為C,依次類推,直到A=1為止。程序流程圖如下:
保存輸入數(shù) TEMP,INPUT1
如果輸入數(shù)為0,那么直接返回?cái)?shù)據(jù)0后退出
如果TEMP不等于1,那么循環(huán),否則返回?cái)?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中試驗(yàn)沒有問題,由于富士的SX系列PLC完全支持ST代碼方式的編程,因此基本上可以不做修改的應(yīng)用在西門子的S7系列的PLC中。
由于三菱的PLC中已經(jīng)包含了自然二進(jìn)制碼轉(zhuǎn)換為格雷碼指令GRY以及格雷碼轉(zhuǎn)換為自然二進(jìn)制碼指令GBIN,因此上述代碼應(yīng)用于三菱系列的PLC已經(jīng)沒有意義,請(qǐng)使用三菱PLC本身附帶的指令,因?yàn)槲鏖T子以及富士的SX系列PLC并沒有附帶轉(zhuǎn)換指令,因此本人書寫了上述代碼用于補(bǔ)充SX系列的指令不足。