天天看點

格雷碼轉換成二進制c語言程式,各位老師格雷碼和二進制有什麼差別,怎麼轉換....

我使用富士的SPH系列編輯的程式,因爲富士的SPH符合IEC61131-3編程規範,是以依據如此改爲其它品牌的PLC也十分之友善。

在精确定位控制系統中,為了提高控制精度,準确測量控制對象的位置是十分重要的。目前,測量位置的方法主要有2種,其一是使用位置傳感器,此方法精度高,但是在多路,長距離位置監控系統中,由于成本昂貴且安裝困難,是以并不實用。其二是采用光電軸角編碼器進行精确位置控制,光電軸角編碼器根據其刻度方法及信号輸出形式,可分為增量式、絕對式以及混合式三種。而絕對式編碼器是直接輸出數字量的傳感器,它是利用自然二進制或循環二進制(格雷碼)方式進行光電轉換的,編碼的設計一般是采用自然二進制碼、循環二進制碼、二

進制補碼等。特點是不要計數器,在轉軸的任意位置都可讀出一個固定的與位置相對應的數字碼;抗幹擾能力強,沒用累積誤差;電源切斷後位置資訊不會丢失,但分辨率是由二進制的位數決定的,根據不同的精度要求,可以選擇不同的分辨率即位數。目前有10 位、11 位、12 位、13 位、14 位或更高位等多種。其中采用循環二進制編碼(即格雷碼)的絕對式編碼器,其輸出信号是一種數字排序,不是權重碼,每一位沒有确定的大小,不能直接進行比較大小和算術運算,也不能直接轉換成其他信号,要經過一次碼變換,變成自然二進制碼,在由上位機讀取以實作相應的控制。而在碼制變換中有不同的處理方式,本文着重介紹富士SX系列中使用程式設計的方法對二進制格雷碼與自然二進制碼的互換。

一、格雷碼(又叫循環二進制碼或反射二進制碼)介紹

在數字系統中隻能識别0 和1,各種資料要轉換為二進制代碼才能進行處理,格雷碼是一種無權碼,采用絕對編碼方式,典型格雷碼是一種具有反射特性和循環特性的單步自補碼,它的循環、單步特性消除了随機取數時出現重大誤差的可能,它的反射、自補特性使得求反非常友善。格雷碼屬于可靠性編碼,是一種錯誤最小化的編碼方式,因為,自然二進制碼可以直接由數/模轉換器轉換成模拟信号,但某些情況,例如從十進制的3 轉換成4 時二進制碼的每一位都要變,使數字電路産生很大的尖峰電流脈沖。而格雷碼則沒有這一缺點,它是一種數字排序系統,其中的所有相鄰整數在它們的數字表示中隻有一個數字不同。它在任意兩個相鄰的數之間轉換時,隻有一個數位發生變化。它大大地減少了由一個狀态到下一個狀态時邏輯的混淆。另外由于最大數與最小數之間也僅一個數不同,故通常又叫格雷反射碼或循環碼。下表為幾種自然二進制碼與格雷碼的對照表:

十進制數

自然二進制

格雷碼

十進制

自然二進制

格雷碼

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、自然二進制碼轉換成二進制格雷碼

自然二進制碼轉換成二進制格雷碼,其法則是保留自然二進制碼的最高位作為格雷碼的最高位,而次高位格雷碼為二進制碼的高位與次高位相異或,而格雷碼其餘各位與次高位的求法相類似。

例如:

自然二進制編碼如下:

1

1

那麼轉換為格雷碼的方法是:保留最高位1,然後将第二位0與第一位1做異或操作,第三位的0與第二位的0做異或操作,第四位的1與第三位的0做異或操作,得到結果如下:

1  1  0  1  Gray

2、二進制格雷碼轉換成自然二進制碼

二進制格雷碼轉換成自然二進制碼,其法則是保留格雷碼的最高位作為自然二進制碼的最高位,而次高位自然二進制碼為高位自然二進制碼與次高位格雷碼相異或,而自然二進制碼的其餘各位與次高位自然二進制碼的求法相類似。

例如将格雷碼1000轉換為自然二進制碼:

1

1

1

1

1

上排為格雷碼,下排為自然二進制,從左到右分别為1~4位

将上排的第一位高位作為自然二進制的最高位,是以在下排的第一位填入1,然後以上排第二位與下排第一位做異或操作,得到下排第二位結果為1,将上排第三位與下排第二位做異或操作,得到下排第三位的結果為1,同理,下排第四位的結果為1,是以,我們得到了轉換結果 如下:

1  1  1  1  Bin

三、自然二進制碼與格雷碼互換在富士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系列的指令不足。