PLC中的大端小端

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字节顺序

  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(小端对齐)

  可以结合“如何在 STEP 7 (TIA Portal) 中使用符号方式按位,字节,或字访问非结构数据类型?”这篇文章理解。文章链接:https://support.industry.siemens.com/cs/cn/zh/view/57374718

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

  要问大端、小端孰优孰劣,并不好分。记住在谁的地盘(平台),按谁的规矩行事就万事大吉。本文大端、小端的内容就写到这里,希望对你有帮助。

更多信息参考:如何在 STEP 7 (TIA Portal) 中使用符号方式按位,字节,或字访问非结构数据类型?

posted @ 2020-07-26 16:34  傍风无意  阅读(3016)  评论(0编辑  收藏  举报