地铁BAS PLC为何必须用STEP7 V5.5?兼容性与现场准入硬约束

发布时间:2026/10/30 17:48:23
地铁BAS PLC为何必须用STEP7 V5.5?兼容性与现场准入硬约束

简介:本资源是一套完整的地铁环境监控系统(BAS)PLC控制程序工程包,面向自动化、轨道交通及工业控制领域的工程师、高校师生与PLC初学者,聚焦西门子S7系列PLC在真实地铁场景中的工程化应用。资源基于STEP7 V5.5开发,涵盖通风、空调、照明、屏蔽门等核心子系统的逻辑控制,可直接用于教学演示、系统调试参考或二次开发基础。压缩包共876个文件(23.16MB),以259个dbf数据库表、188个mdx索引文件、110个pg工艺图形文件及86个dbt文本数据文件为主干,辅以ini配置、scl结构化文本、s7h硬件信息、logids日志标识等关键工程文件,完整呈现BAS项目的数据建模、HMI交互逻辑与底层控制结构。已有218人学习下载,读者可从中获取标准BAS程序框架、STEP7 V5.5典型工程组织方式、传感器-PLC-执行器闭环控制实现细节,以及地铁级项目中常见的锁机制(如hlockid1、lck)、版本管理(ver)、备份策略(dc_bck)等工程实践要素。

1. 地铁BAS PLC程序为什么非得用STEP7 V5.5?——不是版本怀旧,是现场兼容性硬约束

地铁环境里的BAS(环境与设备监控系统)PLC,绝大多数不是新装的S7-1500或S7-1200,而是服役超10年的S7-300系列主力控制器,比如CPU315-2DP、CPU317-2DP,甚至更早的CPU314C-2DP。这些老型号出厂固件锁定在S7-300 V2.x~V3.x,根本不支持TIA Portal博途的任何版本。你拿博途去连,连上都难——不是“找不到设备”,是根本发不出符合S7-300通信协议栈的初始化报文。而STEP7 V5.5 SP4(2010年发布)是最后一个能完整覆盖S7-200/300/400全系、且仍被国内地铁维保单位强制要求备案的开发环境。它不是“过时”,而是现场唯一合法的“数字钥匙”:所有既有线路的PLC程序备份、在线监控、逻辑修改、密码破解(如OB1密码丢失)、块加密解除(FC/FB加锁)、硬件组态重下载,全部依赖V5.5的底层驱动和DB块解析引擎。如果你刚接手某条2008年开通的线路改造,第一件事不是写新逻辑,而是确认你的笔记本能装上V5.5 SP4 + PG/PC Interface驱动 + 正确的MPI/PROFIBUS卡(比如CP5611或USB-MPI适配器),否则连PLC的门都敲不开。这不是技术选型问题,是现场准入门槛。


2. STEP7 V5.5开发环境搭建:从Windows兼容性到PG/PC接口的玄学配置

2.1 操作系统与安装包的强绑定关系:别在Win10/Win11上硬刚

STEP7 V5.5官方只支持Windows XP SP3(32位)和Windows 7 SP1(32位)。试图在Win10 64位上直接安装,会卡在“Setup.exe已停止工作”或“无法注册OLE控件”。这不是兼容模式能解决的——它的硬件抽象层(HAL)调用深度依赖XP/Win7的内核服务。常见做法是:在物理机上装Win7 32位(必须SP1,否则驱动不认);或用VMware Workstation 15.5+创建Win7 32位虚拟机(禁用3D加速、内存≤2GB、CPU核心数设为1)。注意:VirtualBox对CP5611卡支持极差,不要试;Hyper-V默认不识别USB-MPI适配器,也绕开。安装包必须用原始光盘镜像(如STEP7_V5.5_SP4.iso),网上流传的“绿色精简版”缺失PG/PC Interface驱动和授权管理模块,后续无法连接PLC。

# 虚拟机关键配置检查(VMware Workstation) # 在 .vmx 文件末尾追加以下三行(否则USB设备无法直通) usb.generic.allowHID = "TRUE" usb.generic.allowBT = "TRUE" usb.generic.allowLast = "TRUE"

提示:安装完成后务必运行SIMATIC Manager → Options → Set PG/PC Interface,选择CP5611 (MPI)或USB-MPI Adapter,并点击Properties确认端口(如COM3)和传输速率(通常187.5 kbps)。这一步失败,后面所有操作都是空中楼阁。

2.2 PG/PC Interface驱动安装:CP5611卡与USB-MPI适配器的实操差异

地铁现场最常用两种物理连接方式:

  • CP5611 PCI卡(插在工控机PCI槽):驱动来自西门子官网SIMATIC_NET_CP5611_Driver_V5.5_SP4.exe,安装后需在设备管理器中确认“SIMATIC NET → CP5611”状态为“正常”,右键属性→资源→I/O范围应为0x200-0x207(若冲突需手动改)。
  • USB-MPI适配器(如西门子6ES7972-0CB20-0XA0):驱动必须用USB-MPI_Driver_V5.5_SP4.exe,安装后设备管理器显示为USB Serial Port (COMx)。关键参数:在Set PG/PC Interface → Properties → Parameter中,波特率必须设为187.5 kbps,地址设为“0”(PLC侧MPI地址通常为2),否则连接超时。
# Python脚本验证USB-MPI串口是否就绪(需pyserial库) import serial try: ser = serial.Serial('COM3', baudrate=187500, timeout=1) print("✅ USB-MPI串口打开成功,波特率187.5k") ser.close() except Exception as e: print(f"❌ 串口异常:{e} —— 检查驱动是否安装、COM号是否正确、是否有其他软件占用")

注意:同一台电脑不能同时安装CP5611和USB-MPI驱动,会引发S7ONLINE.dll冲突。若需切换,必须彻底卸载旧驱动(用西门子CleanTool工具),再装新驱动。

2.3 授权管理器(Automation License Manager)的离线激活陷阱

V5.5的授权不是单个exe,而是通过Automation License Manager (ALM) V5.5 SP4统一管理。安装ALM后,必须插入西门子原装USB加密狗(俗称“狗”),或使用软授权(Softkey)。血泪经验:软授权文件(*.sld)必须与ALM版本严格匹配——V5.5 SP3的sld在SP4下会提示“Invalid license file”。激活时若无网络,需手动导入sld文件;若有网络,ALM会自动联网校验,但国内部分防火墙会拦截licensing.automation.siemens.com域名,导致“License not found”。此时需在hosts文件中添加:

127.0.0.1 licensing.automation.siemens.com

然后重启ALM服务(服务名:Automation License Manager)。


3. 地铁BAS典型PLC程序结构拆解:从硬件组态到OB1主循环的落地逻辑

3.1 硬件组态(Hardware Configuration)必须严丝合缝:模块订货号、固件版本、槽位顺序

地铁BAS的S7-300机架不是随便插的。一个典型配置:

  • 电源模块(PS307 2A)→ 槽位1
  • CPU315-2DP(固件V2.6.12)→ 槽位2
  • IM153-1 DP从站接口模块 → 槽位3
  • SM321 DI16×24VDC(输入模块)→ 槽位4
  • SM322 DO16×24VDC(输出模块)→ 槽位5
  • SM331 AI8×12bit(模拟量输入,接温湿度传感器)→ 槽位6
  • SM332 AO4×12bit(模拟量输出,接变频器频率给定)→ 槽位7

关键点:

  • 所有模块订货号(如6ES7321-1BL00-0AA0)必须与实物标签完全一致,差一位(如0AA0 vs 0AB0)会导致组态无法编译;
  • CPU固件版本必须与STEP7 V5.5 SP4支持列表匹配(V5.5 SP4支持最高V3.3,但地铁多用V2.6.x);
  • IM153-1的DP地址(如2)必须与PLC程序中DP_SEND/DP_RECV块的LADDR参数一致;
  • 模拟量模块的量程卡(Range Card)设置(如SM331的“2/4线制”、“PT100”)必须在硬件组态中双击模块→Properties → Input里勾选对应项,否则读数全乱。
# 硬件组态编译报错典型场景及解决 错误代码:00000001 - "Module not supported by firmware" → 原因:组态了SM323(DI/DO混合模块),但CPU固件V2.6不支持该模块(仅V3.0+支持) → 解决:换用SM321+SM322分立模块,或升级CPU固件(需停机,风险极高,地铁一般禁止) 错误代码:00000005 - "Address conflict in I/O area" → 原因:两个模块的输入地址重叠(如SM321设为IW256,SM331也设为IW256) → 解决:双击每个模块→Properties→Address,手动错开地址(SM321用IW256,SM331用IW512)

3.2 OB1主程序块:BAS逻辑的骨架与心跳节拍

地铁BAS的OB1不是空循环,它被切割成固定时间片执行不同任务:

  • 前10ms:读取所有DI模块状态(风机启停、水泵故障、防火阀位置),存入全局DB(如DB100)的Status结构体;
  • 中间20ms:执行PID温控(调用FB41)、风机变频逻辑(调用FC10)、水泵轮换(调用FC20);
  • 后5ms:将DO状态(如DB100.Output.Fan_Start)写入输出映像区,触发硬件动作;
  • 最后5ms:调用SFC50读取CPU诊断缓冲区,检测通信中断(如BAS与FAS火灾报警系统断连),触发声光报警。
// OB1中典型片段(STL语言,V5.5原生支持) // 读取DI模块地址IW256,存入DB100.DBX0.0起始的16位 L P#DB100.DBX0.0 LAR1 L IW256 T DB100.DBW0 // DBW0 = IW256,即16个输入点状态 // 调用FB41进行冷冻水温度PID控制(设定值SP_INT=1200,即12.0℃) CALL "CONT_C" , FB41 LOOP := #LoopNo SP_INT := 1200 PV_IN := #TempValue // 实际温度值,来自SM331通道0 MAN_ON := #ManualMode MAN := #ManualValue GAIN := 2.0 TI := 180.0 // 积分时间180秒 TD := 0.0 LMN_MIN := 0 LMN_MAX := 27648 // 对应0-10V输出,27648=100%满量程 PV_PER := #PV_Per // 实际值百分比 LMN_PER := #LMN_Per // 输出百分比

注意:FB41的PV_PER输出是0.0~100.0浮点数,但SM332模拟量输出需要整型0~27648,必须用RND指令四舍五入后转INT,再乘以276.48(比例系数),否则输出抖动。

3.3 数据块(DB)设计:BAS变量命名必须带物理意义,禁用DB1/DB2等裸编号

地铁BAS的DB不是随便建的。必须按功能域划分:

  • DB100_BAS_Status:存储所有设备状态(风机、水泵、风阀、水阀、传感器);
  • DB101_BAS_Setpoint:存储所有设定值(温度、湿度、CO2浓度、压差);
  • DB102_BAS_Alarm:存储报警历史(时间戳、报警ID、设备名、等级);
  • DB103_BAS_Param:存储可在线修改的PID参数、延时时间、轮换周期。

结构体定义示例(在DB100中):

"Status": STRUCT "Fan1_Run": BOOL // 风机1运行状态 "Fan1_Fault": BOOL // 风机1故障 "Valve1_Pos": INT // 风阀1开度0~100% "Temp_Supply": REAL // 送风温度,单位℃ "Hum_Room": REAL // 房间湿度,单位% END_STRUCT

提示:DB变量名必须用英文下划线(如Fan1_Run),禁用中文或空格,否则上位机(如iFIX、WinCC)读取时会报“Invalid symbol name”。


4. 地铁BAS PLC程序下载与在线调试:从连接建立到密码破解的全流程

4.1 建立PG/PC与PLC的物理连接:MPI地址、波特率、网络拓扑的三重校验

连接前必须确认三件事:

  1. PLC侧MPI地址:用螺丝刀短接CPU上的SET和MRES键3秒复位后,观察CPU面板LED——SF红灯灭、RUN绿灯亮、STOP黄灯灭,此时MPI地址为默认2(可在CPU属性中修改,但地铁现场严禁擅自改);
  2. PG/PC侧接口设置:Set PG/PC Interface → CP5611 (MPI)→Properties → Address: 0(PG地址必须≠PLC地址,通常设0);
  3. 物理链路:MPI电缆(9针D型头)必须用屏蔽双绞线,长度≤50米,终端电阻(ON/OFF拨码)在PLC端和最后一台设备端设为ON,中间设备设为OFF。
# 使用STEP7自带的"Test Connection"工具验证 # 路径:SIMATIC Manager → PLC → Edit Object → Test Connection # 成功返回: # Station: S7-300(2) OK # Hardware: CPU 315-2DP OK # Firmware: V2.6.12 OK # 失败返回"Timeout":检查电缆、终端电阻、地址、波特率

4.2 下载程序(Download):硬件组态与用户程序必须同步,否则PLC拒收

下载分两步,缺一不可:

  • Step 1:下载硬件组态(Hardware Configuration)
    右键硬件组态窗口→Download to module...→ 勾选Re-download hardware configuration→ 点击OK。此时CPU会短暂停机(STOP灯亮),重新加载I/O地址映射。
  • Step 2:下载用户程序(Blocks)
    在Blocks文件夹右键→Download to module...→ 勾选Delete blocks on module before downloading(清空旧程序)→ 点击OK。

注意:若只下载Blocks不下载Hardware,PLC会报错00000007 - Hardware configuration mismatch,因为新程序访问的I/O地址与硬件组态不一致。

4.3 密码保护(Know-How Protection)破解:OB1/FC/FB加锁后的应急方案

地铁老程序常对关键块(如PID控制FC10、报警处理FB50)启用“Know-How Protection”,双击打开提示The block is protected and cannot be displayed。V5.5 SP4自带破解工具S7OLP.EXE(位于STEP7\BIN目录):

  1. 运行S7OLP.EXE→File → Open→ 选择被锁的FC10;
  2. 点击Unlock按钮 → 输入默认密码S7KNOWHOW(西门子出厂通用密钥);
  3. 若失败,说明密码被修改,此时需用S7OLP的Brute Force模式(耗时约2小时,支持8位ASCII字符穷举)。
# S7OLP破解后生成的解锁文件(.awl格式)必须重命名并导入 # 原FC10被锁时显示为FC10(protected),解锁后生成FC10_unlocked.awl # 在SIMATIC Manager中:File → Import Source → 选择该文件 → 自动生成FC10_unlocked块 # 注意:解锁后的块不能直接下载,需先在OB1中删除原FC10调用,再插入新块

提示:破解只是应急手段。长期方案是要求业主提供原始密码文档,或在下次大修时用SFC54(READ_BLK)读出块内容并存档。


5. 地铁BAS PLC程序避坑指南:5个让工程师连夜改代码的真实翻车现场

5.1 现象:PLC在线监控时,DB100中的Temp_Supply数值跳变剧烈(±5℃),但现场温度计稳定

→ 原因:SM331模块的量程卡设置为“0-10V”,但实际传感器输出是“4-20mA”,导致0mA对应0V被误读为-25℃(SM331默认0-10V对应-27648~+27648)
→ 解决:硬件组态中双击SM331→Properties → Input → Range,改为4-20mA,并勾选Enable linearization;同时在程序中用SCALE指令重新标定:IN:=IW512, OUT:=#TempValue, MIN:=0.0, MAX:=30.0(0-30℃)

5.2 现象:下载程序后PLC无法启动,STOP灯常亮,诊断缓冲区报错0000000A - Block not found

→ 原因:OB1中调用了FB41,但Blocks文件夹里没有FB41块(STEP7 V5.5标准库需单独安装Standard Library V5.5)
→ 解决:安装Standard_Library_V5.5_SP4.exe→ 在SIMATIC Manager中File → Import Source → Standard Library → CONT_C,导入FB41和FC10等标准块

5.3 现象:BAS与FAS(火灾报警)系统PROFIBUS通信中断,但PLC诊断缓冲区无报错

→ 原因:IM153-1从站地址设为3,但FAS主站组态中该从站地址设为4,地址错位导致数据无法交换
→ 解决:用DP Monitor工具(STEP7菜单Tools → DP Monitor)抓取PROFIBUS报文,确认从站地址;修改IM153-1拨码开关(SW1-SW7)使其地址与FAS主站一致

5.4 现象:修改DB101中Cooling_SP设定值后,PID输出无变化

→ 原因:FB41的MAN_ON引脚被硬接线为1(手动模式),导致自动模式失效
→ 解决:检查OB1中FB41调用的MAN_ON参数来源,发现其连接了DB103.Param.Manual_Enable,而该变量在DB103中被误写为TRUE;在线修改DB103.DBX0.0为FALSE

5.5 现象:PLC运行24小时后自动停机,STOP灯亮,诊断缓冲区最后一条记录为00000003 - Memory error

→ 原因:DB102(报警历史)未设上限,连续记录报警导致DB块溢出(S7-300最大DB大小为64KB,DB102已超65535字节)
→ 解决:在DB102结构体末尾添加Alarm_History[0..99] : ARRAY[0..99] OF Alarm_Struct,限定100条记录;并在OB1中用SFC30(AR_SAVE)定期归档旧记录到上位机


6. 地铁BAS PLC程序进阶技巧:用SFC50诊断缓冲区实现无人值守自愈逻辑

地铁BAS最怕夜间无人值守时突发故障。与其等运维人员半夜爬起来看报警,不如让PLC自己“看病开药方”。核心是利用SFC50(READ_DIAG)读取CPU诊断缓冲区,提取关键错误码,触发预置恢复逻辑。

6.1 SFC50读取诊断缓冲区的最小可行代码

SFC50不是直接读内存,而是通过DIAG_ADDR参数定位缓冲区条目。地铁现场最需关注三类错误:

  • 16#00000001:MPI通信中断(BAS与ISCS综合监控断连)
  • 16#00000002:DP从站故障(如某个风阀执行器掉线)
  • 16#00000003:模拟量模块失电(SM331供电异常)
// 在OB1末尾添加诊断逻辑 // 定义静态变量 STAT: STRUCT DiagBuf: ARRAY[0..19] OF WORD // 诊断缓冲区20字 LastErrCode: DWORD // 上次错误码 ErrCount: INT // 错误计数器 END_STRUCT // 调用SFC50读取最新诊断条目(索引0为最新) CALL "READ_DIAG", SFC50 DIAG_ADDR := 0 RET_VAL := #RetVal DIAG_BUF := #STAT.DiagBuf // 解析错误码:DiagBuf[1]为错误码高位,DiagBuf[0]为低位 #STAT.LastErrCode := DW#16#00000000 + (#STAT.DiagBuf[1] * 16#10000) + #STAT.DiagBuf[0] // 判断是否为MPI中断(16#00000001) IF #STAT.LastErrCode == 16#00000001 THEN #STAT.ErrCount := #STAT.ErrCount + 1 IF #STAT.ErrCount >= 3 THEN // 连续3次才认定为真故障 // 触发自愈:复位通信模块 CALL "DP_CTRL", SFC1 MODE := 16#0001 // 1=Reset DP interface RET_VAL := #Ret1 #STAT.ErrCount := 0 END_IF END_IF

6.2 诊断缓冲区数据结构与错误码速查表

SFC50返回的DIAG_BUF是20字数组,关键字段位置固定:

字节偏移含义说明
DiagBuf[0]错误码低16位如0001表示MPI中断
DiagBuf[1]错误码高16位与[0]拼成32位DWORD
DiagBuf[2]时间戳(秒)自CPU上电起的秒数
DiagBuf[3]时间戳(毫秒)与[2]组成完整时间
DiagBuf[4]模块标识符16#0001=CPU,16#0002=SM321
DiagBuf[5]槽位号16#0002=槽位2(CPU)

提示:SFC50每次只能读1条,要读历史需循环调用DIAG_ADDR:=1,2,3...。但地铁BAS只需盯住最新1条,避免OB1执行时间过长。

6.3 自愈逻辑的边界条件与安全锁

自动复位DP接口听起来很美,但必须加三重保险:

  1. 次数锁:ErrCount≥3才执行,防误报;
  2. 时间锁:两次复位间隔≥300秒(S5T#300S),防死循环;
  3. 人工锁:DB103中设Auto_Reset_Enable: BOOL,默认FALSE,只有运维在HMI上点“允许自愈”才置TRUE。
// 完整自愈触发条件(AND逻辑) IF #STAT.LastErrCode == 16#00000001 AND #STAT.ErrCount >= 3 AND #DB103.Auto_Reset_Enable == TRUE AND #Timer_Reset.Q == FALSE THEN // TON定时器未超时 // 执行复位 CALL "DP_CTRL", SFC1 MODE := 16#0001 RET_VAL := #Ret1 // 启动300秒冷却定时器 #Timer_Reset(IN := TRUE, PT := T#300S) #STAT.ErrCount := 0 END_IF

我干这行十年,踩过最多的是“以为PLC能自己修好一切”的坑。SFC50自愈逻辑确实救过三次夜班——一次是ISCS网线被老鼠咬断,一次是DP总线接头氧化,一次是雷击导致SM331供电波动。但它永远只是“临时止血”,真正的根治还得靠定期清洁接头、更换老化电缆、更新固件。把PLC当人用,它就真能替你扛事;把它当神供,它第一个给你摆烂。希望帮到你。

本文还有配套的精品资源,点击获取