摘 要 本文对S7-300, S7-400 PLC编程过程中所涉及嘚寻址方式方法,做了简单介绍及简单示例
S7 CPU的系统存储区域分为下表中列出的地址区域。在程序中可以根据相应的地址直接读取数据
循环扫描周期开始时,CPU从输入模板读输入值并记录到该区域 |
在循环扫描周期中程序计算输出值并记录到该区域。循环扫描周期结束时CPU將计算结果写入相应的输出模板 |
该区域用于存储程序的中间计算结果 |
该区域提供定时器的存储 |
该区域提供计数器的存储 |
数据块中包含了程序的信息。可以定义为所有逻辑块共享 (shared DBs) 或指定给一个特定的 FB或 SFB 做背景数据块(instance DB) |
该区域包含块执行时该块的临时数据。L堆栈还提供用于传递塊参数及记录梯形逻辑网络中间结果的存储器 |
主站及分布式从站(DP)外设输入输出区域允许直接存取 |
在STEP7程序中可以使用输入输出信号(I/O)位存储区(M),计数器(C)计时器(T),数据块(DB)以及功能块(FB)等地址你可以直接访问这些绝对地址,但是如果给绝对地址以符号(助记符)程序将更易读懂(唎如Motor_A_On, 或者根据你的公司或者工程中的代码使用别的标识符),而一个你的用户程序中的地址也就可以用一个符号来访问
绝对地址由一个地址標识符和存储器位置组成。
如果给绝对地址分配符号可使程序易读而简化故障查找
STEP7能自动翻译符号名为要求的绝对地址。如果你准备用苻号名访问 数组结构,数据块局部变量,逻辑块及用户自定义数据类型那么你必须在此之前先分配符号名给绝对地址。
例如 你可鉯分配符号名’Motor_On’给地址Q 4.0,然后在程序语句中使用符名’Motor_On’作为地址
如需在程序中显示DB里所定义的符号,可以给该DB块定义一个符号不能在符号表给DB块中某地址单独定义符号。
间接寻址分为存储器间接寻址和寄存器间接寻址间接寻址的指针分为16位指针和32位指针,而32位指針又分为内部区域寻址与交叉区域寻址
2.2.1存储器间接寻址
?16位指针:16位地址指针用于定时器、计数器、程序块(DB、FC、FB)的寻址,16位指针被看作一个无符号整数(0~65535)它表示定时器(T)、计数器(C)、数据块(DB、DI)或程序块(FB、FC)的号,16位指针的格式如下:
例如使一个计数器向上计数表示为:
上述指令中’C’为区域标识符,而’MW20’为一个16位指针
16位指针存储器间接寻址举例:
?32位指针:32位地址指针用于I、Q、M、L、数据块等存储器中位、字节、字及双字的寻址,32位的地址指针可以使用一个双字表示第0位~第2位作为寻址操作的位地址,第3位~苐18位作为寻址操作的字节地址第19位~第31位没有定义,32位指针的格式如下:
存储器32指针仅用于内部区域寻址
例如写入一个M的双字表示为:
‘MD’为区域标识符及访问宽度,而LD0为一个32位指针
32位内部区域指针可用常数表示, 表示为P# 字节.位 如常数
为指向第10个字节第3位的指针常數。
若把一个32位整型转换为字节指针常数从上述指针格式可以看出,应要把该数左移3位(或是乘8)即可
32位存储器间接寻址举例:
//DB块间接寻址举例
//M存储器连续区域操作
//将地址指针加2(每个相邻的字地址相差2)。
2.2.2寄存器间接寻址
通过CPU的地址寄存器AR1和AR2寻址方式称为寄存器间接寻址分为内部区域间接寻址和交叉区域寻址。使用寄存器间接寻址方式的程序语句包含以下部分:
指令地址标识符,地址寄存器标识符偏移量
AR1,AR2均为32位寄存器寄存器间接寻址只使用32位指针。
与ARx相关的指令有:
?内部区域寄存器间接寻址
指针格式与存储器间接寻址的32位指針相同第0位~第2位作为寻址操作的位地址,第3位~第18位作为寻址操作的字节地址第19位~第31位没有定义,32位指针的格式如下:
间接寻址表示为:存储器标识符 [ ARx, 地址偏移量 ]
‘MW’为被访问的存储器及访问宽度’AR1’为地址寄存器1,P#2.0为地址偏移量
内部区域寄存寻址举例:
//DB块寄存器内部寻址
//DI、DO区寄存器内部寻址
?交叉区域寄存器间接寻址
包含有存储器区域信息的指针,称为交叉区域指针
同样,交叉区域指针为32位寄存器间接寻址要使用地址寄存器AR1或AR2。
32位交叉区域指针左起0~18位格式与32位内部区域指针相同,19~23位27~30位未定义,31位为交叉区域指針标识位
24~26位是存储区域地址标识,8中组合表示8种存储器区域:
交叉区域指针格式如下:
交叉区域间接寻址举例:
在使用FB/FC形参传递指针參数时16位、32位指针是可用的,但POINTER与ANY指针类型也是常见的类型因为更方便。
?16指针用于参数传递
//编写一个FC作用是启动条件满足后延时3秒输出闭合信号
//定义FC的形参如下:
*32指针用于参数传递
//编写一个FC,作用是将输入DB块指定的区域 (S7多个实数求和) 求出平均值
并且进入一个LOOP循环
?POINTER數据类型及参数传递
POINTER是一种用于传递指针的形参数据类型长度为6个字节。用于向被调用的函数FC及函数块FB传递复合数据类型(如ARRAY、STRUCT及DT等)嘚实参在被调用的函数FC及函数块FB内部可以间接访问实参的存储器。
POINTER参数中数据区含义如下:
若数据区为B#16#84,那么表示该POINTER指针是一个DB块地址,DB块号区域应当是所指向的DB块号(INT类型)并且不为零
(请参考ANY数据类型举例)
?ANY数据类型及参数传递
ANY是一种用于传递指针的形参数据类型,鈳视为POINTER类型的扩展较POINTER类型为复杂,长度为10个字节增加的4字节,最高字节 (Byte 0) 固定为B#16#10第二字节 (Byte 1) 为ANY指针所指向区域的数据类型,而接下来的2芓节 (BYTE 3, 4) 组合为一个INT为ANY指针所指定区域的长度,称为重复系数 (Repetition factor) 其余6字节作用与POINTER类型相同。
//冒泡排序程序算法原理请参考相关资料
//此例程僅提供存于DB块中的INT类型数据排序
//结果为INT数据由小到大排列,保存于原DB块中
//FC3块形参定义如下:
//若输出参数Error不为0, 则说明排序未进行,
//输入数據区是否为DB块
//数据起始地址去掉数据区标识部分
//计算最后一个存储单元指针保存至LD10
//外循环计数LW20循环次数为(数据个数-1)次
//嵌套循环计数LW18,循環次数为(LW20)次
//后一单元数据小于前一单元数据
//否,交换2单元数据
//错误码1ANY指针有错
//错误码2,输入数据区不是DB块
//错误码3输入数据类型不是INT
茬OB1程序中调用举例:
如果您对该文档有任何建议,请将您的宝贵建议提交至
该文档的文档编号:F0215
西门子(中国)有限公司
工业自动化与驅动技术集团 客户服务与支持中心
自动化系统 下载中心:
自动化系统 全球技术资源:
“找答案”自动化系统版区:
应用示例与所示电路、設备及任何可能结果没有必然联系,并不完全相关应用示例不表示客户的具体解决方案。它们仅对典型应用提供支持用户负责确保所述产品的正确使用。这些应用示例不能免除用户在确保安全、专业使用、安装、操作和维护设备方面的责任当使用这些应用示例时,应意识到西门子不对在所述责任条款范围之外的任何损坏/索赔承担责任我们保留随时修改这些应用示例的权利,恕不另行通知如果这些應用示例与其它西门子出版物(例如,目录)给出的建议不同则以其它文档的内容为准。
我们已核对过本手册的内容与所描述的硬件和软件楿符由于差错难以完全避免,我们不能保证完全一致我们会经常对手册中的数据进行检查,并在后续的版本中进行必要的更正欢迎您提出宝贵意见。
版权? 西门子(中国)有限公司 版权保留
复制、传播或者使用该文件或文件内容必须经过权利人书面明确同意侵权者將承担权利人的全部损失。权利人保留一切权利包括复制、发行,以及改编、汇编的权利
西门子(中国)有限公司
介绍了S7-200 PLC在自由口方式下与上位计算机串行通信的程序设计方法,讨论了在程序设计中需注意的问题,并给出了部分采用PLC的STL语言和VB语言实现的串行通信程序
通过平台发起求助,成功后即可免费获取论文全文
您可以选择百度App、微信扫码或财富徝支付求助。
我们已与文献出版商建立了直接购买合作
你可以通过身份认证进行实名认证,认证成功后本次下载的费用将由您所在的图書馆支付
您可以直接购买此文献1~5分钟即可下载全文。