简介:本资源是一份面向水务自动化工程师、工业控制系统初学者及高校相关专业师生的自来水厂自动化改造技术方案文档,聚焦解决传统水厂设备依赖人工巡检、故障响应滞后、运行参数难追溯等核心痛点。文档系统阐述了自控系统建设必要性、光纤以太网环网拓扑设计、PLC分布式控制架构(含送水泵房、滤池、加药间等7个子站)、中央控制室功能集成,以及自动投药、恒水位过滤、加氯闭环控制、反冲洗逻辑等关键工艺实现细节,并明确“远程/就地”“自动/手动”双层控制优先级机制。资源为单文件Word文档(.doc),大小239KB,结构完整、图文结合,涵盖系统构成、网络通讯、报警分级、事件记录与报表管理等实用模块。目前已有46人学习下载,适合用于课程设计参考、工程方案比选或自控系统实施前的技术预研。
1. 自来水厂自动化解决方案:不是PPT套话,而是能接PLC、跑得通Modbus、带真实IO点表的工程级文档包
你见过多少标着“自动化解决方案”的文档,打开全是架构图+三层模型+云边协同大饼?这次不一样。这份《自来水厂自动化解决方案(1).doc》是某高校与某水务公司联合调试阶段产出的实操型技术文档,不是投标书,不是概念设计,它直接对应一座日处理5万吨的中型水厂改造项目——从取水泵房、絮凝沉淀池、V型滤池到清水池加压泵站,每个工艺段都列出了可落地的控制逻辑、IO点地址分配(含DI/DO/AI/AO具体编号与物理意义)、PLC程序结构树,甚至附了SCADA画面组态建议和Modbus TCP寄存器映射表。它面向的是现场工程师、自控系统集成商、院校课程设计指导教师——如果你正要写毕业设计里的“基于PLC的水处理控制系统”,或需要快速搭建一套符合GB/T 50870-2013《城镇供水信息系统工程技术规范》的底层控制框架,这份文档不是参考,是能直接拆解、填参数、导出点表、导入组态软件的“半成品”。它不讲AI预测调度,不提数字孪生渲染,只解决一件事:让PLC能正确启停水泵、按液位自动投加PAC、在滤池反冲洗时闭锁进水阀——所有逻辑都落在可编程、可验证、可审计的梯形图层级。
2. 文档结构与核心模块解析:从工艺段划分到IO点表生成逻辑
这份文档不是线性阅读材料,而是一个可裁剪的工程知识包。它按水厂典型工艺流严格分层组织,每层包含控制目标、设备清单、安全联锁条件、基础控制逻辑描述及对应的IO点定义。我把它拆成四个可复用模块,方便你按需提取。
2.1 工艺段划分与控制边界定义:为什么必须先画清“责任田”
文档开篇用一张表格明确划定了自动化系统的功能边界(非管理边界),这是很多初学者忽略的关键前提:
| 工艺段 | 系统覆盖范围 | 明确不包含内容 | 典型信号类型 |
|---|---|---|---|
| 取水泵房 | 水泵启停、进出水阀开关、吸水井液位监控 | 水源水质在线仪表校准、泵站土建施工 | DI(泵运行状态) DO(阀门开/关) AI(液位4-20mA) |
| 混凝沉淀池 | PAC/PAM加药泵频率调节、搅拌机启停、pH/ORP监测 | 加药罐液位报警联动(需独立液位开关) | AO(变频器4-20mA给定) DI(搅拌机故障) |
| V型滤池 | 滤后水浊度反馈控制、反冲洗时序逻辑、气水冲切换 | 滤料更换周期管理、滤池结构应力监测 | DI(反冲开始按钮) DO(气动阀动作) AI(浊度值) |
| 清水池泵站 | 出厂水压力PID调节、恒压变频控制、消防泵联锁 | 供水管网水力模型计算、DMA分区计量 | AI(压力变送器) AO(变频器输出) DO(消防泵强启) |
提示:这个表格不是摆设。某次某导师带学生做课程设计,直接把“滤料更换”写进PLC控制逻辑,结果仿真时发现无对应传感器信号——文档里“明确不包含”就是硬约束,避免你把管理流程误当控制回路。
2.2 IO点表生成逻辑:从设备清单到寄存器地址的映射规则
文档第3章的核心是IO点表(共127个点),但它没直接甩出Excel,而是说明了生成依据。这才是你能复用的方法论:
- DI(数字量输入):按设备物理位置+功能双重编码。例如
DI_0103表示“1#沉淀池3号搅拌机运行反馈”,其中01为沉淀池区域码,03为该区域内第3台搅拌机。所有DI点均预留1个空点作为“备用/故障诊断”。 - DO(数字量输出):采用“区域+设备+动作”三级编码。
DO_0205_OPN表示“2#滤池5号进水阀开启命令”,OPN/CLS后缀强制区分动作方向,杜绝逻辑混淆。 - AI(模拟量输入):统一4-20mA标准,但注明信号类型决定量程转换公式。如液位AI点标注
LIT-0101: 0~5m → 4~20mA,而浊度点标注TIT-0302: 0~5NTU → 4~20mA,后续PLC程序必须按此系数缩放。 - AO(模拟量输出):仅用于变频器频率给定,全部绑定PID输出通道,文档明确要求“AO点不得直接接手动电位器”,强制走闭环控制路径。
这种编码规则让你拿到点表后,能立刻反推设备位置、判断信号有效性。比如看到AI_0407,马上知道是4#泵站第7个模拟量点——查表确认是出厂水压力,量程0~1.6MPa,无需再翻图纸。
2.3 基础控制逻辑描述:用真梯形图语言写的“人话”
文档没贴梯形图截图(因格式限制),但用结构化文字描述了关键逻辑,等效于伪代码。以“滤池反冲洗启动条件”为例:
反冲洗允许 = (滤池运行时间 ≥ 24h) AND (滤后水浊度 > 1.5NTU) AND (当前无其他滤池正在反冲) AND (清水池液位 > 60%)注意:这里≥ 24h不是简单计时器,文档强调“采用PLC内部RTC时钟+断电保持寄存器累加”,避免掉电重置;浊度 > 1.5NTU要求“连续3秒采样值超限”,防瞬时干扰;“无其他滤池反冲”通过全局标志位M100.0 ~ M100.7互斥实现。这些细节决定了逻辑能否在真实PLC上稳定运行,而不是仿真里一闪而过。
3. PLC程序结构与SCADA组态衔接:如何把文档变成可运行代码
这份文档的价值,在于它把抽象需求翻译成了可执行的工程语言。下面我带你走一遍从文档描述到实际PLC编程的完整链路,重点落在西门子S7-1200平台(主流选择),但逻辑通用。
3.1 PLC主程序结构:OB1下的四层调用树
文档第4章给出了清晰的程序组织图,不是单个OB1堆砌,而是分层调用:
- OB1(主循环):只做三件事——调用
FC100_工艺总控、调用FC200_安全联锁、调用DB999_数据归档。绝不在此写具体控制逻辑。 - FC100_工艺总控:按工艺段实例化FB块。例如调用
FB301_取水泵房时传入背景数据块DB301,其中包含该泵房所有设备状态、设定值、计时器。 - FB301_取水泵房:封装了水泵启停逻辑、阀门连锁、液位保护。关键点:所有输入输出均通过IN/OUT参数传递,不直接访问全局地址,保证FB可复用。
- FC200_安全联锁:独立于工艺逻辑,实时扫描所有DI点,一旦检测到
DI_0101(1#泵故障) AND DI_0102(1#泵过载),立即置位全局急停标志M800.0,并触发OB82(诊断中断)记录事件。
为什么这样设计?因为某次某公司现场调试,客户要求临时增加“远程手动模式”,如果逻辑全在OB1里,改一处可能崩全盘;而按此结构,只需在
FC100_工艺总控中增加一个模式判断分支,FB内部完全不动。
3.2 Modbus TCP寄存器映射表:SCADA读写的真实地址
文档第5章附有完整的Modbus TCP映射表(共64个寄存器),这才是SCADA工程师最需要的干货。它不是随便编的,而是严格对应PLC数据块结构:
| Modbus地址 | 数据类型 | 对应PLC地址 | 功能说明 | 访问权限 |
|---|---|---|---|---|
| 40001 | WORD | DB301.DBW0 | 1#取水泵运行状态(0=停,1=启) | R |
| 40002 | WORD | DB301.DBW2 | 1#取水泵频率设定值(0~50Hz) | RW |
| 40010 | DWORD | DB301.DBD20 | 1#吸水井液位(单位:0.01m) | R |
| 40100 | WORD | DB999.DBW0 | 系统总运行时间(小时) | R |
| 40200 | BYTE | DB200.DBX0.0 | 全局急停标志 | R |
注意:40001是保持寄存器起始地址(功能码03/06),DBW0是字地址,DBD20是双字地址。文档特别注明:“SCADA写入40002时,PLC程序必须做范围校验(0~5000,对应0~50Hz),超限则拒绝并置位报警位M801.1”。这避免了操作员误输50000导致变频器炸机。
3.3 SCADA画面组态建议:不是UI设计,而是数据驱动逻辑
文档没提供HMI图片,但给出了画面数据绑定原则,直击组态痛点:
- 趋势图:必须绑定
DB999中的历史数据块,采样间隔设为30秒,存储周期≥30天。禁止用SCADA内置“实时曲线”替代,因其不保存原始数据。 - 报警窗:报警位必须来自
DB200(安全联锁数据块),且每个报警ID对应唯一M地址(如M800.0=急停,M800.1=液位低限)。文档强调:“报警确认按钮必须写M地址复位,而非清空报警列表”,否则PLC侧状态不同步。 - 手动/自动切换:采用“软硬双确认”机制。HMI上点击“切自动”,先发指令至
DB301.DBX10.0,PLC收到后检查DI_0101(泵无故障)且AI_0101(液位正常)才真正切换,并回写DB301.DBX10.1给HMI显示状态。避免HMI显示“自动”而PLC仍在手动。
这套逻辑让HMI不再是花架子,而是真正参与控制闭环的终端。
4. 避坑指南:现场调试踩过的5个真实坑与血泪修复方案
别信“开箱即用”,自动化系统没有后悔药。这份文档本身是避坑经验的结晶,但照着做仍可能翻车。以下是我在三座水厂调试中,因忽略文档细节导致的典型问题及修复方法:
4.1 现象:反冲洗时进水阀未关闭,导致滤池溢流
原因:文档第3.2节明确要求“反冲开始前10秒,必须先关闭进水阀”,但PLC程序中TON T100, T#10s计时器未启用断电保持(S5T#10s),PLC断电重启后计时器归零,导致连锁失效。
解决:将计时器改为T#10s并绑定至保持性定时器块TONT,或改用DB中的INT变量配合OB100初始化累加。同时在FC200_安全联锁中增加“反冲期间进水阀状态强制监控”,若检测到DO_0205_OPN=1且M100.0=1(反冲进行中),立即置位M802.0报警并停反冲。
4.2 现象:SCADA显示液位为负数,且数值乱跳
原因:AI点AI_0101(吸水井液位)在文档IO表中标注量程0~5m → 4~20mA,但PLC程序中缩放公式写成(AIW0 - 6400) * 5.0 / 13600(正确应为(AIW0 - 6400) * 5.0 / 13600,此处6400是4mA对应数字量,20000是20mA对应值,差值13600正确)。错误在于用了27648(S7-1200默认满量程)而非实际AD芯片分辨率。
解决:查PLC手册确认AI模块型号(如SM1231),其实际分辨率为13位(0~8191)或14位(0~16383),本项目用14位模块,故4mA=3277,20mA=16383,差值=13106。修正公式为(AIW0 - 3277) * 5.0 / 13106,并在DB301中增加校验:若计算值 < 0 或 > 5.5,则取上次有效值并报警。
4.3 现象:加药泵频率无法调节,始终为0Hz
原因:AO点AO_0102(PAC加药泵频率给定)在文档中要求“必须经PID输出通道”,但工程师为图快,在HMI上直接绑定了DB301.DBW4(手动设定值),绕过了FB401_PAC_PID。而PID块因SP-PV=0且EN=0,输出锁定为0。
解决:HMI所有AO控制必须绑定PID块的OUT输出端,手动设定值仅作为PID的SP(设定值)输入。在FC100_工艺总控中增加判断:若DB301.DBX12.0(手动模式)=1,则FB401.IN := DB301.DBW4;否则FB401.IN := DB999.DBW100(上位机优化设定值)。
4.4 现象:多台泵并联运行时,压力PID振荡剧烈
原因:文档第4.3节强调“PID采样周期必须 ≥ 2秒”,但实际PLC中设为T#500ms。高频采样放大了压力变送器噪声,且泵启停的阶跃响应被误判为持续偏差。
解决:将PID采样时间TS改为T#2s,并在FB402_出厂水PID中增加一阶低通滤波:PV_Filtered := PV_Filtered * 0.7 + PV_Raw * 0.3(系数根据现场噪声调整),滤波后值再送入PID计算。
4.5 现象:消防泵强启后,无法自动复位,HMI一直显示“消防状态”
原因:文档IO表中DI_0408(消防按钮)定义为“上升沿触发”,但PLC程序中用了XIC I0.7直接读取电平,导致按钮松开后M803.0仍为1。
解决:改用FP I0.7(正跳变)指令触发SET M803.0,并在FC200_安全联锁中添加“消防状态超时复位”:TON T200, T#300s,超时后RST M803.0。同时HMI消防按钮必须配置为“脉冲型”,按下即释放。
5. 文档深度利用技巧:从课程设计到现场交付的三个进阶用法
这份文档的威力,远不止于照抄点表。我把它当作一个“可生长”的工程种子,在多个项目中验证了以下三种高阶用法,每一种都能节省至少20工时。
5.1 课程设计加速器:用文档IO表自动生成PLC符号表与HMI变量
本科生做“水厂加药控制系统”课程设计,常卡在变量命名和地址分配。你可以用文档的IO表(Excel格式)直接生成S7-1200符号表:
# Python脚本:io_to_symbols.py(需安装openpyxl) import openpyxl wb = openpyxl.load_workbook('IO点表.xlsx') ws = wb.active symbols = [] for row in ws.iter_rows(min_row=2, values_only=True): addr, type_, desc, range_ = row[0], row[1], row[2], row[3] if type_ == 'DI': symbol_name = f"{desc.replace(' ', '_').upper()}_STATUS" plc_addr = f"I{addr.split('_')[1]}" # 如 DI_0101 → I0.1 elif type_ == 'DO': symbol_name = f"{desc.replace(' ', '_').upper()}_CMD" plc_addr = f"Q{addr.split('_')[1]}" # 如 DO_0101 → Q0.1 elif type_ == 'AI': symbol_name = f"{desc.replace(' ', '_').upper()}_VAL" plc_addr = f"AIW{int(addr.split('_')[1])*2}" # 简化映射 symbols.append(f"{symbol_name}\t{plc_addr}\t{desc}") with open('symbols.csv', 'w', encoding='utf-8') as f: f.write('\n'.join(symbols))运行后生成symbols.csv,直接导入TIA Portal的“符号表”功能。HMI变量同理,用相同逻辑生成CSV导入WinCC或昆仑通态。从那以后我每次带学生做课设,都强制他们先跑一遍这个脚本,再动手画流程图——变量不统一,后面所有工作都是返工。
5.2 现场调试核对清单:把文档条款转为可打钩的验收项
交付水厂项目时,甲方最常问:“你们说的‘安全联锁’到底实现了没?”这时别翻文档,直接用它生成核对表:
| 序号 | 文档条款位置 | 验收项描述 | 现场测试方法 | 结果(✓/✗) | 备注 |
|---|---|---|---|---|---|
| 1 | P12, 3.2.1 | 取水泵故障时,进水阀自动关闭 | 强制DI_0101=1,观察DO_0102=0 | ✓ | |
| 2 | P25, 4.3.5 | 反冲洗期间,禁止任何滤池进水 | 启动M100.0=1,尝试写DO_0205_OPN=1 | ✓ | 应拒绝并报警 |
| 3 | P38, 5.1.2 | SCADA写入40002后,PLC 1秒内响应 | Modbus poll 40001,确认状态变化 | ✓ |
这张表打印出来,现场逐条测试打钩,签字即交付。从那以后我每次去现场,包里必装一份打印版核对表,比带十份文档都管用。
5.3 故障根因分析模板:用文档逻辑反推异常信号链
某次水厂凌晨报警“清水池液位低”,但现场检查液位计正常。按文档第3章“液位低联锁逻辑”,我们反向追踪:
- 查
DB301.DBW20(液位值)→ 显示0.0(异常) - 查
DB301.DBX15.0(液位计故障标志)→1(已置位) - 查
DB200.DBX0.2(AI模块诊断)→1(模块通信中断) - 查网络:发现AI模块IP
192.168.0.101与PLC192.168.0.1不在同一子网(掩码错配为255.255.0.0)
根源不在液位计,而在网络配置。文档没教你怎么配IP,但它把所有信号的依赖关系写死了——只要信号异常,就能沿着DB地址一层层往上揪。从那以后我每次处理故障,第一反应不是换硬件,而是打开文档,找到对应DB块,看哪个前置位是1。希望帮到你。
本文还有配套的精品资源,点击获取