相信大家在閱讀有關通訊資料傳輸、PLC資料儲存等技術文件時,經常會碰到“Big-Endian”(大端對齊)與Little-Endian(小端對齊)術語。很多朋友不理解大端和小端模式,本文給大家寫一下此知識點。

一杯清酒邀明月發表於2024-03-29

  相信大家在閱讀有關通訊資料傳輸、PLC資料儲存等技術文件時,經常會碰到“Big-Endian”(大端對齊)與Little-Endian(小端對齊)術語。很多朋友不理解大端和小端模式,本文給大家寫一下此知識點。

一、大端與小端之分

  在PLC系統中,資料儲存在以位元組為單元的可定址儲存器中。這些資料一般包括如:BYTE、WORD、DWORD、REAL、STRING等。WORD由兩個位元組組成,DWORD由4個位元組組成,STRING如S7-200 SMART PLC中最多由255個位元組組成。對於這些多位元組資料型別,都被儲存為連續的位元組序列。那麼必然存在著一個如果將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。例如一個值為0x7788的16bit的WORD型變數x, 存放在0x0010開始儲存器地址中。對於大端模式,就是將0x77放在低地址中,即0x0010中,0x88放在高地址中,即0x0011中。小端模式,剛好相反。

  大端模式:是指對於多位元組資料的MSB(最高有效位元組)儲存在記憶體的低地址中,而資料的LSB(最低有效位元組)儲存在記憶體的高地址中。

  小端模式:是指對於多位元組資料的MSB(最高有效位元組)儲存在記憶體的高地址中,而資料的LSB(最低有效位元組)儲存在記憶體的低地址中。

  比如以四位元組DWORD數值0x0A0B0C0D的存放方式為例:大端模式:最高位位元組是0x0A,儲存在最低的記憶體地址a處,下一個位元組0x0B存在後面的地址a+1,以此類推。小端模式:最高位位元組是0x0A,儲存在最高的記憶體地址a+3處,下一個位元組0x0B存在後面的地址a+2,以此類推。

  從上面示例可以看出,大小端的差異在於存放順序不同。

  一段關於“端“的起源故事:

  “endian”一詞來源於十八世紀愛爾蘭作家喬納森·斯威夫特(Jonathan Swift)的小說《格列佛遊記》(Gulliver's Travels)。小說中,小人國為水煮蛋該從大的一端(Big-End)剝開還是小的一端(Little-End)剝開而爭論,爭論的雙方分別被稱為“大端派”和“小端派”。以下是1726年關於大小端之爭歷史的描述:

“ 我下面要告訴你的是,Lilliput和Blefuscu這兩大強國在過去36個月裡一直在苦戰。戰爭開始是由於以下的原因:我們大家都認為,吃雞蛋前,原始的方法是打破雞蛋較大的一端,可是當今皇帝的祖父小時候吃雞蛋,一次按古法打雞蛋時碰巧將一個手指弄破了。因此他的父親,當時的皇帝,就下了一道敕令,命令全體臣民吃雞蛋時打破雞蛋較小的一端,違令者重罰。老百姓們對這項命令極其反感。歷史告訴我們,由此曾經發生過6次叛亂,其中一個皇帝送了命,另一個丟了王位。這些叛亂大多都是由Blefuscu的國王大臣們煽動起來的。叛亂平息後,流亡的人總是逃到那個帝國去尋求避難。據估計,先後幾次有11000人情願受死也不肯去打破雞蛋較小的一端。關於這一爭端,曾出版過幾百本大部著作,不過大端派的書一直是受禁的,法律也規定該派任何人不得做官。” ”
—— 《格列夫遊記》 第一卷第4章 蔣劍鋒(譯)

二、幾款常見PLC位元組順序

  1. 西門子PLC採用大端方式:

  S7-200/200 SMART:如一個16位資料16#1234存放在VW100,則高位元組資料16#12存於地址VB100,低位元組資料16#34存於地址VB101。S7-300/400/1200/1500:

  注意:對於S7-1200/1500,最佳化的塊(Optimized block)儲存使用Little-Endian(小端對齊)

2. 施耐德PLC採用小端方式:

如PL7 Pro平臺:

3. 三菱PLC採用小端方式:

4. 其它概念

通訊中的序

  開篇提到了,通訊協議資料傳輸中涉及到大小端。

網路序

  網路傳輸一般採用大端序,也被稱之為網路位元組序,或網路序。IP協議中定義大端序為網路位元組序。

位序
  一般用於描述序列裝置的位元組各bit傳輸順序。網路協議中只有資料鏈路層的底端會涉及到。如RS-232、RS-485都屬於小端序(先傳低bit)的序列協議。

Modbus通訊

  Modbus以“Big-Endian”(大端對齊)表示地址和資料項。這意味著當傳送多個位元組資料項時,首先傳送最高地址的位元組資料。

  對於單個位元量,仍按位元組進行傳輸。傳輸位元量時,第一個資料位元組的LSB(最低有效位)對應第一個位元量,依次類推,一直到這個位元組的MSB(最高有效位)為止,再從第二個位元組開始。如果數量不是八的倍數,則用零填充資料位元組中剩餘的位,一直到位元組的MSB。

  如讀取多個16位保持暫存器,從站先傳送4x00001(值0x0002)的高位元組0x00然後低位元組0x02,接著傳送4x00002(值0x0004)的高位元組0x00然後低位元組0x04,以此類推......

  可以看出這和西門子大端模式相匹配。避免了大小端的轉換(如果資料位元組順序不一致,需要轉換)。這也是大家在做PLC通訊時,經常會遇到的一個問題。只要你理解其中原理(高低順序),找到轉換的方法就容易了。

常見位元組序

  常見的作業系統是小端,通訊協議是大端。

常見處理器體系的位元組序

  大端模式:PowerPC、IBM、Sun

  小端模式:x86、DEC

  要問大端、小端孰優孰劣,並不好分。記住在誰的地盤(平臺),按誰的規矩行事就萬事大吉。本文大端、小端的內容就寫到這裡,希望對你有幫助。

相關文章