做水处理项目这些年,我最大的体会是:现场逻辑翻来覆去就那么几件事。原水提升泵、加药泵、过滤反洗阀、恒压供水,说白了就是泵阀切换、模拟量采集、PID调节、变频器通讯和报警联锁。所以每当有朋友问我“西门子1200PLC怎么入门水处理”,我通常不会丢一本手册给他,而是建议先找一套结构清晰、注释完整的程序模板拆着看。这套基于博图V16的1200PLC水处理程序模板,正是我从多个水站项目里整理出来的学习骨架:CPU用1214C,配模拟量模块和RS485通信模块,覆盖了从底层仪表到上位监控的完整链路。它不是什么高深代码,但能帮你少走很多弯路,尤其是刚接触S7-1200和博图V16的人。
1. 水处理控制需求梳理:为什么值得有一套“模板”
1.1 水站现场到底需要PLC管哪些事
一个常规的市政或工业水处理站,工艺段大致是:原水提升、加药混合、絮凝沉淀、过滤、反冲洗、消毒,最后进入清水池并外送。每个工艺段的控制对象不一样,原水段是提升泵和液位计,加药段是计量泵和pH仪、流量计,过滤段是电动阀门和压差开关,外送段是变频恒压供水泵和压力变送器。
PLC在水站里其实就干三类活:一是数据采集,把液位、压力、流量、pH、浊度、余氯这些仪表信号读进来,转成工程值,送到触摸屏和上位机;二是顺序控制和联锁,比如反冲洗必须按“先关进水阀、再开反洗阀、然后启反洗泵”这样的顺序来,任何一个阀门反馈不到位都不能进行下一步;三是闭环调节,比如加药泵根据进水流量或余氯偏差自动调节频率,供水泵根据管网压力自动调速。
这三类活听着简单,但组合到一起就容易乱。尤其是泵阀之间的联锁关系,如果一个项目从头编写,可能要写半个多月,试车阶段还会频繁爆出“泵没停就关阀”“低水位还启动泵”这些低级问题。把成熟的逻辑固化成模板,本质上就是把工艺经验代码化,让新项目在正确骨架上生长。
1.2 为什么是S7-1200和博图V16,而不是200 Smart或1500
做水处理项目,选型时经常在S7-200 Smart、S7-1200、S7-1500三者之间犹豫。S7-200 Smart价格确实便宜,小型净水器、单泵房足够用,但它的PID、网络通信和Online调试体验都偏弱。S7-1500性能强劲,适合几百上千点的中型水厂,但成本也摆在那里,很多小型水站根本用不到那么高的运算能力和通信带宽。
S7-1200恰好卡在中间。CPU1214C本体带14个数字量输入、10个数字量输出,可以扩展信号模块和通信模块,内部支持PID_Compact、运动控制、OPC UA、PROFINET和MODBUS TCP,入门时拿它学,项目上拿它用,过渡非常平滑。博图V16这个版本对1200的指令支持已经很完善,而且和WinCC集成在一起,做触摸屏和上位机也很方便。我在模板里选择博图V16,还有一个原因是它的仿真实用性高:PLCSIM可以模拟大部分功能块,学习时不需要整天抱着真实PLC。
要提醒一句,如果你下载的例程是博图V13或V14做的,直接放到V16里打开时可能提示升级,升级本身一般没问题,但要注意个别工艺对象如PID_Compact的版本兼容性,有时候需要在属性里手动迁移。
1.3 模板定位:不是一个写死的工程,而是一套“工艺骨架”
我管这套程序叫“工艺骨架”,因为它不是把某个水厂的点位表一抄完事,而是把所有水处理工艺里通用的东西抽出来,统一命名,统一结构。比如模拟量仪表全部用UDT定义,泵阀全部用标准FB实例,报警位统一规划到报警DB。这样不管换到哪个项目,程序里的功能块名称、变量结构都差不多,维护成本会直线下降。
对学习的人而言,模板的价值在于能“顺着抄”。抄不是可耻的事,关键是抄也要理解每段逻辑为什么这么写。比如你想搞清楚“为什么泵故障后不能自动复位”,就得去FB里看故障反馈怎么锁存的;想搞清楚“为什么反洗过程要分步”,就得去顺序控制块里看步进条件。模板提供了一个可以提问的起点,而不是一份只能照着敲的代码。
2. 模板的整体设计:硬件组态与软件架构
2.1 硬件清单与I/O地址规划
模板里,我选了一套在很多小水站里都很常见的硬件组合。CPU是1214C DC/DC/DC,本体自带14DI/10DQ,另外挂一块SM1231 AI 8通道模拟量输入模块,一块SM1232 AQ 2通道模拟量输出模块,再加一块CM1241 RS485通信模块用于带变频器。触摸屏用KTP700 Basic PN,走PROFINET连接PLC。
硬件选型时要注意,AI模块的通道类型一定要和现场仪表匹配。水处理现场绝大多数压力、液位、流量变送器都是两线制4-20mA,所以SM1231的通道要配置成4-20mA,量程对应0到27648。如果接的是热电阻或热电偶,就得换专门的RTD模块或TC模块,普通AI模块读不了。
I/O地址规划上,我习惯把数字量输人输入集中放在I0.0到I0.13,数字量输出放在Q0.0到Q0.9,模拟量放在IW64、IW80这类连续地址段。这样做的理由是监控表、触摸屏变量表和现场接线图能一一对应,调试时一眼就能看出某个信号有没有进到PLC。
硬件配置的完整清单大致如下:
| 模块 | 型号 | 用途 |
|---|---|---|
| CPU | CPU 1214C DC/DC/DC | 主控制器 |
| AI模块 | SM1231 AI 8×13bit | 接收4-20mA仪表信号 |
| AO模块 | SM1232 AQ 2×14bit | 输出频率给定或调节阀开度 |
| 通信模块 | CM1241 RS485/422 | Modbus RTU带变频器 |
| HMI | KTP700 Basic PN | 现场监控与操作 |
如果你拿到的项目不是这个配置,也没关系。模板里的地址映射做成了独立的DB,改动时集中修改一个“硬件配置文件”就行,不需要满程序翻地址。
2.2 程序结构:OB、FB、FC、DB是怎么分工的
这套模板的程序结构并不复杂,但分工很明确。OB1是主循环,负责扫描运行所有调用;OB100是启动初始化,上电时执行一次,用于设置默认值、清报警保持、给PID写初始参数;OB35是循环中断,每100ms执行一次,专门调用PID调节功能块,保证控制周期稳定。
FB是模板里的主角。泵控制、阀控制、PID调节、恒压供水这些带状态和背景数据的逻辑,全部做成了FB,每次调用都有自己的背景DB。比如FB100泵控制,实例DB叫DB100_原水提升泵,再调用一次,实例DB叫DB101_外送泵,同一段代码可以被多个设备复用。FC则用在无状态的逻辑上,比如模拟量断线判断、工程量转换、Modbus通讯错误代码解析,这类逻辑不需要保持状态,用FC更简单。
全局DB用来存报警字、联锁状态、设备调度结果和配方参数。这样做的最大好处是:上位机或HMI只要读一个DB,就能拿到所有设备的运行状态和报警信息;写一个DB,就可以设置工艺参数。
程序调用链可以这样理解:OB100启动初始化,然后OB35里跑PID,OB1里按顺序调用泵阀FB、顺序控制块、报警处理块和通信快。相当于一套车间流水线,每个工位干固定的事,谁都不会乱插队。
2.3 UDT:把仪表和设备定义成“数据结构”
模板中用了大量UDT,这是很多初学者容易忽略的关键点。UDT可以理解成自定义的数据结构,比如水站里有24台模拟量仪表,每个都需要存储原始值、工程值、量程上下限、报警值、断线状态,如果每个点都在DB里单独建变量,DB会变得又臭又长。
所以在模板里我定义了一个UDT300_AI仪表结构。它的成员包括:
- RawValue:Int,对应AIW原始值
- ScaledValue:Real,转换后的工程值
- ScaleMin、ScaleMax:Real,量程上下限
- HighAlarm、LowAlarm:Bool,高低报警
- Deadband:Real,报警死区
- Fault:Bool,断线或超量程故障
然后在全局DB里声明一个数组:DB100_AIData[1..24] OF UDT300_AI。以后新增仪表,只需要改数组下标和硬件组态,功能块不需要动。这个做法对泵阀设备也一样,UDT310_Device包含启停命令、运行反馈、故障反馈、手动自动开关、运行时间累计等成员,任何一台泵、一台阀都能套用。
用UDT的另一个好处是让HMI联调简单。触摸屏变量表里直接拖出DB数组的第一项,再通过“多重实例编辑器”批量生成画面,比逐个建变量高效得多。
3. 关键功能块实现与实操要点
3.1 模拟量采集与工程量转换:从AIW到工程值的一步到位
模拟量处理是水处理程序里的基本功。博图硬件组态里虽然可以配置AI模块的量程,但实际工程里我更习惯在程序里自己写转换功能块。原因很简单:硬件配置的量程转换只能告诉你当前百分比,断线检测和滤波还得自己写,不如集中到一个FC里统一处理。
我写了一个FC300_AI_Scale,输入是模拟量原始值、量程上下限和零点对应值,输出是工程值和故障位。核心逻辑用SCL写出来大概是这样:
FUNCTION FC300 : Void VAR_INPUT RawValue : Int; // AIW原始值 RawZero : Real; // 量程零点对应的原始值,通常0.0 RawFull : Real; // 满量程对应的原始值,通常27648.0 ScaleMin : Real; // 工程值下限 ScaleMax : Real; // 工程值上限 END_VAR VAR_OUTPUT ScaledValue : Real; // 转换后的工程值 Fault : Bool; // 断线或超限 END_VAR VAR_TEMP RawReal : Real; END_VAR具体的转换式:
#RawReal := INT_TO_REAL(#RawValue); IF #RawValue <= 0 OR #RawValue >= 27648 THEN #Fault := TRUE; #ScaledValue := #ScaleMin; ELSE #Fault := FALSE; #ScaledValue := (#RawReal - #RawZero) / (#RawFull - #RawZero) * (#ScaleMax - #ScaleMin) + #ScaleMin; END_IF;需要说明的是,S7-1200的4-20mA信号在断线或者超限时,原始值往往不是简单跳变到0,而是会出现极端负值或某些溢出标志。所以我加了“RawValue <= 0 或者 RawValue >= 27648”这个判断,作为简单断线监测。如果你的仪表更精确,可以在模块属性里启用“断线诊断”,CPU诊断缓冲区会给出具体通道号,但程序里也需要同步做逻辑联锁。
工程量转换后,我还会在OB35里做一阶滤波,防止液位和压力信号毛刺导致误报警。滤波系数大概取0.2到0.5,系数太小响应慢,太大滤不掉干扰。这个要根据现场实际情况调整,模板里给的是初始可调值。
3.2 泵阀控制:手动/自动/互锁/轮换
水处理站里泵和阀是最核心的执行设备。模板里的FB100泵控制块,把泵的控制分成了手动和自动两个通道。手动模式下,HMI或者面板按钮直接给启动命令;自动模式下,由液位、压力、时间或者顺序逻辑满足条件后触发启动。无论哪个通道,最终都要经过联锁条件检查:比如原水低位、清水池高水位、设备故障、变频器故障、急停信号,任何一个为真,泵都不能启动或者要立即停止。
为了防止继电器抖动,泵的启动命令我习惯用SR触发器实现。置位条件是启动指令加上联锁通过,复位条件是停止指令、故障反馈或联锁断开。这样即使启动按钮被按一下马上就松开,输出也能保持住。如果直接用简单的“与或”逻辑,可能会出现按钮一松泵就停的现象。
泵故障检测要特别注意“启动确认时间”。实际项目中,泵刚启动时反馈信号不会立刻变成TRUE,如果在第一个扫描周期就判断“运行反馈为FALSE并报故障”,系统会误报警。我一般在FB里加一个延时定时器:启动命令发出0.5秒到2秒后,如果反馈仍未到位,才认定启动失败。同样,停止时也要加一段延时判断反馈是不是真的断开,防止接触器卡死。
模板里还写了泵组轮换逻辑。比如两用一备的三台泵,程序会根据每台泵累计运行时间,自动选择运行时间最短的一台作为下一次优先启动。这样可以均衡磨损,避免一台泵常年运行、另一台常年闲置。轮换启动在每次泵停止后进行一次判断,不能在运行中突然切换,否则会对管网压力造成冲击。
3.3 PID调节功能:加药与恒压
水处理里的PID调节,最常见两处:加药泵根据流量或余氯调节加药量,外送泵根据管网压力调节变频频率。博图V16里自带的PID_Compact功能块很好用,但在实际项目里很多人第一次调用就被它搞晕。
PID_Compact的调用非常简单:
"PID_Compact_1"( Input := #PV, Setpoint := #SP, ManualEnable := #ManualMode, ManualValue := #ManualCV, Output := #CV );关键不在调用,而在参数整定。模板里我默认给PID_Compact设置如下初始值:比例增益P=1.0,积分时间I=60秒,微分时间D=0秒,采样时间在OB35里设为100ms。这几个值不是最优值,但能保证系统在一个相对稳定的起点运行。
正反作用方向是新手最容易踩的坑。加药这个场景,当余氯实测值高于设定值时,应该减少加药泵输出,这是“反作用”;而恒压供水场景,当管网压力低于设定值时,应该增加变频器频率,这是“正作用”。PID_Compact里需要在Advanced参数中设置逆作用模式。如果设反了,控制回路会越跑越偏,最终不是全开就是全关。
PID输出限幅也要提前设好。变频器频率给定一般对应0到50Hz,或者0到100.0的百分数。模板里把输出上限设为100.0,下限设为0.0,避免PID运算瞬间输出一个负值或大于100的值,把变频器或调节阀吓一跳。
整定口诀很简单:先纯比例,P由小往大调,观察输出是不是能跟手设定值;再加积分消除余差;微分尽量不用。水处理对象大多是大惯性、大滞后,D参数容易把干扰放大,得不偿失。
3.4 变频器通讯:Modbus RS485与PROFINET
水处理现场的变频器五花八门,ABB、森兰、汇川、三菱都有。用S7-1200带变频器,串口方案里最常用的协议就是Modbus RTU。模板里我用CM1241 RS485模块,调用博图自带的MB_COMM_LOAD和MB_MASTER指令,和ABB变频器或森兰SB200系列通信。
通信配置流程我总结为四步:第一步,在OB100里调用MB_COMM_LOAD,把CM1241端口参数配置为波特率9600、8数据位、偶校验、1停止位,波特率要跟变频器侧一致;第二步,确定从站地址,比如1号泵变频器地址设为1;第三步,在OB1里调用MB_MASTER,读取保持寄存器和写控制字;第四步,把读写到的数据映射到变频器运行标志、频率设定、电流反馈等变量上。
一个典型的MB_MASTER调用参数包括从站地址、功能码(03读保持寄存器、06写单个寄存器)、起始地址和数据长度。比如要写频率,一般是保持寄存器地址40001,对应Modbus地址0,写入值按变频器手册换算,有些变频器0到16384表示0到50Hz,有些按百分数,倍数关系不同。
这里有个很重要的坑:同一个RS485端口,只能有一个Modbus主站实例。我看到好几个人在模板基础上加了一个新的MB_MASTER,程序编译没问题,但变频器怎么都通信不上,原因就是两个MB_MASTER同时去抢占同一个串口,总线冲突了。解决办法是只保留一个MB_MASTER,把读写多个寄存器的请求合并到同一个数据区里;或者用轮询定时器,把多个变频器的读写放在一个循环里分时执行。
如果现场变频器支持PROFINET,那更简单。模板里也可以直接挂IO设备,把ABB传动装置通过GSD文件组态成PROFINET IO,程序里直接读写I和Q地址,没有Modbus那些地址换算。西门子1200和1500做PN通讯也是一样的逻辑:一边做IO控制器,一边做IO设备,或者双方都用PUT/GET指令读写对方DB区。
3.5 报警联锁与故障处理
报警是水处理程序里不能省的部分。模板里,我把所有报警源分成三类:模拟量高报警和低报警、设备运行状态报警、通信故障报警。每类报警都做成标准模式,避免在程序中满天飞。
触发报警时,我喜欢加一个“确认时间”。液位计信号飘一下,瞬时超过高报警值,本来不该动不动就响,所以模拟量报警在OB35里加0.5秒至1秒的延时确认。泵故障信号则加2秒左右的确认时间,避免继电器颤动引起误报。这个思路和泵启动确认是同一个道理。
报警锁存也要注意。设备故障报警必须锁存,故障复位按钮按下后才清零。如果不锁存,接触器断开故障信号消失了,报警也跟着消失,HMI上根本看不到故障原因。模板里用R_TRIG上升沿指令把故障状态“抓住”,再输给报警DB。
联锁逻辑我单拎出来放到一个全局DB里维护。比如原水低液位对应的联锁位LOW_LEVEL,由液位计算块输出,泵控制FB的联锁输入全部汇总到这个DB里查。这样做的好处是三言两语就能跟工艺人员说清楚:现在哪个条件阻止了泵启动,只要打开联锁状态画面就能看到。
有人会问,现在博图里面有一个叫“muting”的东西,能不能直接拿来用?那个多半是安全功能块里的“屏蔽”逻辑,用于安全门、光栅这类安全回路临时旁路,水处理模板里我没有套用,因为安全回路的屏蔽涉及安全等级和风险评估。普通水站的联锁短时需要,可以用带密码的旁路开关,但一定要记录并提示,避免长期处于旁路状态。
3.6 运行时间锁与授权保护实现
聊到程序交付,很多设备商会有“时间锁”的需求,也就是设备运行到某个日期后,在HMI上提示需要联系原厂续期或维护。这个功能可以用系统时钟来实现,读取PLC的本地时间,和设定的到期时间比较,到期后把“维护提醒”置位。这不涉及任何破解和不安全操作,而且能有效保护工程师的劳动成果,属于合法的授权管理手段。
模板里我写了一个FC400_TimeCheck,用RD_SYS_T读取系统时间,和DB里的ExpiryDate比较。为了不让设备直接停摆,到期处理我建议做成两种模式:一是只弹提醒,不锁设备;二是限制部分高级参数修改,设备继续运行但工艺调整权限被冻结。这样既能提醒用户,又不至于让水站瘫痪造成更大的安全问题。
时间锁的常见坑是PLC断电再来电后,系统时间恢复到出厂值,导致授权计算出错。所以一定要在OB100里判断PLC当前时间是否晚于某个基准时间,如果时间异常,提示维护人员重新校准时钟。更稳妥的做法是在HMI画面上加上“当前时间”显示,方便一眼发现时间不对。
4. 博图V16学习模板的导入与调试
4.1 安装博图V16及许可证常见问题处理
博图V16是很多学习者刚接触时就卡住的环节。安装包很大,包含STEP 7 Professional V16和WinCC V16,装的时候尽量关掉杀毒软件,以管理员身份运行,装完后再开杀毒,否则授权组件容易被误拦。
“博图V16找不到许可证”是个出现频率极高的词,很多人一遇到就以为是软件坏了,其实大部分原因是Automation License Manager的许可证服务没有启动,或者安装时授权文件没有成功部署。检查思路是:打开Automation License Manager,看看Receiver里有没有对应的许可证;没有的话,重新激活;有的话,确认服务“Automation License Manager Service”正在运行,并检查Windows服务是否被禁用。
需要特别说明,我这里讲的都是正版授权的激活过程。博图是商业软件,请从官方渠道购买和获取许可。网上流传的各种“授权工具”“解锁补丁”,一是存在安全风险,二是可能带来法律问题,学习编程没必要在这种地方走弯路。
安装完成后,第一次新建项目,建议直接选择“创建项目”,CPU选1214C,语言用SCL和LAD都行。如果你的模板程序是从别的电脑拷贝过来的,注意项目文件路径不要太深,最好放在纯英文目录下,避免中文路径导致的一些奇怪编译错误。
4.2 模板导入后的硬件替换与地址映射
下载这套模板到自己的电脑后,第一步先别急着打开程序。先看一眼CPU型号是不是和你手头的硬件一致。模板里用的是1214C,如果你用的是1211C或者1215C,直接编译会报“分配的硬件型号不匹配”。在博图左侧项目树中,右击CPU,选“更改设备”,再选择你实际使用的型号即可。
硬件模块的槽位也要和模板里对上。如果模板组态里挂了三块模块,你实际只有两块,设备组态里就会出红线。这时候建议删掉多余的模块,重新组态你的实际配置。模块的I/O地址会自动分配,如果和模板里的程序变量不一致,程序里会提示“操作数不存在”,这时候需要在程序变量表中把AIW地址改为实际地址。
如果组态时找不到某个模块或者某个智能设备,别慌。西门子官网的EDZ部件下载区可以下载对应的GSD文件和设备描述文件,导入到博图里后就能组态了。这个操作在水处理项目后期加第三方智能设备时特别常用,比如超声波流量计、在线余氯仪表。
硬件替换好后,先做一次“编译”,看看有没有地址错误。随后把项目下载到PLC。下载前建议先“下载到RAM”,也就是临时存储,测试没问题后再“下载到装载存储区”保证上电后程序还在。
4.3 在线调试:监控表、强制表、诊断
在线调试是这套模板真正值钱的地方。第一步是创建监控表,把关键变量拖进去,比如原水液位、泵运行反馈、故障字、PID输出值。点击“监控”按钮后,能看到实时值变化,这是判断程序逻辑对不对的最直观手段。
强制表是调试时的利器,比如你手头没有真实液位计,但想测试低液位联锁逻辑,可以直接强制原水液位变量为0.0,看泵是不是会停。强制后变量旁边会出现黄色六边形图标,这个状态会一直保持,调完一定要全部删除强制并下载,否则生产时会出现“莫名其妙的锁定信号”。我见过有人把信号强制成1后忘了取消,现场调试了一个小时都找不到原因,最后发现是强制表里还有旧值。所以强制表用完必须清理干净。
在线诊断也很重要。CPU自带诊断缓冲,程序报错时,双击“在线诊断”窗口能看到故障代码和发生时间。很多编译通过的逻辑,运行时会报“梯形图非法”或“除数为零”等错误,这些在仿真阶段就能抓出来。模板里所有除法运算我都加了分母为0判断,比如流量瞬时值为0时累计值就不累加,防止CPU进入STOP。
在线修改程序时要注意,尽量先把程序下载到RAM,确认无误后再下载到ROM。如果PLC正带着现场设备联动,下载瞬间输出会复位,所以要提前和现场人员确认安全,或者切到就地手动模式再下载。这个习惯比任何技巧都重要。
5. 常见问题与排查经验
5.1 通讯类问题:Kepserver、OPC UA与串口读不到数据
很多项目要对接上位机或者物联网平台,常用的方式是S7-1200通过OPC UA或者Kepserver与上位机交换数据。博图V16里,S7-1200支持启用OPC UA服务器,只需在PLC属性里勾选“激活OPC UA”,然后在安全设置里添加访问权限,上位机再通过Kepware或UaExpert连接。连接不上的时候,先ping一下PLC的IP,再用UaExpert能扫到节点树,基本就能定位到是IP不通还是权限问题。
如果发现ModScan能读取串口数据,但西门子组态软件或者触摸屏读不到,这个问题我遇到好几次。原因通常是:ModScan和你的PLC程序在抢同一个串口,或者串口Master/从站参数不一致。CM1241的RS485口同一时间只能被一个通信指令使用,如果OB1里有两个MB_MASTER访问同一个端口,后执行的那个大概率会报“忙”错误。另外,ModScan读的是保持寄存器,而你的组态软件读的是输入寄存器,地址错位也会读不到数据。
5.2 PID“抽风”的几种原因
现场最惊悚的画面,是PID一投入自动,变频器频率瞬间冲到50Hz,然后阀门全开全关来回抽。别问我怎么知道的,模板刚调通时我也经历过。
排查顺序很有讲究。第一步,切手动模式,给一个固定输出,确认变频器方向、阀门方向和信号极性对不对;第二步,看过程值反馈是不是稳定,如果PV值乱跳,先修信号滤波和接线;第三步,看正反作用有没有设反,可以把设定值人为调高或调低一下,观察输出变化方向;第四步,再看P和I参数是否匹配。很多人一上来就调PID参数,结果反馈量程错了,怎么调都是白搭。
PID_Compact的趋势记录功能很好用,在线监控时把PV、SV、CV三条曲线显示出来,能清楚看到振荡周期和超调量。整定一次,记录下来,这就是宝贵的调试资料。
5.3 编译报错的典型场景
模板打开后,新手最常见的编译错误有这么几类:SCL代码里变量名没对齐,比如定义的是RawValue,用的时候写成了Rawvalue;FB的实例DB被重复使用,导致“背景DB已被占用”;调用FC时,某个ENO连接断开但程序里还用了结果。
博图编译时,输出窗口会给出错误行号,双击就能跳到对应位置。大部分SCL语法错误,根据提示改掉就好。如果报“非法访问DB”,检查一下DB号是否和程序引用的DB一致,尤其是从旧项目升级时,DB号可能会变化。
5.4 时钟和保持性问题
水站程序里时间相关的问题很隐蔽。如果PLC系统时间不对,时间锁、报表、故障时间戳全都会乱。S7-1200里可以读取模块时间,也可以在OB100里用WR_SYS_T设置时间,但更推荐在HMI里设置,或者接一个NTP时间同步。模板里我特意把时间校准页面放到了HMI上,每周校准一次,故障时间戳就不会错。
另一个隐藏问题是DB保持性。泵累计运行时间、轮换计数、报警锁存,这些断电后必须保留。DB默认的保持性设置可能不是“保持”,如果不勾选,PLC断电后运行时间清零,泵组轮换逻辑就会乱套。模板里我在每个需要保持的DB属性里勾选了“断电保持”,并把不需要保持的临时数据在OB100里清零。这个动作看着简单,却直接关系到设备稳定运行。
5.5 从1200到1500移植:程序结构基本不变,注意IO和指令差异
不少人学完1200之后,会转向1500或者库卡机器人交互这类更大一点的系统。模板的程序结构,在S7-1500上基本可以平移,FB和UDT的编程方式完全一样。移植到1500时要注意:模拟量输入地址的偏移可能变化,比如1200的AIW64到了1500可能变成了IW80;PID_Compact版本不同,配置界面略有差异,但功能参数大同小异。S7-1200和1500之间的PN通讯,如果一台做IO控制器、一台做IO设备,直接在设备和网络中拖线就行;如果双向通信,可在两边都启用PUT/GET,不过要慎重开放通信权限,涉及安全时要做好访问控制。
至于1500和库卡机器人的交互,其实也是标准的PROFINET通信:机器人作为智能设备挂到PLC的IO设备里,PLC输出“启动”“暂停”“复位”等命令字,机器人反馈“运行中”“到位”“故障”等状态字。思路和模板里变频器PROFINET通信一模一样,协议变,逻辑不变。
我把这套1200水处理模板调试完成后,再向上扩展1500系统,整个迁移过程基本没改写主逻辑,只调整了硬件组态和IO地址。这也是为什么我一直强调,模板更像一套工艺骨架,学的是逻辑组织方式,而不是死记某个具体地址。当你把泵阀、仪表、PID、通信这些基础功能块都吃透,往后不管是1500还是机器人,都只是换个主机的玩法而已。
最后分享一个我自己调试模板时保留的小习惯:每次下载完程序,我都会在监控表里把关键模拟量、泵状态、报警字按顺序排好,HMI画面和监控表一一对应。这样做看起来麻烦,但真到试车那天,你会省下大量翻变量找问题的时间。程序是你的,逻辑也是你的,只有把基础骨架牢固掌握好,现场那些突发状况才不会让你手忙脚乱。