您的位置:控制工程论坛网论坛 » 西门子社区 » 西门子S7-200PLC局部变量详解

guai

guai   |   当前状态:在线

总积分:4822  2024年可用积分:6

注册时间: 2013-08-04

最后登录时间: 2022-03-24

空间 发短消息加为好友

西门子S7-200PLC局部变量详解

guai  发表于 2014/7/12 9:08:39  置顶    3889 查看 4 回复  [上一主题]  [下一主题]

手机阅读

IN           调用POU提供的输入参数。
OUT          返回调用POU的输出参数。
IN_OUT       数值由调用POU提供的参数,由子程序修改,然后返回调用POU。
TEMPORARY    临时保存在局部数据堆栈中的临时变量。一旦POU完全执行,临时变量数值则无法再用。在两次P0U执行之间,临时变量不保持其数值。
    局部变量是分配给每个子程序的临时存贮区。
    当子程序被调用时,系统分配局部变量区给子程序;子程序执行完成后,该局部变量区被释放。释放时其中存贮的值也同时丢失,不能再下一扫描周期再被子程序使用。
    局部变量区的大小为64个字节,其中最后4个字节被系统所占用,实际可供子程序使用的为60个字节。
    由于局部变量区的数据不能带到上一扫描周期,因此只能用于存迪程序运算中的中间值,可以减少对全局变量区的占用。
    由于局部变量区在子程序被调用时才被分配,且分配时并不对数据区进行初始化,所以其初始值是不确定的。因此在程序中用到这些存贮区的值的指令前,必须有对该存贮区地址的赋值操作,否则可能会出现错误的执行结果。尤其在子程序中存在大量的跳转指令时,很容易出现漏掉对局部变量赋值的情况,要格外注意。 
    每个子程序调用的输入/输出参数的最大限制是16,如果您尝试下载的程序超过此一限制,IN和out加起来共16个超过16个就会出错,本人做一个程序的时候发现了这个问题,在这里提醒各位同行。
    1、子程序或者中断程序不能访问分配给主程序的局部存储器。子程序不能访问分配给主程序、中断程序或者其他子程序的局部存储器。同样的,中断程序也不能访问分配给主程序或子程序的局部存储器。 
    2、有关局部变量:S7-200有64个字节的局部存储器,其中60个可以用作临时存储器或者给子程序传递参数。
    如果用梯形图或功能方块图编程,STEP7--Micro/WIN保留这些局部存储器的最后四个字节。
    局部存储器和变量存储器很相似,但只有一处区别。变量存储器是全局有效的,而局部存储器只在局部有效。全局是指同一个存储器可以被任何程序存取(包括主程序、子程序和中断中断程序程序)。局部是指存储器区和特定的程序相关联。S7--200给主程序分配64个局部存储器;给每一级子程序嵌套分配64个字节局部存储器;同样给中断程序分配64个字节局部存储器。
    子程序或者中断程序不能访问分配给主程序的局部存储器。子程序不能访问分配给主程序、中断程序或者其他子程序的局部存储器。同样的,中断程序也不能访问分配给主程序或子程序的局部存储器。S7--200 PLC根据需要分配局部存储器。也就是说,当主程序执行时,分配给子程序或中断程序的局部存储器是不存在的。当发生中断或者调用一个子程序时,需要分配局部存储器。新的局部存储器地址可能会覆盖另一个子程序或中断程序的局部存储器地址。
    局部存储器在分配时PLC不进行初始化,初值可能是任意的。当在子程序调用中传递参数时,在被调用子程序的局部存储器中,由CPU替换其被传递的参数的值。局部存储器在参数传递过程中不传递值,在分配时不被初始化,可能包含任意数值。
   3、CPU226的项目中最多可以创建128个子程序,其他CUP可以创建64个子程序。子程序可以嵌套调用,即在子程序中调用别的子程序,一共可以嵌套8层。在中断程序中调用的子程序不能再调用别的子程序。不禁止递归调用(子程序调用自己),但是应慎重使用递归调用。
   4、子程序中的定时器:停止调用子程序时,线圈在子程序内的位元件的ON/OFF状态保持不变。如果在停止调用时子程序中的定时器正在定时,100ms定时器将停止定时,当前值保持不变,重新调用时继续定时;但是1ms定时器和10ms定时器将继续定时,定时时间到时,它们的定时器位变为1状态,并且可以在子程序之外起作用。
    如何输入第一个局部变量赋值欲在局部变量表中赋值,请遵循以下步骤:
    1.    确保正确的POU在程序编辑器窗口中显示,如有必要,点击所需的POU标记。(因为每个POU都有自己的局部变量表,您需要确保对正确的POU赋值。)
    2.    如果局部变量表处于隐藏状态,下拉水平分裂条,显示局部变量表。
    3.    为需要定义的变量选择具有正确说明类型的行,在"名称"域中为该变量键入一个名称。(如果您在OB1或中断例行程序中赋值,局部变量表只包含TEMP变量。如果您在子程序中赋值,局部变量表包含IN、IN_OUT、OUT和TEMP变量。)您不需要在局部变量表中的变量名前加井号。井号只用在程序代码中的局部变量前。

1楼 0 0 回复
  • a1228

    a1228   |   当前状态:在线

    总积分:315  2024年可用积分:0

    注册时间: 2014-07-04

    最后登录时间: 2014-07-29

    空间 发短消息加为好友

    a1228   发表于 2014/7/12 10:29:04

    谢谢楼主分享

    2楼 回复本楼

    引用 a1228 2014/7/12 10:29:04 发表于2楼的内容

  • kill933670

    kill933670   |   当前状态:离线

    总积分:0  2024年可用积分:0

    注册时间: 0001-01-01

    最后登录时间: 0001-01-01

    空间 发短消息加为好友

    kill933670   发表于 2014/7/12 20:54:23

    很好的资料,收藏了

    3楼 回复本楼

    引用 kill933670 2014/7/12 20:54:23 发表于3楼的内容

  • ahljj

    ahljj   |   当前状态:在线

    总积分:11781  2024年可用积分:0

    注册时间: 2006-12-25

    最后登录时间: 2020-08-19

    空间 发短消息加为好友

    ahljj   发表于 2014/7/13 8:21:32

    很好的资料

    4楼 回复本楼

    引用 ahljj 2014/7/13 8:21:32 发表于4楼的内容

  • ahljj

    ahljj   |   当前状态:在线

    总积分:11781  2024年可用积分:0

    注册时间: 2006-12-25

    最后登录时间: 2020-08-19

    空间 发短消息加为好友

    ahljj   发表于 2014/7/13 8:21:48

    很好的资料

    5楼 回复本楼

    引用 ahljj 2014/7/13 8:21:48 发表于5楼的内容

总共 , 当前 /