1. 项目概述:为什么“PLC编程思路”比“PLC指令怎么写”重要十倍
你是不是也经历过这样的场景:手握GX Works2或TIA Portal,对着一个电机启停任务发呆——IO点已分配好,手册翻了三遍,AND、OR、SET、RST这些基本指令都背熟了,可一动笔画梯形图,就卡在“第一行该放什么”?或者更糟:程序写完了,现场调试时逻辑错乱,继电器噼啪乱响,变频器报F001,而你盯着屏幕里密密麻麻的触点和线圈,完全找不到问题出在哪一层逻辑上。这不是你不会用PLC,而是没人告诉你——PLC不是“写代码”,是“建模型”。它不处理“数据流”,而是在模拟“物理世界的运行节律”。
我带过37个自动化项目,从食品灌装线到半导体晶圆搬运机,最常听到的求助不是“LD指令怎么用”,而是“这个设备有6种运行模式,怎么让PLC不打架?”、“手动/自动切换时,为什么急停后状态会丢失?”、“32台变频器同步启停,梯形图画到第5页就晕了”。这些问题的答案,从来不在指令表里,而在编程思路中。所谓思路,就是把现实中的机械动作、工艺约束、安全联锁、人机交互,翻译成PLC能理解的、可验证的、可维护的逻辑结构。它决定了你写的程序是“能跑通的草稿”,还是“十年不改的工业资产”。
这正是本篇要拆解的核心:以一个真实产线上的“双工位装配站”为蓝本(含气缸动作、传感器反馈、变频输送带、HMI急停联动),全程不贴一行完整代码,只讲每一步“为什么这样想”、“如果换种思路会掉进什么坑”、“现场调试时哪几个信号点必须先抓波形”。你会看到,一个合格的PLC程序员,80%的时间花在白板上画状态转换图、标IO约束条件、列故障树,而不是在软件里拖线圈。梯形图只是最终呈现形式,状态机才是心脏,IO定义才是骨架,而“思路”是让这两者严丝合缝咬合的精密齿轮。如果你正被“plc梯形图100实例详解”这类标题吸引,却总在第3个实例就卡住——不是例题太难,是你缺了一套可复用的思维脚手架。接下来的内容,就是把它焊死在你的工作流程里。
2. 编程思路的整体设计与底层逻辑拆解
2.1 为什么必须抛弃“从左到右写梯形图”的直觉?
新手最容易犯的致命错误,是把PLC编程当成“填空题”:输入X0接启动按钮,那就第一行画个常开触点;输出Y0控电机,那就后面接个线圈——然后一路复制粘贴,直到逻辑崩塌。这种写法在单按钮启停这种教科书案例里能蒙混过关,但一旦面对真实产线,立刻暴露三个硬伤:
时序不可控:比如星三角降压启动,要求KM1吸合后延时2秒再断开KM1并吸合KM2。若用简单定时器堆叠,当电网波动导致PLC扫描周期跳变,2秒可能变成1.8秒或2.3秒,轻则电机抖动,重则烧毁接触器。真正可靠的方案,是把“启动→延时→切换→运行”定义为4个互斥状态,每个状态内只做一件事(如“延时状态”只启动T37,不碰任何输出线圈),状态切换由精确的传感器反馈触发,而非单纯依赖时间。
故障不可追溯:当32台变频器中第17台突然停机,传统写法下你要逐行检查所有与Y17相关的触点链路,可能涉及12个中间继电器、5个定时器、3个比较指令。而基于状态机的设计,你只需看“第17号变频器当前处于哪个状态”(如“故障锁定态”),再查该状态下哪个输入信号(如DI17_OverTemp)为ON,5秒内定位根因。
维护成本爆炸:客户临时要求增加“手动微调模式”,传统写法需在原有300行梯形图中插入新逻辑,极易引入隐性冲突;状态机方案则只需新增一个“Manual_Tune”状态分支,并明确定义它与现有各状态的进入/退出条件(如“按住UP键且当前非故障态”才能进入),主干逻辑纹丝不动。
我见过最典型的反面案例:某包装机PLC程序共2187行,其中1923行用于处理“光电开关误触发后的去抖逻辑”,原因就是初始设计没把传感器信号预处理抽象成独立模块,而是把延时、上升沿检测、确认计数全揉进主控逻辑里。后来换型时,光剥离这部分就花了两周。
提示:PLC扫描周期不是恒定值。S7-1200典型扫描时间在10ms~50ms浮动,取决于程序长度、通信负载、中断数量。任何依赖“固定扫描次数延时”的写法,在产线高负载时段必然失效。状态机通过“事件驱动”规避此风险——不是“等够100次扫描”,而是“等传感器信号稳定保持300ms”。
2.2 四层架构:把复杂系统拆解为可管理的模块
真正稳健的PLC编程思路,本质是构建一套分层防御体系。我们以“双工位装配站”为例(含A/B工位气动夹紧、视觉检测OK/NG、变频输送带启停、HMI模式选择),将其拆解为四个严格隔离的层级:
| 层级 | 名称 | 核心任务 | 典型IO操作 | 关键设计原则 |
|---|---|---|---|---|
| L0 | 信号预处理层 | 对原始传感器信号进行滤波、边沿检测、电平确认 | 读取X0~X15(光电、限位、按钮),输出M100~M199(标准化信号) | 绝不出现输出线圈!所有输出仅用于内部标志位,且每个物理输入对应唯一M地址 |
| L1 | 设备驱动层 | 将L0层信号转化为具体执行器动作 | 读取M100~M199,输出Y0~Y31(电磁阀、变频器使能、报警灯) | 一个输出只由一个状态控制。例如Y5(A工位夹紧阀)只能在“Clamp_A”状态下置位,其他状态必须复位 |
| L2 | 工艺逻辑层 | 定义设备间的协作关系与工艺约束 | 读取L1层输出状态(如Y5=ON表示已夹紧),输出M200~M299(工艺标志) | 禁止跨工位直接读写。A工位不能直接读B工位的Y12,必须通过M250(B工位Ready)这类工艺信号中转 |
| L3 | 系统管理层 | 处理模式切换、急停、复位、HMI交互等全局事务 | 读取HMI寄存器、急停输入X100,输出M300~M399(系统状态) | 最高优先级。急停信号X100必须在L0层就触发所有输出强制复位,不经过任何中间逻辑 |
这种分层不是为了炫技,而是为了解决工业现场最痛的三个问题:
- 调试效率:当夹紧不到位时,你只需查L0层M105(A工位夹紧到位信号)是否为ON。若是,则问题在气路或传感器;若否,再查L1层Y5是否输出——故障域瞬间缩小80%。
- 变更安全:客户要求增加“夹紧压力检测”,只需在L0层新增一个压力传感器处理逻辑,L1~L3层完全不用动。
- 知识沉淀:新工程师接手时,看懂L0层就能掌握所有传感器特性,看懂L2层就能理解整条产线工艺,无需通读2000行混合逻辑。
注意:西门子TIA Portal的“多重实例”功能,本质就是对这种分层的原生支持。把“气动夹紧单元”封装成FB块,L0/L1逻辑内置,L2层只需调用“Clamp_Unit(Enable:=M201, Done=>M202)”,这才是面向对象思想在PLC里的正确打开方式。
2.3 状态机:PLC编程的“操作系统内核”
如果说分层架构是楼房结构,状态机就是地基下的桩基。几乎所有工业设备的运行,本质上都是在有限个离散状态间迁移:电机的“停止→启动→运行→故障→停机”;装配站的“待机→上料→装配→检测→卸料”;甚至HMI界面的“主画面→参数设置→报警历史→用户登录”。用状态机建模,不是为了显得高级,而是因为它是唯一能穷举所有可能、杜绝逻辑漏洞的方法。
以“星三角降压启动”为例,常见错误写法是:
// 错误示范:时间驱动,无状态标识 LD X0 // 启动按钮 AN T37 // 避免重复启动 OUT Y0 // KM1吸合 LD Y0 OUT T37 K20 // 延时2秒(20*0.1s) LD T37 OUT Y1 // KM2吸合(三角形)这段代码的问题在于:它假设PLC永远在线、电源永不中断、传感器永不误报。现实中,若启动过程中急停被按下,T37会清零,但Y0仍保持吸合,导致KM1持续带电——这是重大安全隐患。
正确做法是定义4个状态:
- STOP:所有输出复位,等待启动信号
- STAR_RUN:Y0=ON(KM1),T37开始计时,监控X1(星形接触器反馈)
- SWITCHING:T37到时,Y0=OFF,Y1=ON(KM2),同时启动切换保护定时器T38(防触点粘连)
- DELTA_RUN:X2(三角形接触器反馈)为ON后进入,Y1保持,T38清零
状态迁移条件必须包含双重确认:
- 进入STAR_RUN:X0=ON AND M300=STOP AND X1=OFF(确保KM1未吸合)
- 进入SWITCHING:T37=ON AND X1=ON(不仅时间到,还要确认KM1确实吸合)
- 进入DELTA_RUN:T38=ON AND X2=ON(KM2吸合且反馈到位)
这种设计下,即使急停触发,PLC立即跳回STOP态,所有输出强制复位,不存在“悬空状态”。我在调试某汽车焊装线时,曾发现一个隐藏BUG:当焊接机器人正在移动时触发急停,其PLC状态机因缺少“运动中急停”的迁移分支,导致伺服使能信号未及时关闭,机器人靠惯性撞上工装——补上这个状态后,问题彻底消失。
3. 核心细节解析与实操要点
3.1 IO定义:不是“接线表”,而是“系统宪法”
很多工程师把IO分配当成体力活:X0接启动按钮,X1接停止按钮……这种做法埋下巨大隐患。真正的IO定义,必须回答三个哲学问题:
- 这个信号代表什么物理意义?(是“按钮被按下”的瞬时事件,还是“系统处于手动模式”的持续状态?)
- 它的有效电平是什么?(NPN传感器输出低电平有效,还是PNP输出高电平有效?)
- 它的电气特性如何约束逻辑设计?(光电开关响应时间10ms,那你的去抖延时至少设为20ms;接近开关最大开关频率1kHz,那你的扫描周期必须<1ms才能可靠捕获)
以“双工位装配站”的关键IO为例,我们这样定义:
| 物理点 | 地址 | 类型 | 信号含义 | 有效电平 | 关键约束 | L0层处理逻辑 |
|---|---|---|---|---|---|---|
| A工位夹紧到位 | X5 | 输入 | 气缸活塞到达指定位置 | 高电平 | 响应时间15ms | LD X5 AN T100 OUT M105;LD X5 OUT T100 K150(150*0.1ms=15ms);LD T100 OUT M105 |
| 急停按钮 | X100 | 输入 | 全局紧急停止请求 | 低电平(NC触点) | 必须硬件直连PLC急停端子 | LDN X100 OUT M900(M900=ON表示急停触发) |
| 变频器1运行中 | X20 | 输入 | VFD1驱动电机旋转 | 高电平 | 需与Y30(VFD1使能)互锁 | LD X20 AN Y30 OUT M220(若VFD1运行但使能未开,报故障) |
| HMI模式选择 | MW100 | 通讯 | 0=手动,1=自动,2=维护 | —— | 数据更新周期200ms | LD MW100 == K0 OUT M301;LD MW100 == K1 OUT M302;LD MW100 == K2 OUT M303 |
看到没?L0层处理逻辑已明确写出。这不是可选项,而是强制规范。因为:
- X5的去抖必须用硬件定时器(T100),而非简单“LD X5 OUT M105”,否则振动环境下会频繁抖动;
- X100用LDN(取反)是因为急停是NC触点,断开时X100=OFF,系统需识别为“急停触发”,所以M900=ON代表危险;
- MW100的模式判断必须用==K0/K1/K2,而非“LD MW100 AN MW100+2”,避免模式字节被干扰时产生非法值(如MW100=5)。
实操心得:在GX Works2中,务必启用“IO注释”功能,把上表内容直接写入IO注释栏。每次打开程序,鼠标悬停X5就能看到“气缸到位(15ms去抖)”,比翻纸质文档快10倍。TIA Portal的“符号表”同理,别偷懒只写“X5”。
3.2 梯形图绘制:不是“画电路”,而是“写剧本”
梯形图(LD)常被误解为电气原理图的翻版,其实它是时序剧本。每一行,都在描述“在某个条件下,某个角色(输出)将做出什么动作”。因此,优秀梯形图必须满足:
- 主角唯一:每行只控制一个输出(Y或M),避免“LD X0 OUT Y0 Y1”这种多输出行;
- 条件清晰:所有前置触点必须有明确物理意义,禁用“LD M100 AN M101 AN M102”这种无注释组合;
- 时序可视:关键延时、脉冲必须用专用定时器(T)、计数器(C),而非“用100个扫描周期计数”这种黑魔法。
以“输送带1s闪烁报警灯”为例(热词中高频出现),错误写法:
// 错误:用扫描周期计数,不可靠 LD M1000 // 报警触发 AN T100 OUT M1001 // 闪烁使能 LD M1001 AN T100 OUT T100 K100 // 100*10ms=1s(假设扫描10ms) LD T100 OUT Y100 // 灯亮 LD T100 AN T101 OUT T101 K100 LD T101 OUT Y100 // 灯灭?等等,这里Y100被重复赋值!这段代码存在竞态:T100和T101可能同时为ON,Y100状态不确定。正确写法是用状态机:
// 正确:双状态循环 // STATE_FLASH_ON: Y100=ON, T200开始计时 LD M1000 AN M1002 OUT M1001 // 进入ON态 LD M1001 OUT Y100 LD M1001 OUT T200 K100 // 1s // STATE_FLASH_OFF: Y100=OFF, T201开始计时 LD T200 AN M1001 OUT M1002 // 进入OFF态 LD M1002 AN T201 OUT Y100 // 确保Y100=OFF LD M1002 OUT T201 K100 // 状态切换 LD T200 AN M1002 OUT M1001 // OFF态到ON态 LD T201 AN M1001 OUT M1002 // ON态到OFF态现在,Y100的状态由且仅由M1001/M1002决定,T200/T201只负责计时,职责分明。调试时,你只需监控M1001和M1002的交替频率,就知道闪烁是否准确。
提示:GX Works2的“语句表转梯形图”功能(热词中高频搜索)之所以常失败,是因为语句表里存在“LD X0 OR X1 AND X2”这种复杂布尔表达式,而梯形图天然适合“串并联”结构。正确做法是:先把复杂条件拆成中间继电器(如LD X0 OR X1 OUT M500;LD M500 AND X2 OUT M501),再转梯形图——这恰恰印证了“思路先行”的重要性。
3.3 状态机实现:从纸面到PLC的落地技巧
状态机不是画在白板上的概念,它必须精准映射到PLC资源。我们以S7-1200为例,推荐三种工业级实现方式(按可靠性排序):
方式一:绝对地址状态寄存器(最推荐)
用一个字(MW)存储当前状态码,每个状态分配唯一数值:
- MW200 = 0 → STOP
- MW200 = 1 → STAR_RUN
- MW200 = 2 → SWITCHING
- MW200 = 3 → DELTA_RUN
状态迁移用“比较+传送”指令:
// 从STOP到STAR_RUN:X0按下且无故障 LD "Start_PB" AN "Fault_Flag" AN "MW200" == K0 = "MW200" := K1 // 从STAR_RUN到SWITCHING:T37到时且KM1吸合 LD "T37" A "KM1_FB" A "MW200" == K1 = "MW200" := K2优势:状态一目了然,HMI可直接读MW200显示当前状态;故障时查MW200值即可知卡在哪步;支持在线修改状态码强制跳转(调试神器)。
方式二:位组合状态(适用于状态<8个)
用MB200的8个位分别代表8个状态,每次仅一位为1:
- M200.0 = STOP
- M200.1 = STAR_RUN
- ...
状态迁移用“置位/复位”:
// 进入STAR_RUN:先复位所有状态位,再置位M200.1 LD "Start_PB" AN "Fault_Flag" = "M200.0" := 0 // 清STOP = "M200.1" := 1 // 置STAR_RUN = "M200.2" := 0 // 清SWITCHING ...劣势:状态数受限;HMI显示需额外转换;在线修改困难。
方式三:SCL语言状态机(TIA Portal专属)
用结构化文本编写,可读性最强:
CASE State OF STOP: IF Start_PB AND NOT Fault_Flag THEN State := STAR_RUN; Y0 := TRUE; // KM1吸合 T37(IN:=TRUE, PT:=T#2S); END_IF; STAR_RUN: IF T37.Q AND KM1_FB THEN State := SWITCHING; Y0 := FALSE; // KM1断开 Y1 := TRUE; // KM2吸合 T38(IN:=TRUE, PT:=T#500MS); END_IF; END_CASE;注意:SCL虽易读,但必须配合严格的编译检查——TIA Portal的“语法检查”会提示“State未初始化”,你必须在FB初始化中写State := STOP;,否则上电首扫状态未知。
实操心得:无论用哪种方式,必须为每个状态添加超时保护。例如STAR_RUN状态,若T37运行10秒仍未收到KM1_FB信号,则强制跳回STOP并报警。我在调试某锂电池化成柜时,因未加此保护,导致KM1卡涩时PLC一直等待,耽误整批电池生产——后来所有状态都加了“Timeout_Timer”,再没出过类似问题。
4. 实操过程与核心环节实现
4.1 从需求到状态图:双工位装配站实战推演
让我们把前述理论,落地到一个具体项目:“双工位装配站”,需求如下:
- A/B工位独立运行,可同时夹紧、装配、检测;
- 每个工位有“夹紧→装配→检测→卸料”四步;
- 视觉检测结果(OK/NG)决定后续动作:OK则卸料,NG则报警并暂停该工位;
- HMI可选“单工位自动”或“双工位循环”模式;
- 急停触发时,所有动作立即停止,夹紧阀保持(防工件掉落)。
第一步:提取核心状态
不急于画梯形图,先问:整个系统有哪些不可再分的原子状态?
- 工位级:
Idle(空闲)、Clamping(夹紧中)、Assembling(装配中)、Inspecting(检测中)、Unloading(卸料中)、Alarm(报警); - 系统级:
Manual_Mode、Auto_Mode、Emergency_Stop。
第二步:绘制状态迁移图
用纸笔画出关键迁移(省略部分细节,聚焦主干):
[Idle] --(夹紧按钮按下)--> [Clamping] [Clamping] --(夹紧到位X5=ON)--> [Assembling] [Assembling] --(装配完成X6=ON)--> [Inspecting] [Inspecting] --(视觉OK)--> [Unloading] [Inspecting] --(视觉NG)--> [Alarm] [Unloading] --(卸料完成X7=ON)--> [Idle] [Alarm] --(复位按钮)--> [Idle]第三步:定义状态迁移条件与动作
这是最关键的一步,必须精确到IO点:
Clamping → Assembling条件:X5=ON AND NOT X6(夹紧到位且装配未开始);动作:Y10=ON(启动装配气缸);Inspecting → Alarm条件:X8=ON(视觉NG信号);动作:Y100=ON(报警灯),M500=ON(该工位暂停标志);Emergency_Stop状态:所有输出Y强制复位,但Y5/Y15(A/B工位夹紧阀)保持原状(用AN M900条件控制,M900=急停标志)。
第四步:分配PLC资源
- 状态寄存器:MW200(A工位)、MW202(B工位)、MW204(系统模式);
- 中间标志:M500(A工位暂停)、M501(B工位暂停)、M900(急停);
- 输出:Y0-Y9(A工位执行器)、Y10-Y19(B工位执行器)、Y100(报警灯)。
现在,梯形图只是把上述逻辑“翻译”成LD语言。你会发现,之前困扰你的“32台变频器怎么管”,答案很简单:为每台变频器定义独立状态寄存器(MW300-MW331),所有状态迁移逻辑复用同一套模板——这就是模块化的力量。
4.2 Factory IO仿真:零硬件验证思路正确性
没有实物PLC也能验证思路?Factory IO是工业界公认的“PLC思维沙盒”。它不模拟PLC指令,而是模拟物理世界响应——你画的梯形图控制虚拟气缸,气缸的伸出/缩回时间、传感器的检测延迟、电机的启停惯性,全部按真实参数建模。这才是检验思路的终极考场。
以“星三角启动”为例,在Factory IO中:
- 创建虚拟电机,设置“星形启动电流=6A,三角形运行电流=3A”;
- 添加虚拟电流表,实时显示Ia/Ib/Ic;
- 配置传感器:X1(KM1反馈)响应时间设为20ms,X2(KM2反馈)设为25ms;
然后加载你的状态机程序。观察现象:
- 若状态迁移仅依赖T37,你会看到:T37到时后,KM1断开,但KM2尚未吸合,电机瞬间失电,电流归零——这暴露了“切换间隙”的设计缺陷;
- 正确状态机应在此间隙插入“短接过渡”:在SWITCHING态,短暂同时输出Y0和Y1(<10ms),利用KM1触点弹跳时间完成切换。
Factory IO会立即用红色高亮显示“电机失电”报警,逼你修正逻辑。我在教新人时,要求他们必须用Factory IO跑通所有状态迁移,再烧录到真实PLC——这节省了80%的现场调试时间。
提示:Factory IO免费版已足够教学使用。下载后,在“设备配置”中选择“Siemens S7-1200”,导入TIA Portal生成的GSD文件,即可实现1:1仿真。热词中“factory io仿真软件下载”指向的就是这个生产力工具。
4.3 现场调试:从波形图揪出“幽灵故障”
思路再完美,现场也会遇到教科书不写的BUG。我的调试铁律是:永远相信IO信号,永远怀疑自己的逻辑。必备工具:PLC自带的“监控表” + 示波器(或PC端逻辑分析仪)。
典型场景:装配站A工位偶尔夹不紧,但监控X5(夹紧到位)有时为ON有时为OFF,无法复现。
排查步骤:
- 抓原始波形:用示波器接X5端子,发现信号有高频毛刺(500Hz),幅度达DC24V的30%;
- 查L0层逻辑:发现去抖定时器T100设为K10(10*0.1ms=1ms),远小于毛刺周期;
- 修正:将T100改为K100(10ms),并增加“连续3次采样为ON才置位M105”的软件滤波(用计数器C100实现);
- 验证:波形显示X5毛刺被完全过滤,M105稳定为ON。
另一个经典问题:“32台变频器同步启停,第17台总是慢半拍”。
- 监控Y30(VFD17使能)波形,发现其上升沿比Y0-Y16晚12ms;
- 检查梯形图,发现Y30的驱动逻辑位于程序末尾,而PLC扫描是从上到下执行;
- 解决:将所有变频器使能输出(Y0-Y31)集中放在程序最开头的独立网络中,确保它们在同一扫描周期内被刷新。
实操心得:在GX Works2中,善用“软元件测试”功能。右键X5 → “强制ON”,观察M105是否在10ms后变为ON;再强制OFF,看M105是否保持。这比现场等传感器动作快100倍。TIA Portal的“在线监视”同理,但记得开启“周期性更新”,否则看不到实时变化。
5. 常见问题与排查技巧实录
5.1 热词高频问题深度解析
Q1:“plc梯形图100实例详解,为什么我学不会第3个?”
根本原因不是例题难,而是你跳过了“实例背后的建模过程”。比如“电机正反转”实例,重点不是LD X0 OUT Y0和LD X1 OUT Y1,而是:
- 为什么必须加互锁(
AN Y1在正转支路,AN Y0在反转支路)? - 为什么停止按钮要用
LDN X2(NC触点)? - 如果正转接触器粘连,如何防止反转时短路?(答案:加硬件互锁+软件互锁双重保护)
解决方法:拿到任何实例,先用白板画出它的状态图(至少3个状态),再标出每个状态的进入/退出条件和动作。坚持10个实例后,你会发现自己能一眼看出“这个实例缺了急停状态”。
Q2:“gx works2怎么把语句表快速转为梯形图?”
这个问题本身就有陷阱。语句表(STL)是PLC的汇编语言,梯形图(LD)是图形化表达,二者不是等价翻译。GX Works2的转换功能,仅适用于结构清晰的STL(如LD X0 OUT Y0)。一旦遇到LD X0 OR X1 AN X2 OUT Y0,转换结果会是一团乱麻的并联触点。
正确路径:
- 第一步:在语句表中,用
//注释标明逻辑段(如// 夹紧控制段); - 第二步:将每段语句表,按“条件→动作”拆成独立网络;
- 第三步:用GX Works2的“插入网络”功能,手动绘制每个网络,边画边写注释。
这看似慢,但强迫你思考每一步的意图,反而加速掌握。
Q3:“一台plc控制3台变频器,程序怎么写不混乱?”
答案是:拒绝“一台PLC控制三台”,改为“PLC控制三个独立变频器单元”。
- 为每台变频器创建独立FB块(如VFD_Control),封装其所有逻辑(使能、频率给定、故障复位、运行反馈);
- 主程序只调用三次FB:
VFD1(Enable:=M100, Freq:=MW100)、VFD2(Enable:=M101, Freq:=MW101); - 所有FB共享同一套状态机模板,仅参数不同。
这样,当客户要求增加第4台,你只需复制FB调用行,无需改动任何逻辑。
5.2 独家避坑清单:那些手册不会写的血泪教训
| 问题现象 | 根本原因 | 排查技巧 | 终极解决方案 |
|---|---|---|---|
| PLC上电后输出随机动作 | 状态寄存器未初始化 | 监控MW200上电首扫值,若为随机数则确认 | 在FB的“静态变量”中初始化State := STOP;,或在OB100中强制赋值 |
| HMI模式切换后逻辑错乱 | 模式字MW100更新延迟,旧值被多次读取 | 在模式网络后加NOP 0指令,强制PLC在此处刷新所有读取 | 用“上升沿检测”读取模式变化:LD MW100 != MW100_OLD OUT M800,再用M800触发状态重置 |
| 变频器通讯偶发超时 | PLC与VFD的RS485终端电阻未接 | 用万用表测A-B线间电阻,正常应为120Ω | 在通讯链路首尾各加120Ω电阻,中间节点不接 |
| 多个定时器同时启动导致扫描周期暴涨 | 定时器未用“TONR”(保持型)或未复位 | 监控PLC的“循环时间”诊断寄存器(如S7-1200的SM0.5) | 所有定时器统一用TONR,状态迁移时用R Txx复位,避免累积误差 |
5.3 效率提升工具链:让思路落地更快
- GX Works2插件:安装“LD Checker”,它能在你画完梯形图后,自动扫描:
- 是否存在未使用的输出线圈;
- 是否有触点串联超过8个(影响扫描时间);
- 是否遗漏急停互锁(如Y0支路未加AN M900)。
- TIA Portal技巧:用“交叉引用”功能(Ctrl+Shift+X),点击Y0,立刻显示所有调用Y0的网络——排查“谁在偷偷控制这个输出”时,比手动搜索快10倍。
- 通用神技:在程序开头创建“调试网络”,用
LD M800(调试使能)控制所有