分享

【工控知识】子程序的“OUT'与'IN_OUT'

 yf4190 2016-03-26

每天推送行业相关资讯设备操作问题分析设备操作图解初入行业学习方法等,关注我们妥妥没错(咨询热线:400-8835503)

精彩内容

700万实战设备准备待续,你是否心动,工业帮欢迎大家来参观考察


下面是一个S7-200很简单的子程序:





提问:

一次调用没有问题, 如果两次用SM0.0的常开触点调用它,将会出现冲突,有条件的网友不妨试试。问题在哪里? 


分析: 

在OB1中两次调用上图的子程序SBR_0,在运行程序时发现,接通I0.0外接的小开关,Q0.0和Q0.1同时变为ON。


这是因为分配给SBR_0的输出参数“电动机”的地址为L0.2,第一次调用SBR_0之后,L0.2的值为ON。第二次调用SBR_0时,虽然起动按钮I0.2为OFF,但是因为两次调用SBR_0时局部变量区是公用的,此时输出参数“电动机”(L0.2)仍然为ON,所以第二次调用SBR_0之后,由于执行上图程序,输出参数“电动机”使Q0.1为ON。


子程序的局部变量一定要遵循“先赋值后使用”的原则。


S7-200的子程序使用临时变量来传递参数,OUT类型的参数不会把实参读入形参,所以这里使用OUT形参的触点就出现了临时变量未赋值先使用的情况。将输出参数“电动机”的变量类型改为IN_OUT就可以解决上述问题。


这是因为两次调用子程序,参数“电动机”返回的运算结果分别用Q0.0和Q0.1保存,在第二次调用子程序SBR_0,执行“O  #电动机”指令时,因为“电动机”是IN_OUT参数,使用的是前一个扫描周期保存到Q0.1的值,与本扫描周期第一次调用子程序后参数“电动机”的值无关。


简单地说,对于有记忆功能的电路,需要用存储单元来保存要记忆的变量值。S7-300的FB可以用静态变量来保存,而S7-200的子程序没有静态变量,只有用IN_OUT变量的实参(本例中的Q0.1)来保存变量值。



点击“阅读全文”观看工业帮700万设备与学员风采!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多