一、导读
模拟量编程:从"重复劳动"到"一次搞定"
PLC 不只是逻辑控制。现场 90% 的物理量——温度、压力、流量、转速、液位——全都是模拟量。一个项目十几个传感器很正常,挨个写采集程序就是纯体力活:通道映射、量程转换、滤波、异常判断,每个传感器来一遍,代码量上去了,出错概率也上去了。
怎么破?S7-300 的 FC 块就是干这个的。
FC 是什么?一个可以反复调用的"子程序模板"。你把一个模拟量通道的完整处理逻辑写进去,做成一个标准块,后面几十个传感器直接"套模板"就行——改个通道号、改个量程参数,其他逻辑复用。写一次,用百次,既省时间又少出错。
二、控制要求:
1Hz 闪烁怎么实现? — 不用自己写定时器。S7-300 有系统时钟存储器字节(比如 MB0),其中 M0.5 就是固定的 1Hz 脉冲,直接拿来用就行,省代码又稳定。
低温保护建议加延时防抖 — 温度传感器偶尔会跳变,如果温度在 5℃ 附近波动,电机频繁启停就废了。建议加个 3~5s 的延时:温度低于 5℃ 持续 3s 才停电机,温度回升到 6℃ 以上持续 3s 才允许重启,给个滞回区间。
两路采集建议做块封装 — 室内、室外都是温度传感器,硬件型号、量程范围、滤波算法大概率一样。写一个 FC 块,管脚传不同的通道号就行,不用写两遍采集逻辑。
结构化编程的基本套路:OB1 当"总指挥",FC/FB 当"干活的"
PLC 程序不是一股脑堆在 OB1 里写的。标准写法是分工:
OB1 是主循环 — 只负责"调度",不负责"干活"。它的作用就是按顺序调用一个个 FC/FB,本身不写具体逻辑。
FC/FB 是功能块 — 每个块专门干一件事:采集温度写一个块,电机控制写一个块,报警逻辑写一个块,写完丢给 OB1 调用就行。
写 FC/FB 时有两种选择:
带参数编程 — 像个"函数",调用时传参(IN/OUT/IN_OUT)。同一个逻辑,换个参数就能用在不同地方,真正做到一次编写到处调用。
不带参数编程 — 块内部直接用全局地址 M、I、Q。好处是写得快,不用定义接口;坏处是复用性差,换个项目地址全变了,块就废了。
▲图1
▲图2
三、程序编写:
1)硬件组态
2)定义FC块参数接口,分别为AI_input、Osh、Osl等 3)根据公式进行编写程序:[(Osh-Osl)*(AI_Input-Lsl)]/ (Lsh-Lsl)+ Osl
4)在主程序OB1中调用三次FC1程序块:填入AI通道地址、Osh工程高值(查看传感器量程上限)、Osl工程低值(查看传感器量程下限)、Lsh数字量高值(10V电压对应27848)、Lsh数字量低值(0V电压对应0)
四、结束语:
FC 块的正确打开方式:带参数才叫"模板",不带参数就是"一次性脚本"
同类型设备有十几个?每个都写一遍程序?没必要。
把一个设备的完整逻辑写成一个带参数的 FC,它就成了一个"通用模板":
模板里不写死具体地址(比如 I0.0、Q0.0),而是用接口参数占位
调用时,把当前设备的实际地址填到参数里
十几个设备,同一个 FC 调用十几次就行,每次只换参数
不带参数的 FC 没有灵魂——内部直接用全局地址,换个项目地址全变了,改起来比重新写还累。