楼主最近还看过
放在300里一样有问题!
300仿真没有问题,硬件我没有试过。
200按一个启动按钮,两个Q点都要ON,300则不会。
S7-200的子程序使用临时变量来传递参数,对于OUT类型子程序不会把实参读入形参,所以这里使用OUT形参的触点就出现了临时变量未赋值先使用的情况,换成IN/OUT类型则避免了该问题,而S7-300的FC的参数传递机制又有区别,对于I.Q.M以及非绝对地址引用的DB块数据(如DBX0.0)形参传递的是实参的地址,即访问形参即访问实参,不会经过临时变量,而使用绝对地址引用的DB块数据(如DB1.DBX0.0)时也会使用临时变量来传递参数。
S7-200的子程序使用临时变量来传递参数,对于OUT类型子程序不会把实参读入形参,所以这里使用OUT形参的触点就出现了临时变量未赋值先使用的情况,换成IN/OUT类型则避免了该问题,而S7-300的FC的参数传递机制又有区别,对于I.Q.M以及非绝对地址引用的DB块数据(如DBX0.0)形参传递的是实参的地址,即访问形参即访问实参,不会经过临时变量,而使用绝对地址引用的DB块数据(如DB1.DBX0.0)时也会使用临时变量来传递参数。
如果I.Q.M形参传递的是实参的地址,对于I\Q\M形实参,则不仅OUT变量可以将值传入,IN变量应该也可以将值传出。
目前用PLCSIM测试结果中OUT变量可以将值传入FC中,而IN变量不能将值传出FC。也就是说将启动按钮、停止按钮和电动机都定义为OUT类型,也可以控制电动机的输出,而将启动按钮、停止按钮和电动机都定义为IN类型则无输出。
目前未在PLC上进行测试。
S7-200的子程序使用临时变量来传递参数,对于OUT类型子程序不会把实参读入形参,所以这里使用OUT形参的触点就出现了临时变量未赋值先使用的情况,换成IN/OUT类型则避免了该问题,而S7-300的FC的参数传递机制又有区别,对于I.Q.M以及非绝对地址引用的DB块数据(如DBX0.0)形参传递的是实参的地址,即访问形参即访问实参,不会经过临时变量,而使用绝对地址引用的DB块数据(如DB1.DBX0.0)时也会使用临时变量来传递参数。
如果I.Q.M形参传递的是实参的地址,对于I\Q\M形实参,则不仅OUT变量可以将值传入,IN变量应该也可以将值传出。
目前用PLCSIM测试结果中OUT变量可以将值传入FC中,而IN变量不能将值传出FC。也就是说将启动按钮、停止按钮和电动机都定义为OUT类型,也可以控制电动机的输出,而将启动按钮、停止按钮和电动机都定义为IN类型则无输出。
目前未在PLC上进行测试。
你是用梯形图测试的吧,你转换成STL会有所发现。
下面是西门子的一个资料里有关FC的基本数据类型的参数传送机理的图:
下面是有关的文字说明:
传递机理
随着调用指令CALL,STL/LAD/FBD编辑器首先根据参数列表中给出的实际参数,计算交叉区域指针,并在FC调用指令之后立即存贮这些指针。
此时,如果在该FC内部访问形式参数(比如:A On_1),CPU就根据存储在B堆栈中的返回地址确定该FC调用指令。然后根据相关的参数列表,FC就可确定与形式参数对应的实际参数的交叉区域指针。于是,通过这个指针就实现了对实际参数的访问。
这种传递机理与“按引用调用”相一致,如果在某一FC中访问了形式参数,那么,结果也访问了相应的实际参数。 .
这种通过指针的访问机理要求:
? 在FC调用中,所有的块参数都必须赋值。
? 在参数声明里,不能对块参数进行初始化。
注意事项
如果是用DB中的实际参数来对块参数进行赋值,或者传递的是复杂类型参数,那么,参数传递将变得更加复杂。