1. 项目概述与核心价值
1.1 为什么西门子1200加博图是自动化入行的黄金组合
西门子S7-1200系列PLC,搭配TIA Portal(博图)编程软件,可以说是当下中小型自动化项目里最稳的一套组合了。我接触过不少从三菱、欧姆龙转过来的工程师,也带过完全零基础的新人,大家上手博图之后都有一个共同感受:这套软件的集成度太高了,从PLC程序、HMI画面、驱动配置到网络组态,全部在一个工程里搞定,比老式Step7那种分散的工具链省了太多时间。
S7-1200定位在入门级到中端性能之间,CPU从1211C到1217C,IO点覆盖从十几个到几百个,加上自带以太网口、支持Profinet总线,基本能覆盖95%以上的中小型设备控制场景。不管是单机设备、小型产线、风机水泵控制,还是教学实验平台,这套方案都非常能打。博图软件从V13一路更新到现在的V20,功能越来越强,但对新手来说,核心玩法其实变过多少——选型、建项目、写程序、仿真、下载调试,这套流程吃透了,换什么版本都只是菜单位置变了而已。
我见过太多人卡在第一步:软件装好了,CPU选型转圈圈,许可证找不到,HMI仿真按钮点了没反应。这篇文章我就用自己实际跑过的项目为例,把西门子1200博图程序案例从选型、建项目到调试交付的完整链路掰开揉碎讲清楚。适合正在学PLC的电气工程师、刚入职的自动化助理工程师,以及想接非标设备项目的自由职业者参考。
1.2 这个案例能帮你解决什么问题
这个案例不是那种教科书式的"点亮一个灯"的Demo,而是一个接近真实工程的小型混料控制系统。系统里有模拟量采集(液位传感器)、开关量输出(搅拌电机、进料阀、排料阀)、定时逻辑(搅拌时间)、报警处理(液位超限)、以及HMI上的手动/自动切换和状态监控。
拿这个案例说事,是因为它几乎覆盖了博图编程里最常用的核心功能模块:
- 硬件组态时如何选对CPU型号和扩展模块
- 符号寻址与绝对地址的取舍
- FC(函数)和FB(函数块)怎么划分才合理
- 定时器、计数器、比较指令的实战用法
- 模拟量处理和工程量转换
- 报警逻辑怎么设计才不容易误报
- HMI与PLC的变量连接和数据交互
- 用PLCSIM仿真调试的具体操作
把这套案例跑通,你就能独立上手大多数常规设备的控制程序了。接下来我按实际开发顺序一步步讲,先做需求拆解和硬件选型,再讲博图工程搭建和程序编写,最后说调试与排错,方便你照着操作。
2. 硬件选型与博图版本匹配
2.1 西门子1200如何选型:CPU型号与扩展模块搭配
选型这个问题,热搜词里一直排得挺高,因为很多人上来就问"西门子1200怎么选",但这个问题本身就不够精准。S7-1200只是一个家族,下面还分了CPU 1211C、1212C、1214C、1215C、1217C等型号,数字越大,运算性能、工作存储区大小、自带IO数量、高速计数和运动控制能力都不一样。
我自己的选型逻辑一般是这么走的,你可以直接拿去参考:
第一步,数清楚I/O点总量。把项目里所有传感器、按钮、接触器、阀、指示灯全部列出来,注意区分数字量输入DI、数字量输出DQ、模拟量输入AI、模拟量输出AQ。然后在这个总数之上放15%-20%的余量,因为现场调试过程中总会冒出几个之前没想到的点位,没有余量就只能换大CPU,非常被动。
第二步,根据IO点数和通信需求定CPU。这里有个基本对应关系参考:
| 需求描述 | 推荐CPU | 理由 |
|---|---|---|
| IO点很少(20点以内)、无模拟量 | CPU 1211C DC/DC/DC | 自带6DI/4DQ,体积最小,成本最低 |
| IO点中等(40点以内)、有模拟量 | CPU 1212C DC/DC/DC | 自带8DI/6DQ,可扩展1个信号板 |
| IO点较多(80点以内)、带变频器走Profinet | CPU 1214C DC/DC/DC | 自带14DI/10DQ,工作存储区更大,可扩3个模块 |
| 需要RS485/RS232通信、支持更多模块 | CPU 1215C DC/DC/DC | 带两个通信口,自带2路模拟量输入 |
| 运动控制、高速计数需求强 | CPU 1217C DC/DC/DC | 性能最强,支持更多高速通道 |
第三步,考虑扩展能力和信号模块。S7-1200的信号模块SM系列,比如SM 1231模拟量输入模块、SM 1222数字量输出继电器模块,根据你选CPU的不同,最多能扩展的模块数量也不同。1211C只能挂一个信号板,1212C能挂两个模块加一个信号板,1214C以上能挂八个模块,这点初学者特别容易漏掉。
拿我这个混料控制项目来说,实际点位并不算多:数字量输入用了启动按钮、停止按钮、液位开关下限、手动/自动切换旋钮,共4个点;数字量输出用了进料阀、排料阀、搅拌电机接触器、运行指示灯,共4个点;模拟量输入一个液位变送器4-20mA信号。所以CPU 1212C DC/DC/DC就绰绰有余了,甚至有点浪费。但如果现场设备将来要挂变频器走Profinet通信,我会直接上1214C,原因很简单:1200系里真正常见的编码器和Profinet设备组态,在1212C上虽然也能做,但工作存储区和通信资源明显紧张,调试时会出现一些莫名其妙的"资源不足"提示。
如果你觉得上面这套逻辑看着麻烦,我再给你一个更省事的办法:直接下载西门子官方选型工具TIA Selection Tool,把输入输出点清单填进去,它能自动推荐CPU型号和电源搭配,还能帮你算功耗。不过我始终坚持手动过一遍上面的逻辑,因为工具只会给出参数匹配,不会替你想余量和成本平衡。
2.2 博图V16到V21版本选择与安装注意事项
现在网上搜"博图安装"会看到很多人问V16、V17、V18、V19、V20、V21到底装哪个。我直说我的观点:只要你的CPU选型不是特别老,就装V16以上的SP版本,比如V16 SP1、V17,或者直接V18/V19。V20和V21是目前比较新的版本,功能更强,但如果你是在帮工厂维护老设备,手里有V15甚至V14以前做的项目,那就得注意低版本博图无法打开高版本工程这个问题,这是博图一个让很多人头疼的地方——高版本软件能向下兼容打开低版本项目,但低版本软件打不开高版本项目。
举几个实际搭配参考:
| 你的场景 | 推荐版本 | 原因 |
|---|---|---|
| 新学1200、手头是教材/VIP视频 | V16或V17 | 教程最多,资料好找,功能足够用 |
| 要支持S7-1200 G2新固件 | V17及以上 | G2固件V4.5以上需要V17支持 |
| 需要和S7-1500、ET200SP一起用 | V18及以上 | 新硬件库支持更全 |
| 最新固件的1214C/1215C | V19/V20 | 官方新固件基本只在新版软件里支持 |
安装博图这个事,我看到热搜里一大串关于"无法将xxx识别为cmdlet"、"pnpm不是内部或外部命令"这类关键词,看起来很杂,其实指向的是一个共同痛点:电脑环境出了问题。博图安装失败的案例里,十有八九是操作系统环境不干净导致的。
我给的安装建议是几条铁律:
第一,系统必须用Windows 10专业版64位或Windows 11专业版,家庭版大概率会出问题,因为博图需要的一些服务在家庭版里被砍掉了。工控电脑不要用那种精简版系统,一定用官方原版镜像安装的系统。
第二,安装前把杀毒软件全部退出,包括Windows Defender的实时保护也先关掉。博图安装过程中会往系统目录写大量文件、注册服务和驱动,杀毒软件拦截会导致装到一半报错。
第三,安装路径保持默认,不要改到中文路径或者带空格的路径下,博图对路径的兼容性远没有现代软件那么强。
第四,许可证问题。热搜词里"博图找不到许可证step7"这个坑我踩过不止一次。正常情况你需要安装SIMATIC STEP 7 Professional许可证,有正版授权就正常激活。如果没有,也要注意网上所谓"自动激活"工具可能会被新版本博图检测为异常,导致软件功能受限或者HMI仿真不正常。就我个人来说,如果只是学习用途,建议你找能申请试用版的渠道用试用授权,或者用PLCSIM自带的仿真授权,别折腾系统层面的破解,后面出问题排查起来极度痛苦。
2.3 PLCSIM仿真软件:练习必备,务必安装
很多人问:我不想买真机,能用电脑练吗?答案是可以,但你要额外装一个叫S7-PLCSIM的软件。博图安装包里有这个组件,安装时勾选上就行。PLCSIM相当于在电脑里虚拟出一台S7-1200 CPU,你写的程序下载到虚拟CPU里运行,然后配合同样在电脑里的WinCC HMI做仿真。这样一个真实的触摸屏HMI画面就能在电脑上看到并操作了。
我强烈建议新手在写任何程序之前,先确认自己装好了PLCSIM。因为没有仿真你在编程阶段就只能对着软件干瞪眼,写完你也不知道对不对,真正有经验的工程师,程序写好一定会先跑仿真,确认逻辑无误后才下载到真实PLC。仿真能帮你省下的调试时间,几乎能达到30%以上,这是非常保守的数字了。
注意一点:博图新版本里面PLCSIM有V16、V17、V18之分,必须和你安装的主版本严格一致。比如博图V18配合PLCSIM V18,不能混用。这也是"博图HMI仿真按钮无反应"这个问题的高发原因之一——软件装好了,但是PLCSIM没装或者版本不对,HMI仿真自然起不来。
3. 工程搭建与硬件组态详解
3.1 新建项目与添加设备的完整流程
打开博图软件后的界面和早期Step7差别挺大,但核心操作思路是一致的:先建项目,再添加设备,然后配置硬件,最后写程序。下面这个流程是我平时用的,你照着走一遍基本不会卡壳。
第一步,启动博图软件,在起始页面点"创建新项目",给它起一个项目名称,比如"Mixer_Control_Demo",选择存储路径。项目名称建议使用英文字母、数字和下划线,不要用中文和特殊符号,否则后面做版本管理和跨电脑拷贝时可能会有兼容性问题。
第二步,项目创建成功后,左侧项目树中双击"添加新设备"。在弹出的对话框里,先找到"控制器"分类,再展开"SIMATIC S7-1200",你会看到按CPU型号分组的列表,比如CPU 1212C DC/DC/DC、CPU 1214C DC/DC/DC等。注意每个型号后面还有"6ES7 212-1HE40-0XB0"这种订货号以及固件版本,需要选和自己硬件上贴纸一致的固件版本,如果选得过高,实际固件版本不匹配,下载时会报错;选得过低,又无法使用一些新功能。
我自己的这个项目里,选择的是CPU 1212C DC/DC/DC,固件版本V4.5。如果你手头是真实PLC,就去看PLC正面的灰色标签,上面有固件版本号,比如"Firmware V4.5",照着这个选才行。
第三步,添加完CPU后,如果需要扩展模块,在项目树里选中CPU,右键选择"添加设备",会看到"信号模块"列表。例如添加SM 1231 AI 4x13bit模拟量输入模块,注意它的测量范围支持0-10V和4-20mA等,需要在模块属性中的"输入"选项卡里配置对应的量程和滤波值。
第四步,给PLC分配一个IP地址。选中CPU,在属性->PROFINET接口->以太网地址里,设置IP地址为192.168.0.1,子网掩码255.255.255.0。这里有个常见坑点:如果你要把程序下载到真实PLC,电脑网卡设置的IP地址和PLC的IP必须在同一个网段内,比如电脑设置成192.168.0.2,否则博图会搜索不到设备。
3.2 IO变量表与符号寻址的规范设计
硬件组态完成后,接下来重要的事情就是建变量表。博图里面变量表的位置在项目树的"PLC变量"->"显示所有变量"里。很多初学者图省事,程序里直接写"I0.0"、"Q0.0"这种绝对地址,后期程序一长就完全看不懂了。我强烈建议大家使用符号寻址,也就是给每个变量起个有意义的名字,程序里只使用符号名。
举个例子,"I0.0"这个地址,在变量表里给它命名成"Start_Button",数据类型为Bool,注释写上"启动按钮,常开触点接入"。那么在程序里你就可以直接用"Start_Button"这个符号来编程,而不是记那个冷冰冰的地址。
变量表我整理一个典型的清单,你可以参考:
| 变量名 | 数据类型 | 地址 | 注释 |
|---|---|---|---|
| Start_Button | Bool | I0.0 | 启动按钮 |
| Stop_Button | Bool | I0.1 | 停止按钮 |
| Mode_Switch | Bool | I0.2 | 手动/自动切换 |
| Level_Low_Switch | Bool | I0.3 | 液位下限开关 |
| Inlet_Valve | Bool | Q0.0 | 进料阀输出 |
| Outlet_Valve | Bool | Q0.1 | 排料阀输出 |
| Mixer_Motor | Bool | Q0.2 | 搅拌电机接触器 |
| Run_Lamp | Bool | Q0.3 | 运行指示灯 |
| Level_Value_Raw | Int | IW64 | 液位模拟量原始值 |
| Level_Value_Real | Real | 共享DB | 液位工程量值(米) |
| Mix_Time_Preset | Int | 共享DB | 搅拌时间预设(秒) |
| Mix_Time_Current | Int | 共享DB | 搅拌计时当前值 |
注意模拟量地址IW64的编号不是随意定的,它取决于模块插入的槽位。在硬件组态界面里,你选中模拟量模块后,在模块属性里的"IO地址"选项卡就能看到系统自动分配的起始地址。实际用的时候,直接看软件自动分配的地址就行,不用背规律。
符号寻址会带来一个额外好处:当你后期修改硬件配置导致IO地址变化时,只需要修改变量表里的地址即可,程序里的符号名不需要变动。这个特性在项目调试阶段非常实用,因为你经常需要把某个输入点从一个通道挪到另一个通道。
3.3 为什么共享数据块尽量用结构化变量
除了IO变量,博图里还有一种变量容器叫数据块DB。数据块分为两种:全局数据块(共享DB)和背景数据块。背景数据块是FB功能块自带的存储区,而全局数据块则是你定义的一套全局数据区,程序块的任何位置都可以访问它。
我在设计这个混料控制系统时,把模拟量转换后的液位值、定时预置值、各种中间计算变量全部放在一个共享DB里,这个DB做了结构化处理。什么叫结构化?就是DB里可以嵌套多个自定义结构体。比如我建了一个"Mixer"结构,里面有"Motor"、"Valve"、"Timer"这样的子结构,每个子结构下面再挂具体变量。
这样做有个明显好处:变量有明确的归属关系,查找方便,而且当你把DB传给HMI时,HMI侧的变量浏览也清爽得多。更实际地说,如果程序里出了Bug需要调试,结构化DB能让监控列表一目了然,不会出现几十个扁平的变量名挤在一起的尴尬局面。
创建共享DB的方法很简单:在项目树"程序块"上右键,选"添加新块",类型选"全局DB",语言不用管,点击确认后在DB编辑器里把上面的变量建立好,然后还需要在属性里取消勾选"优化的块访问",或者选中"非优化访问"。这里涉及一个比较深入的问题——优化块访问和非优化块访问的区别,初学者可以不用太纠结,但有一点要注意:非优化访问的DB可以通过绝对地址访问,比如"DB1.DBD0",而优化访问的DB只能通过符号名访问。我的习惯是:如果不涉及和第三方通信或者威纶通触摸屏直接读PLC数据,就用优化访问,博图内部编译效率更高,各种监控也更方便。
4. 程序逻辑设计与SCL及梯形图混合编程
4.1 功能块FC与FB的划分原则
程序架构设计的核心问题是:我这段控制逻辑应该用FC(函数)还是FB(函数块)?用OB1(主组织块)一个块把全部逻辑写到底行不行?
先回答后面那个问题:写到底当然能跑,但如果程序超过一定规模,你会发现排查问题十分痛苦。因为PLC程序是循环扫描执行的,一旦OB1里逻辑太多,扫描周期拉长,很多时间敏感的控制逻辑就会出问题。而且错误定位极难。
我个人的划分经验是:
第一,公用的、不需要保存内部状态的计算逻辑用FC。比如模拟量工程量转换、报警比较、BCD码转整数这类逻辑,输入给个原始值,输出给个工程量,没有状态需要记忆,用FC最合适。
第二,带状态的设备控制逻辑用FB。比如说搅拌电机控制、阀门控制,它们有启动中、运行中、停止中等功能性状态,这些状态需要随着扫描周期被记住,FB自带背景数据块,天然适合做这种状态机控制。
第三,中断、通信、Modbus等特殊功能,一般放在专门的服务程序或组织块里,不要在OB1里直接裸写底层指令,比如调用Modbus通信指令,你把它们放在OB1循环扫描里,通信会一直被重复触发,造成总线堵塞。
我这个混料系统的程序结构规划如下:
- OB1:主程序,按顺序调用各FB和FC
- FC1:模拟量换算,读取液位原始值并转为工程量
- FB1:混料控制状态机,实现自动流程
- FB2:报警处理,检测液位超限/电机过载等
- 共享DB1:结构化数据区,保存所有中间变量
在实际编程时,OB1顶部会放一个FC100"初始化"调用,用于对关键变量赋初值。这样做的目的,是把设备上电的第一扫描周期里需要执行的初始化动作集中管理,避免散落到各个块里。
4.2 SCL语言编程实例:混料状态机
博图支持三种编程语言:LAD(梯形图)、FBD(功能块图)、SCL(结构化控制语言)。梯形图是电工思维,适合看触点线圈关系;SCL是高级语言思维,适合写复杂逻辑算法、循环和状态机。近些年的趋势是SCL越来越流行,因为博图V15以后SCL编辑器的体验大幅提升了,写状态机、数组处理、FOR循环这些逻辑比梯形图方便太多。
我就不绕弯子,直接把自己常用的一个混料状态机SCL代码核心结构写出来供你参考。请注意,代码块不可直接复制到你的工程里用于生成,因为不同变量名要对齐自己的DB和接口,但思路可以直接套用:
// FB1 混料控制状态机 // 状态定义: 0=空闲, 10=进料, 20=搅拌, 30=排料, 40=完成 IF #Auto_Mode AND #Start_Cmd THEN #State := 10; END_IF; CASE #State OF 0: // 空闲状态 #Inlet_Valve := FALSE; #Mixer_Motor := FALSE; #Outlet_Valve := FALSE; IF #Auto_Mode AND #Start_Cmd THEN #State := 10; END_IF; 10: // 进料状态 #Inlet_Valve := TRUE; IF #Level_High_Switch THEN #Inlet_Valve := FALSE; #Mix_Timer_Start := TRUE; #State := 20; END_IF; 20: // 搅拌状态 #Mixer_Motor := TRUE; IF #Mix_Timer_Done THEN #Mixer_Motor := FALSE; #Outlet_Valve := TRUE; #State := 30; END_IF; 30: // 排料状态 #Outlet_Valve := TRUE; IF #Level_Low_Switch THEN #Outlet_Valve := FALSE; #State := 40; END_IF; 40: // 完成状态 #Run_Lamp := TRUE; IF NOT #Auto_Mode THEN #Run_Lamp := FALSE; #State := 0; END_IF; END_CASE;这段代码的核心是状态机思想:设备的整个运行过程被拆成几个明确的阶段,每一扫描周期根据当前状态和输入条件决定下一步动作。好处是逻辑清晰、不会出现步与步之间的竞争冒险,后续要增加阶段也只需要在CASE里多加几个分支就行。
有几点我要重点解释一下:
状态编号用10、20、30而不是1、2、3,是因为这样方便后期在中间插入新状态而不需要改动其他所有编号。如果你用1、2、3,临时想插一个"预搅拌"状态,就得把后面的状态号全部重排一遍,容易漏改出错。
每个状态里我会先给输出赋默认值,比如空闲状态下把所有输出都写为FALSE,这样能保证状态切换过程中不会因为上个状态的输出残留导致动作乱跳。
在"30: 排料状态"里,我用的是"液位下限开关"作为排料完成的判定。实际应用中如果你只有定时排空的逻辑也可以,但最好加上传感器确认,因为单纯靠时间就可能出现罐体没排空就进入下一步的误判。
4.3 定时器TONR与模拟量处理在博图里的落地
这个案例里定时搅拌环节,我用的是TONR(保持型定时器)实现的。为什么要用保持型而不是普通TON?因为在自动流程中,如果中途设备因为报警停下,搅拌时间应该保持住,等故障恢复后继续计时,而不是清零从头计。这种需求用保持型定时器就是天然匹配的。
在SCL中调用定时器,其实不是传统梯形图里那种直接放置一个TONR方块,而是需要实例化一个IEC定时器。博图支持IEC定时器,类型是TONR_TIME。在FB的静态变量区定义一个"TONR_Instance"变量,类型选TONR_TIME,然后在代码区调用:
#TONR_Instance(IN := #Mix_Timer_Start, PT := #Mix_Time_Preset, Q => #Mix_Timer_Done, ET => #Mix_Time_Current);需要注意PT类型是TIME,而TIME的格式不像整数那样直接写秒数,它是一个带单位的时长类型,比如T#10S代表10秒。你在HMI上给用户设置"搅拌时间"时,通常输入的是一个整数秒,比如10、20、30,传到PLC时需要先转成TIME类型再赋值给PT。转换可以用一个简单的计算:#PT_Temp := T#0S + #Seconds,或者在SCL里用TIME_TO_INT之类的转换指令反向处理,但我更推荐用T#0S + #Seconds这个方法,不用记一堆转换函数的名称。
模拟量处理这块,也就是液位变送器信号,它从4-20mA进到SM1231模拟量输入模块后,PLC读到的原始值是0到27648之间的整数。4mA对应0,20mA对应27648。而液位变送器的实际量程可能比如是0到5米,所以必须做一个线性换算,把原始整数映射到0.0到5.0的浮点数。
这个换算公式非常基础但极其常用:
实际工程量 = (原始值 - 0) / (27648 - 0) × (量程上限 - 量程下限) + 量程下限
如果变送器是0-5米对应4-20mA,则简化成:工程量 = 原始值 / 27648 × 5.0。如果你选择的是0-10V而不是4-20mA的变送器,原始值范围同样是0-27648,公式也类似,但要注意模块属性里输入类型要改成0-10V,硬件拨码或者接线方式都要对应正确。
在SCL里,这个换算过程放在FC1中实现:
#Level_Value_Real := INT_TO_REAL(#Level_Value_Raw) / 27648.0 * 5.0;这段代码里INT_TO_REAL是把整数转成浮点数的转换函数,因为整数除以浮点会有隐式转换问题,为了确保精度,建议先把原始值转成REAL再做除法。实际项目中,如果液位变化比较快且伴随电机启停产生的电磁干扰,原始值可能会有波动,这时候可以在模块属性里打开模拟量输入的"滤波"功能,一般设置成4次均值即可,如果滤波强度太大,信号响应会变慢,这个需要你按现场实际情况调。
4.4 HMI画面组态与PLC变量联动的要点
程序写完后,如果要让人能操作设备,就需要做HMI画面。博图项目里可以添加WinCC RT Advanced的HMI设备,比如KTP700 Basic PN这类触摸屏,或者直接用WinCC Runtime作为电脑上的仿真画面。
HMI组态里有几个要点,我反复踩坑后总结出来的:
第一,HMI变量尽量直接关联PLC变量。在HMI的画面编辑器里,给按钮、指示灯、数值显示控件添加变量时,可以从PLC变量表里拖拽过来。这样做的优势是:画面组态和程序变量天然统一,不需要在HMI侧再额外建立一套同名变量去"转发",否则有双份变量就容易出现有的地方更新了有的地方没更新的情况。
第二,按钮属性设置要用"按下时置位、释放时复位"这种基于事件的逻辑,而不是把按钮的"操作模式"直接选成"切换"。举个例子,手动模式下点动搅拌电机,你会希望按住按钮时电机运转、松开时停止。如果直接把按钮绑到Q0.2变量上并选"切换",那你按一下就启动,再按一下才停止,这不是点动,而是自锁。正确做法是先给按钮选择事件"按下",在按下事件里调用"置位位"指令操作Q0.2,然后在"释放"事件里调用"复位位"指令操作Q0.2。
第三,画面上的数值显示和输入框的格式一定要和PLC变量的类型匹配。液位是REAL类型,画面上选择"浮点数"格式,并设置小数位数为1位或2位。如果你画面上用整数格式显示REAL,轻则显示自动取整,重则直接报类型不匹配,画面编译过不了。
做完画面后,点击仿真按钮,博图会启动WinCC Runtime,然后你还需要启动PLCSIM,让PLC程序和HMI能通信。如果这两端没有连上,就会出现热搜词里经常出现的"博图HMI仿真按钮无反应"。大多数情况下,真正的原因不是按钮没反应,而是HMI仿真界面上的CPU连接显示为断开状态,你必须先在PLCSIM里下载程序并运行,再启动HMI仿真,而且要确保两者的IP地址在同一网段或通过S7ONLINE连接方式能互相访问。
我从实际操作得来的心得是:1200和HMI仿真之间通讯默认走的是"仿真接口",在博图里把HMI连接的"接口"选为"Simulation"即可,不要选成实际的网卡型号。这个设置藏在HMI设备的"连接"属性里,一旦选错,HMI哪怕运行了也一直处于离线状态。
5. 实操调试流程与问题排查
5.1 用PLCSIM仿真跑通全流程的具体步骤
代码写完,HMI画面组态完毕,下一步进入调试。如果这是你第一次走完整流程,我建议严格按下面的顺序来,能省掉不少"莫名其妙"的报错时间。
先编译PLC程序。在博图软件里点击"程序块"根节点,按快捷键Ctrl+B或者右键选择"编译"。编译通过后,看下方的"编译"窗口有没有警告和错误。警告可以先不管,但错误必须全部解决。
启动PLCSIM。在项目树里选中CPU,菜单栏有一个"仿真"图标,点击后会弹出一个窗口让你选择仿真协议,保持默认点击"确定"。此时PLCSIM软件界面会启动,里面的虚拟CPU处于STOP状态。
下载硬件组态和程序。在PLCSIM启动后,选中项目树中PLC的根节点,点击"下载"图标。博图会提示你选择目标设备,选择PLCSIM虚拟的CPU,点击"装载"。下载过程中可能弹出一个PG/PC接口的选择对话框,要选成"PLCSIM"的接口。下载完成后,PLCSIM虚拟CPU会自动切换到RUN或者需要你手动点一下RUN按钮。
监控程序。回到博图的程序块界面,点击"启用/禁用监视"按钮,可以在梯形图或SCL代码里看到每条指令的实时值。此时把PLCSIM和博图项目保持打开状态,你就可以观察变量变化了。
启动HMI仿真。选中HMI设备,点击"启动仿真"。系统会先编译HMI项目,如果画面有错会报出来。启动后,WinCC Runtime界面弹出,你就可以用鼠标点击画面上的按钮来操作"虚拟PLC"了。
我第一次走这个流程时犯过一个低级错误:先启动了HMI仿真,然后再开PLCSIM,结果HMI一直连不上CPU。后来才意识到,HMI仿真启动后需要搜索仿真PLC,而当时PLCSIM还没有运行,自然搜索不到。正确做法是先把PLCSIM启动并让程序跑起来,再启动HMI仿真。
5.2 常见问题速查表:从安装到模拟量再到仿真的逐一排除
我把这几年被问到最多的问题整理成一份速查表,里面的内容基本都是热搜词的高频内容,你遇到问题直接按表排查即可。
| 问题现象 | 大概率原因 | 解决动作 |
|---|---|---|
| 博图软件安装失败,中途报错退出 | 系统环境不干净/杀毒软件拦截/未装.NET组件 | 卸载重装官方原版Windows,退出杀毒软件,安装所需前置组件 |
| 博图找不到许可证STEP7 | 许可证未正确安装或被系统改动 | 检查授权管理器中的许可证,重新激活STEP7 Professional |
| 博图V18选CPU一直转圈圈 | 首次启动需要加载硬件库,或项目管理器卡死 | 等待5-10分钟,若仍卡死则关闭软件重启,确保磁盘空间充足 |
| PLC下载时报错找不到设备 | IP地址不在同一网段/接口选择错误 | 检查电脑网卡IP与PLC是否同在192.168.0.x;下载接口选PN/IE |
| HMI仿真按钮无反应 | HMI连接配置错误/PLCSIM未运行 | 把HMI连接接口设为Simulation,确保PLCSIM已启动且CPU处于RUN |
| 模拟量读数波动或者为0 | 量程配置错误/模块接线问题/滤波没开 | 检查SM1231属性中量程是否4-20mA;硬件接线是否接入正确的通道 |
| PLCSIM里程序运行但输出不动作 | 状态机没进入预期状态或使能条件不满足 | 使用监控表给关键输入强制置位,观察状态号和输出状态 |
| 程序下载到真实PLC后HMI黑屏 | 博图HMI Runtime未授权或版本冲突 | 检查HMI运行系统授权,重新下载HMI项目到面板 |
这里面再展开说一下"HMI仿真按钮无反应"这个痛点,因为很多新手都在这一步卡住。你先看两件事:第一,HMI仿真画面上的CPU状态指示灯是不是绿色?如果显示灰色或者断开,那说明PLC连接没建立起来。第二,看一下博图软件底部有没有报错信息,常见的是"在线访问"失败,此时需要回到HMI设备的设备组态里,检查HMI的以太网地址是否设置正确,比如HMI的IP是192.168.0.2,那PLC的IP是192.168.0.1就没错。如果你检查完IP也正确,PLCSIM也正常运行了,按钮还是没反应,那就用博图的"在线与诊断"工具,在线连接PLC,看看通信是否建立。这招能帮你快速定位到底是通信问题还是画面逻辑问题。
5.3 报警与安全逻辑:让程序经得起现场检验
除了控制流程,报警和安全逻辑是对一个程序水平最直接的检验,也是工程交付时的核心关注点。实际项目中比较容易出现的问题是:报警变量设置不当导致频繁误报,或者报警没有自锁导致一闪而过,现场人员根本来不及查看故障原因。
我在这套混料程序里设置的报警条件主要有三个:液位高限报警(说明进料超时或阀门故障)、液位低限报警(说明料不够)、以及电机过载信号(由热继电器给出)。针对每个报警,我都采用"报警标志自锁+复位按钮"的设计思路:
一个报警产生后,报警标志位置位并保持,直到操作人员确认故障排除,然后按复位按钮才能清除。这个设计为了防止瞬时干扰或偶发故障导致系统不稳定。在HMI画面上,报警信息应该显示为文本而不是只有位状态,比如直接在画面上放几个文本控件,用可见性动画绑定报警位,报警为TRUE时显示"液位高限"并改变背景色。
再一个要点就是急停逻辑。真实的项目中,物理急停按钮应该接的是PLC外部硬回路,直接切断输出电源,而不是只通过程序实现软停车。我在做演示项目时没办法完全模拟真实接线,但程序中会保留一个E-Stop输入位,一旦触发,所有输出强制复位,同时状态机回到空闲状态。你在做SCL状态机时会发现,如果把急停判断放在CASE之外、主程序的前部,那么不管在哪个状态,只要急停触发,都不会执行状态机逻辑,这样更安全。
5.4 程序块封装与交接文档的经验建议
项目调试完成后,最后一步是程序归档和交接。我们做项目的人都知道,交付的文件绝不只是代码本身,还包括后面的人能否快速接手维护。博图工程的文件结构比老Step7清晰,但仍然建议做如下几件事:
第一,给每个程序块、数据块写详细注释。在博图里,FB和FC的接口参数都可以在接口区添加注释,变量表里也能加注释。不要觉得这是浪费时间,如果过半年你自己回头来改程序,没注释的代码一样能难住你。
第二,程序块尽量做成"可复用"的封装。比如我这个混料控制的状态机FB,如果下次要做一个双罐混料系统,只需要复制这个FB,再新分配一个背景数据块给第二罐,然后把接口参数(IO变量、时间预设、液位信号)换成第二罐的地址即可。这种复用手法能显著缩短开发周期,而且两个FB相互独立,不会出现共享变量导致的逻辑干扰。
第三,导出归档文件。项目完成前,选中项目树根节点,执行"项目"->"归档",生成一个.zap格式的归档文件,这个文件可以用任何一台装了相应版本博图的电脑恢复出完整项目。适合发给合作方或者作为自己的存档。
另外还要注意,程序下载到真实PLC后,可以通过"上载"功能从设备中读出程序。但如果PLC里程序涉及专有技术保护或者块密码,上载可能会受限。我一般会在程序块属性里设置密码保护,防止未经授权的人查看核心逻辑,这个密码管理好了就完事了,忘了的话会很麻烦——技术上虽然有办法绕过,但会花不少功夫。
6. 经验心得与常见认知纠偏
6.1 博图SCL语言为什么越来越值得投入时间
如果你刚开始接触1200,可能会纠结:是学梯形图还是学SCL?很多老工程师习惯梯形图,觉得能在线监控每个触点的通断状态,直观。我完全理解这个观点,我自己早期调试也是梯形图为主。但说实话,现在接的非标自动化项目复杂度在上升,逻辑往往包含多状态切换、数组配方管理、数据运算,这些用梯形图做非常痛苦,一个FOR循环在梯形图里能写满半屏,SCL只需要三四行。更何况,以后你要接西门子1500的项目,SCL的优势更加突出,因为1500上很多通信库和高级应用示例默认就是SCL写的。
我的建议是双轨学习法:先学会梯形图,了解PLC的基本执行逻辑和扫描概念;然后趁早切换到SCL,把复杂逻辑用SCL表达。调试监控时,SCL的每行代码旁边会实时显示变量值,其实也能看得清清楚楚,不必为了"直观"抱着梯形图不放。这个案例里我也特意把状态机这个核心逻辑用SCL实现,就是希望你能体会到高级语言写状态机的爽快感。
6.2 仿真软件和真实设备差距认知
很多教程会反复告诉你仿真多么重要,我前面也强调PLCSIM对新手练习很有用,但这里也要泼一盆冷水:PLCSIM毕竟是仿真,它与真实PLC有差距,最明显的一点是仿真无法模拟外部接线的真实物理信号,比如按钮弹跳、传感器延时、热继电器动作时间,这些都会影响逻辑稳定性。
举例来说,PLCSIM里你给输入点强制一个TRUE,那么所有读取该输入的逻辑会立即在下一扫描周期响应,干净利落。但真实设备上,按钮按下会产生接触抖动,如果你在程序里不做去抖处理,可能会把一次正常的启动操作误判成多次启动/停止脉冲,导致状态机乱跳。类似的问题仿真阶段完全发现不了,必须在真实设备联调时才暴露。因此,在仿真里确认逻辑正确只能算第一步,真正的现场调试才是检验程序可靠性的关键环节。
6.3 关于"复制粘贴就能用的程序"要谨慎
网上经常有人说"西门子1200博图程序案例"之类的内容,甚至有人直接出售整套工程源码。我的态度是:源码可以借鉴,但不能盲信。不同项目的IO分配、工艺要求、安全标准、设备品牌都不同,别人写的程序直接拿来用,需要做的事其实是"移植",不是"粘贴"。
我一般拿到一个参考案例,会先看它的程序架构和变量组织方式,再重点研究状态机和报警处理思路,然后才动手改造为自己的逻辑。整个过程中,变量命名、状态编号、硬件地址基本全部推倒重来。你如果真的想通过案例学习,建议把案例当成一道"例题"来钻研,看懂它的解法思路之后,自己再独立做一遍,这个内化过程比收藏十个案例都管用。
另外,任何网上找来的程序,下载前务必用杀毒工具扫描,博图工程里的脚本虽然不太可能携带恶意代码,但防人之心不可无,特别是一些整合了外部ActiveX控件或者批处理脚本的老案例,谨慎态度没有坏处。
6.4 向现代化标准化方向靠拢
最后说一个容易被忽视的方向。西门子近年来强调"标准化"概念,比如PLCopen规范中的运动控制功能块,或者西门子自己在GSD文件、库文件管理、程序版本管理上的要求。对个人开发者来说,虽然不必马上100%遵循那些大厂标准,但尽早养成一些好习惯很有必要。
比如:用工程中的"主副本"来管理设备版本,把每个版本的程序用备注说明改了什么;在HMI上做运行时语言切换;程序里全部用符号访问而非绝对访问;FC/FB的形参名称用有意义的单词而不是X1、X2这种;程序块的接口变量设计成手动模式下可逐个点动的模式,方便现场点检。这些习惯积累到一定程度,你会发现写新项目的速度越来越快,因为大部分代码都是从自己之前的工程里"提炼"出来的库文件,再微微调整就适配了新需求。
我个人实操中最大的体会就是:别急着追求最新版本博图,也别指望别人给的程序能直接跑,关键是把每个指令的行为、每个时序关系、每次数据转换都吃透。这个混料系统的项目案例并不高深,但如果你完整走完从选型、组态、编程、仿真到排错的整个闭环,那你就已经超过了相当一部分刚入行的工程师。后面再去碰1200+变频器Profinet通信、1200做Modbus RTU主站、1500+WinCC大型项目,其实都是同一套方法论在延伸罢了。