☰
PLC编程实战:入行前三年踩过的90个坑与经验总结
2026/10/26 9:42:02 网站建设 项目流程

1. 入行前三年,我把PLC踩过的坑都整理成了这90条

刚入行那会儿,我总觉得PLC编程就是“把梯形图画对就行”。直到第一次独立接手一个西门子1200的小型包装线项目,IO分配表改了七版,程序框架推倒重来三次,现场调试时因为一个模拟量滤波参数没设对,设备在客户面前直接宕机——那一刻我才明白,PLC这行,光会画梯形图远远不够。

这篇文章是我入行1到3年期间,从实际项目中一点一点攒下来的90条实战经验。它们覆盖了PLC选型、IO分配、梯形图编程、程序框架搭建、西门子1200实操、SCADA通讯、现场调试与故障排查等核心环节。每一条都来自真实的项目现场,不是教科书上的理论复述。无论你是刚接触PLC编程的新人,还是已经能独立做项目但总觉得“差那么点意思”的同行,这些经验都能帮你少走弯路。我会按主题分类展开,每条都尽量说清楚“为什么这么做”和“不这么做会怎样”,让你不仅知道怎么做,更知道背后的逻辑。

2. 项目整体设计与思路拆解

2.1 为什么程序框架比梯形图本身更重要

很多新手拿到项目就开始画梯形图,结果写到一半发现逻辑混乱、变量命名一塌糊涂、后期改一个功能要翻遍整个程序。我踩过这个坑之后,总结出的第一条铁律就是:先搭框架,再写逻辑。

一个合格的PLC程序框架,应该像一栋楼的承重结构——它不直接决定你住得舒不舒服,但决定了这栋楼能不能盖高、能不能改户型。具体来说,框架要解决几个问题:程序分几个层级、每个层级的职责是什么、变量怎么命名、状态机怎么设计、报警和手动模式怎么嵌入。

以西门子1200为例,我常用的框架是分层结构:设备层(底层IO控制)、工艺层(单站逻辑)、调度层(整线协调)、接口层(HMI和SCADA通讯)。每一层只和相邻层交互,不跨层调用。这样做的好处是,当你需要替换某个工位的设备时,只需要改设备层,工艺层以上的逻辑完全不动。

2.2 IO分配不是“数够点数就行”

IO分配是PLC项目里最容易被低估的环节。我见过太多人拿到电气图纸就开始数输入输出点,然后随便往模块上一排就完事。结果到了调试阶段,发现某个高速计数器必须接在特定通道、某个模拟量信号和数字量信号互相干扰、某个输出点的公共端接错了导致整组模块不工作。

IO分配的核心原则有三条:功能分区、信号类型分组、预留余量。功能分区是指把同一工位或同一功能的IO放在连续的地址段,方便后期排查;信号类型分组是指数字量、模拟量、高速计数、通讯信号要分开规划,避免互相干扰;预留余量是指每个模块至少留10%到20%的空点,方便后期增加传感器或执行器。

注意:西门子1200的IO地址是自动分配的,但你可以通过修改设备组态里的起始地址来手动规划。我习惯把输入和输出分开规划,输入从I0.0开始,输出从Q0.0开始,模拟量从IW64和QW64开始,这样在程序里一眼就能看出信号类型。

2.3 梯形图编程的“可读性”比“技巧性”重要

梯形图是PLC编程最常用的语言,但很多人把它当成了“炫技场”——用各种复杂的逻辑块嵌套、用中间继电器绕来绕去、用跳转指令把程序切得支离破碎。我早期也犯过这个毛病,直到有一次同事接手我的程序,花了整整两天才看懂一个简单的启停逻辑。

梯形图的第一原则是可读性。具体做法包括:每个网络只做一件事、注释写清楚“这个网络在什么条件下执行什么动作”、避免超过三层的逻辑嵌套、用符号名代替绝对地址。西门子1200的TIA Portal支持符号寻址,你可以给每个变量起一个有意义的名字,比如“Conveyor1_Start”而不是“I0.3”,这样程序读起来就像读一段伪代码。

2.4 状态机是程序框架的灵魂

如果你问我,入行前三年学到的最有价值的编程思想是什么,我会毫不犹豫地说:状态机。无论是简单的单站控制还是复杂的整线调度,状态机都能让你的程序逻辑清晰、易于调试、方便扩展。

状态机的核心思想是:把设备的运行过程拆分成若干个离散的状态,每个状态有明确的进入条件、执行动作和退出条件。比如一个气缸的动作可以拆成“初始位、伸出中、伸出到位、缩回中、缩回到位”五个状态。在程序里用一个整数变量记录当前状态,然后用CASE语句或比较指令来驱动输出。

这样做的好处是:调试时你可以直接监控状态变量的值,一眼看出设备卡在哪个环节;修改逻辑时只需要改对应状态的代码,不会影响其他状态;增加新功能时只需要增加新状态,不会打乱原有逻辑。

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

3.1 西门子1200的硬件组态与IO规划实操

西门子1200是我用得最多的PLC型号,它的硬件组态在TIA Portal里完成。很多新手在这一步容易犯的错误是:直接使用默认地址,不做任何规划。结果程序写到一半发现地址不够用,或者某个模块的地址和另一个模块冲突。

我的做法是:在硬件组态里,先规划好每个模块的起始地址。数字量输入模块从I0.0开始,数字量输出模块从Q0.0开始,模拟量输入从IW64开始,模拟量输出从QW64开始。每个模块预留至少10%的空点。然后在Excel里做一张IO分配表,包含地址、符号名、信号类型、所属工位、备注等信息。这张表是整个项目的“地图”,编程、调试、后期维护都靠它。

实操心得:IO分配表一定要在编程之前完成,并且和电气工程师确认过。我吃过亏——电气图纸上某个传感器是常闭的,但我按常开编程,结果调试时设备一上电就动作。后来我养成了习惯:每个IO点都标注“常开/常闭”和“有效电平”。

3.2 梯形图编程中的常见陷阱与规避方法

梯形图看起来简单,但有几个陷阱是新手必踩的。第一个是双线圈输出——同一个输出线圈在程序里出现了两次。在梯形图中,后面的线圈会覆盖前面的状态,导致逻辑混乱。规避方法是:每个输出只在一个网络里出现,如果需要多个条件控制同一个输出,用中间变量合并逻辑。

第二个是上升沿和下降沿的使用。很多新手不知道,梯形图里的普通触点是在每个扫描周期都判断的,如果你需要“按下按钮时执行一次”的逻辑,必须用上升沿指令。西门子1200里用P_TRIG指令或者R_TRIG功能块。我见过有人用普通触点做计数,结果按一次按钮计数加了十几次。

第三个是模拟量处理的量程转换。西门子1200的模拟量输入模块,4到20毫安对应的数值是0到27648。你需要用NORM_X和SCALE_X指令把它转换成实际的工程值。很多人直接拿原始值去比较,结果设定值和实际值对不上。

3.3 程序框架搭建的实操步骤

搭建程序框架,我通常按以下步骤来:

  1. 定义变量表:在PLC变量表里定义所有IO变量、中间变量、HMI变量。命名规则是“工位_功能_类型”,比如“Station1_Cylinder1_Extend”。
  2. 创建功能块:为每个工位创建一个FB(功能块),里面包含该工位的所有逻辑。FB的接口定义输入输出参数,方便复用。
  3. 设计状态机:在每个FB里用一个整数变量表示状态,用CASE语句驱动输出。
  4. 编写调度层:在主程序OB1里调用各个FB,按工艺顺序协调各工位。
  5. 嵌入手动模式:每个FB里都要有手动/自动切换逻辑,手动模式下可以单独控制每个输出。
  6. 集成报警处理:用一个全局报警FB收集所有报警信号,统一处理。

注意:FB的接口参数不要太多,一般不超过10个。如果参数太多,说明这个FB的职责不够单一,应该拆分成多个FB。

3.4 SCADA与PLC通讯的配置要点

SCADA和PLC的通讯是很多项目的“最后一公里”,也是最容易出问题的地方。我用的比较多的是WinCC和组态王,通讯方式主要是以太网和Profibus。

以太网通讯的配置要点:PLC的IP地址要和SCADA电脑在同一个网段;在TIA Portal里要开启“允许来自远程对象的PUT/GET通信访问”;SCADA里的驱动要选对型号,比如西门子1200选S7-1200驱动,不要选S7-300。

Profibus通讯的配置要点:波特率要和从站数量匹配,一般从站越多波特率越低;终端电阻要拨到ON的位置,否则通讯不稳定;地址不能冲突。

实操心得:调试通讯时,先用ping命令确认物理连接正常,再用PLC的在线诊断功能确认通讯负载率。如果通讯时断时续,多半是网线质量或终端电阻的问题。

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

4.1 一个完整的小型项目从零到调试的流程

我拿一个最近做的“基于西门子1200的自动化包装线控制系统”来举例,完整走一遍流程。

第一步:需求分析和IO规划。包装线有上料、封口、贴标、下料四个工位。每个工位有若干传感器和气缸。我统计了一下,数字量输入32点,数字量输出24点,模拟量输入4点。选了一个1214C DC/DC/DC的主机,加一个16DI/16DO的扩展模块和一个4AI的模拟量模块。

第二步:硬件组态和IO分配。在TIA Portal里组态硬件,规划地址。主机自带的IO从I0.0开始,扩展模块从I8.0开始。模拟量从IW64开始。做了一张IO分配表,和电气工程师确认。

第三步:程序框架搭建。创建了四个FB,分别对应四个工位。每个FB里用状态机控制气缸动作。OB1里按顺序调用四个FB,中间加互锁逻辑。

第四步:梯形图编程。以封口工位为例,状态机有“等待、加热、封口、冷却、完成”五个状态。每个状态的进入条件是上一个状态完成且当前工位有料。输出控制加热器、封口气缸、冷却风扇。

第五步:HMI画面设计。用KTP700触摸屏做了主画面、手动画面、报警画面。主画面显示各工位状态和产量,手动画面可以单独控制每个气缸,报警画面显示当前报警和历史报警。

第六步:现场调试。先空载测试各气缸动作,再带料测试。调试时发现封口时间不够,导致封口不牢。调整了定时器参数,从2秒加到3.5秒。又发现贴标工位的传感器位置偏了,调整了安装支架。

4.2 模拟量处理的参数计算与实操

模拟量处理是很多新手的痛点。我拿一个压力传感器举例:量程是0到10兆帕,输出4到20毫安,接入西门子1200的模拟量输入模块。

原始值范围是0到27648,对应4到20毫安。但4毫安对应的是0兆帕,20毫安对应的是10兆帕。所以实际压力值的计算公式是:压力 = (原始值 - 0)/ 27648 * 10。

在TIA Portal里,我用NORM_X指令把原始值归一化到0到1,再用SCALE_X指令缩放到0到10。具体参数:NORM_X的MIN是0,MAX是27648;SCALE_X的MIN是0,MAX是10。

注意:如果传感器是0到20毫安输出,对应的原始值范围是0到27648,但0毫安对应的是-25%的量程。这种情况需要用不同的计算公式。

4.3 状态机编程的完整代码示例

下面是一个气缸控制的状态机代码示例,用SCL语言写,因为SCL比梯形图更适合写状态机:

CASE #State OF 0: // 初始状态 #CylinderExtend := FALSE; #CylinderRetract := FALSE; IF #StartSignal THEN #State := 10; END_IF; 10: // 伸出中 #CylinderExtend := TRUE; #CylinderRetract := FALSE; IF #ExtendSensor THEN #State := 20; END_IF; 20: // 伸出到位 #CylinderExtend := FALSE; #CylinderRetract := FALSE; IF #WorkDone THEN #State := 30; END_IF; 30: // 缩回中 #CylinderExtend := FALSE; #CylinderRetract := TRUE; IF #RetractSensor THEN #State := 0; END_IF; END_CASE;

这段代码的逻辑很清晰:每个状态只做一件事,状态的切换条件明确。调试时监控#State的值,就知道气缸卡在哪个环节。

4.4 现场调试的实操记录与参数调整

现场调试是检验程序质量的唯一标准。我记录了一个包装线项目的调试过程:

第一天:空载测试。发现上料气缸动作太快,导致物料飞出。调整了气缸的排气节流阀,把伸出速度降下来。

第二天:带料测试。发现封口温度不够,封口不牢。检查发现加热器的PID参数没调好。用自整定功能重新整定了PID参数,温度稳定在设定值正负2度以内。

第三天:联机测试。发现贴标工位和封口工位的节拍不匹配,导致物料堆积。调整了封口工位的等待时间,从3秒降到2.5秒,节拍匹配了。

第四天:SCADA联调。发现WinCC上显示的压力值和实际值对不上。检查发现是量程转换的公式写错了,把0到10兆帕写成了0到16兆帕。改过来之后正常了。

实操心得:调试时一定要做记录,每个问题、每个参数调整都记下来。我习惯用手机拍照加备忘录,后期写调试报告时直接整理。

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

5.1 PLC启动不了?先查这几个地方

PLC启动不了是新手最常遇到的问题。我遇到过的情况包括:电源没接好、模块没插紧、固件版本不匹配、程序有语法错误、硬件组态和实际硬件不一致。

排查顺序是:先看PLC的电源指示灯亮不亮,不亮就查电源;再看模块的指示灯,如果某个模块的灯不亮,可能是没插紧或模块坏了;然后用TIA Portal在线诊断,看有没有报错信息;最后检查硬件组态和实际硬件是否一致。

注意:西门子1200的固件版本要和TIA Portal的版本匹配。如果PLC的固件是V4.0,TIA Portal是V15,可能连不上。需要升级TIA Portal或者降级PLC固件。

5.2 通讯不上?按这个顺序排查

通讯问题也是高频故障。我总结的排查顺序是:物理层、网络层、应用层。

物理层:网线有没有插好、网口灯亮不亮、网线是不是好的。用ping命令测试。

网络层:IP地址是不是同一个网段、子网掩码对不对、有没有IP冲突。

应用层:驱动选对了没有、通讯参数配置对了没有、PLC的PUT/GET权限开了没有。

实操心得:我习惯在项目开始时就给每个PLC分配固定的IP地址,并且记录在案。调试时直接用ping命令测试,能省很多时间。

5.3 模拟量信号跳变?多半是这几个原因

模拟量信号跳变是让人很头疼的问题。常见原因有:信号线没有屏蔽、信号线和动力线走在一起、传感器供电不稳定、PLC的模拟量模块没有做滤波。

解决方法:信号线用屏蔽双绞线,屏蔽层单端接地;信号线和动力线分开走线,至少间隔20厘米;传感器用独立的稳压电源供电;在PLC程序里加滤波,比如用移动平均滤波,取最近10个采样值的平均。

5.4 常见问题速查表

问题现象可能原因排查方法解决方法
PLC启动不了电源故障检查电源指示灯更换电源或检查接线
PLC启动不了模块接触不良检查模块指示灯重新插拔模块
通讯不上IP地址不对ping测试修改IP地址
通讯不上驱动选错检查SCADA驱动配置选择正确的驱动
模拟量跳变信号干扰检查屏蔽和走线加屏蔽、分开走线
模拟量跳变滤波不足检查程序滤波参数增加滤波
输出不动作双线圈输出检查程序合并逻辑
输出不动作公共端接错检查接线更正接线
计数器不准没用上升沿检查程序加上升沿指令
定时器不准时基选错检查定时器参数选择合适的时基

5.5 那些年我踩过的“奇葩”坑

说几个让我印象深刻的坑。有一次,一个项目调试时发现某个输出点偶尔不动作,查了半天程序没问题,最后发现是输出模块的公共端螺丝没拧紧,接触不良。还有一次,一个模拟量信号一直跳变,换了传感器、加了滤波都没用,最后发现是变频器的干扰,把变频器的载波频率调低就好了。

还有一个坑是“时间到期自动停机”的功能。客户要求设备运行1000小时后自动停机。我一开始用PLC的内部时钟做,结果发现PLC断电后时钟不走了。后来改用累计运行时间的做法,每秒加1,存在保持寄存器里,断电也不丢。

实操心得:PLC编程不只是写程序,还要懂电气、懂工艺、懂现场。很多问题不是程序的问题,是接线的问题、干扰的问题、参数的问题。多去现场,多动手,经验自然就来了。

6. 从入门到独立做项目,我的学习路径

6.1 新手最容易犯的五个错误

回顾我入行前三年的经历,新手最容易犯的错误有五个:一是跳过IO分配直接编程;二是不搭框架直接写逻辑;三是变量命名随意,后期自己都看不懂;四是不做手动模式,调试时只能改程序;五是不写注释,过一个月自己都不记得当时怎么想的。

这五个错误的共同点是:当时觉得省事,后期付出十倍代价。我的建议是:从一开始就养成好习惯,IO分配表、程序框架、变量命名规范、手动模式、注释,一个都不能少。

6.2 如何快速提升PLC编程能力

提升PLC编程能力,我的经验是:多做项目、多看别人的程序、多总结。多做项目不用解释,实践出真知。多看别人的程序是指,有机会就看看同事或网上的优秀程序,学习别人的框架和思路。多总结是指,每个项目做完后写一份总结,记录遇到的问题和解决方法。

另外,我建议新手从西门子1200入手,因为它的资料多、生态好、TIA Portal功能强大。等熟练了再学三菱、汇川、倍福等其他品牌。不同品牌的PLC逻辑是相通的,学会一个,其他的触类旁通。

6.3 程序框架的复用与扩展

程序框架的价值在于复用。我现在的做法是:把常用的功能块(气缸控制、电机控制、PID控制、报警处理)做成标准库,新项目直接调用。这样能节省大量时间,而且因为标准库经过多个项目验证,稳定性有保障。

扩展性也很重要。我在设计框架时,会预留一些接口,比如预留几个空的FB槽位、预留一些IO地址、预留一些HMI画面。这样后期增加功能时,不需要大改框架。

实操心得:我习惯在项目开始时就问客户:“这个设备以后会不会增加新功能?”如果会,就在框架里预留好接口。这个习惯帮我省了很多后期改程序的麻烦。

6.4 关于AI生成PLC代码的一些看法

最近AI生成PLC代码是个热门话题。我试过用AI生成一些简单的梯形图逻辑,比如启停控制、定时器、计数器,效果还可以。但复杂的逻辑,比如状态机、PID控制、多轴协调,AI生成的代码还需要人工修改和验证。

我的看法是:AI可以帮你写一些模板化的代码,节省时间,但不能替代你对工艺的理解和对逻辑的把控。PLC编程的核心是“理解设备怎么动”,这个AI暂时还做不到。所以,把AI当成一个辅助工具就好,不要指望它帮你搞定整个项目。

6.5 持续更新,持续积累

这90条经验不是终点,而是一个起点。PLC这行,技术更新快,新品牌、新工具、新方法层出不穷。我现在的习惯是:每做一个新项目,就总结几条新经验,加到自己的知识库里。日积月累,这些经验就成了我最宝贵的财富。

最后分享一个小技巧:我习惯在手机里建一个备忘录,专门记录调试时遇到的问题和解决方法。有时候在现场灵光一闪,赶紧记下来,回去再整理。这个习惯帮我攒了不少干货,也让我在写这篇文章时有了足够的素材。

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

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

立即咨询