发布于 2007-08-29 21:00:10
0楼
多谢鼠老爹的答复,每个阀门都用一个定时器是不可能的,因为会造成程序的复杂性,正是因为子程序中不能用定时器,所以我才采用INC进行累加次数(每秒/次),并将这个数作为IN_OUT类型传回给实参进行储存.每个阀门的延时次数各自使用一个字节时行存储.只要在调用时存在动作不到位的情况,就进行累加次数.超过设定的次数就报警.
象这种程序在化工行业用的较多,阀门是随工艺要求来进行开关的.所以也没有一个固定的顺序,所以不可能用顺序语句来处理.只能每一个阀门就用自己的实参来调用这个子程序.用这个子程序来处理开到位或关到位的情况,然后根据实际情况,将这个阀门的报警位赋"0"或"1"输出.
特别阀门多的时候,用这种子程序就显得更重要了.如果为每个阀门单独编这个程序,必然使程序变得很繁.有了这个子程序就简单多了,因为每个阀门都有自己的报警点,就可以在人机界面中作报警信息,当有阀门存在着开不到位或关不到位的情况时,就可以从人机中得到信息,可以快速处理故障.
我想通了,因为有十几个阀门要调用这个子程序,而在子程序中调用这个上升沿指令时,必然使上升沿指令失控.而S7-300中的上升沿指令不同,它有自己的储存位,只要这个储存位不重复,它可以被调用多少次都没有关系.但S7-200的上升沿指令不同,没有采用储存位来保存上升沿后的状态,所以在子程序中多次调用时会失控.所以我想到将子程序中的秒触发上升沿移出主程序中,将每一次秒信号触发的信号变成周期为1秒而只导通一个扫描周期的脉冲.而程序在每周期扫描中,在开不到位或关不到位的条件满足的情况下,由这个只导通一个周期的秒脉冲,使能自加(INC)运算一次.这样就可保证让自加指令只导通一个周期.
这是我个人的想法,有不对的地方请各位多多指教.
学如逆水行舟,不进则退