资讯动态

西门子S7-1200 PLC输送分拣线改造:博途编程与调试实战经验

发布时间:2026/10/20 7:49:20 来源:尧图企业网站定制
前阵子做的一条小型输送分拣线改造控制核心用的就是西门子1200整套程序在博途TIA Portal里从组态、编程、仿真一直跑到现场试车。这次案例做完我对S7-1200的选型边界、程序块怎么划分、状态机怎么写、调试时会遇到哪些坑都有了比较具体的认识。如果你正准备用1200做类似的小型自动化设备或者手里拿着博图程序案例却不知道从哪里下手这篇文章应该能帮你少走不少弯路。文章不聊那种大而全的理论而是按我做项目的真实顺序来先讲为什么选1200再讲I/O怎么规划、博途里怎么组态接着拆程序结构和分拣逻辑最后把仿真调试和现场常见的坑一次性捋清楚。不管你是刚接触博途的新手还是已经写过几个1200项目但想优化结构的老工程师都能在里面找到可以直接搬走的东西。1. 项目背景与选型为什么这个案子交给西门子1200来做1.1 原设备的问题和改造诉求这条分拣线原来的控制方式是“继电器时间继电器”的老套路。设备本身不复杂一条来料输送带、两个推料气缸、三个光电检测点、一台变频器驱动输送带再加上手动/自动切换、产量计数和报警提示。总点数算下来数字量输入8个左右数字量输出6个左右另外预留一到两路模拟量通道备用。老设备最大的痛点在于换产品规格时要人工去调时间继电器刻度不准生产时抖动又大继电器触点频发拉弧故障排查全看师傅经验图纸画得也不全。客户提的需求并不激进就是想要一套稳定、可调、有明确报警提示的系统最好以后还能接触摸屏。这种需求用小型PLC来做是最合适的。传统继电器方案虽然成本最低但控制柜里的中间继电器和时间继电器加起来几十个接线复杂、调试费劲、后期排障靠手摸一点都不划算。1.2 为什么在S7-200 SMART和S7-1200之间选了1200我在选型时主要对比了西门子的S7-200 SMART和S7-1200。S7-200 SMART在小系统里的性价比确实能打指令简单、上手快很多老工程师闭着眼睛都能写。但有一个限制在当时很关键它在通信能力上对PROFINET的支持比较弱而我判断这套设备后续一定会接触摸屏还可能把变频器和远程IO挂到同一张网络上。S7-1200的CPU本体集成了PROFINET口组态触摸屏时不需要额外转换卡上位机访问也更方便。具体型号我选了CPU 1214C DC/DC/DC。这里有个选型逻辑值得说一下1211C虽然便宜但本体集中度低只有6路数字量输入和4路输出做这个案子虽然勉强够但几乎没有备用点1212C好一点不过模拟量通道少1214C本体带14DI/10DQ还集成了2路模拟量输入扩展余地大而且价格和1212C差距不大。国内中小型设备里1214C用得最多后续备件好买、图纸参考也多所以直接一步到位选了1214C。预算方面多说一句PLC本体价格只是整个控制系统的一小部分程序开发、调试周期、后期维护成本才是大头。选1200不选200 SMART多出来的那点硬件成本在第一轮现场调试节省的两三天时间里就赚回来了。1.3 一个控制系统的第一步其实是画I/O清单很多人打开博途就急着建工程、拖块、写程序等写了一半才想起来有几个传感器没算进去于是又回去改硬件组态、改地址分配程序里一片引用错误。这种边写边改的做法在小项目里还能忍在稍微大点的系统里就是灾难。我做完需求梳理后先画了一张I/O清单再开工建工程。这张表长这样信号名称信号类型PLC地址备注启动按钮DII0.0常开上升沿有效急停按钮DII0.1常闭断开为急停变频器故障DII0.2变频器干接点来料检测DII0.3光电传感器检测到为1气缸伸到位DII0.4磁性开关或接近开关气缸缩到位DII0.5磁性开关或接近开关计数光电DII0.6产品通过时给脉冲手动/自动选择DII0.71为自动0为手动输送带接触器DOQ0.0控制电机启停气缸电磁阀DOQ0.1两位五通阀运行指示灯DOQ0.2绿色故障指示灯DOQ0.3红色蜂鸣器DOQ0.4报警输出这里有一个很关键的设计习惯急停按钮接常闭点程序里也要按常闭逻辑去处理同时硬件回路上让它直接切断接触器电源。这样万一急停线路断线PLC会立刻识别成急停状态而不是“没按就继续跑”。这种安全冗余的思路越早养成越好。I/O表定下来之后后面所有工作都有据可依图纸、编程、电气接线、HMI组态全都用同一套地址沟通成本低很多。2. 博途里的硬件组态和I/O清单设计2.1 新建工程时最容易忽略的固件版本问题打开博途选择“创建新项目”项目名建议直接带设备名、日期和版本号比如“分拣线_20250612_V1.0”。这样后面维护时看着项目列表就能知道这个项目是什么设备、什么时候改过、当前是第几版不会出现一堆“新建项目1”“新建项目2”分不清的情况。添加设备时选择CPU 1214C DC/DC/DC这里有一个特别容易踩的坑固件版本。博途软件版本不同可选的CPU固件版本也不同。如果软件比较旧而手上CPU固件比较新在设备视图里就要手动选一个与CPU兼容的固件版本。我之前有一次没注意选了老固件版本下载时提示设备不兼容折腾了很久才发现问题。按采购这台CPU的实际固件版本来选能省很多时间。2.2 PROFINET IP地址和触摸屏连接规划S7-1200的PROFINET口默认IP是192.168.0.1但在现场我通常会给PLC单独规划一个稳定网段。比如PLC设为192.168.1.10触摸屏设为192.168.1.11子网掩码255.255.255.0。两者挂在同一个工业交换机下面博途组态时在“属性—以太网地址”里设置好IP触摸屏和PLC之间的通讯就不需要再做任何驱动程序配置直接拖变量连接即可。下载时博途可以选“PN/IE接口”填入CPU的IP地址后驱动下载。如果现场没有设置好PC网卡和PLC同网段会搜不到设备。这时候不要来回猜先把PC网卡手动改成192.168.1.x网段再重新扫描基本都能找到。2.3 PLC变量表坚持用符号名在博途的“PLC变量表”里把I0.0、Q0.0这些绝对地址全部定义成有意义的符号名比如“I0_3_FeedDetect”表示来料检测、“Q0_1_Cylinder”表示气缸电磁阀。编程时一律用符号名不要直接写绝对地址。这样做的最大好处是后期如果因为现场接线变化而改了地址只需要改变量表程序逻辑完全不用动。我曾经维护过一个老项目图纸和实际接线差了三个点就是因为变量名全是“I0.0”这种地址谁都不敢乱动。用符号名之后这种问题基本消失。博途还支持从Excel导入导出变量表在点位多的时候非常高效。可以先用Excel把点位整理好列好名称、地址、数据类型、注释再导入博途比自己一项一项敲快得多。2.4 保持性区域提前设置S7-1200支持对数据块里的变量设置保持性也就是说断电之后这个值还能记住。设备上的产量累计、计件数、当前模式这些数据一旦掉电清零现场会很麻烦。所以我在变量表或者全局DB里直接把需要保持的变量设置为“保持”。这个设置在博途的PLC变量表“保持性”列里就能勾选也可以在“保持性存储器”里按地址范围设置。这个步骤虽然小但真到了现场才发现反而很被动。试想一下设备跑了一上午生产了三千个产品下午一断电产量归零谁都没法交代。3. 程序框架OB、FB、FC、DB怎么分工才不会失控3.1 不要把逻辑全堆在OB1里我第一次写1200的时候把所有逻辑全部写在OB1里一个OB1几十个网络从下料、传送、气缸到报警全混在一起。当时觉得能跑就行后来设备出故障我一个网络一个网络往下翻光标都找不到问题在哪个块里那种感觉真的不想再来一次。这个案例里我采用了比较规范的程序框架OB1主循环只做程序块的调用不直接写工艺逻辑。OB30循环中断100ms执行一次用来做报警扫描、运行时长累计。FB1__MOTOR电机控制块包含启动、停止、故障互锁。FB2__CYLINDER气缸控制块包含伸出、缩回、到位超时保护。FB10__CONVEYOR输送线工艺主流程状态机就在这里。FC100__ALARM报警判断和汇总。DB10__PARAM存放所有可调参数。DB20__STATS存放产量、运行时间、故障次数。这种结构的好处是每个块只管一件事主流程只管状态流转设备控制块只管执行动作报警块只管汇总报警互不干扰。以后排查问题先看工艺主流程卡在哪一步再查对应设备的控制块基本十分钟内能定位。3.2 FB和FC怎么选FC没有自己的背景数据块每次调用都要把参数重新传入、传出FB有背景DB和静态数据适合描述一个“设备对象”。拿气缸来举例气缸有伸出时间、缩回时间、伸到位、缩到位、当前状态这些信息。我把气缸封装成一个FB输入是“伸出指令”“缩回指令”输出是“到位”“超时报警”静态参数里存动作时间。这样一条线有两个气缸就调用FB2两次每次分配一个背景DB互不干扰。下次换个设备还是用气缸同一个FB直接复用改一下参数就能用。这不是炫技而是实实在在地减少重复代码。程序做得越小巧后期维护的人越轻松。3.3 定时器的正确打开方式S7-1200和S7-200 SMART在定时器上有一个明显区别。S7-1200不再用老式的T37、T38这类定时器而是用TON、TOF、TP这些指令。使用TON时需要给它指定一个背景DB或者用临时实例。很多人第一次用1200明明写了TON却没有分配背景DB编译就报错或者两个TON共用一个背景DB程序里表现完全混乱。我的习惯是每个设备的动作定时器都用自己FB的背景DB来保存不共用一个定时器。比如气缸伸出延时2秒这个延时计时器就存在气缸FB的背景DB里。这样定时器实例和设备的生命周期是绑在一起的不会出现交叉干扰。另外如果程序里有按固定周期执行的任务比如每100ms采集一次状态并累计运行时间建议放在OB30循环中断里。OB30的周期在硬件组态里设置执行精度比在OB1里用定时器累加高得多。3.4 把所有可调参数收进一个DB客户现场最常提的需求就是“把这个延时改短一点”“那个时间再加两秒”。如果把时间参数像常量一样写死在程序里每次调整都要改程序、重新编译、下载很麻烦。我的做法是把所有可调参数集中放进DB10__PARAM比如气缸动作时间、分拣等待时间、故障恢复延时全部定义成符号变量再通过HMI画面绑定。现场调试时直接在触摸屏输入数值PLC程序内部自动读取参数DB。这种做法节省的调试时间非常可观而且参数调整都有迹可循不会被悄悄改得面目全非却没人知道。4. 分拣工艺的核心逻辑状态机的实现过程4.1 先把工艺边界理顺再写代码这个案例的工艺过程可以描述为产品从料仓落到输送带输送带把产品向前输送到达分拣位后由光电传感器检测到产品气缸将产品推入旁路料斗之后气缸缩回继续等待下一个产品。连续生产时需要累计产量并在触摸屏上显示。在写程序前我把这个流程拆成了几个清晰步骤等待启动和来料、启动输送带延时、等待产品到达分拣位、气缸伸出推料、气缸缩回并计数。每一步都对应一个状态号。这样做的好处是现场调试时如果流程卡住我一眼就能看出卡在第几步再针对那一步去查传感器或执行机构。4.2 用SCL写一个带状态机的主流程SCL是博途里的结构化文本语言写顺序控制比梯形图更清晰。下面是一段简化后的状态机骨架演示了从等待来料到分拣计数的主要过程CASE #Step OF 10: // 等待启动和来料 IF DB_PARAM.AutoMode AND I0_3_FeedDetect THEN #Step : 20; END_IF; 20: // 启动输送带延时后等待产品到达 Q0_0_Conveyor : TRUE; IF #TimerConveyor.Q THEN #Step : 30; END_IF; 30: // 等待产品到达分拣位 IF I0_6_CountSensor THEN #Step : 40; END_IF; 40: // 气缸伸出推料 Q0_1_Cylinder : TRUE; IF I0_4_ExtendDone AND #TimerExtend.Q THEN #Step : 50; END_IF; 50: // 气缸缩回完成一次计数 Q0_1_Cylinder : FALSE; IF I0_5_RetractDone AND #TimerRetract.Q THEN DB_STATS.TotalCount : DB_STATS.TotalCount 1; #Step : 30; END_IF; END_CASE;这段代码在实际项目里当然不会这么简单气缸和电机部分应该封装在FB里。这里想表达的核心思想是状态机决定“下一步该做什么”设备控制块负责“这个动作怎么完成”。把这两层分开故障时定位就会非常快状态卡在40步说明要么气缸没伸到位要么伸出延时没到直接去查气缸FB即可。4.3 手动自动切换必须做到无扰动手动自动切换是现场非常容易出问题的环节。如果自动运行时手动画面还能直接强制输出或者手动运行的时候突然切到自动设备从停止状态直接启动都容易出事故。我采用的原则是输出信号不允许有双重来源。程序里做一个统一输出逻辑IF DB_PARAM.AutoMode THEN M_DEV_Cmd : #AutoCmd; ELSE M_DEV_Cmd : #ManualCmd; END_IF;自动模式下只认自动逻辑的指令手动模式下只认手动操作指令。切换的瞬间还需要把设备控制块的状态复位到安全状态让所有执行机构停止输出。等操作员重新发出启动指令后设备才按照当前模式继续运行。这样才能保证从手动到自动、从自动到手动的切换不会产生意外动作。4.4 计数信号要加滤波别让假脉冲骗了你计数光电在输送线上很容易因为产品抖动、光线变化产生多个脉冲如果直接拿这个信号去计数产量数字会明显偏大。我的习惯是给计数信号加一个去抖滤波比如信号持续50毫秒才认为有效一次。在SCL里可以写一个简单的TON计时延时时间到了并且信号还保持着才去触发计数。这个细节看着小但在实际生产中非常重要。好的计数不是让你数出理论值而是让你数出的每个数字都能对得上实物否则客户第二天就会打电话问“为什么产量莫名其妙多了一百件”。4.5 报警逻辑和HMI显示报警系统在这个案例里包括三类急停触发、变频器故障、气缸动作超时。急停和变频器故障都是直接输入信号气缸超时是设备控制块内部判断气缸发出伸出指令后如果在设定时间内没有收到伸到位信号就认为气缸异常触发报警。所有报警汇总到FC100里输出一个总报警位一方面驱动Q0.3故障指示灯和Q0.4蜂鸣器另一方面把它作为HMI上的报警变量。HMI里配置好报警文本后现场就能直接看到“变频器故障”这样的具体信息而不是看着一个灯瞎猜。这一步能明显降低操作人员的处理时间。5. 仿真下载与在线调试把程序真正跑起来的几条硬经验5.1 用PLCSIM先跑一遍虚拟分拣流程博途自带的PLCSIM可以模拟S7-1200运行不需要实物PLC就能验证程序逻辑。点击仿真按钮把程序下载到虚拟PLC后可以在PLCSIM的变量视图里强制输入信号比如把I0.3强制为1观察状态机是否从10跳到20、Q0.0是否变为TRUE。这样能在上电之前把明显低级的状态机死步、延时逻辑写反都揪出来。但仿真有它的边界PLCSIM不模拟真实接线I/O信号都是软件里强制出来的仿真通过只能说明PLC内部逻辑是对的不能说明现场接线、传感器、气缸这些是对的。所以仿真结果是“逻辑验证”不是“现场验收”。5.2 在线监视的三种方式现场调试时我最常用三种在线监视方式。第一种是打开程序块的在线视图直接在SCL或梯形图上看各变量的实时值当前状态在哪个STEP一目了然第二种是监控表把要看的变量拖进去按列观察实际值和强制值适合批量对比信号第三种是HMI变量状态适合确认触摸屏和数据块通讯是否正常。使用在线监视前PLC必须处于RUN状态程序块也要和PLC内的程序一致否则在线视图上会显示“程序块不一致”的提示需要先下载程序再重新监视。5.3 强制信号是调试利器也是事故温床调试时为了跳过某些检测条件我经常会在监控表里强制点位。比如临时把I0.4气缸伸到位强制为1让流程继续往下走。这个功能非常强大但也非常危险。有一次调试时我强制了到位信号测试完忘了取消强制切换回自动流程后气缸实际没伸到位程序却因为强制信号认为它到位了继续执行下一步差一点造成机械碰撞。从那以后我给自己定了一条铁律做任何可能产生机械动作的操作前先切断动力电源强制完信号必须立刻解除强制并在调试记录里登记。这条规矩看着麻烦关键时刻能救命。5.4 下载程序时最容易犯的错博图里的下载分“硬件组态下载”和“程序下载”。如果改了设备组态比如新增扩展模块、修改IP地址一定要整站下载否则CPU和扩展模块之间通讯不正常。只改了程序逻辑的话下载程序块即可速度快、影响小。另一个重要习惯是从现场PLC上传旧程序。如果设备已经运行一段时间程序换过多个版本你电脑里的项目不一定是当前最新版本。此时先“从设备上传程序”到电脑保存成项目再决定是否修改下载。盲目用电脑里的旧版本去覆盖现场新程序是一种非常危险的操作。6. 整理几个最容易翻车的问题和对应的解决办法6.1 HMI读取DB变量报“访问错误”怎么办S7-1200的数据块默认是“优化访问”模式触摸屏通过符号名访问非常方便。但如果你习惯了用绝对地址比如DB10.DBD4这种方式去绑定HMI变量而DB10又开着优化访问编译时就会出现访问错误或无法绑定。解决办法有两个一是保持优化访问模式HMI绑定变量时直接选PLC变量列表里的名称二是把该DB取消“优化块访问”重新编译后再生成绝对地址。我建议选第一种既然博途已经提供了符号寻址就别再回到绝对地址的老路上。6.2 CPU固件和博途版本不匹配这个问题在项目开工或者后期维护时经常遇到。博途软件版本较旧而CPU固件是新的添加设备时又选了老固件下载时会提示“设备版本不兼容”。相反的情况也存在CPU固件旧、博途软件新有时可以选择升级CPU固件但升级前必须断电并确认软硬件版本确实兼容不能随便操作。我的建议是在设备视图里直接选择CPU上实际固件版本或者略低于实际版本的兼容选项。选购PLC时也顺便记录一下现场使用的博途版本方便日后维护。6.3 多个OB同时写一个变量引发的数据混乱S7-1200的程序可以同时存在OB1和OB30等多个组织块。如果在OB1里写某个产量变量又在OB30里也写了同一个变量两个组织块的执行顺序不断叠加可能出现变量被覆盖、逻辑结果时好时坏的怪现象。这种问题最隐蔽的因为它不报错只是实际动作偶尔不对。我给自己的约定是一个变量只在一个OB里执行写操作其它OB只允许读取。比如产量累计只在OB1的状态机里写OB30只负责读取并做报警判断。这个简单约定能避免一大批“查不出原因”的诡异故障。6.4 模拟量量程换算写清楚虽然这个案例的模拟量通道是预留备用的但我想提一下量程换算。S7-1200的模拟量输入原始值范围是0到27648对应的是0到100%的信号。如果外接的是4到20mA传感器要显示成实际工程值需要做量程标定。换算关系其实就是一次函数工程值 (原始值 / 27648) × (量程上限 - 量程下限) 量程下限这里要注意4到20mA对应的原始值不是从0开始的而是约5530到27648所以要先把原始值减去5530再做比例换算。这个细节我见过很多人出错尤其是第一次接模拟量时显示出来全是负数或者最大值。把换算公式写在功能块的注释里后面维护的人会感谢你。6.5 版本管理和项目归档做完一个阶段我会把整个项目归档一次归档文件带日期和版本号。同时额外导出一份PLC变量表、报警文本表和参数表。为什么这么做因为项目文件是单机文件硬盘损坏、误删、同步工具覆盖都可能导致项目丢失但变量表和参数表只要有纸质或PDF版照着改回来的工作量就小得多。另外每次现场改动必须同步更新图纸。很多设备做久了之后程序版本和接线图已经对不上新接手的人根本不敢改只能靠猜。这种技术债是最难还的。6.6 编程时的注释习惯千万不要等到程序快写完了才回去补注释。写完一个网络、写完一个功能块立刻把注释补上顺便把当初为什么这么写也记下来。两三个月后你再看自己写的程序如果没有注释连你自己都要靠猜。我做项目时对注释的要求是一个功能块头部必须写明功能、输入输出、使用日期、调用位置。这不算麻烦反而能让你在后续维护中节省数倍时间。这个案例做完之后我最大的感受是1200加上博途这套组合对小中型自动化项目来说确实能做到“程序结构清爽、调试效率高、维护方便”。但前提是你要把功夫下在写程序之前——I/O表理清楚、地址分配合理、块结构提前规划好后面写代码就像填空一样顺畅。如果你正准备开始一个类似的项目我建议先从这三张表入手I/O清单、程序块清单、参数DB清单。这三张表画齐了你已经成功了一半。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑