西门子S51500系列PLC寻址方式浅析

西门子S51500系列PLC寻址方式浅析

对于西门子寻址方式在此做简单解析,目的备忘和更为深入和熟练的使用。

1、西门子高地址、低字节

高字节、低字位对应描述对象是以字节为单位,只有比字节大的存储单位进行数据存储时才存在这种说法,具体到PLC中就是字和双字,一个双字是由四个连续的字节组成,此处以西门子博途MD0的双字变量作为解析地址举例来解析西门子高地址低字节的意义,定义如下:

MD0为双字DWord数据类型,其是由连续的四个字节组成,即MB0、MB1、MB2和MB3,此处MB3为高字节,MB0为低字节,如下示意图为MD0的32个位的排列顺序。

从上图可以看到最左边是最高位31,最右边是最低位0,左边最高的8各位编号为24-31,对应的字节是MB0,最右边最低的8个位0-7,对应的字节是MB3,可以从图中看出,西门子的MD0最高的字节编号MB3反而在最右边充当最低的0-7位,而最低的字节编号MB0出现在了最高位24-31位置编号,这就是高地址、低字节意义。

下面是数字在空间中的存储介绍,比如十进制数字1,234,567,891,其十六进制为16#499602D3,二进制位2#0100 1001 1001 0110 0000 0010 1101 0011,这些数据在西门子PLC中的存储方式如下图:

从上图可以看出,MB3作为最高字节编号,其存储的为最低位数据16#D3,MB0作为最低字节编号,其存储的为最高位数据16#49。以下为将MD0分解为32个位时,数据存储情况。

由上图可以看出,在西门子数据存储过程中,对于双字MD0其分为四个连续字节,MB0存储最高位数据,MB3存储最低位数据,在数字用十六进制显示过程中,每两个数字表示一个字节,如16#49表示最高位MB0,每一个数字表示四个位,依据8421的方式对每个位进行对应,如当MD0存储的数据为16#10000000时,则M0.4位true。

2、西门子片段寻址

在西门子S71500/S71200系列PLC开始,其寻址方式开始支持Slice或者片段寻址方式,语法表达式如下,以MD0举例:

位寻址: ”测试双字”.%Xn

字节寻址:”测试双字”.%Xbn

字寻址: ”测试双字”.%Xwn

双字寻址:”测试双字”.%Xdn(对于64位及以上数据)

以上”测试双字”表示待寻址数据变量名,%X后b表示字节,访问8个位,w表示字,访问16个位,d表示双字,访问32个位,n表示寻址序号。

通常针对Byte、Word等数据类型的变量进行片段访问,如下图所示,此外也可以对INT、DINT等整数数据类型的变量进行片段访问。注意,博途V13以后.X改为.%X。

由上图可以看出,对于MD0使用片段寻址时:

”测试双字”.%X0对应MD0的最低位,即M3.0;

”测试双字”.%X31对应MD0的最高位,即M0.7;

”测试双字”.%Xb0对应最低字节MB3;

”测试双字”.%Xb3对应最高字节MB0;

”测试双字”.%Xw0对应最低字MW2;

”测试双字”.%Xw1对应最高字MW0;

3、西门子间接寻址

3.1 PEEK

西门子使用SCL编程时,可以用PEEK指令来读取I、Q、M和DB中的数据,PEEK支持以位(PEEK_BOOL)、字节(PEEK_BYTE)、字(PEEK_WORD)以及双字(PEEK_DWORD)的形式进行数据读取。

3.1.1 PEEK_BOOL

PEEK_BOOL以位的形式对西门子数据进行间接寻址,用于在不指定数据类型的情况下从标准存储区读取存储位。指令应用举例为:

#Peeker_BOOL := PEEK_BOOL(AREA := 16#84,

DBNUMBER := 1,

BYTEOFFSET := 2,

BITOFFSET := 1,

ENO => ENO);

IF NOT ENO THEN;

#Peeker_BOOL := 0;

END_IF;

指令针脚定义如下:

在上表中的AREA说明中,16#81对应I区,16#82对应Q区,16#83对应M区,16#84对应DB区。如以MD0为例,读取MD0中的各个位,其对应关系见以下分析:

"位读取存储" := PEEK_BOOL(

area := "读取区域",

dbNumber := "DB号",

byteOffset := "待读取地址",

bitOffset := "待读取位");

如上图所示,当读取M区域时:

待读取地址:n 待读取位: x

PEEK_BOOL读取的位为:Mn.x 注意:x≤7

3.1.2 PEEK_BYTE

PEEK_ BYTE以字节的形式对西门子数据进行间接寻址,用于在不指定数据类型的情况下从标准存储区读取存储字节。指令应用举例为:

#字节存储 := PEEK_BYTE(area := "读取区域",

dbNumber := "DB号",

byteOffset :="待读取地址");

如上图所示,当读取M区域时:

待读取地址:n

PEEK_BYTE读取的字节为:MBn

3.1.3 PEEK_WORD

PEEK_ WORD以字的形式对西门子数据进行间接寻址,用于在不指定数据类型的情况下从标准存储区读取存储字。指令应用举例为:

#字存储:=PEEK_WORD(area := "读取区域",

dbNumber := "DB号",

byteOffset := "待读取地址");

如上图所示,当读取M区域时:

待读取地址:n

PEEK_WORD读取的字节为:MWn

3.1.4 PEEK_DWORD

PEEK_ DWORD以双字的形式对西门子数据进行间接寻址,用于在不指定数据类型的情况下从标准存储区读取存储双字。指令应用举例为:

#双字存储 := PEEK_DWORD(area := "读取区域",

dbNumber := "DB号",

byteOffset := "待读取地址");

如上图所示,当读取M区域时:

待读取地址:n

PEEK_DWORD读取的字节为:MDn

3.2 POKE

西门子使用SCL编程时,可以用POKE指令来写入I、Q、M和DB中的数据,PEKE支持以位(PEKE_BOOL)、字节(PEKE_BYTE)、字(PEKE_WORD)以及双字(PEKE_DWORD)的形式进行数据写入。

3.2.1 POKE_BOOL

POKE_BOOL以位的形式对西门子数据进行间接寻址,用于在不指定数据类型的情况下从标准存储区写入存储位。指令针脚定义如下:

在上表中的AREA说明中,16#81对应I区,16#82对应Q区,16#83对应M区,16#84对应DB区。如以MD0为例,读取MD0中的各个位,其对应关系见以下分析:

POKE_BOOL(area:="读写区域",

dbNumber:="DB号",

byteOffset:="待读写地址",

bitOffset:="待读写位",

value:="值给定位");

如上图所示,当写入M区域时:

待读写地址:n 待读写位: x

POKE_BOOL写入的位为:Mn.x 注意:x≤7

3.2.2 POKE_BLK

“写入存储地址”指令用于在不指定数据类型的情况下将存储地址写入标准存储区,下表为指令及其针脚定义表。

POKE(AREA := 16#84,

DBNUMBER := 1,

BYTEOFFSET := 2,

VALUE := BYTE#7,

ENO => ENO);

在上表中的AREA说明中,16#81对应I区,16#82对应Q区,16#83对应M区,16#84对应DB区。如以MD0为例,读取MD0中的各个位,其对应关系见以下分析:

如上图所示,当写入M区域且Value为byte时:

待读写地址:n

POKE写入的为字节为:MBn

如上图所示,当写入M区域且Value为WORD时:

待读写地址:n

POKE写入的为字为:MWn

如上图所示,当写入M区域且Value为DWORD时:

待读写地址:n

POKE写入的为双字为:MDn

相关阅读