摘要: 本文通过一个“电机启停控制”的子程序案例,形象地类比“配方”与“食材”的关系,帮助初学者彻底理解PLC子程序的参数传递(IN, OUT, IN_OUT)机制。
一、 为什么需要子程序?——从“做菜”说起
假设你要控制10台相同的电机,每台都有“启动”、“停止”按钮,“运行”指示灯和“故障”信号。如果每台电机都写一遍相同的梯形图逻辑,程序会变得冗长且难以维护。
子程序就像一个通用的“做菜配方”,比如“炒青菜”。配方里定义了步骤:放油、下菜、翻炒、调味。而参数就是每次炒菜时用的具体食材:这次是油菜,下次是菠菜。
二、 创建“电机控制”子程序与参数定义
我们创建一个名为MC_Motor的子程序,并定义它的“接口”(即参数表):
输入参数:
i_Start(IN BOOL): // 启动按钮,相当于“油”i_Stop(IN BOOL): // 停止按钮,相当于“盐”i_Fault(IN BOOL): // 故障信号,相当于“火候”
输出参数:
o_Run(OUT BOOL): // 运行状态输出,相当于“成菜”o_Alarm(OUT BOOL): // 报警输出
输入输出参数:
io_RunCond(IN_OUT BOOL): // 一个保持型的运行条件,它既是输入也是输出,相当于“锅里的底味”
注意: IN参数是子程序只能读取的“食材”,OUT是子程序加工后产出的“菜品”,IN_OUT是子程序可以读取并修改的“调料罐”。
三、 编写子程序内部逻辑
在MC_Motor子程序内部,
我们编写一个标准的启保停电路:
(注:为简化,io_RunCond的使用略复杂,可理解为需要记忆的上次状态,此处用%M0.0替代其功能)
四、 调用子程序并传递参数
在主程序中,我们可以多次调用这个“配方”,为每台电机提供各自的“食材”。
调用电机1:
i_Start:=%I0.0// 将物理输入点I0.0(启动按钮1)传递给子程序i_Stop:=%I0.1// 停止按钮1o_Run=>%Q0.0// 将子程序的运行结果输出到物理输出点Q0.0(接触器1)o_Alarm=>%M100.0// 将报警输出到内部标志位M100.0
调用电机2:
i_Start:=%I0.2// 启动按钮2i_Stop:=%I0.3// 停止按钮2o_Run=>%Q0.1// 接触器2o_Alarm=>%M100.1// 报警2
五、 核心理解:参数传递的逻辑
IN参数: 是单向的。调用时,将外部变量(如
%I0.0)的值复制给子程序内部的i_Start。子程序内部如何修改i_Start,都不会影响外部的%I0.0。OUT参数: 是单向的。子程序执行完毕后,将内部
o_Run的最终结果复制给外部变量(如%Q0.0)。IN_OUT参数: 是双向的。调用时,将外部变量的值和内存地址都传递给子程序。子程序直接在这个内存地址上操作,所以它的修改会直接影响外部变量。
总结: 子程序通过参数化,实现了代码的高度复用和结构化。理解IN、OUT、IN_OUT三种参数的数据流向,是灵活运用子程序的关键。
RAYBET雷竞技首页官网