首页 > 其他分享 >PLC中的大端小端

PLC中的大端小端

时间:2024-03-29 11:59:32浏览次数:21  
标签:小端 字节 模式 地址 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(小端对齐)

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

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

标签:小端,字节,模式,地址,PLC,大端
From: https://www.cnblogs.com/ybqjymy/p/18103502

相关文章

  • Siemens 西门子 PLC Modbus写入float字节排列
    写保存寄存器功能码16示意:在西门子PLC中,实数,float,的保存方式遵循“高字节低地址,低字节高地址”的方式。假设使用16功能码向PLC的40005写入一个float,先利用BitConverter.GetBytes(f)得到要写的float的byte[]A。根据PLC中的存储方式,要想获得正确的float,在字40005的低......
  • CAN转PROFIBUS DP网关助力和利时PLC连接潍柴发电机组
    潍柴,作为柴油机行业的翘楚,其产品被广泛地应用于通信、石油、医疗、铁路以及农牧业等多个领域。 南通某项目有多台即将发往国外的潍柴发电机组,客户新需发电机组增加PROFIBUSDP接口以达到与上位系统和利时PLC实时通信。 该项目中,上位机系统需实时监控柴油机的转速,机油压力和......
  • 【PLC学习十一】浅谈西门子PLC的PID控制功能
    【PLC学习十一】浅谈西门子PLC的PID控制功能PID是自动控制中最常见的控制器,那么他在PLC中是如何实现的呢?文章目录【PLC学习十一】浅谈西门子PLC的PID控制功能前言一、PID是什么?二、西门子PID模块1.输入参数CONT_C2.输出参数CONT_C三、CONT_C实际使用1、写一个单独......
  • 西门子PLC常用底层逻辑块分享_模拟量写入
    文章目录前言一、功能概述二、模拟量写入程序编写1.创建自定义数据类型2.创建FC块“模拟量写入”3.编写程序前言本文分享一个自己编写的模拟量写入逻辑块。一、功能概述常用于阀门开度或者电机转速设置。二、模拟量写入程序编写1.创建自定义数据类型2.创建F......
  • tcp/ip网络通信时的大小端序转换
    1.短整形/长整形的转换#include<arpa/inet.h>//u:unsigned//16:16位,32:32位//h:host,主机字节序//n:net,网络字节序//s:short//l:int//这套api主要用于网络通信过程中IP和端口的转换//将一个短整形从主机字节序->网络字节序uint16_thtons(......
  • PLC常用通信协议应用
    PLC通信协议ModbusModbus协议介绍Modbus协议的应用Modbus通信模式ModbusRTU通讯ModbusRTU报文映射寄存器常见功能码数据类型ModbusCRC校验计算ModbusRTU举例(读位)ModbusRTU举例(读字)ModbusTCP协议应用TCP数据帧ModbusTCP报文ADSADS简介ADS支持多种协议ADS通讯原......
  • 三菱PLC实例学习
    案例一:控制两台电机(水泵)1.工艺分析(硬件选型)控制要求:1.单独控制:两台电动机互不影响地独立操作启动与停止(即可通过两个独立的按钮分别控制电机M1和电机M2的启停)2.两台电动机又可以联动控制(可以同时启动,也可以同时停止)3.电机过载(热接触器)时,需要单独报警4.有故障确认或故障复......
  • PLC数据远程采集
    在当今工业4.0时代,可编程逻辑控制器(PLC)作为工业自动化的核心组件,扮演着至关重要的角色。然而,传统的PLC数据采集方式往往受限于地域和距离,无法满足现代工业生产对于远程监控和管理的需求。HiWooBox一款PLC数据远程采集的网关产品,旨在为企业提供更加高效、便捷的远程数据采集......
  • 如何判断操作系统大小端
    用一个函数判断当前系统是大端序(big-endian)还是小端序(little-endian):#include<stdio.h>intcheck_endian(){unsignedintnum=1;char*ptr=(char*)&num;return(int)*ptr;}intmain(){if(check_endian()==1){printf("小端序\n&qu......
  • 在工厂项目中,我是用这个读取PLC数据的
    ApachePLC4X软件介绍ApachePLC4X旨在创建一组库,以统一的方式与工业级可编程逻辑控制器(PLCs)进行通信。目前,支持以下语言:JavaGoC(尚未可用)Python(尚未可用)C#(.Net)(已废弃)功能特点PLC4X设计目标之一是为开发人员提供简化的API,隐藏底层通信细节,以便与各种......