寂静回声 发表于 3 天前

欲用西门子 1200PLC 实现如下功能



问
https://s3.bmp.ovh/2026/11/02/0jVUYaYO.jpg


答
按 TIA Portal + S7-1200 的常规做法:
在 PLC 数据类型里新建一个 UDT,名字叫 typeTank,每个水罐的东西都收在里面,这样后面 50 个罐就是一个数组。
再建一个全局 DB,名字叫 DB_Tank,保持默认的优化块访问。
始数据按罐号存,排序结果单独放 sorted,这一点很重要,不能为了方便显示而把原始数组搅乱。

功能 1,温度从高到低并带罐号。
新建一个 FC,名字叫 FC_Sort,语言选 SCL。排序要解决的核心是温度和罐号一起走,不能只排温度,所以用选择排序,交换的是整个结构,罐号自然跟着温度走。

功能 2,到温度启动阀和泵。
新建一个 FB,名字叫 FB_TankControl,用一个 FOR 循环把 50 个罐统一处理。这里加了回差,不然温度在设定点附近晃,阀和泵会嗒嗒嗒来回跳。

PT100 直接配 SM1231 RTD 模块,在设备组态里把模块通道类型设成对应的 RTD,比如 PT100 标准型,温度单位选摄氏度,模块读上来的数就能直接当温度用,不用再写缩放,读出来搬进 tank.tempAct 就行。如果你用的是 4 到 20 毫安的温度变送器配普通模拟量模块,那就得用 NORM_X 加 SCALE_X 把原始值换算成实际温度,50 路就循环处理 50 次。
OB100 里做初始化,把罐号 1 到 50 先写好,回差给默认值。OB1 里按这个顺序调,先读温度,再做控制,最后排序显示,对应西门子把输入、逻辑、输出分开的习惯。

显示排序用一个表格控件,数据源绑定 DB_Tank.sorted,50 行,每行两列分别是罐号和温度,刷新就是排完序的从高到低顺序。设定值在另一个画面做一个 50 行的表格,I/O 字段绑定 tank.tempSet,模式设成输入,操作工直接改,想让设定值断电不丢,就在 DB 里把这一组变量的 Retain 勾上。再放自动手动切换和 50 个阀、泵的手动按钮、故障指示灯。

50 个阀加 50 个泵是 100 个数字量输出,本体那点 DQ 远远不够,要按模块点数扩展,比如 16 点一块的 DQ 模块要 7 块左右,具体看你选的型号,在设备组态里加完模块,把 valveCmd、pumpCmd 和实际 Q 点对应好,输出再统一写一次到硬件。

页: [1]
查看完整版本: 欲用西门子 1200PLC 实现如下功能