1. 入行前三年,我把PLC踩过的坑都翻了一遍
刚入行那会儿,我以为PLC编程就是拖拖梯形图、连连变量、下载程序完事。真正到了现场才发现,事情远没有这么简单——IO分配表对不上、程序框架越写越乱、通讯连不上、仿真跑不起来、设备一上电就宕机,这些问题几乎每个新手都会遇到。我入行头三年,从三菱FX系列摸到西门子S7-1200,从简单的红绿灯控制做到整条包装线的系统集成,踩过的坑、熬过的夜、被师傅骂过的次数,加起来能写一本小册子。
这篇文章是我对自己这三年实战经验的系统梳理,围绕PLC编程入门、IO分配、梯形图逻辑、西门子1200程序框架、SCADA与PLC连接、仿真调试、常见故障排查这几个核心方向,整理出90条实战经验。内容适合入行1-3年的PLC工程师、自动化相关专业的学生,以及从电气维护转岗做编程的技术人员。每条经验我都会说清楚“为什么这么做”和“不这么做会怎样”,不是干巴巴的教条,而是现场摔打出来的真实体会。
文章会比较长,建议你先收藏,遇到具体问题的时候按章节翻。我也会尽量把每个技术点讲透,让你看完能直接用到项目上。
2. 入行第一课:PLC编程入门必须搞清楚的几件事
2.1 先搞懂PLC到底在干什么
很多人学PLC一上来就背指令,这是本末倒置。PLC的本质就是一个工业控制器,它的工作模式是“输入采样→程序执行→输出刷新”循环扫描。你写的每一行梯形图,本质上都是在描述“什么条件下让哪个输出动作”。
我刚开始学的时候,师傅让我用继电器电路去理解梯形图。一个启动按钮并联一个自锁触点,再串联一个停止按钮,最后接线圈——这就是最基础的启保停电路。梯形图里的常开触点对应物理常开按钮,常闭触点对应物理常闭按钮,线圈对应接触器。你把继电器逻辑搞明白了,梯形图就通了一大半。
但PLC和继电器电路有一个关键区别:扫描周期。继电器是并行工作的,PLC是串行扫描的。这意味着如果程序写得不好,可能会出现“双线圈”问题——同一个输出线圈在程序里出现了两次,后面的覆盖前面的。我见过一个新手写的程序,气缸伸出和缩回用了同一个输出点,结果设备动作完全乱套。所以第一条经验就是:输出线圈在程序里只能出现一次,需要多处控制就用中间变量M或者置位/复位指令。
2.2 数据类型不是小事,选错了后面全是坑
PLC编程里常见的数据类型有BOOL、BYTE、WORD、DWORD、INT、DINT、REAL、TIME等。新手最容易犯的错误就是不管什么数据都用WORD或者INT,结果做浮点运算的时候精度丢失,或者做比较的时候类型不匹配。
举个实际例子:你在做一个模拟量采集,4-20mA对应0-100摄氏度。如果你用INT来存原始值,然后直接做线性变换,计算过程中很容易溢出。正确的做法是用REAL类型做浮点运算,最后再转成INT用于显示。西门子1200里,模拟量输入通道的原始值是0-27648对应4-20mA,这个系数要记牢。
还有时间数据类型。很多人用INT来存定时器时间,单位是毫秒,结果定时器时间一长就溢出了。西门子1200里应该用TIME类型,配合TON定时器使用,直接写T#5S、T#1M30S这种格式,清晰又不会出错。
2.3 编程软件的选择和基本操作
三菱用GX Works2/3,西门子用TIA Portal(博途),欧姆龙用Sysmac Studio,汇川用InoProShop(基于Codesys)。不同品牌的软件操作逻辑差异很大,但核心概念是相通的。
我建议新手先从西门子TIA Portal入手,因为它的帮助文档最完善,社区资源也最多。安装博途的时候注意版本兼容性——TIA Portal V15写的程序,V14打不开;V16的项目,V15也打不开。所以项目开始前一定要确认好版本,不然到了现场发现打不开程序,那就尴尬了。
博途里新建项目后,第一件事是配置硬件组态。CPU型号、信号模块、通讯模块都要在这里添加。硬件组态错了,程序写得再好也下载不进去。我见过有人把1214C的组态配成了1215C,结果编译一直报错,查了半天才发现是CPU型号选错了。
3. IO分配:看起来简单,做起来最容易翻车
3.1 IO分配表是程序的骨架
IO分配表就是一张表格,列出每个输入输出点的地址、名称、功能说明、信号类型。这张表看起来简单,但它是整个程序的基础。IO分配没做好,后面写程序就是一团乱麻。
我现在的习惯是:项目开始前先画一张IO分配表,用Excel做,包含以下几列——序号、地址、符号名、描述、信号类型(DI/DO/AI/AO)、常开/常闭、备注。符号名用英文或者拼音缩写,不要用中文,因为博途里中文符号名在某些版本会有兼容性问题。
IO分配有几个原则:输入点按功能模块分组,输出点按执行机构分组,预留10%-20%的备用点。比如一个气缸控制,输入是磁性开关两个(伸出到位、缩回到位),输出是电磁阀一个。那这个气缸就占2个输入1个输出。如果有10个气缸,那就是20个输入10个输出。再加上按钮、指示灯、传感器,总数就出来了。选型的时候CPU本体IO不够就加扩展模块,但要注意扩展模块的地址分配规则。
3.2 西门子1200的IO地址分配规则
西门子S7-1200的IO地址分配和S7-200、S7-300都不一样。1200的CPU本体IO地址是固定的:数字量输入从I0.0开始,数字量输出从Q0.0开始。信号模块(SM)的地址是在硬件组态里自动分配的,也可以手动修改。
这里有个坑:1200的信号模块地址是按槽位顺序分配的,不是按你插的顺序。比如你插了一个DI模块和一个DO模块,DI模块在槽位2,DO模块在槽位3,那DI的地址可能是I8.0开始,DO的地址是Q8.0开始。如果你把模块拔了重新插到别的槽位,地址就变了,程序里的地址全要改。
所以我的经验是:硬件组态确定后,把IO地址表打印出来贴在电柜门上,接线和编程都按这张表来。后期如果模块位置变了,先改硬件组态,再更新IO表,最后改程序。顺序不能乱。
3.3 模拟量IO的分配和换算
模拟量输入输出比数字量复杂得多。以西门子1200为例,模拟量输入模块SM1231的通道地址是IW64、IW66、IW68这样排列的,每个通道占2个字节。模拟量输出模块SM1232的地址是QW80、QW82这样排列。
模拟量换算的公式要记牢:对于4-20mA输入,原始值0-27648对应工程量下限到上限。比如一个压力变送器量程0-10MPa,4mA对应0MPa,20mA对应10MPa。那换算公式就是:实际压力 = (原始值 / 27648) × (10 - 0) + 0。如果变送器是2-20mA或者0-10V,系数又不一样。
我建议在程序里做一个通用的模拟量换算FC块,输入参数是原始值、量程下限、量程上限,输出是工程量。这样每个模拟量通道调用一次就行,不用重复写代码。注意做除法之前先转成REAL类型,不然整数除法会丢精度。
4. 梯形图编程:从能用到好用之间差了什么
4.1 梯形图输入与输出的区别,新手最容易搞混
梯形图里,输入信号(I点)和输出信号(Q点)的区别不仅仅是地址前缀不同。输入点是只读的,你不能在程序里给输入点赋值;输出点是可以读写的,你可以在程序里读输出点的状态,也可以给它赋值。
但这里有个关键点:输入点的状态取决于外部信号,程序扫描到输入点的时候,读到的是输入映像寄存器的值,不是物理端子的实时值。这意味着如果一个输入信号变化很快,比如一个光电传感器检测到一个快速通过的物体,程序可能扫描不到。这时候需要用中断或者高速计数器来处理。
输出点也有类似的问题。程序里给输出点赋值后,实际物理输出要在输出刷新阶段才会更新。如果一个扫描周期内你对同一个输出点多次赋值,只有最后一次有效。这就是为什么前面说输出线圈只能出现一次。
还有一个新手常犯的错误:用输入点做自锁。比如启动按钮I0.0,停止按钮I0.1,输出Q0.0。正确的写法是I0.0常开并联Q0.0常开,再串联I0.1常闭,最后接Q0.0线圈。如果你写成I0.0常开并联I0.0常开,那就没有自锁效果,按钮一松输出就断了。
4.2 程序框架:好的框架让后期维护省一半时间
我见过太多新手写的程序,所有逻辑都堆在OB1里,几百行梯形图从头写到尾,没有注释,没有分段,没有FC/FB。这种程序自己能跑,但别人接手就是灾难,甚至过两个月自己都看不懂。
一个好的程序框架应该分层:OB1负责调用,FC/FB负责具体功能,DB负责数据存储。我的习惯是:
- OB1里只放初始化调用、模式选择、报警处理、主控调用
- 每个功能模块写成一个FB,比如气缸控制FB、电机控制FB、模拟量处理FB
- 每个FB有自己的背景DB,数据存在DB里,不占用M区
- 报警和状态用全局DB统一管理
这样做的好处是:功能模块可以重复调用,参数通过接口传递,修改一个地方所有调用处都生效。比如你有10个气缸,写一个气缸FB,调用10次,每次传入不同的IO地址和参数就行。后期要改气缸动作逻辑,只改FB就行,不用改10个地方。
4.3 常用梯形图指令的实战用法
置位/复位(S/R):适合控制需要保持状态的输出,比如电机启动后保持运行,直到按下停止。但要注意,置位和复位如果用在同一个输出上,要确保不会同时触发。我一般会在置位前串联复位条件,复位前串联置位条件,避免冲突。
定时器(TON/TOF/TP):TON是接通延时,TOF是断开延时,TP是脉冲定时器。新手最容易搞混TON和TOF。记住:TON是输入接通后开始计时,计时到了输出接通;TOF是输入断开后开始计时,计时到了输出断开。做设备延时启动用TON,做风扇延时关闭用TOF。
计数器(CTU/CTD/CTUD):CTU是加计数,CTD是减计数,CTUD是加减计数。计数器一般配合比较指令使用。比如产量统计,用CTU计数,当计数值达到设定值时触发报警或者换箱。
比较指令(CMP):等于、大于、小于、大于等于、小于等于、不等于。比较指令在模拟量处理、位置控制、配方管理中用得很多。注意比较指令的数据类型要一致,INT和REAL不能直接比较。
移动指令(MOVE):把一个值赋给另一个变量。MOVE指令在初始化、数据传递、配方切换时很常用。注意MOVE指令的数据长度要匹配,BYTE不能直接MOVE到WORD,需要转换。
5. 西门子1200程序框架:从零搭建一个可复用的项目模板
5.1 硬件组态和网络配置
拿到一个1200的项目,第一步是硬件组态。在博途里新建项目,添加CPU型号,然后添加信号模块、通讯模块、触摸屏等设备。如果是分布式IO,还要添加ET200SP或者ET200M站,配置PROFINET网络。
PROFINET网络配置有个细节:设备名称和IP地址要提前规划好。CPU、触摸屏、远程IO、变频器、伺服驱动器,每个设备的名称和IP都要唯一。我一般用“设备类型+编号”的命名规则,比如PLC-01、HMI-01、ET200-01、VFD-01。IP地址按网段划分,比如PLC是192.168.0.1,触摸屏是192.168.0.2,远程IO从192.168.0.10开始。
组态完成后,编译整个项目,确保没有错误。然后下载硬件组态到CPU,下载之前确认CPU的IP地址和电脑在同一网段。如果连不上,检查网线、网卡设置、防火墙。我遇到过好几次是因为电脑开了防火墙,博途搜索不到设备,关了防火墙就好了。
5.2 定义数据类型和全局DB
程序框架的核心是数据结构。我一般会定义几个全局DB:
- IO_DB:存放所有IO点的映射,输入输出都映射到这个DB里,程序里用DB里的变量,不用直接访问I/Q地址。这样做的好处是后期硬件地址变了,只改IO_DB的映射就行,不用改程序逻辑。
- Param_DB:存放设备参数,比如速度设定、时间设定、温度设定、配方数据。
- Alarm_DB:存放报警信息,每个报警一个BOOL位,配合报警文本。
- Status_DB:存放设备状态,运行、停止、故障、手动、自动等。
定义DB的时候,变量命名要规范。我习惯用“设备_功能_类型”的格式,比如Cylinder1_Extend_Sensor、Motor1_Run_CMD、Valve1_Open_Feedback。这样一看名字就知道是什么信号,不用翻IO表。
5.3 编写可复用的FB块
以气缸控制FB为例,接口参数包括:伸出指令、缩回指令、伸出到位信号、缩回到位信号、伸出输出、缩回输出、超时时间、手动/自动模式。FB内部逻辑包括:手动模式下直接响应指令,自动模式下按顺序动作,超时报警,互锁保护。
写FB的时候要注意:接口参数的数据类型要明确,输入输出要分开。Input是外部传入的,Output是FB输出的,InOut是既能读又能写的。静态变量存在背景DB里,FB每次调用都会保留上次的值。
气缸FB写好后,在OB1里调用10次,每次分配不同的背景DB,传入不同的IO地址。这样10个气缸的控制逻辑就完成了,代码量比直接写10遍少得多,而且后期维护方便。
5.4 报警处理和模式管理
报警处理是程序框架里很重要的一块。我一般把报警分成三类:故障报警(需要停机处理的,比如电机过载、气压低)、警告报警(不影响运行但需要提醒的,比如温度偏高、产量接近目标)、提示信息(操作提示,比如请放料、请取件)。
报警用BOOL数组或者结构体来管理,每个报警位对应一个报警文本。在HMI上做一个报警画面,用报警控件显示当前报警和历史报警。西门子1200的报警可以在CPU里做,也可以在HMI里做。我一般简单报警在HMI里做,复杂报警在CPU里做,通过DB传递报警位。
模式管理一般分手动、自动、维护三种模式。手动模式下每个动作单独控制,用于调试和故障处理;自动模式下按流程运行;维护模式下可以强制输出、屏蔽传感器。模式切换要有互锁,比如自动运行中不能直接切到手动,要先停止当前流程。
6. SCADA与PLC连接:数据采集和上位机监控
6.1 SCADA和PLC的通讯方式
SCADA(数据采集与监视控制系统)和PLC连接,常见的方式有:OPC UA、Modbus TCP、PROFINET、S7通讯、MQTT等。不同品牌PLC支持的协议不一样,西门子1200支持OPC UA、S7通讯、Modbus TCP;三菱支持MC协议、Modbus;汇川支持Modbus、OPC UA。
选择通讯方式要考虑几个因素:实时性要求、数据量大小、网络环境、上位机软件支持情况。如果只是做数据采集和监控,OPC UA或者Modbus TCP就够了;如果需要高速数据交换,PROFINET或者S7通讯更合适。
我做过一个项目,上位机用WinCC,PLC用1200,通过S7通讯连接。配置的时候要在博途里把CPU的“允许来自远程对象的PUT/GET通信访问”勾上,然后在WinCC里建立S7连接,指定PLC的IP地址和机架槽号。这个选项不勾,WinCC就连不上PLC,我当初找了半天才发现。
6.2 数据点表的规划和映射
SCADA和PLC连接之前,要规划好数据点表。哪些数据需要上传到SCADA,哪些数据需要在SCADA上显示,哪些数据需要在SCADA上修改后下发给PLC,都要提前列清楚。
数据点表一般包含:点名、PLC地址、数据类型、读写权限、量程、单位、报警限值。我习惯用Excel做数据点表,然后导入到SCADA软件里。这样比在SCADA里一个个手动添加快得多,而且不容易出错。
数据映射的时候要注意:PLC里的数据类型和SCADA里的数据类型要对应。PLC里是INT,SCADA里也要用INT;PLC里是REAL,SCADA里也要用REAL。如果类型不匹配,数据显示会乱码或者数值错误。我见过一个项目,PLC里温度是REAL类型,SCADA里配成了INT,结果显示的温度是实际值的整数部分,小数全丢了。
6.3 上位机画面的设计要点
SCADA画面设计不是越花哨越好,关键是信息清晰、操作方便、报警醒目。我一般把画面分成几个区域:顶部是标题栏和报警条,左侧是导航菜单,中间是主监控画面,底部是状态栏。
主监控画面用工艺流程图的形式展示设备状态,运行中的设备用绿色,停止的用灰色,故障的用红色闪烁。关键参数用数字显示,重要数据用趋势图展示。操作按钮要加确认对话框,防止误操作。
报警画面要能按时间、等级、确认状态筛选。报警发生时要有声音提示,操作员确认后声音停止。报警记录要能导出,方便事后分析。
7. 仿真调试:不接硬件也能把程序跑起来
7.1 S7-PLCSIM Advanced的安装和配置
S7-PLCSIM Advanced是西门子1200/1500的仿真软件,可以在电脑上模拟PLC运行,不需要实际硬件。安装的时候要注意版本兼容性——PLCSIM Advanced V3.0支持TIA Portal V15.1及以上,V4.0支持V16及以上。安装之前先装TIA Portal,再装PLCSIM Advanced,顺序反了可能装不上。
安装完成后,在博途里打开项目,点击“启动仿真”按钮,博途会自动调用PLCSIM Advanced。如果启动不了,检查几个地方:PLCSIM Advanced的服务有没有启动、防火墙有没有拦截、虚拟网卡有没有安装。我遇到过PLCSIM Advanced启动不了且没有报错的情况,后来发现是Windows的Hyper-V和PLCSIM Advanced冲突,关了Hyper-V就好了。
7.2 仿真启动不了error11的排查思路
PLCSIM Advanced启动报error11,一般是网络配置问题。PLCSIM Advanced会创建一个虚拟网卡,IP地址默认是192.168.0.1。如果这个IP和你的实际网卡冲突,就会报error11。
解决办法:打开PLCSIM Advanced的控制面板,修改虚拟网卡的IP地址,换一个不冲突的网段。然后在博途里把CPU的IP地址也改成同一网段。如果还是不行,卸载PLCSIM Advanced重新安装,安装的时候选择“修复”或者“更改”,确保虚拟网卡驱动正确安装。
还有一个常见问题是PLCSIM Advanced的授权。没有授权的话,仿真只能运行21天,到期后需要重新激活。如果授权有问题,PLCSIM Advanced会启动失败,但报错信息可能不明确。检查授权管理器里的授权状态,确保PLCSIM Advanced的授权有效。
7.3 仿真环境下的程序调试技巧
仿真环境下调试程序,最大的好处是可以随时修改、随时下载,不用担心损坏硬件。我一般用仿真做这几件事:验证逻辑正确性、测试报警和互锁、调试PID参数、模拟故障场景。
调试的时候可以用PLCSIM Advanced的监控表,强制输入输出点的状态,观察程序响应。比如强制一个输入点为TRUE,看对应的输出是否按预期动作。也可以用PLCSIM Advanced的序列功能,按时间顺序自动改变输入状态,模拟实际运行过程。
注意:仿真环境下有些功能用不了,比如高速计数器、运动控制、某些通讯功能。这些功能需要实际硬件才能测试。所以仿真通过的程序,到现场还要再调试一遍。
8. 常见故障排查:PLC宕机、通讯失败、程序跑飞
8.1 PLC宕机的常见原因和排查方法
PLC宕机是指CPU停止运行,所有输出进入安全状态。常见原因有:程序死循环、扫描周期超时、内存溢出、电源波动、硬件故障。
程序死循环一般发生在WHILE或者FOR循环里,循环条件永远不满足,CPU一直在循环里出不来。扫描周期超时是程序执行时间超过了CPU设定的最大扫描周期,CPU会报错并停机。内存溢出是程序或者数据占用的内存超过了CPU的容量。
排查方法:先看CPU的诊断缓冲区,里面有详细的错误信息。如果是扫描周期超时,优化程序结构,把耗时的操作放到中断里执行。如果是内存溢出,检查DB块的大小,删除不用的变量。如果是电源波动,检查供电电源和接地。
我遇到过一次PLC宕机,诊断缓冲区显示“扫描周期超时”。查了半天发现是一个FOR循环里做了大量浮点运算,循环次数设成了10000次。后来把循环次数降到100次,问题解决。所以写循环的时候一定要设上限,不能无限循环。
8.2 通讯失败的排查步骤
通讯失败是PLC项目里最常见的问题之一。排查步骤:先查物理层,再查协议层,最后查应用层。
物理层:网线有没有插好、水晶头有没有做对、交换机有没有通电、网口指示灯亮不亮。我遇到过好几次是网线水晶头松动,重新压一下就好了。
协议层:IP地址对不对、子网掩码对不对、设备名称对不对、通讯端口对不对。用ping命令测试网络通不通,用博途的“在线访问”测试能不能搜到设备。
应用层:通讯配置对不对、数据地址对不对、数据类型对不对。比如Modbus通讯,从站地址、寄存器地址、数据类型都要匹配。我见过一个项目,Modbus从站地址设成了1,但程序里读的是地址2,结果一直读不到数据。
8.3 程序跑飞的典型场景和预防措施
程序跑飞是指程序执行结果和预期不符,但CPU没有报错。典型场景有:双线圈、地址冲突、数据类型不匹配、中断嵌套、指针越界。
双线圈前面说过了,同一个输出线圈出现两次,后面的覆盖前面的。地址冲突是两个变量用了同一个地址,比如M10.0和M10.1是同一个字节的不同位,如果程序里同时用了这两个位,可能会互相影响。数据类型不匹配是比较或者运算时类型不一致,导致结果错误。
预防措施:程序编译后看交叉引用表,检查有没有地址冲突和双线圈。博途的交叉引用功能可以列出每个地址在哪些地方被使用,很方便排查。另外,程序下载前先做一次全编译,确保没有警告和错误。
9. 90条实战经验速查表
下面是我整理的90条实战经验,按类别分组,每条都是现场踩过的坑或者总结的技巧。建议收藏,遇到问题的时候按类别翻。
9.1 编程习惯类(1-15条)
- 输出线圈在程序里只能出现一次,多处控制用M变量或S/R指令。
- 每个FB/FC都要写注释,说明功能、输入输出、调用条件。
- 变量命名用英文或拼音,不要用中文,避免兼容性问题。
- 程序分段写,每个功能一个网络段,段前加标题。
- 模拟量换算做成通用FC,不要每个通道重复写。
- 定时器时间用TIME类型,不要用INT存毫秒。
- 浮点运算前先转REAL,整数除法会丢精度。
- 比较指令的数据类型要一致,INT和REAL不能直接比较。
- 循环要有上限,不能无限循环。
- 中断程序要短小精悍,不要放耗时操作。
- 程序下载前先全编译,检查警告和错误。
- 用交叉引用表检查地址冲突和双线圈。
- 重要参数存在DB里,不要用M区,M区掉电不保持。
- 程序版本用日期+版本号命名,方便追溯。
- 定期备份程序,至少保留三个版本。
9.2 IO分配类(16-30条)
- IO分配表用Excel做,包含地址、符号名、描述、信号类型。
- 输入点按功能模块分组,输出点按执行机构分组。
- 预留10%-20%的备用IO点。
- 硬件组态确定后打印IO表贴在电柜门上。
- 1200的信号模块地址按槽位顺序分配,不是按插入顺序。
- 模拟量输入通道地址是IW64、IW66、IW68这样排列。
- 模拟量输出通道地址是QW80、QW82这样排列。
- 4-20mA对应0-27648,换算公式要记牢。
- 模拟量换算先转REAL再做除法。
- 输入点是只读的,不能在程序里赋值。
- 输出点可以读写,但一个扫描周期内只有最后一次赋值有效。
- 快速变化的输入信号要用中断或高速计数器。
- 输入滤波时间要合理设置,太短会抖动,太长会延迟。
- 输出点驱动感性负载要加续流二极管。
- 备用IO点也要接线到端子排,方便后期扩展。
9.3 梯形图编程类(31-45条)
- 启保停电路:启动常开并联输出常开,串联停止常闭。
- 置位复位不能同时触发,要加互锁。
- TON是接通延时,TOF是断开延时,不要搞混。
- 计数器配合比较指令使用,实现产量统计和报警。
- MOVE指令的数据长度要匹配,BYTE不能直接MOVE到WORD。
- 比较指令用于模拟量处理、位置控制、配方管理。
- 手动/自动模式切换要有互锁。
- 自动流程用步序控制,每一步一个状态。
- 步序切换条件要明确,避免死循环。
- 报警用BOOL数组管理,每个报警位对应一个文本。
- 报警分故障、警告、提示三类,处理方式不同。
- 模拟量滤波用平均值或者一阶滞后。
- PID参数先整定P,再整定I,最后整定D。
- 运动控制指令要配合工艺对象使用。
- 程序框架分层:OB1调用,FC/FB功能,DB数据。
9.4 西门子1200类(46-60条)
- 博途版本兼容性要注意,V15的项目V14打不开。
- 硬件组态先配CPU,再配信号模块和通讯模块。
- PROFINET设备名称和IP地址要提前规划。
- 下载硬件组态前确认电脑和CPU在同一网段。
- 防火墙可能拦截博途搜索设备,关了再试。
- 允许PUT/GET通信访问要勾上,否则SCADA连不上。
- 1200的M区掉电不保持,重要数据存DB。
- DB块要勾选“优化的块访问”还是“标准访问”要想清楚。
- 优化的DB访问速度快,但不能用绝对地址。
- 标准DB可以用绝对地址,但访问速度慢。
- FC没有背景DB,FB有背景DB。
- FB的静态变量存在背景DB里,每次调用保留上次值。
- 多重背景可以节省DB数量,但要注意实例化。
- 中断OB要分配优先级,优先级高的先执行。
- 诊断缓冲区是排查故障的第一手资料。
9.5 仿真调试类(61-75条)
- PLCSIM Advanced安装前先装TIA Portal。
- PLCSIM Advanced和Hyper-V冲突,关了Hyper-V再试。
- 启动不了error11一般是虚拟网卡IP冲突。
- 修改虚拟网卡IP到不冲突的网段。
- 仿真授权只有21天,到期要重新激活。
- 仿真环境下高速计数器、运动控制用不了。
- 用监控表强制输入输出,观察程序响应。
- 用序列功能模拟实际运行过程。
- 仿真通过的程序到现场还要再调试。
- 仿真调试PID参数很方便,不用接实际设备。
- 仿真环境下可以模拟故障场景,测试报警逻辑。
- PLCSIM Advanced支持多个实例,可以模拟多PLC通讯。
- 仿真下载前确认CPU型号和实际一致。
- 仿真环境下程序扫描周期和实际有差异。
- 仿真调试记录要保存,方便和现场调试对比。
9.6 通讯和SCADA类(76-90条)
- SCADA和PLC连接先规划数据点表。
- 数据点表包含点名、地址、类型、权限、量程、单位。
- PLC和SCADA的数据类型要对应,INT对INT,REAL对REAL。
- OPC UA适合跨平台数据采集,Modbus TCP适合简单通讯。
- S7通讯要在博途里勾选PUT/GET访问。
- WinCC建立S7连接要指定IP地址和机架槽号。
- Modbus通讯从站地址、寄存器地址、数据类型要匹配。
- 通讯失败先查物理层,再查协议层,最后查应用层。
- 用ping测试网络通不通,用在线访问测试设备搜不搜得到。
- 网线水晶头松动是通讯故障的常见原因。
- SCADA画面设计信息清晰、操作方便、报警醒目。
- 运行设备绿色,停止灰色,故障红色闪烁。
- 操作按钮加确认对话框,防止误操作。
- 报警记录要能导出,方便事后分析。
- 数据趋势图比数字显示更直观,重要参数都要做趋势。
10. 从新手到熟手,我踩过的那些坑
入行第一年,我写了一个红绿灯程序,觉得自己挺厉害。师傅看了一眼说:“你这个程序,黄灯和红灯同时亮的时候,东西向和南北向的车都停了,路口直接堵死。”我当时没考虑全红时间,后来加了2秒全红,问题解决。这件事让我明白,PLC程序不是逻辑对了就行,还要考虑实际工艺。
第二年做包装线项目,IO点有200多个,我一开始没做IO分配表,直接对着电柜接线写程序。写到一半发现地址对不上,又回头查线,浪费了两天时间。从那以后,我养成了先做IO表再编程的习惯,再也没犯过这种错误。
第三年做SCADA项目,WinCC连不上1200,我查了半天网络,最后发现是博途里没勾“允许PUT/GET通信访问”。这个选项默认是不勾的,但不勾的话S7通讯用不了。后来我把这个设置写进了自己的项目检查清单,每次做SCADA项目都先确认这个选项。
还有一次,程序在仿真里跑得好好的,到现场一上电就宕机。诊断缓冲区显示扫描周期超时,查了半天发现是一个FOR循环里做了大量浮点运算。仿真环境下电脑CPU快,扫描周期没超;实际PLC的CPU慢,扫描周期就超了。从那以后,我写循环都会设上限,而且尽量把耗时操作放到中断里。
这些坑说起来都是小事,但每一个都让我长了记性。PLC编程这件事,经验比理论重要,现场比仿真重要。你可以在电脑上把程序写得完美无缺,但到了现场,一个接线错误、一个参数设置不对、一个干扰信号,就能让程序跑飞。所以多动手、多记录、多总结,才是从新手到熟手的唯一路径。
最后分享一个小技巧:我习惯在项目结束后写一份“项目复盘”,记录这个项目遇到的问题、解决方法、下次要注意的地方。这份复盘存在电脑里,下次做类似项目的时候翻出来看看,能避免很多重复踩坑。三年下来,我的复盘文档已经有几十份了,这比任何教程都管用。