PLC基礎篇之數制及其表示方法

所謂「數制」,是指「數」的表示方法,即計數的方法。數制採用進位的方法,當數值增加到該位能表示的最大值時,會將位數增加一位(進位)。按照進位的規則進行計數的數制,稱為進位數制。常見的進位數制有:二進位(Binary)、十進位(Decimal)和十六進位(Hexadecimal)。

人類的思維習慣於十進位(Decimal),所謂「逢十進一」。這個沒什麼好說的,地球人都知道。

本文要介紹的是PLC編程相關的概念,因此要重點介紹的是二進位(Binary)和十六進位(Hexadecimal)。

現代計算機普遍採用馮·諾伊曼(John von Neumann,1903~1957)的體系結構。美籍匈牙利科學家馮·諾伊曼根據電子元件的雙穩特性,提出數字計算機應採用二進位進行存儲和運算。

二進位(Binary)只有「0」和「1」兩個數碼,可以表示數字量的兩種不同的狀態,比如觸點的吸合與斷開,線圈的通電與斷電等等。在PLC的存儲單元中,可以使用一個「位(bit)」來表示「0」或者「1」兩種值,8個「位」組成一個位元組(Byte)。以西門子S7系列PLC為例,可以使用STL語句 「S Q0.0」將Q0.0置為「1」。其中,「Q0.0」中的「Q」表示輸出過程映像區(Output),第一個「0」表示第「0」個位元組,第二個「0」表示該位元組的第「0」位。當該指令執行後,PLC的輸出模塊的Q0.0將會有信號輸出,它連接的繼電器線圈會通電,常開觸點吸合,接通相應的電路。

二進位採用「逢二進一」的規則,可以使用多位二進位數來表示數值。將最低位記為第0位,從右往左的第n位,其權值(數制中某位上的1所代表的數值)為2的n次方。

在西門子S7系列PLC中,二進位常數以「2#」開始,比如:2#1101。二進位數可以轉換成十進位數,轉換方法是把各個位上的數乘以其權值,然後相加。比如2#1101,等於1乘以2的3次方(=8),加上1乘以2的2次方(=4),加上1乘以2的0次方(=1),等於十進位13。

由於二進位數位數太多,編程時書寫起來不太方便。為了簡化書寫,同時保持二進位宜於「位」操作的特性,人們把四個二進位位組成一組,用來表示一個數。由於四個二進位位所成表示的最大數是2#1111(=15),於是就出現了十六進位的數制。十六進位的數碼除了包括十進位的0~9之外,還包括A~F六個字母。A等於十進位的10,依次遞增,F等於10進位的15。

十六進位的表示方法比較多,在C/C++中用前綴"0x"表示,比如上一篇文章中提到的「0x0384」;在VB中使用前綴"&H"表示,比如「&H1A2B」;在西門子S7系列PLC中,使用「16#」來表示16進位數。但通常情況下,在表示16進位數的時候,需要同時指出它的數據類型(後續會有專門文章介紹數據類型相關知識),比如B#16#56表示16進位數56,它的數據類型是位元組(Byte)。

十六進位數可以很方便的轉換成二進位數,只需要把每一位數轉成二進位數,然後組合起來即可。比如B#16#56,其中16#5=2#0101,16#6=2#0110,所以16#56=2#1010110,如下圖:

程序設計中還用到一種編碼,稱為BCD碼。BCD是英文"Binary-Code Decimal"的縮寫,這種編碼的數制是十進位。BCD碼使用四個二進位數來表示一位十進位數,每一位允許的範圍是2#0000~2#1001,也就是十進位的0~9,採用「逢十進一」的規則。

BCD碼是有符號的,用最高位來表示符號,「0」表示正數,「1」表示負數。對於一個四位的BCD碼而言(16個二進位位),能表示的範圍是「-999~+999」。為什麼呢?其實比較好理解,你想,最高位是符號位,那麼就剩下了三位,由於每一位BCD碼,其本質是十進位數,所以每一位最大的數都是9,所以三位數最大就是999,加上符號,所以四位BCD碼能表示的十進位數的範圍是「-999~+999」。同樣的道理,八位BCD碼(32個二進位位)能表示的十進位數的範圍是「-9999999~+9999999」。

好了,關於PLC編程需要的數制的知識就先聊到這裡了。相關參考文章:

PLC基礎篇之編程語言的魅力

PLC基礎篇之PLC的誕生及工作原理

給你講個來自《格列佛遊記》的計算機故事

官網方正智芯(founder chip)提供本文PDF版本下載:


推薦閱讀:

加入匯川的小夥伴們,大家都來說說當初的想法吧?
聽說只會PLC在外面也不好混?
CNC與PLC的區別……?
plc S7-200是否已經徹底停產,對於初學者,學S7-200有意義嗎?
工控軟體有什麼開源項目?

TAG:可编程逻辑控制器PLC | 电气自动化 | 工控 |