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)来保存变量值。