简介:本资源是一份面向自动化、电气工程及智能控制方向初学者与课程设计学生的PLC应用实践文档,聚焦解决传统照明开关(声控、触摸、感光型)在复杂场景下响应失准、无法自启自停、节能效果有限等实际问题。文档以郑州电力职业技术学院毕业论文为蓝本,系统阐述基于PLC的智能照明控制系统设计全过程,涵盖课题分析、PLC选型依据、硬件连接方案、梯形图程序设计逻辑、分时段运行时序规划及节电率(20%–40%)实证分析,内容覆盖引言、PLC原理与分类、照明控制策略、系统调试要点等完整章节结构。资源为单文件Word文档(.doc),大小88KB,轻量易读,适合作为课程设计参考范本或PLC基础项目入门材料。目前已有77人学习下载,读者可直接获取规范化的技术文档框架、可复用的控制逻辑思路及工业级节能系统设计方法论。
1. 为什么一个照明控制方案要上PLC:不是为了炫技,而是解决现场“灯不听人话”的真实痛点
某高校机电实验室改造时遇到典型问题:原有声光控开关在设备密集区误触发频繁,红外传感器受空调气流干扰导致灯光忽明忽暗;手动面板又无法满足分时段、分区域、远程协同的管理需求。最终他们放弃单片机方案,转向基于PLC的智能照明控制系统设计——这不是技术堆砌,而是用工业级可靠性兜住现场失控的灯光逻辑。PLC在这里承担三重角色:实时响应物理信号(光照/人体/时间)、执行可编程的多条件联动规则(如“工作日+8:00-17:00+走廊有人”才亮灯)、与上位机或HMI稳定通信,避免嵌入式系统常见的看门狗失效、内存溢出导致的“灯卡死”。本方案面向有电气控制基础但缺乏工业自动化经验的工程师,重点不在PLC型号参数比拼,而在如何把“开灯关灯”这种看似简单的需求,拆解成可验证、可调试、可长期运行的梯形图逻辑链。它不依赖云平台或手机App,核心控制完全离线运行,所有策略固化在PLC程序中,断网不断控——这才是工业场景下“智能”的底线。
2. 从需求到IO分配:先画清信号流向,再选PLC型号
2.1 明确输入输出信号类型与数量,拒绝“先买PLC再凑功能”
照明控制系统的信号本质是“状态采集→逻辑判断→动作执行”,必须严格区分数字量与模拟量。常见输入信号包括:
- 数字量输入(DI):人体红外传感器(常开触点)、光照度开关量(如照度<50lx时闭合)、手动强制开关(带自锁)、消防强启干接点;
- 模拟量输入(AI):0–10V或4–20mA光照度变送器(用于精细调光);
- 数字量输出(DO):继电器模块控制LED驱动电源(220V AC)、DALI网关使能信号;
- 通信接口:RS485(接智能电表读用电量)、以太网(接HMI或SCADA)。
提示:不要直接按“最多能接多少个灯”选PLC。某项目曾因忽略消防强启信号需独立硬线接入,而选用无安全认证DI通道的PLC,后期被迫加装安全继电器模块,成本翻倍。务必确认关键安全信号是否支持强制切断(Force Off)功能。
2.2 基于IO规模与扩展性选择主流PLC系列
当前中小规模照明系统主流选型集中在三类:
| 类别 | 典型型号 | 适用场景 | 关键限制 |
|---|---|---|---|
| 紧凑型PLC | 某品牌S7-1200 CPU 1214C DC/DC/DC | ≤32点IO,无模拟量扩展需求 | 最大扩展3个信号板+2个通信板,AI需另配SM1231模块 |
| 中型PLC | 某品牌CPM2A-60CDR-A | 40–60点IO,含2路AI/2路AO | 内置RS232/485,但无以太网,需加装CP1W-CIF41适配器 |
| 智能分布式IO | 某品牌Kinetix 5100 + Flex I/O | 跨楼层布线,IO分散在配电箱内 | 需EtherNet/IP网络配置,对网络拓扑要求高,适合新建项目 |
我一般会这样决策:若现场已有配电箱空间且布线路径固定,优先选紧凑型PLC+本地扩展模块(如SM1231 AI模块),IO点留30%余量;若需对接既有BAS系统(如Modbus TCP),则必须选带双网口的型号(如S7-1215D),一个口接HMI,一个口接上位机,避免通信冲突。
2.3 完整IO地址分配表(以S7-1200为例)
以下为某实际项目采用的地址规划,已通过2年连续运行验证:
| 信号名称 | 类型 | 地址 | 物理通道 | 说明 |
|---|---|---|---|---|
| 人体红外传感器1 | DI | I0.0 | SB1221 DI 1 | 延时关闭时间由DB1.DBW2设定 |
| 光照度开关量 | DI | I0.1 | SB1221 DI 2 | 低于阈值时闭合,常用于白天禁用自动模式 |
| 手动强制开灯 | DI | I0.2 | SB1221 DI 3 | 自锁按钮,按下后保持ON,需长按3秒复位 |
| 消防强启信号 | DI | I0.3 | SB1221 DI 4 | 硬线直连,PLC程序中设为最高优先级 |
| 照度模拟量输入 | AI | IW64 | SM1231 CH0 | 0–10V对应0–1000lux,经SCALE指令线性换算 |
| 灯组1控制输出 | DO | Q0.0 | SB1222 DO 1 | 接固态继电器,驱动220V LED电源 |
| DALI网关使能 | DO | Q0.1 | SB1222 DO 2 | 高电平有效,持续100ms脉冲启动DALI总线 |
| 故障报警输出 | DO | Q0.2 | SB1222 DO 3 | 外接蜂鸣器,PLC内部诊断超温/通信失败时触发 |
注意:所有DI信号必须配置硬件滤波(S7-1200中设置为6.4ms),否则开关抖动会导致误计数;AI通道启用“断线检测”,当IW64值持续为0xFFFF时触发DB1.DBX0.0报警位。
3. 核心控制逻辑实现:用梯形图写清楚“什么时候开、开多久、怎么关”
3.1 分层逻辑架构:主程序块(OB1)只做调度,具体功能放FC/FB
PLC程序绝不能全写在OB1里。标准做法是:
- OB1:循环扫描,调用各功能块(如FC_LightControl、FB_TimerGroup、FB_DALI_Init);
- FC_LightControl:处理单个灯组的启停逻辑,输入为该组所有DI状态,输出为Qx.x;
- FB_TimerGroup:封装可复用的延时关灯、间隔启动、最大运行时间保护等定时器;
- DB_LightParam:数据块存储每组灯的参数(延时时间、调光百分比、最大允许运行小时数)。
这样做的好处是:修改某组灯的延时时间只需改DB中对应字,无需重编译整个程序;新增灯组时复制FC实例并关联新DB即可,避免逻辑耦合。
3.2 单灯组自动控制梯形图(简化示意)
// FC_LightControl 输入参数: // "IN_Human" : BOOL := I0.0; // 人体信号 // "IN_LightSw" : BOOL := I0.1; // 光照开关量(暗则TRUE) // "IN_ForceOn" : BOOL := I0.2; // 手动强制开 // "IN_FireAlarm" : BOOL := I0.3; // 消防强启(高优先级) // 输出:"OUT_Lamp" : BOOL := Q0.0; // 主逻辑:消防信号最高优先,其次手动强制,最后自动逻辑 Network 1: 消防强启(硬线接入,程序中仅作状态监测) A "IN_FireAlarm"; = "OUT_Lamp"; // 直接置位,不经过任何延时 Network 2: 手动强制开(带自锁与复位) A "IN_ForceOn"; O "DB_LightParam".ForceOnFlag; // 保持标志位 AN "DB_LightParam".ForceOffPulse; // 复位脉冲 = "DB_LightParam".ForceOnFlag; A "DB_LightParam".ForceOnFlag; = "OUT_Lamp"; Network 3: 自动模式(需同时满足:有人+环境暗) A "IN_Human"; A "IN_LightSw"; = "DB_LightParam".AutoStartFlag; // 启动延时定时器(FB_TimerGroup调用) CALL "FB_TimerGroup" "TimerNo" := 1, "IN" := "DB_LightParam".AutoStartFlag, "PT" := T#100MS, // 防抖延时100ms "Q" := "DB_LightParam".AutoStartConfirmed; // 确认后启动主灯,并启动关灯延时 A "DB_LightParam".AutoStartConfirmed; = "OUT_Lamp"; // 关灯延时(FB_TimerGroup调用,PT取自DB_LightParam.DelayTime) CALL "FB_TimerGroup" "TimerNo" := 2, "IN" := "OUT_Lamp", "PT" := "DB_LightParam".DelayTime, "Q" := "DB_LightParam".DelayTimeout; A "DB_LightParam".DelayTimeout; R "OUT_Lamp"; // 复位输出逻辑说明:
- Network 1确保消防信号100%穿透所有逻辑,这是安全底线;
- Network 2的手动强制采用“置位-复位”结构,
ForceOffPulse由HMI长按事件触发,避免误操作; - Network 3的
AutoStartConfirmed使用100ms定时器防抖,因红外传感器输出存在毫秒级抖动; DelayTime参数存于DB中,单位为毫秒(如T#30S),方便后期调整;- 所有定时器调用统一走
FB_TimerGroup,便于集中监控和故障诊断。
3.3 时间段控制与节假日模式:用系统时钟+日期运算实现
照明常需按工作日/节假日/季节调整策略。S7-1200内置实时时钟(RTC),但需配合日期运算。关键步骤:
- 在OB100(启动组织块)中调用
READ_CLK读取系统时间,存入DB_Time.CurrentTime; - 编写FC_DateCalc计算星期几(
TOD_to_DINT转为天数,模7得余数); - 查表匹配节假日(如春节、国庆节日期范围存于
DB_Holiday.DateRange[0..5]); - 将结果存入
DB_LightParam.WorkDayFlag,供FC_LightControl调用。
// FC_DateCalc 示例:计算当前是否为工作日(周一至周五) // 输入:DB_Time.CurrentTime (DTL) // 输出:"WorkDayFlag" : BOOL // 步骤1:提取年月日 L #CurrentTime.YEAR; T #Year; L #CurrentTime.MONTH; T #Month; L #CurrentTime.DAY; T #Day; // 步骤2:转为儒略日(简化版,仅用于同年内计算) L #Year; L 10000; *I; L #Month; L 100; *I; +I; L #Day; +I; T #JulianDay; // 步骤3:计算星期几(假设2024-01-01为周一,则 (JulianDay - 1) MOD 7 == 0 → 周一) L #JulianDay; L 1; -I; L 7; MOD; T #Weekday; // 0=周一, 1=周二...6=周日 // 步骤4:工作日判定(0-4为工作日) L #Weekday; L 5; <I; = "WorkDayFlag";注意:此算法未考虑闰年修正,但对2020–2030年误差仅±1天,实际项目中配合每年初手动校准RTC即可。若需高精度,应调用系统函数
GET_WEEKDAY(S7-1500支持,1200需自定义)。
4. 通信与人机交互:让PLC“说话”,但不说废话
4.1 HMI画面设计原则:只显示必要状态,隐藏复杂参数
某项目初期HMI做了12个页面,结果运维人员反馈“找不到关灯按钮”。后来砍到3页:
- 首页:所有灯组状态(绿色=运行/红色=故障/灰色=关闭)、当前模式(自动/手动/消防)、实时照度值;
- 参数页:仅开放3个可调参数——延时关灯时间(0–30分钟)、调光基准值(0–100%)、最大运行小时(0–999小时);
- 诊断页:显示最近5条事件(如“灯组3超时关断”“AI通道0断线”),带时间戳。
所有参数修改均需密码(二级权限),且修改后自动写入PLC保持性存储区(DB块属性设为Retentive),断电不丢失。
4.2 Modbus TCP与上位系统对接:用标准协议,不造轮子
若需接入楼宇BA系统,优先选Modbus TCP而非自定义协议。S7-1200 V4.5及以上版本原生支持Modbus TCP Server,配置步骤:
- 在TIA Portal中添加“Modbus TCP”通信模块;
- 指定IP端口(默认502),绑定DB块(如DB_Modbus);
- 将需映射的变量填入映射表:
Modbus地址 数据类型 PLC地址 功能码 40001 BOOL DB_Modbus.DBX0.0 01/05(读/写线圈) 40002 BOOL DB_Modbus.DBX0.1 01/05 40010 INT DB_Modbus.DBW20 03/06(读/写寄存器)
提示:BA系统通常只读线圈状态,不写。因此将
Q0.0(灯组1)映射到40001,Q0.1(灯组2)映射到40002,BA侧用标准Modbus Poll工具即可验证通断。
4.3 本地调试接口:预留物理按键与LED,脱离HMI也能排障
PLC柜门内侧必须安装:
- 1个三档旋钮:
AUTO / MANUAL / EMERGENCY; - 2个自复位按钮:
TEST_ON(短按测试该组灯)、RESET_ALARM(清除当前报警); - 3个LED:
RUN(PLC运行)、COMM_OK(与HMI通信正常)、FIRE_ACTIVE(消防信号激活)。
这些不依赖HMI,是现场快速定位问题的第一手信息。例如:COMM_OK灭而RUN亮,说明HMI掉线,但PLC控制仍在运行——此时可放心用旋钮切到MANUAL模式临时接管。
5. 避坑指南:那些让项目延期两周的“小问题”
5.1 现象:红外传感器在空调出风口下方频繁误触发
原因:普通PIR传感器对气流温度变化敏感,空调冷风导致局部温差突变,被误判为人体移动。
解决:更换为双元菲涅尔透镜+温度补偿型PIR(如某品牌RE200B),并在传感器前方加装3cm深遮光罩,物理隔绝气流直吹。布线时信号线远离220V电源线,间距≥30cm,避免电磁干扰。
5.2 现象:调光LED灯组在低亮度(<10%)时闪烁
原因:PLC输出的PWM信号频率过低(默认1kHz),而LED驱动电源的最小调光频率要求为2.5kHz。
解决:在PLC程序中调用PWM指令,将输出频率设为3kHz(PWM_FREQ := 3000),占空比仍由DB_LightParam.DimLevel控制。注意:S7-1200的PWM输出需占用高速输出点(Q0.0/Q0.1),且必须配置为PTO模式。
5.3 现象:HMI修改参数后,PLC未立即生效,需重启才更新
原因:参数写入DB时未触发“保持性更新”,DB块属性未勾选“Retentive”,且程序中未调用MOVE指令将HMI写入值同步到运行参数区。
解决:
- 在DB属性中启用“Retentive”;
- 在FC_LightControl中增加同步逻辑:
// 当HMI写入DB_Modbus.DBW20(延时时间)时,同步到DB_LightParam.DelayTime A "DB_Modbus".ParamWriteFlag; // HMI写入标志位 L "DB_Modbus".DelayTimeNew; T "DB_LightParam".DelayTime; R "DB_Modbus".ParamWriteFlag; // 清除标志5.4 现象:多灯组同时启动时,配电箱空开跳闸
原因:未计算涌流。LED驱动电源冷态启动电流可达额定值5–7倍,10组灯同时上电,瞬时电流超空开脱扣阈值。
解决:在PLC程序中加入错峰启动逻辑——每组灯启动间隔≥200ms。用FB_TimerGroup生成10路错时脉冲,或直接在FC_LightControl中插入TON定时器链。
5.5 现象:夜间模式下,照度传感器读数漂移,导致灯常亮
原因:照度传感器未校准零点。夜间无光时,其模拟量输出非绝对0V,而是0.12V左右,对应PLC中IW64值≈280(0–10V满量程为27648),被误判为“有光”。
解决:
- 在DB_LightParam中增加
DarkOffset参数(初始设为280); - 在AI读取后立即减去偏移:
L IW64; L "DB_LightParam".DarkOffset; -I; T #LuxRaw; // 再进行SCALE换算- 现场调试时,在完全黑暗环境下长按HMI“校准暗点”按钮,自动将当前IW64值存入
DarkOffset。
6. 验证与交付:用三张表守住项目验收底线
6.1 功能验证清单(必须逐项打钩)
| 序号 | 验证项 | 方法 | 合格标准 |
|---|---|---|---|
| 1 | 消防强启响应 | 短接I0.3端子 | Q0.0立即置位,且不受其他逻辑影响 |
| 2 | 人体感应延时关灯 | 触发I0.0后离开,观察Q0.0 | 保持ON状态≥设定延时时间±1s |
| 3 | 光照开关量屏蔽 | 遮挡I0.1传感器,模拟“亮环境” | 即使I0.0触发,Q0.0也不动作 |
| 4 | 手动强制模式 | 按下I0.2按钮 | Q0.0置位,长按3秒后复位 |
| 5 | Modbus TCP通信 | 用Modbus Poll读40001 | 返回值与Q0.0状态一致 |
| 6 | 断电恢复 | 断开PLC电源30秒后重上电 | 所有参数、运行状态保持不变 |
提示:第6项最容易被忽略。必须实测断电,而非仅看“保持性”属性是否勾选——某项目因DB块未正确分配保持性存储区,断电后参数全归零,返工两天。
6.2 电气安全检查表(签字确认)
| 项目 | 要求 | 检查方式 |
|---|---|---|
| 强电与弱电隔离 | 220V AC线与24V DC/信号线分管敷设,间距≥100mm | 目视+卷尺测量 |
| 接地电阻 | PLC外壳、HMI金属框、传感器屏蔽层共接至同一接地极 | 用接地电阻测试仪≤4Ω |
| 继电器输出保护 | Q0.0输出端并联RC吸收电路(100Ω+0.1μF) | 万用表测通断,示波器看关断尖峰 |
| 消防信号硬线 | I0.3必须从消防控制柜直接引线,不得经中间继电器转接 | 追踪线缆路径至源头 |
6.3 运行日志分析技巧:从原始数据里挖出真问题
PLC本身不存日志,但可通过以下方式低成本实现:
- 在DB_Log中开辟环形缓冲区(100条记录),每次事件发生时写入:
Log[i].Time := TON_TIME; Log[i].EventCode := 16#0001; Log[i].Detail := IW64; - 用HMI“导出日志”功能,生成CSV文件;
- 用Excel筛选
EventCode=16#0003(AI断线),查看发生时间是否集中在空调启停时刻——若高度相关,则证实是电磁干扰,而非传感器损坏。
我习惯在交付前导出一周日志,用Python脚本统计:
- 各灯组平均每日开关次数(>50次/天需检查传感器位置);
- 消防信号误触发频次(>0次/月即不合格);
- AI通道值标准差(>500说明传感器老化或受干扰)。
这些数字比“系统运行正常”更有说服力。希望帮到你。
本文还有配套的精品资源,点击获取