PLC中的大端小端

 

相信大家在閱讀有關通訊數據傳輸、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字節順序?

 

西門子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(小端對齊)

 

可以結合“如何在 STEP 7 (TIA Portal) 中使用符號方式按位,字節,或字訪問非結構數據類型?”這篇文章理解。

文章鏈接:https://support.industry.siemens.com/cs/cn/zh/view/57374718

 

施耐德PLC採用小端方式:

 

如PL7 Pro平臺:

 

三菱PLC採用小端方式:

 

 

通訊中的序

 

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

 

網絡序

網絡傳輸一般採用大端序,也被稱之爲網絡字節序,或網絡序。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

 

要問大端、小端孰優孰劣,並不好分。記住在誰的地盤(平臺),按誰的規矩行事就萬事大吉。

 

本文大端、小端的內容就寫到這裏,希望對你有幫助。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章