
简介这份课程设计说明文档围绕基于三菱PLC的智能家居监控系统展开适合自动化、电气工程及传感检测相关专业学生与初级工程人员用于完成家居安防、舒适度和设备自动控制等课程设计或实验报告参考。压缩包内仅含一个doc文档大小约1.33MB内容为一套完整的设计说明。目前已有191人学习下载。文档从智能家居概念、PLC在自动控制中的作用、温湿度与烟雾等传感器应用讲起逐步覆盖系统组成、控制方式选择、硬件选型、PLC输入输出端口分配以及智能窗户、安防、点动等程序流程并配有光敏电阻、温度时间、声控开门、红外线和可燃气体检测等仿真接线图。读者可据此理清方案论证、硬件与软件设计脉络也可参考其目录结构、原理说明和程序模块划分用于撰写报告、准备答辩或开展智能家居入门实践。1. 从一块S7-1200说起PLC做智能家居监控系统到底解决什么问题三室两厅的全屋智能如果只靠Wi-Fi模块加手机App堆出来最怕的是断网即失联、场景一多就延迟、空调和地暖逻辑互相打架。把西门子S7-1200、三菱FX5U或者汇川PLC放进配电箱当本地主控逻辑跑在本地断网也能开关灯、控窗帘、调温度上位机只负责看数据和下发策略这就是基于PLC的智能家居监控系统设计说明里最该先定下来的事。它适合对稳定性、抗干扰和后期维护有要求的住宅、别墅和公寓样板间也适合拿PLC课程设计或PLC毕业设计练手的人当作完整题目。下面按选型、点表、梯形图与SCL逻辑、Modbus通信、联调排错五步走一遍每一步都给能直接抄的参数和代码。2. 智能家居监控系统的PLC选型与IO点表怎么定选型和点表是这套系统最容易翻车的地方。很多人一上来就写梯形图结果模拟量通道不够、继电器输出带不动窗帘电机、通信口数量对不上。先把硬件底座定死后面编程才会顺。2.1 主控与扩展模块的选型对比家用场景不需要大型PLC重点看本机IO、通信口和模拟量扩展能力。下表是常见四种主控的对比价格和渠道按当地代理商实际报价为准。型号本机IO通信模拟量编程平台典型场景西门子 S7-1200 CPU 1214C DC/DC/DC14DI/10DO2×以太网可扩RS485需加SM1231博途 TIA Portal中高端住宅、别墅三菱 FX5U-32MT/ES16DI/16DO以太网、RS-485内置2通道AIGX Works3中小户型、教学汇川 H5U-1614MTD16DI/14DO以太网、RS-485扩展模块AutoShop / CODESYS国产替代、性价比欧姆龙 CP1H-XA40DT-D24DI/16DORS232/RS485内置4AI/2AOCX-Programmer老项目改造、组态对接判断依据很直接模拟量点位超过4个、需要Modbus TCP服务器、后续想接HMI组态画面优先选S7-1200或FX5U预算紧、点位少汇川和欧姆龙更划算。注意DC/DC/DC表示供电直流、输入直流、输出晶体管灯控回路要另加中间继电器。2.2 点表设计DI、DO、AI怎么分配点表是编程和组态的共同语言先列清楚再动手。下面是一套两室一厅的最小点表模板。点位名称类型地址示例信号形式说明入户门磁DII0.0常闭干接点开门触发回家场景客厅人体红外DII0.1高电平有效PIR延时关灯用客厅温度AIIW644-20mA变送器量程-20~80℃客厅湿度AIIW660-10V量程0-100%RH客厅主灯DOQ0.0继电器接中间继电器窗帘开DOQ0.1继电器与Q0.2互锁窗帘关DOQ0.2继电器与Q0.1互锁空调启停DOQ0.3干接点接红外转发器新风DOQ0.4继电器与空调联动点表排完先做一次地址校验避免两个变量占同一个地址。用一段Python脚本就能查出来# 校验PLC点表检查地址重复、类型与地址段是否匹配 import csv from collections import Counter ADDR_RULE {DI: I, DO: Q, AI: IW, AO: QW} def check(path): rows list(csv.DictReader(open(path, encodingutf-8))) addrs [r[address].strip() for r in rows] dup [a for a, c in Counter(addrs).items() if c 1] bad [r for r in rows if not r[address].strip().startswith(ADDR_RULE[r[type].strip()])] print(重复地址:, dup or 无) print(类型与地址不匹配:, bad or 无) check(io_points.csv)脚本逻辑是遍历点表CSV用Counter统计地址出现次数出现两次以上的就是重复占用再按类型检查前缀DI必须以I开头DO以Q开头AI对应IWAO对应QW。参数上只要把CSV列名固定为name、type、address、signal、note换项目直接复用。2.3 输出类型与供电继电器还是晶体管NPN还是PNP灯控、窗帘、新风这类阻性或小感性负载用继电器输出最省事直接串220V回路但继电器有机械寿命开关频繁的场景建议中间加接触器或固态继电器。调光、伺服、需要高速脉冲的场合必须用晶体管输出晶体管分NPN和PNP选错接线方式会一直导通或者完全不动。常见做法是源型输入接PNP传感器漏型输入接NPN传感器同一台PLC的公共端接法要保持一致。供电上PLC本体用24V开关电源传感器单独一路24V并加保险模拟量变送器尽量与变频器、大功率灯具分开走线屏蔽层单端接地。DI干接点距离超过20米时建议加中间继电器隔离否则感应电压会让输入误动作。3. 用梯形图和SCL把温湿度、灯光、窗帘逻辑跑起来硬件定完就进入编程。梯形图适合写开关量和互锁SCL适合写模拟量换算和状态机两者在博途里可以混用。下面三段逻辑覆盖了这套系统八成的实际动作。3.1 模拟量采集到温度值的换算S7-1200的模拟量输入原始值0-27648对应0-20mA4-20mA对应5530-27648。温度变送器量程-20~80℃换算公式为T -20 (Raw - 5530) / (27648 - 5530) × 100。用SCL写成一个功能块比在梯形图里堆NORM_X和SCALE_X更容易复用。// 4-20mA温度变送器换算量程-20~80℃ FUNCTION_BLOCK TempScale VAR_INPUT Raw : INT; // AI通道原始值 RawMin : INT : 5530; // 4mA对应值 RawMax : INT : 27648; // 20mA对应值 EngMin : REAL : -20.0; EngMax : REAL : 80.0; END_VAR VAR_OUTPUT Temp : REAL; Valid : BOOL; END_VAR BEGIN // 低于3.6mA视为断线或传感器故障 Valid : Raw 4500; IF Valid THEN Temp : EngMin (INT_TO_REAL(Raw - RawMin)) * (EngMax - EngMin) / INT_TO_REAL(RawMax - RawMin); ELSE Temp : 0.0; END_IF; END_FUNCTION_BLOCKRawMin和RawMax按实际模块量程改0-10V输入的模块对应0-27648不要照抄。Valid引脚接到HMI做报警温度跳变时先看Valid是不是掉过再查屏蔽和接地。3.2 场景联动的状态机写法智能家居场景不要用一堆M0.0、M0.1布尔量堆用一个整数Mode表示当前场景逻辑集中在一个CASE里HMI和上位机都只改这一个寄存器。状态划分如下Mode值场景触发条件主要动作0离家门锁反锁且无人在家关灯、关窗帘、空调待机1回家门磁触发玄关灯亮、客厅灯亮2会客HMI按钮全亮、窗帘开3观影HMI按钮主灯灭、灯带30%4睡眠定时或按钮全关、夜灯、空调26℃对应的SCL骨架// 场景状态机Mode由HMI或上位机写入 CASE #Mode OF 0: // 离家 #LightAll : FALSE; #CurtainOpen : FALSE; #ACEnable : FALSE; 1: // 回家 #LightHall : TRUE; #LightLiving : TRUE; #CurtainOpen : TRUE; 4: // 睡眠 #LightAll : FALSE; #NightLight : TRUE; #ACTarget : 26.0; ELSE #Mode : 0; // 非法值回落到离家防止死状态 END_CASE;CASE的ELSE分支必须有否则上位机写入一个越界值系统会停在无动作状态。Mode建议放在保持寄存器里断电重启后能恢复。3.3 互锁、回差和防抖这几段逻辑能直接抄窗帘电机正反转同时吸合会烧电机必须互锁空调靠温度阈值频繁启停会伤压缩机要加回差。// 窗帘正反转互锁 #CurtainOpenCmd : #CurtainOpenReq AND NOT #CurtainCloseReq; #CurtainCloseCmd : #CurtainCloseReq AND NOT #CurtainOpenReq AND NOT #CurtainOpenCmd; // 空调温度回差控制回差1℃避免频繁启停 IF #RoomTemp #ACTarget 1.0 THEN #ACRun : TRUE; ELSIF #RoomTemp #ACTarget - 1.0 THEN #ACRun : FALSE; END_IF; // 人体感应延时关灯TON定时器5分钟 #LightTimer(IN : NOT #PirLiving, PT : T#5M); IF #LightTimer.Q THEN #LightLiving : FALSE; END_IF;互锁两条赋值语句的先后顺序不能反第二行里带了NOT CurtainOpenCmd保证同一个扫描周期内两个输出不可能同时为真。回差一般取1-2℃房间保温差、空调功率偏小就取2℃。人体延时5分钟是经验值走廊短一点取2分钟也可以。4. Modbus打通PLC与上位机、手机端本地逻辑跑通之后值钱的部分在通信。用Modbus把PLC的数据开放出来上位机、组态软件、Node-RED都能读手机端再基于MQTT展示思路就完整了。4.1 寄存器映射表怎么排映射表是PLC和上位机之间的接口契约一次排清楚后面改协议不用返工。Modbus地址数据区PLC变量类型说明40001保持寄存器RoomTemp×10INT室温单位0.1℃40002保持寄存器Humidity×10INT湿度单位0.1%40003保持寄存器LuxINT光照单位lx40004保持寄存器ModeINT场景状态0-400001线圈LightLivingBOOL客厅灯00002线圈CurtainOpenBOOL窗帘开00003线圈ACRunBOOL空调运行温度放大10倍存成整数是常见做法浮点数跨平台字节序容易踩坑整数最稳。40001对应上位机address0这个偏移差是新手第一个大坑。4.2 博途里配置Modbus TCP服务器做法是调用MB_SERVER指令不要自己写Socket。步骤新建一个全局DB存放保持寄存器数组在OB1或循环中断里调用MB_SERVERMB_HOLD_REG指向该DB的数组CONNECT指向TCON_IP_v4结构端口填502MB_SERVER的MB_UNIT_ID设1。参数上连接ID每台从站唯一接口ID对应PLC的以太网口超时时间默认即可。写完在线下载用Modbus Poll或下面的Python脚本先读一次确认能通再接上位机。如果PLC同时做客户端去读温湿度变送器注意客户端和服务器不能冲突使用同一个连接资源。4.3 Python上位机读写的完整代码from pymodbus.client import ModbusTcpClient import time PLC_IP, PLC_PORT, UNIT 192.168.0.10, 502, 1 client ModbusTcpClient(PLC_IP, portPLC_PORT, timeout1) def read_snapshot(): rr client.read_holding_registers(address0, count4, slaveUNIT) if rr.isError(): print(读寄存器失败:, rr) return None return rr.registers[0] / 10.0, rr.registers[1] / 10.0, \ rr.registers[2], rr.registers[3] def set_mode(mode): return client.write_register(address3, valuemode, slaveUNIT) def set_light(on): return client.write_coil(address0, valueon, slaveUNIT) if __name__ __main__: while True: snap read_snapshot() if snap: print(室温 %.1f℃ 湿度 %.1f%% 光照 %dlux 场景 %d % snap) time.sleep(2)address0对应40001count4一次读温度和湿度、光照、场景四个寄存器减少往返次数。slave是单元号必须和MB_SERVER里设的一致。timeout设1秒家用网络出现丢包时直接报错比卡死好。写线圈控制客厅灯时value传True/Falsepymodbus会自动转成1/0。4.4 Node-RED转MQTT给手机端手机端不需要直接连PLC中间加一层MQTT更安全也方便多个终端订阅。// Node-RED function节点寄存器数组转JSON发到MQTT let r msg.payload; let out { temp: r[0] / 10.0, humidity: r[1] / 10.0, lux: r[2], mode: r[3], ts: Date.now() }; msg.topic home/plc/telemetry; msg.payload JSON.stringify(out); return msg;流程是modbus-read节点定时读4个寄存器function节点做缩放和打包mqtt out节点发到home/plc/telemetry。反向控制用mqtt in订阅home/plc/cmd再接modbus-write。注意Modbus和MQTT的数据格式不要混MQTT侧保留JSON写寄存器前再拆成整数。5. 联调排错顺序与几个能落地的进阶技巧5.1 通信超时和模拟量跳变的排查顺序通信超时按物理层、参数层、协议层、应用层四步查。先量RS-485的A/B线有没有接反终端电阻是否只在总线两端各一个屏蔽层是不是单端接地再核对从站号、波特率、校验位和停止位9600-8-N-1是最通吃的组合然后检查寄存器偏移40001在代码里是address 0最后看轮询周期从站超过16台时单次轮询超过1秒很常见要拆成两组轮询或者改以太网。模拟量跳变先看Valid位有没有闪断闪断说明是接线或干扰数值缓慢漂移多半是变送器供电不稳数值周期性跳则要查是不是和变频器共用了24V电源。一阶滤波系数取0.2-0.3能压住大部分跳变但滤波太狠会让温度响应变慢回差控制会跟着迟钝。5.2 资源占用查看与AI生成PLC代码的正确用法博途在线诊断里可以看程序存储区、工作存储区和M区的占用循环时间在OB1属性里读。每增加一个Modbus从站、每加一段CASE状态机都会吃掉扫描周期家用场景循环周期控制在10ms以内比较舒服。M区不够用时优先把中间变量放进DB不要硬扩M区。现在用AI生成PLC代码很流行比较靠谱的用法是让它生成SCL骨架、CASE分支、换算公式的框架地址和数据类型必须人工核对。PLC数据类型INT和REAL混用、定时器实例重复调用这两类是AI生成代码最常见的错误编译能过但运行不对。5.3 几个可以直接沿用的经验参数参数推荐值说明Modbus轮询周期500ms-1s温湿度无需更快模拟量一阶滤波0.2-0.3抑制跳变兼顾响应空调温度回差1-2℃保护压缩机人体感应延时关灯2-5分钟按房间用途调通信超时与重连1000ms / 3次连续失败再报警点表地址预留每类留20%后期加传感器不用改协议最后补一个容易被忽略的技巧给Mode寄存器加一个心跳位上位机每30秒写一次递增数连续两分钟不变说明通信断了本地逻辑自动回落到离家状态。这样即使网络设备死机灯和窗帘也不会停在不可控状态整套基于PLC的智能家居监控系统才算真正扛得住长期运行。本文还有配套的精品资源点击获取