代理西门子6ES7214-1AG40-0XB0
浔之漫智控技术有限公司长期低价销售数控伺服系统:80
2C S、802D SL、810D DE、820D SL、840C CE、840D DE、840D SL、840DiSL、S120数控系统、数控伺服驱动模块、控制模块、电源模块、备品备件等。
有一种力量,正在支持我们前行,源于博大精深,同心致远。
上海浔之漫长期低价销售西门子PLC200.300.400.S1200.S1500.ET200.Smart200,6SE70变频器.70备件.6SY7000/7010.C98面板,6RA70/28/24直流调速器,6XV电缆,6EP电源,3RW30/40/44软启动器,6AV人机触摸屏,LOGO!,6SL系列G110.G120.S120.V10.V20,MM440/430/420变频,6DR阀门定位器,7ML.7ME.7MF.7MH仪表仪器,6FC.6SN伺服数控,电机等西门子系列产品
那么当主程序第二次调用该子程序时,开辟临时存储空间,此时的存储空间与第一次调用时开辟的不一定一致。可是,也有可能由于程序简单,仍然使用第一次调用时占用的存储空间。如果这种情况发生了,那么第一次调用时已经将#CC的L0.2置了1,而此值依旧存在,那么第二次调用时输入参数I0.2和I0.3为0,#CC(L0.2)为1,由于客户的子程序逻辑有自保持部分,*后L0.2的逻辑结果仍然是1。子程序完成后,#CC将值传送到输出参数Q0.1上,使其置1。就会出现客户反映的那种问题。
那么该如何避免这种情况呢?
大家是否还记得刚刚介绍局部变量参数类型时除了IN,OUT类型外,还有一种类型叫IN_OUT,这种类型的参数是先读入,再写出,这里我们就可以利用它的特点解决上面的问题。
下面对子程序的参数进行修改,将原先的#CC变量类型改为IN_OUT。如下图所示:
图.05
主程序结构不变,如下所示,可以看到由于#CC的类型是IN-OUT,它在子程序块的接口位置也转到了左侧输入侧。
图.06
下面将I0.0置1,其他输入都为0,监控程序状态,如图.07所示,可以看到只有Q0.0为1,Q0.1状态为0。而如果将I0.1置1,Q0.0被复位,Q0.1还是0,这样就符合客户的控制要求了。
图.07
同样,如果只给I0.2置1,那么也只有Q0.1会亮,不会再影响Q0.0。
了解了IN_OUT类型变量的特点,就不难分析以上的结果。因为每次调用子程序时,局部变量#CC都会先去读取输入参数Q0.0或Q0.1的状态,两次调用子程序时,#CC变量使用的同一区域,该区域的值也会在开始被Q点的状态所修改,就不存在两次调用相互影响的情况了。
如果在子程序一开始就添加一条指令,对局部变量#CC进行赋初值(如图.08),也可以避免临时变量区数值不定的问题,您可以尝试测试下。
图.08
在编写200子程序时要特别注意局部变量的特点,一旦出现多次调用不正常的情况,就可以从局部变量的特点出发分析,看看是不是存在隐患。善加利用IN_OUT变量也许可以解决许多问题