PLC+组态王实现智能路灯控制:S7-200系统设计与调试全记录

PLC+组态王实现智能路灯控制:S7-200系统设计与调试全记录 搞PLC这块的人应该没少接触过路灯控制这类项目。我前两年接了一个老小区的路灯节能改造甲方给的预算不高要求却不少既要按季节自动调整开关灯时间又要后半夜降功率省电还得能看到每路路灯的运行状态。当时手头正好有西门子S7-200的库存上位机选了组态王这套PLC 组态王的组合前后忙了一个多月把整个系统跑通了。今天就把这个项目从头到尾拆开聊从硬件选型到程序结构从组态画面到通信联调再到实际运行中踩过的坑一次说清楚。如果你正要接手类似的小区路灯、景观照明、园区亮化项目这篇文章应该能帮你少走不少弯路。1. 项目背景与整体设计思路1.1 传统路灯控制方式到底浪费在哪小区路灯这东西看着简单实际管起来挺头疼。最常见的老做法就是两种一种是时控开关每天固定时间合闸拉闸完全不管冬夏昼夜长短变化夏天晚上7点天还亮着灯就开了冬天早上6点天没亮灯已经关了另一种干脆就是人工物业电工每天早晚跑一圈手动开关配电箱赶上刮风下雨或者忘了那灯光就彻底放飞自我了。这两种方式带来的问题不只是灯亮灯灭这么简单。后半夜小区里人流量极小但路灯还是以额定功率全亮着这不是照明是纯烧钱。我曾经给一个中型小区粗略算过一笔账假设小区有80套路灯单套路灯功率150W每天从18点开到次日6点一共12小时。如果后半夜4小时把功率降一半或者采用隔盏亮的方式一年下来光这一项就能省出差不多2600多度电按商业电价算每年节省近两千块。这还只是一个中等规模小区物业公司手里管着好几个小区积少成多就很可观了。所以这个项目的核心需求其实就三条开关灯时间能自动跟随季节变化不需要人工频繁调整。后半夜人流稀少时段自动切换成半亮或隔盏亮模式降低功耗。值班室能实时看到每路路灯的状态出故障能第一时间报警定位。1.2 为什么选S7-200 组态王这套组合项目定下来之后选型是第一个问题。当时市面上做路灯控制的方案也不少了有专门的智能照明控制器有基于物联网的远程模块甚至还有直接用4G DTU配云平台的。但考虑到这个项目的实际条件我最后还是选了西门子S7-200作为主控制器配合组态王做上位机监控。先说S7-200。这款PLC虽然已经算是西门子的老一代产品但在小型自动化改造项目里依然是很有性价比的存在。它的优势在于一是稳定工业级器件在配电箱这种高温、震动、电磁干扰的环境中比普通单片机方案可靠得多二是指令集对小型逻辑控制非常合适定时器、计数器、比较指令、实时时钟读写都有做时间控制类的项目很顺手三是自带RS485通信口支持PPI协议、Modbus协议和上位机组态软件通信非常方便。再说组态王。它是国产组态软件里用得最多的之一内置了大量PLC的通信驱动。对于S7-200组态王直接支持PPI通信方式不需要额外写通信代码只要在设备配置里选对型号、填好COM口和站号就能直接建立变量连接。这比用InTouch、WinCC这类软件去折腾OPC要省事太多尤其项目预算有限的情况下组态王的授权成本也友好得多。这套组合的本质就是工业级控制 快速组态上位机。PLC负责现场逻辑组态王负责展示和交互两者通过串口通信各司其职。到现在回看这个选择是对的无论是开发周期还是后期维护都达到了预期的效果。2. 系统硬件架构与I/O资源规划2.1 系统拓扑从PLC到灯具的完整链路整个系统分三层来理解现场设备层、控制层、监控层。现场设备层就是路灯本身和对应的驱动回路。我把小区内道路分成三组回路分别是主干道回路、支路回路、景观带回路。每一组回路都由一个交流接触器来控制通断电接触器的线圈则由PLC输出点通过中间继电器来驱动。为什么中间要加一层中间继电器这是很多人容易忽略的细节。PLC的输出点尤其是继电器输出型的虽然标称能带2A左右的负载但交流接触器的线圈在吸合瞬间会产生很高的浪涌电流和反电动势直接接在PLC输出点上时间长了很容易把触点烧掉。中间继电器起到电气隔离和电流放大的作用便宜、好换坏了不心疼相当于给PLC输出口加了一层保护。控制层就是S7-200 PLC本体。我用的是一个CPU224型号14路数字输入、10路数字输出对这个小项目来说余量很充足。PLC的通信口Port0通过RS485总线连接到监控室的工控机采用PPI协议。另外我加了一个光照度传感器的信号输入作为开关灯的辅助判断条件后面会细说。监控层是一台普通工控机装组态王6.55通过USB转RS485串口线与PLC通信。工控机放在物业值班室显示器和主机常年开机运行组态王的运行画面值班电工只需要看画面上的灯色变化就知道哪条回路在工作、有没有故障。2.2 I/O点分配与硬件选型细节I/O点分配这件事看着简单但分配得好不好直接影响程序好不好写。我最终是这样分配的输入点地址功能说明I0.0手自动切换旋钮打在自动档时PLC按时间表运行打在手动档时由上位机远程控制I0.1光照度传感器信号雨天/阴天光照不足时提前开灯I0.2回路1接触器辅助触点反馈判断主干道回路是否真实吸合I0.3回路2接触器辅助触点反馈判断支路回路是否真实吸合I0.4回路3接触器辅助触点反馈判断景观回路是否真实吸合I0.5报警复位按钮故障排除后复位报警状态输出点地址功能说明Q0.0主回路1控制经中间继电器KA1驱动接触器KM1Q0.1主回路2控制经中间继电器KA2驱动接触器KM2Q0.2主回路3控制经中间继电器KA3驱动接触器KM3Q0.3故障指示灯/蜂鸣器任一回路故障时报警这里要特别说一下接触器辅助触点反馈的意义。很多初做路灯控制的人会忽略这个反馈信号觉得我PLC输出都亮了灯肯定就亮了实际完全不是这么回事。接触器线圈烧了、机械卡住了、接触器吸合了但主触点打火、甚至有人把接触器下端线路检修时断开了这些情况PLC输出端完全感知不到。有了辅助触点反馈PLC才能通过比较输出指令和实际反馈是否一致来判断回路是否正常运行。这是整个系统可靠性最重要的一环。另外在硬件选型上还有几个细节。接触器我选了施耐德的LC1D系列电流规格比实际负载留了1.5倍余量中间继电器选的欧姆龙MY2NJDC24V线圈配合S7-200的输出刚好每个接触器线圈两端都并联了RC吸收器用来抑制断开时的反向过电压。这些属于花小钱办大事的典型多投入不了几百块钱但能让系统寿命差出好几倍。3. 核心PLC程序设计与控制逻辑实现3.1 梯形图程序整体结构设计S7-200的编程软件是STEP 7-Micro/WIN程序用梯形图编写。整体结构上我没有把所有逻辑堆在一个主程序里而是采用了主程序 子程序的模块化结构。主程序OB1里面主要做三件事调用初始化子程序、调用时间控制子程序、调用故障检测子程序。这样做的最大好处是程序可读性强后期改逻辑不用在一坨梯形图里翻来翻去找网络。比如物业说后半夜想从凌晨2点改成3点你只需要改时间控制子程序里的比较指令完全不影响其他部分。这里分享一下我做PLC程序的习惯每个子程序内部用网络注释标明功能关键逻辑旁加上中文注释。S7-200的梯形图支持每行注释这一步千万别省。一个项目做完三个月后除非是你自己天天维护不然接手的人看着一堆没有任何注释的梯形图想死的心都有。初始化子程序主要负责设置一些初始状态比如刚上电时输出全部复位、报警变量清零、读取PLC当前实时时钟到指定的V存储区。时间控制子程序是核心后面单独展开。故障检测子程序里做了回路一致性判断和报警锁定逻辑。3.2 时间控制与分时段调光逻辑路灯控制的核心就是时间。S7-200带硬件实时时钟通过TODR读取实时时钟指令可以把当前时间读到V存储区然后通过比较指令来判断当前时刻落在哪个时间段。读取出来的时间是BCD码格式这一点很容易踩坑。直接拿读到的字节和十进制数比较结果总是错的因为BCD码里十六进制0x18代表的是18点但在数值上它等于十进制的24。所以我会先用一个子程序把BCD码转成十六进制整数后面做比较就顺畅多了。整个控制策略我是这样设计的按照冬夏两套时间表来跑时间段控制模式说明18:00 - 22:00夏季为19:00开始全亮模式三组回路全开保证晚高峰出行照明22:00 - 05:00半亮模式主干道回路隔盏亮支路和景观回路全关05:00 - 天亮全亮模式早起出行高峰全部开启白天关闭模式所有回路断电仅保留故障检测这里说的隔盏亮是我用的降功率手段也是最稳妥的一种。很多人会问为什么不用调光器或者降压节能我在设计时确实考虑过但最终放弃了。调光器方案比如可控硅前沿切相调光对LED驱动电源和高压钠灯都不太友好容易造成灯具闪烁、驱动电源损坏后期维护成本很高。降压节能柜更不用说了价格贵、体积大、对电网有谐波污染小项目用不起也没必要。隔盏亮虽然没有真正的调光效果细腻但它实现简单、成本几乎为零、可靠性极高路灯本身就是均匀分布的隔一盏亮一盏在视觉上完全不影响基本照明后半夜马路上本来也没人这个方案最实用。判断天亮和天黑我在程序中采用两种方式结合正常情况下直接用固定时间表但如果当天是阴雨天光照度传感器的信号会提前触发开灯条件。光照度传感器的信号是开关量照度低于设定阈值时输出一个闭合信号PLC检测到I0.1有信号且时间处于傍晚或早晨的临界区间就提前执行开灯。梯形的实现思路大概是在时间控制子程序里先把当前的小时和分钟拆出来然后用比较指令判断当前时间是否落在某个区间。区间判断用串联触点实现。举个实际例子18:00到22:00全亮这个逻辑就是当当前时间大于等于18:00和当前时间小于22:00两个条件都满足时置位M0.0全亮模式标志位。其他时间段同理。3.3 手动/自动切换与故障检测逻辑手自动切换功能放在I0.0这个旋钮上它是一个两位选择开关。PLC程序里用I0.0的常开常闭触点分别触发手动模式和自动模式。自动模式下灯具的状态完全由时间表决定手动模式下时间控制逻辑被旁路上位机组态王画面上的手动开关按钮直接控制Q0.0-Q0.2。这样设计的场景是遇到特殊活动比如小区举办中秋晚会需要延长照明时间值班员把旋钮打到手动档在电脑上点一下按钮就能控制不用改程序。手动和自动之间我加了互锁自动模式激活时手动控制指令无效手动模式激活时时间表输出无效。这个互锁纯粹靠梯形图里用常闭触点实现简单可靠避免出现两边同时抢输出的情况。故障检测逻辑是这个项目里比较花心思的部分。原理是PLC输出回路控制指令比如Q0.0输出ON同时反馈点I0.2应该检测到接触器辅助触点闭合。如果输出指令为ON但反馈点为OFF说明接触器没有吸合反过来输出指令为OFF但反馈点为ON说明接触器可能卡死或线路有短路这两种情况都属于故障。为了避免瞬时干扰造成误报警我加了一个延时判断异常状态持续超过3秒才确认为故障。确认故障后置位一个报警变量同时点亮Q0.3故障指示灯并触发蜂鸣器。报警一旦触发就保持直到故障排除后人工按下I0.5复位按钮才能消除。这个故障锁定 手动复位的设计很重要如果不做锁定某些瞬时故障一闪而过值班员根本来不及看到第二天可能都不知道昨晚某条回路出过问题。4. 组态王上位机监控画面开发4.1 数据词典与I/O变量定义组态王这边的开发第一步是建工程第二步就是数据词典。数据词典就是组态王的变量登记表所有要在画面上显示和控制的物理量都得在这里先定义好。对于S7-200通过PPI协议通信的情况组态王的数据词典里变量的类型要选择I/O离散和I/O整数两种。I/O离散对应PLC里的位变量比如M0.0、I0.0这类的I/O整数对应PLC里的VW、VD等寄存器变量。我最终定义的变量大概是这样的表格组态王变量名数据类型连接的PLC地址读写属性用途AutoModeI/O离散M0.0只读自动模式激活状态ManualModeI/O离散M0.1只读手动模式激活状态Loop1_StatusI/O离散M1.0只读回路1运行状态Loop2_StatusI/O离散M1.1只读回路2运行状态Loop3_StatusI/O离散M1.2只读回路3运行状态Alarm_StatusI/O离散M10.0只读报警状态Loop1_ManualI/O离散M2.0读写回路1手动控制Loop2_ManualI/O离散M2.1读写回路2手动控制Loop3_ManualI/O离散M2.2读写回路3手动控制CurrentHourI/O整数VB100只读当前小时CurrentMinuteI/O整数VB101只读当前分钟RunModeText内存字符串无-当前运行模式文字显示这里有个重要原则上位机和PLC之间通信的变量地址必须和PLC程序里使用的地址完全一致。比如PLC程序里把回路1状态写入M1.0组态王里就必须定义M1.0。如果两边地址对不上画面显示的就是错的而且这种错误很难排查因为通信本身是正常的只是数据映射错了位置。另一个需要注意的点是读写属性的选择。有些变量PLC端只负责输出比如运行状态、报警状态组态王就应该设成只读防止误操作往PLC写入垃圾数据。而那些需要上位机控制输出的变量比如手动控制位就设成读写。4.2 监控画面组态与动画连接画面组态这一步组态王确实做得比我用过的很多国外软件都要顺手。我先从物业要来了小区总平面图的CAD文件简化处理后导成位图作为监控画面的背景。然后在对应位置放上路灯图元、回路状态指示灯、操作按钮和时间显示框。画面上每个路灯图元和背景之间做了动画连接。动画连接是组态王里最有意思也最核心的功能。它本质上就是图元属性和变量值之间的绑定。我做的连接主要有这么几类状态变色连接是最直观的。每个回路的指示灯图元填充颜色属性关联到Loop_Status变量。我在动画连接对话框里设置变量为0时填充色为灰色灯灭变量为1时填充色为绿色灯亮变量为-1时填充色为红色故障。这样值班员瞄一眼画面颜色就知道所有回路的工作状态。按钮操作连接用于手动模式。我放了一个回路1开按钮在按下时事件里关联一个命令脚本把Loop1_Manual这个变量置1放一个回路1关按钮关联脚本把Loop1_Manual置0。需要注意按钮上的文字提示要加条件自动模式下按钮应该是灰色不可用的可以通过按钮的安全区和离散量来控制按钮可用性我这里直接用了变量类型的安全区设置当AutoMode变量为1时手动按钮处于禁用状态。当前时间显示这一块PLC每秒钟向VB100和VB101写入一次当前小时和分钟组态王画面放一个文本图元在模拟值输出连接里关联CurrentHour和CurrentMinute变量显示格式设置成XX:XX这样值班员在电脑右下角就能直接看到系统时间不用抬头看时钟。4.3 报警与数据记录配置报警功能在组态王里做起来不难但用好了价值很大。我在数据词典里把Alarm_Status变量定义为报警变量然后在报警配置里设置报警类型为开关量报警报警条件和报警文本都写好。组态王的运行画面里放一个报警窗口控件关联到这个报警变量。这样一旦PLC检测到回路故障把M10.0置位组态王的报警窗口就会立刻弹出一条红色的报警记录同时音响会响我在组态王里配置了报警声音文件。值班人员看到报警后先去现场排查处理完了回来按一下复位按钮报警状态解除报警窗口的记录会留存方便后续追溯。数据记录这块我用组态王的历史数据功能做了每日开关灯时间记录。组态王可以配置历史数据保存到本地数据库之后用历史趋势曲线控件或者报表控件来查询。在项目验收的时候我把一个月的开关灯时间记录导出来做成Excel表格甲方看到实际的节能数据比对效果项目验收一次通过。5. 通信配置与联调实战5.1 S7-200与组态王通信参数设置这套系统里通信是灵魂通信断了上位机就是块砖头。S7-200和组态王之间的通信我用了PPI协议。配置过程有几个关键步骤任何一个错了都连不上。首先是PLC侧的通信设置。在STEP 7-Micro/WIN软件里打开系统块找到通信端口设置确认PLC的站地址默认是2波特率我设的是9600bps。这里有一个坑要提醒大家如果PLC站地址和波特率你改了组态王那边必须完全一致两边对不上肯定连不通。然后是组态王侧的设备配置。打开组态王的工程浏览器在设备配置里选PLC分类下的西门子再选S7-200系列然后在设备地址里填PLC的站号也就是2端口。通信参数选择对应的COM口号、波特率9600数据位8、停止位1、无校验。这些是PPI协议下最通用的配置。物理连接上用的是USB转RS485串口线从工控机USB口转出来接到PLC的Port0口。这里要特别强调RS485的接线规范A接A、B接B不能接反。因为RS485是差分信号接反了收发不出来数据但你又看不出明显的物理损坏排查起来很隐蔽。我这次实际调试时也踩了这个坑一开始用了一根杂牌USB转485线怎么都连不上设备。后来换了一根质量好的转换线查一下端口号重新设置COM口立即就通了。注意在Windows的设备管理器里确认USB转串口的COM口号。不同电脑插不同的USB口COM口号会变组态王里的COM口设置要跟着改。建议固定使用工控机同一个USB口来插这个转换线避免每次重启电脑后COM号变动导致通信异常。5.2 常见通信故障排查通信故障是联调过程中最容易出的问题我按优先级总结了排查顺序几乎能覆盖90%以上的通信问题检查物理连接PLC通信口指示灯有没有闪串口线两头是否插紧RS485的A、B线有没有接反检查COM口号设备管理器里看转出来的COM口是几号组态王设备配置里的COM口要完全一致。检查波特率和站号PLC系统块里设置的波特率、站号和组态王设备配置里的是否匹配。检查是否被占用关掉STEP 7-Micro/WIN软件再测试组态王通信。这个特别重要因为STEP 7-Micro/WIN软件一旦打开并监控PLC会独占COM口组态王就拿不到这个串口了。检查终端电阻如果通信距离很长或者线上设备很多需要在总线两端并联120Ω终端电阻。组态王里有一个很实用的自检功能在设备配置里选测试它会对PLC发出请求并显示返回结果。如果测试正常说明驱动、参数和物理链路都没问题剩下的就是变量地址映射的事了。6. 常见问题与故障排查实录6.1 PLC输出点频繁损坏问题这个项目的PLC最开始在试运行阶段坏了两个输出点表现为Q0.0和Q0.1有指令但输出口无电压PLC本身报警灯也亮了。我一开始以为是PLC质量问题后来查了接线才发现是我图省事把接触器线圈直接并在了PLC输出点回路上没有经过中间继电器。接触器线圈断电瞬间的反电动势把PLC输出触点打坏了。解决方式就是回到标准做法PLC输出点先驱动中间继电器中间继电器的触点再去控制接触器线圈。同时在接触器线圈两端并联RC吸收器进一步抑制反向过电压。改完之后半年多再没出现过输出点损坏的情况。这里面的教训是PLC的输出口再耐用也不要直接带感性负载一定要用中间继电器做隔离这一点对继电器输出型PLC尤其重要。6.2 PLC实时时钟漂移问题S7-200的硬件实时时钟在出厂时有一定的精度但长期运行后会产生漂移尤其是环境温度变化大、PLC长时间通电的情况下一个月下来可能差出几分钟。对路灯控制来说开关灯时间差几分钟不会造成大问题但累积久了就很麻烦比如到了冬天可能晚开灯半小时影响居民出行。我的解决办法是让组态王每天定时给PLC校时。在组态王里写一个定时脚本每天早上6点把工控机当前时间写入PLC的时钟寄存器。工控机本身有Windows时间同步也可以定期进行internet校时这样整体精度就能保持住。这个方法不额外增加成本但确实很实用。具体脚本很简短在组态王的应用程序命令语言里配置早上06:00:00触发一次脚本内容就是把系统当前时间拆成年月日时分秒分别写入PLC的VB108到VB113的实时时钟寄存器然后调用PLC的TODW指令将寄存器内容写入时钟。注意写入的格式必须符合S7-200实时时钟要求的BCD码格式这里又涉及一次数值转换。6.3 上位机画面与现场状态不一致项目刚交付的时候物业管理处反馈过一个问题组态王画面上显示某回路灯是绿色的运行中但现场看那一路的灯根本没亮。我过去排查后发现问题出在组态王变量的采集频率上。默认情况下组态王对I/O变量的采集不是实时轮询的而是有一个采集频率设置。如果采集频率设得太长比如10秒甚至更长那么PLC端状态改变后上位机画面要过一段时间才能刷新出来。另外如果画面同时打开的窗口太多组态王的采集周期也会被拉长。解决方式是把关键状态变量Loop_Status、Alarm_Status的采集频率改成100~200毫秒操作类变量Loop_Manual保持默认即可。改完之后画面刷新速度基本做到了和现场状态同步。如果你用组态王做类似的监控画面记得在最初的变量定义阶段就把采集频率设好后期逐个变量去改很烦。7. 写在最后的一点经验这个项目从设计到稳定运行前前后后用了将近两个月时间。回头总结我觉得最值得分享的有三条一是做路灯控制这类项目别把精力花在花哨的功能上先把时间管理和故障反馈这两条主线做扎实。时间表设计得再复杂不如把隔盏亮这个降功耗功能做得稳定可靠。二是PLC和上位机的地址映射一定要从一开始就规划清楚两边对应关系做成文档保存。很多项目后期维护困难就是因为当时的地址表随手写在草稿纸上最后找不到了。三是现场调试时一定要带笔记本电脑和编程线STEP 7-Micro/WIN软件、驱动、组态王安装包全部备好。联调过程中改程序、改画面、改配置是常态工具不全真的会卡死现场。这个系统后续想扩展也很方便。S7-200的通信口如果考勤了可以加一个串口服务器的模块把RS485转成以太网配合组态王的网络版功能就能把监控页面发布到局域网物业主任在自己办公室电脑上也能看到小区路灯状态。再往后如果物业想接入手机端可以加4G DTU模块把PLC的关键数据通过MQTT协议上传到云平台那就完全是另一个维度的智能照明系统了。不过这些都是后话先把本地的这套PLC 组态王的系统稳定跑起来再考虑远程化改造也不迟。