☰
西门子S7-1200博途仿真停车场车位控制系统开发详解
2026/10/9 5:14:45 网站建设 项目流程

我们做自动化项目的,十有八九都绕不过停车位管理这个经典场景。这次用西门子1200配合博途(TIA Portal)环境,把停车场车位控制系统完整做了一遍,从PLC程序到HMI画面设计,再到仿真联调,每一步都踩过坑、填过土。这篇就把整套流程、设计思路、实操细节原原本本分享出来,尤其把仿真环境里那些“看着没问题就是不工作”的坑点全部列出来,给后面做类似项目的朋友做个参考。

先说清楚,这套系统是基于S7-1200的博途仿真,PLC程序和HMI画面都是虚拟环境里跑的。也就是说,你不需要真买一套硬件,一台装了博途软件的电脑就能完成全部开发验证。这对学生做课程设计、工程师做方案验证、甚至想入门PLC编程的朋友来说,都是成本最低的一条路。HMI画面设计是本项目的重头戏,后文会逐页拆解每一个画面的布局、功能、控件配置和背后的设计逻辑。

1. 内容整体设计与思路拆解

1.1 停车场车位控制的核心需求

停车场车位控制系统,听着复杂,拆开看核心就三个词:检测、控制、显示。检测是知道车位有没有车,控制是管理进出口和引导指示,显示是让用户和管理员都能直观看到状态。

具体到本项目,车位规模设计为16个,编号从1到16。系统需要实现三大功能模块:

  • 入口控制:车辆到达入口,检测有车请求,判断场内是否有空位,有则放行(抬杆),无则拒绝(红灯禁行提示)。
  • 车位检测与指示:每个车位配一个光电/接近传感器,实时检测占用状态;每个车位上方或入口处设置指示灯,空闲绿色、占用红色。
  • HMI监控:管理员在触摸屏上实时查看16个车位的状态、进出车辆计数、系统运行状态,并能手动干预(比如强制抬杆放行紧急车辆)。

这个需求放在真实停车场里,对应的是车位引导系统和出入口道闸联动系统。做这个项目时,我建议先别急着写代码,把I/O表和系统流程图拉出来,这是后面所有工作的基准。

1.2 方案选型:为什么用西门子1200+博途

当前市面上PLC家族很多,三菱FX系列、汇川AM系列、西门子S7系列都有各自的拥趸。选西门子1200,主要是三个原因:

一是软件生态完整。博途(TIA Portal)一套软件搞定PLC编程、HMI组态、仿真联调,不需要像老方案那样PLC用Step7、触摸屏用WinCC flexible分开搞。特别是博途V16以上版本,S7-1200和HMI的仿真可以无缝对接,这在教学和方案验证场景里非常香。

二是S7-1200性价比高。作为西门子中小型PLC的主力,CPU 1214C自带14路DI/10路DO,本项目16个车位传感器输入加若干控制输出,刚好够用,不需要额外扩展模块。即使实际场景车位更多,加一个SM1221/1222数字量模块也就解决了。

三是仿真能力成熟。博途自带的PLCSIM配合S7-PLCSIM Advanced,可以实现PLC程序的离线仿真,配合HMI的Simulation功能,一台电脑就能完成整个系统的虚拟联调。这套流程做熟了,现场调试的时间能压缩一半以上。

有人可能会问,为什么不用三菱GX Works或Codesys?没有贬低谁的意思,这类课程设计或方案验证项目,选西门子体系自然有教学资源多、社区案例丰富、遇到问题好查资料这些无形优势。对于新手来说,遇到报错能找到解决方案,比什么都重要。

1.3 系统架构与控制流程

系统整体架构分三层:

  • 现场设备层:16个车位传感器(数字量输入)、入口地感传感器、出口地感传感器、入口道闸电机控制、出口道闸电机控制、入口指示灯(红/绿)、出口指示灯(红/绿)、16个车位指示灯。
  • 控制层:S7-1200 PLC,完成所有逻辑运算、计数统计、状态判断。
  • 监控层:HMI触摸屏,显示车位状态、统计信息、报警信息,支持手动控制。

控制流程设计上,我遵循“先判断、后动作、再反馈”的闭环思路:

车辆到达入口 -> 入口地感信号ON -> PLC判断空闲车位数量是否大于0 -> 充足则入口绿灯亮、道闸抬升、车辆进入 -> 车辆经过出口地感时计数器加1 -> PLC自动分配一个最近空闲车位 -> 车位指示灯由绿变红 -> 道闸落下(定时或车辆通过后延时)。

出车流程正好相反:出口地感检测到车辆 -> 道闸抬升放行 -> 计数器减1 -> 对应车位释放 -> 指示灯由红变绿。

这里有个设计细节值得说明:车位和车辆的绑定关系。简单做法是只统计数量,不精确到具体车位。进阶做法是“入口分配车位号”,即入口抬杆时,HMI和现场指示牌直接显示“请驶入5号车位”,这个引导逻辑会让系统体验好很多。

本项目采用了进阶做法,PLC内部用了一个16位的车位状态字(16个BOOL量组成数组),程序自动从1号开始搜索第一个空闲车位,分配后置ON,释放后置OFF。

2. 核心细节解析与实操要点

2.1 I/O地址分配与变量表规划

整个系统能不能顺利跑起来,I/O分配是第一个关键点。这个表在纸上画错了,后面程序里到处都是隐患。我用的CPU是1214C DC/DC/DC,DI地址从I0.0开始,DO从Q0.0开始,具体分配如下:

信号类型地址说明数据类型
入口地感开关I0.0车辆到达入口信号BOOL
出口地感开关I0.1车辆到达出口信号BOOL
1-8号车位传感器I0.2-I1.1各车位占用检测BOOL
9-16号车位传感器I1.2-I2.1各车位占用检测BOOL
入口道闸电机Q0.0抬杆/落杆驱动BOOL
出口道闸电机Q0.1抬杆/落杆驱动BOOL
入口绿灯Q0.2允许进入指示BOOL
入口红灯Q0.3车位已满禁止进入BOOL
出口绿灯Q0.4允许驶出指示BOOL
车位指示灯1-8Q0.5-Q1.4对应车位状态BOOL
车位指示灯9-16Q1.5-Q2.6对应车位状态BOOL

在博途里建变量表时,建议直接建一个PLC变量表,把所有I/O信号用带有语义的名字命名,比如Sensor_Car_Position_01代表1号车位传感器,Light_Car_Position_01代表1号车位指示灯。千万别用默认的I0.2、Q0.5这种裸地址去写程序,那样程序读起来就是天书,后期维护看到能哭出来。

另外,还要规划一组DB块变量用于中间逻辑:

  • Available_Spaces:INT类型,当前空余车位数量。
  • Car_Count_Total:INT类型,累计进入车辆总数。
  • Entry_Request:BOOL类型,入口请求信号(由入口地感和防重复触发逻辑共同决定)。
  • Gate_Status_Entry:BOOL类型,入口道闸状态(TRUE=抬杆中)。

这些变量不仅要给PLC程序用,还要映射到HMI画面,建变量时名称务必和HMI端保持一致,减少后面联调的对地址环节。

2.2 控制逻辑的程序分段设计

写PLC程序最忌一个OB1里堆几百行迷宫逻辑。我的习惯是“按功能分段、用FC封装”,把程序拆成几个功能块,每个块职责单一,调试时可以单独看某个功能是否正常。

本项目把程序拆成五个部分:

2.2.1 车位传感器信号处理(FC_Car_Sensor)

16个车位传感器信号进来后,先不做复杂逻辑,只做一件事:把原始传感器值Sensor_Car_Position_01到_16同步到DB块里的一组中间变量Pos_Occupied[1]到Pos_Occupied[16]中。同时实时统计ON的数量,计算出Available_Spaces = 16 - ON数量。

这里要注意传感器抖动问题。真实场景中光电传感器在车辆到位瞬间会有信号抖动,容易导致误判。实操中我用了一个0.2秒的定时器做信号稳定滤波,连续0.2秒检测到ON才认为车位被占用,配合博途的上升沿指令R_TRIG做边沿检测,能有效避免误动作。仿真场景下虽然传感器信号是手动模拟的,但程序里滤波逻辑保留着,以后移植到真实环境就是直接能用的。

2.2.2 车辆进出判断与道闸控制(FC_Gate_Control)

这是系统最核心的逻辑。入口方向处理流程如下:

  • 读取Entry_Request(入口地感I0.0的上升沿触发)。
  • 判断Available_Spaces > 0:
    • 满足:置位入口道闸抬升输出Q0.0,入口绿灯Q0.2亮,红灯灭。同时调用“车位分配逻辑”(见下)找出一个空闲车位号,把车位号传给HMI显示“请停放X号车位”。
    • 不满足:入口红灯Q0.3闪烁,绿灯灭,道闸不动作。
  • 车辆通过入口地感进入后,地感信号从ON变OFF(下降沿),触发道闸落杆,Q0.0复位。

落杆时间我用的是延时断开定时器TONR,设置5秒。原理是车辆从车头压到地感到车尾完全通过地感,一般需要2-4秒,延时5秒保证车身完全通过再落杆,避免砸到车顶。

2.2.3 车位分配算法(FC_Assign_Slot)

搜索策略采用“始终分配编号最小的空闲车位”。用FOR循环从索引1到16遍历Pos_Occupied[]数组,找到第一个FALSE,返回该索引作为分配车位号,并把这个位置写入变量Assigned_Slot(INT类型),同时HMI端对应显示。

有两点需要说明:

  • 为什么不设计成“距离入口最近优先”?因为实际停车场里车位可能在不同楼层或区域,简单按编号最小分配,逻辑简单且直观,作为教学验证项目完全够用。要做区域引导的话,得额外加区域划分变量和优先级表,复杂度会明显上升。
  • 分配的车位在车辆真正停进去之前只是“预分配”,并没有锁定。这意味着如果司机开进去没停到指定位置,而是停了另一个空位,系统以车位传感器为准更新状态。这个设计是符合停车场实际运行逻辑的,毕竟你没法强制司机停哪。
2.2.4 系统计数器与统计(FC_Statistics)

计数这块我做了两个统计变量:

  • Car_Count_Total:入口抬杆放行次数(入口请求有效且抬杆动作完成的上升沿计数)。
  • Exit_Count_Total:出口道闸抬杆次数。

系统正常运行时,Car_Count_Total - Exit_Count_Total应该等于当前占用车位总数,这个值可以和16个车位传感器的占用数量做交叉校验,两边的差值大于0就说有计数异常。HMI画面上专门有一块区域展示这个差值并标红报警,这个设计是实际调试中发现了“车辆中途驶离未通过出口道闸”这类场景后补上的,实用性很高。

2.2.5 HMI手动控制接口(FC_Manual_Control)

考虑到紧急车辆放行、设备测试等需求,HMI上提供了手动控制模式。手动模式下可以强制抬杆、强制落杆、可以单独控制某个车位指示灯。程序设计上用了“手动优先”原则:一旦HMI手动模式开关置ON,自动逻辑的道闸控制输出被切断,由手动按钮直接联动输出。

这个逻辑实现非常简单,一个Manual_ModeBOOL开关加几个中间变量,然后在输出映射处做选择:

IF Manual_Mode THEN Q0.0 := Manual_Gate_Up_Entry; // 手动抬杆 Q0.1 := Manual_Gate_Up_Exit; ELSE Q0.0 := Auto_Gate_Up_Entry; Q0.1 := Auto_Gate_Up_Exit; END_IF;

2.3 博途仿真环境搭建的预备工作

这里必须先说清楚博途仿真分几层,很多新手容易迷糊:

  • PLCSIM(S7-PLCSIM):用于S7-1200/1500的纯逻辑仿真,就是模拟PLC运行程序,你可以强制输入、监控变量,但它不带HMI仿真能力。
  • HMI仿真(Simulation):博途组态好的HMI画面可以直接启动软件仿真,画面和控件都能操作,但它需要和PLCSIM建立连接才能读到PLC变量。
  • PLCSIM Advanced:更高级的仿真器,用于S7-1500/1200的仿真通讯,比如和外部程序(C#、Python)通过API通讯,或者模拟网络通讯场景。这个对纯HMI联调不是必须的。

本项目用PLCSIM配合HMI Simulation就足够了。实操步骤后面第4章详写,这里先提一个关键点:博途V16以上版本的HMI仿真和PLCSIM之间是自动建立连接关系的,前提是你在项目树里把HMI和PLC变量做好关联,并且HMI的设备地址和PLC仿真地址在同网段。

真实项目中,HMI和PLC是通过Profinet网线连接的,HMI设备组态时IP要设在PLC的同一个网段(比如PLC是192.168.0.1,HMI就设192.168.0.2)。仿真时这个IP约束不存在,但变量连接关系一定要对,否则HMI画面上全是“###”或“连接断开”的报错。

3. 实操过程与核心环节实现

3.1 博途项目新建与硬件组态

打开博途V16或更新版本,选择“新建项目”,命名ParkingLot_Control_System。在项目树里进入“添加设备”,选控制器,型号SIMATIC S7-1200,CPU 1214C DC/DC/DC,订货号6ES7214-1HG40-0XB0(V4.0以上固件)。博途里不同版本固件对指令集有影响,建议选最新支持的版本。

硬件组态时默认会生成一个Profinet接口,设置PLC的IP地址为192.168.0.1,子网掩码255.255.255.0。这个IP在后面HMI连接时要用。

然后添加HMI设备,选“SIMATIC HMI”,比如TP700 Comfort或精简系列面板KTP700 Basic。HMI的IP地址设为192.168.0.2。如果用的是精简面板,组态时直接选Basic Panel系列即可,功能上对画面切换、变量显示、按钮操作完全够用,而且画面更简洁,适合这个项目。

HMI组态完毕后,组态里面有个“连接”设置,需要在HMI的“设备和网络”视图中新建一条Profinet连接,连接对象选PLC_1。通信协议用S7协议(Optimized)即可,博途默认会建好。

3.2 用户程序编写实现

程序块结构如下:

程序块类型功能
OB1组织块主程序循环,调用各FC
FC_Status_Monitor函数车位状态刷新与计数
FC_Gate_Control函数进出口道闸控制逻辑
FC_Slot_Assign函数空闲车位搜索分配
FC_Statistics函数进出计数与异常校验
FC_Manual_Control函数手动模式切换
DB_Global_Data全局数据块共享变量存储

OB1里按照采样周期循环调用以上FC。FC之间通过全局DB块交换数据,每个FC内部也有局部变量做中间逻辑,互相不干扰。

这里给出一段核心的车位资源分配代码供参考(STL/SCL可互相转换,我用SCL写的):

// FC_Slot_Assign:搜索第一个空闲车位 FUNCTION FC_Slot_Assign : INT VAR_TEMP i : INT; END_VAR // 默认返回0,表示无空位 FC_Slot_Assign := 0; // 从1到16搜索第一个空闲车位 FOR i := 1 TO 16 DO IF NOT DB_Global_Data.Pos_Occupied[i] THEN FC_Slot_Assign := i; DB_Global_Data.Assigned_Slot := i; EXIT; // 找到即退出循环 END_IF; END_FOR;

这段逻辑的核心是EXIT跳出循环,避免无谓遍历。如果返回0,HMI端就要显示“车位已满”。

道闸控制逻辑的SCL写法:

// 入口控制 IF DB_Global_Data.Entry_Request AND NOT DB_Global_Data.Manual_Mode THEN IF DB_Global_Data.Available_Spaces > 0 THEN DB_Global_Data.Auto_Gate_Up_Entry := TRUE; DB_Global_Data.Entry_Red_Light := FALSE; DB_Global_Data.Entry_Green_Light := TRUE; FC_Slot_Assign(); // 触发车位分配 ELSE DB_Global_Data.Auto_Gate_Up_Entry := FALSE; DB_Global_Data.Entry_Red_Light := TRUE; DB_Global_Data.Entry_Green_Light := FALSE; END_IF; END_IF; // 入口地感下降沿 -> 延时落杆 IF DB_Global_Data.Entry_Request AND NOT DB_Global_Data.Entry_Request_Prev THEN // 上升沿:抬杆 ELSE // 延时5秒后落杆 END_IF;

3.3 HMI画面设计全过程

HMI画面是整个项目的门面,也是本次需求的重中之重。我在TP700面板上设计了4个主画面,通过底部导航按钮切换。

3.3.1 主监控画面(画面编号001)

主监控画面是系统默认首页,布局如下:

  • 顶部:标题栏,显示“停车场车位控制系统”,下方一行显示当前时间和日期。
  • 中间:一个4行×4列的16宫格区域,每个格子代表一个车位。格子内显示车位编号、车位状态(绿色底=空闲、红色底=占用),状态用背景颜色和多边形填充变化实现。这个功能的实现原理是:画面放置一个代表车位的矩形对象,设置其“背景颜色”属性关联到对应车位变量——Pos_Occupied[i]为TRUE时背景变红,FALSE变绿。
  • 右侧:一个大字体的“剩余车位”显示框,关联Available_Spaces变量,用“N / 16”的格式显示。
  • 底部:一排导航按钮,分别是“主监控”“手动控制”“报警记录”“运行统计”。

关于16宫格的实现技巧:不要画16个独立的矩形然后逐个关联变量,那样效率太低。更好的办法是做一个“车位显示模板”——画好一个矩形和文字标签后,整组选中复制,修改每个副本的变量关联属性即可。博途支持对矩形对象的属性做变量关联,右键点击矩形,在属性->外观->背景颜色里选“变量连接”,把变量选到对应的Pos_Occupied[i]。

3.3.2 手动控制画面(画面编号002)

这个画面给管理员提供干预能力,分三个区域:

  • 道闸控制区:两个按钮“入口抬杆”“入口落杆”,两个按钮“出口抬杆”“出口落杆”。按下按钮时置位对应的手动控制中间变量。按钮的“模式”建议选“取消按下的状态”,这样不会卡住一直输出,避免误操作导致道闸长时间打开。
  • 车位指示灯控制区:16个小型按钮,每个按钮控制一个车位的强制指示灯。其实实际项目里车位灯是和传感器联动的,这里手动控制更多是给运维人员测试用。
  • 模式切换区:一个“手动/自动”切换开关,关联Manual_Mode变量。这个开关置ON时,自动逻辑的输出连接被切断。为了防止误切换导致现场混乱,我在画面里加了一行红色警告文字:“手动模式已启用,自动逻辑已断开!”这行文字通过Visibility属性关联Manual_Mode变量,TRUE时可见。
3.3.3 报警与事件画面(画面编号003)

报警画面用博途的“报警视图”控件实现,配置报警变量和触发条件。报警类型分两种:

  • 系统诊断报警:PLC模块故障、HMI断线(仿真时偶尔出现,属正常)。
  • 用户自定义报警:车位已满(触发条件Available_Spaces等于0)、计数异常(Car_Count_Total减去Exit_Count_Total不等于16个车位占用总数,差值超过2时报警)、进出口道闸超时(道闸抬杆或落杆动作超过10秒未完成)。

自定义报警的配置路径:在项目树找到HMI设备下的“HMI报警”,右键选择“新建报警”。触发条件直接用PLC变量作为触发标签,例如“Available_Spaces == 0”即可。

报警画面上还放了一个“报警确认”按钮,作用是把报警状态变为“已确认”,方便区分新报警和历史报警。手动控制画面里操作产生的报警(比如手动模式启用)也在这里记录,方便事后审计。

3.3.4 运行统计画面(画面编号004)

统计画面用数值显示框和趋势图表构成:

  • 数值区:累计进入车辆数(Car_Count_Total)、累计驶出车辆数(Exit_Count_Total)、当前在场车辆数(差值计算)、系统运行时间(用PLC的系统时钟秒值换算成“XX天XX小时”显示在文本框中)。
  • 趋势区:用HMI的“趋势视图”控件画一张折线图,横轴是时间,纵轴是车位占用率(0-100%)。趋势显示的数据源是PLC里一个名为Cur_Occupy_Percent的INT变量,程序里每10秒把当前占用率写入该变量,并启用历史记录功能,这样HMI就能读取历史数据画出曲线。

做趋势视图时有个坑:博途精简面板的“趋势视图”控件有点弱,曲线刷新速度慢。实测下来,把采样周期从默认的1秒改成10秒,画出来的曲线反而更平滑,而且CPU占用率更低。这个经验可以类比到所有HMI趋势图设计中——采样过快没实际意义,反而造成画面卡顿。

3.4 仿真联调全流程操作

这台系统的联调步骤,我按开发顺序来排,每步都验证通过再往下走:

第一步:启动PLCSIM。

在博途项目树中右键点击PLC_1,选择“仿真->启动”,系统会自动编译程序并启动PLCSIM。如果弹出“是否存在多个PLC_1”选项,选你要仿真的那台就行。PLCSIM窗口打开后,把“模块状态”显示为RUN绿指示灯。

这里必须提醒一个常见问题:PLCSIM启动后程序默认不是RUN状态,如果你不手动点击“RUN”按钮,程序不会执行。很多人卡在这一步,HMI连上去看到变量全不刷新,就是因为PLC仿真停在STOP状态。

第二步:启动HMI仿真。

项目树中右键点击HMI设备,选择“仿真->启动”。HMI会自动编译组态并弹出仿真画面。首次启动可能会提示找不到HMI连接或需要选择PLCSIM实例,正常情况它会自动关联到已运行的PLCSIM。

一个细节:HMI仿真窗口弹出后,如果画面角落显示“连接中断”或全屏“###”,先检查两个东西:一是HMI运行系统设置里的“设备地址”是不是192.168.0.2,二是PLC的IP是不是192.168.0.1,两边不一致连接就不成功。

第三步:手动模拟输入信号。

PLCSIM窗口左侧可以找到“输入变量”表(如果没显示,在菜单栏“在线工具”里找“监视表”或“强制表”)。在监视表里把I0.0(入口地感)置为TRUE,观察HMI画面入口绿灯是否变亮。把I0.2(1号车位传感器)置为TRUE,观察1号车位方块变红、剩余车位列表减少1。

这一步是整个联调的关键验证点。如果PLC内部逻辑有问题,这个环节暴露出来最直接。

第四步:反复模拟进车/出车全流程。

手动按顺序操作监视表:

  1. I0.0(入口地感)置TRUE再置FALSE,模拟一辆车到达并进入;
  2. 观察HMI画面:剩余车位数减少,某车位变红,累计进入车辆数加1;
  3. I0.1(出口地感)置TRUE再置FALSE,模拟车辆驶出;
  4. 观察HMI画面:剩余车位数恢复,对应车位变绿,累计驶出车辆数加1。

如果出现“车位变红但剩余车位没变化”这种逻辑不一致,优先检查FC_Status_Monitor里的统计逻辑——统计和状态显示不能各算各的,必须用同一条数据链,即Available_Spaces必须是从Pos_Occupied[]数组实时统计出来的,而不是独立维护一个加减计数。

3.5 HMI画面与PLC的变量连接配置

HMI变量连接是HMI开发中最容易翻车的一环,说几个经验:

第一,HMI变量要建在“HMI变量表”中,类型必须和PLC变量类型一致。比如Available_Spaces在PLC里是INT,HMI变量也得是INT,差一个字节都可能读不到数据。PLC里的BOOL类型对应HMI的BOOL,没问题。INT对应16位整数。博途里还有个“Variant”类型,但那个主要用于脚本,普通画面不建议混用。

第二,画面对象的属性连接方式有两种:直接连接变量或通过“动态文本”间接连接。直接连变量是常规操作:在对象的属性页里找到目标属性(如背景颜色),点击右侧的“变量”下拉按钮,选择“使用变量”,然后在弹出的对话框选HMI变量,并且选择“PLC变量”页签下的变量,意思是这张画面直接从PLC读变量。

第三,有些属性(比如按钮的“可见性”)支持布尔表达式关联,你就可以写Available_Spaces == 0这种逻辑表达式。这个功能挺好用,比如车位满了之后让“禁止驶入”图标自动显现,就是设置可见性属性为Available_Spaces == 0。

第四,注意画面切换按钮的设置。导航按钮的本质是“切换画面”系统函数,在按钮属性里选择一个“系统函数”为“ActivateScreen”,目标画面填002、003等。这个操作和普通功能按钮完全不同,别搞混。

4. 常见问题与排查技巧实录

做仿真联调,问题集中在五类:PLC启动不了、HMI连不上、变量不刷新、按钮没反应、PLCSIM Advanced起不来。逐个说排查方法。

4.1 PLCSIM启动失败或PLC不运行

现象:点击仿真启动后,PLCSIM窗口弹出报错,或者窗口里PLC一直显示STOP,点RUN没反应。

排查顺序:

  1. 检查项目编译是否通过。在博途主界面左下角“编译”输出窗口看有没有错误。程序有错误时PLCSIM拒绝加载,这是最常见的。
  2. 检查PLCSIM版本和博途版本是否匹配。博途V16配套PLCSIM V16,博途V17配PLCSIM V17,版本不一致会出现各种莫名问题。
  3. 检查PC用户名是否含中文。西门子软件对Windows用户名为中文或带有特殊字符的路径很敏感,实测中文路径会导致PLCSIM无法加载PLC实例,报错不明。建议用纯英文的Windows账户。
  4. 点RUN后如果指示灯变黄或红,打开PLCSIM菜单里的“诊断”视图,看“模块状态”里的错误代码。常见的是“CPU被放置在STOP因为一个编程错误”,这时候需要回到博途程序的调用堆栈里找错误点。

4.2 HMI仿真按钮无反应

这是热词里出现频率很高的问题,我特别说明。按钮按下去画面上的变量不变化,原因有几种:

  • 变量连接未生效:按钮的事件属性里选择的变量没有正确关联。检查方式:双击按钮,看“属性->事件->按下”选项卡里执行的是否是“置位位”系统函数,操作数的PLC变量是否选对。如果选了“系统函数”而不是按钮的“功能”,按钮就不会有任何效果。
  • PLC程序里手动/自动模式未切换:如果你在HMI手动画面里按了“抬杆”,但PLC程序里没有走手动分支,输出当然不变。先确认HMI手动模式开关已经置ON,且Manual_Mode变量已经变成TRUE。
  • 仿真过程中变量类型不匹配:HMI按钮置位的BOOL变量,在PLC变量表里如果被定义为内部BOOL没问题,如果定义成外部I变量,置位无效。手动控制变量一定在DB块里定义,不要直接去置位I区。

4.3 HMI画面显示“###”或数值不刷新

画面上的数值显示变成“###”只有两种情况:数字溢出或连接断开。项目里数值都很小不会溢出,那就是变量连接断了。

处理路径:在HMI画面空白处右键,选择“属性”面板,找到“运行系统设置->设备地址”,确认和PLCSIM仿真的PLC在同一网段。然后检查项目树里HMI设备下的“连接”配置,确认《PLC_1_连接_1》存在且激活。

连接检查后如果还不行,试一下删掉HMI设备和PLC设备,重新添加。要注意次序:必须先在网络中建立HMI和PLC的Profinet连接,再在HMI画面里做变量关联,顺序反了偶尔会出现幽灵连接。

4.4 S7-PLCSIM Advanced启动后PLC实例无法运行

Advanced和普通PLCSIM是两回事。Advanced用来仿真带通信能力的场景,但它对电脑性能要求高,而且经常出现启动不了的情况——实例创建成功但状态一直是“S”,点Start没反应,也没有报错弹窗。

这种问题的原因,按我的排查经验按概率排列:

  • 防火墙拦截了PLC实例的内部通信端口,把防火墙关闭再试(内网环境可以临时全关)。
  • PLCSIM Advanced实例使用了物理网卡的IP。打开Windows的网络设置,看设备管理器里有没有“Siemens PLCSIM Virtual Ethernet Adapter”这个虚拟网卡,没有的话重新安装PLCSIM Advanced组件,安装时务必勾选虚拟网卡驱动。
  • 电脑上装了多个版本的PLCSIM或Simulation Manager,版本冲突。卸载低版本,保留一套最新版。

4.5 博途安装过程中的“许可证确认后变灰卡住”

装博途时遇到过安装界面停在“接受许可证”那一步,按钮点击后变灰色没反应,程序卡死。这个问题的根源是安装程序缺少“基本优化”或操作系统缺少某个组件,而且Windows防火墙服务没启动也会卡住。

解决办法:

  • 右键“接受许可协议”界面的安装程序,选择“以管理员身份运行”。
  • 关闭所有杀毒软件和Windows Defender实时保护,安装完再开。
  • 确认Windows Installer服务(msiserver)正在运行,服务没启动的,通过services.msc手动启动后再装。
  • 如果还是卡住,打开任务管理器看安装进程状态,如果CPU占用为0且持续超过10分钟,基本可以确认安装程序挂死,直接结束进程,然后重启电脑换“预安装所有必备组件”模式重试。

这个过程中,千万别反复点“接受”,点一次等回应即可,重复点击更容易触发界面假死。安装博途本身就是个考验耐心的活儿。

5. 系统验证与后续扩展思路

5.1 功能验证清单

整个系统做完之后,我整理了一份验证清单,照着过一遍,确认系统状态健康:

验证项操作预期结果
初始状态所有传感器FALSE16个车位全绿,剩余车位16,无报警
进车一I0.0上升沿入口绿灯亮,分配1号车位,1号车位变红
进车二I0.0再次上升沿分配2号车位,剩余车位14
满车位连续将1-16号传感器置TRUE入口红灯亮,分配结果为0,报警“车位已满”
出车一I0.1上升沿出口绿灯亮,剩余车位增加,对应车位释放变绿
手动模式HMI置手动ON手动画面按钮可控制道闸,自动逻辑输出切断
计数校验核对Car_Count_Total和Exit_Count_Total差值差值等于当前占用车位数量

这个清单建议打印出来贴在工位旁边,每次改动程序后重新跑一遍,能省大量排查时间。

5.2 后续可以扩展的方向

这套系统做完,往真实项目靠拢还有几条明确路径:

  • 增加上位机SCADA监控。PLCSIM Advanced可以和WinCC(不是精简版HMI,而是WinCC Professional或WinCC Runtime Professional)连接,实现更完整的数据采集、趋势归档和报表功能。这也是热词里常搜到“SCADA如何与PLC连接”的实际应用场景。连接方式是通过TCP/IP或工业以太网协议,PLCSIM Advanced虚拟网卡提供通信通道,WinCC里组态变量管理器指向PLC地址即可。
  • 对接数据库与后端管理系统。用C#通过S7协议库(比如Sharp7)读取PLC变量,写入SQL Server数据库,实现停车记录存储、车牌识别联动、费用计算。这类上位机应用的核心是通讯频率设计,实测读取16个BOOL加几个INT变量,100ms周期完全没问题,但如果加了大量趋势数据读写,频率需要降到500ms以上,避免影响PLC扫描周期。
  • 加入模拟量信号。如果车位检测用超声波测距传感器(输出模拟量),程序里需要增加模拟量采集与限值比较逻辑。S7-1200本体不带模拟量输入通道(除非选带AI的型号或加SM1231),实现时会涉及量程转换和滤波处理,又是新的知识点。
  • 多停车场联网。通过S7-1200的Profinet或TCP通信功能,把多个停车场的PLC接入一个中心服务器做集中调度。这时候就需要给每个PLC配唯一的IP地址和站号,通讯程序里做多站轮询。

这套系统虽然跑在仿真环境里,但整个开发流程——从需求拆解、变量规划、程序模块化设计、HMI画面布局到仿真验证——和真实项目是一模一样的。把仿真调通了,现场调试时主要工作就只是核对I/O接线和调整滤波时间常数。这也是为什么我一直建议在校学生和刚入行的工程师多练仿真,设备条件不够就创造条件,一台电脑就能跑完整个自动化项目闭环,学到的东西一点不比放真机少。

最后再说一句实操体会:HMI画面看着是“画图”,其实真正考验的是对PLC变量体系和控制逻辑的理解深度。画面响应布控、颜色变化联动、按钮启停逻辑,每一处都建立在扎实的变量映射基础上。先把变量表理得清清楚楚,画面设计就是水到渠成的事。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询