做植物萃取饮料产线这套项目的时候我其实挺感慨的西门子S7-300这个平台在很多人眼里已经是“老古董”了但在食品饮料行业它依然有着大量的存量设备、备件供应链和调试习惯。尤其是配上博途STEP7和WinCC Professional这套工具链做中大型萃取、调配、灌装产线的上位机监控相当顺手。这篇文章我会把整个项目的架构、程序组织方式、WINCC画面脚本思路以及现场调试时最容易踩的坑一次讲清楚。不管你是做产线维护的电气工程师还是准备用S7-300做类似萃取项目的自动化同行应该都能从中找到可以直接抄作业的东西。1. 项目整体设计与控制架构1.1 工艺主线与控制需求拆解植物萃取饮料的生产工艺并不复杂但每个环节都“事多”。原料经过清洗、粉碎、称重后进入萃取罐在设定温度下加水或溶剂进行搅拌萃取萃取液经过粗滤、精滤后进入调配罐再加辅料混合之后杀菌、灌装。整条线最核心的控制难点集中在萃取段温度必须精确稳定液位不能超限搅拌和排液顺序要严丝合缝。温度控制之所以关键是因为不同植物原料的萃取温度窗口差异很大。温度太高容易破坏活性成分温度太低萃取率又上不去所以萃取罐需要PID闭环调节而不是简单的开关量加热。液位控制也一样补水阀、排液阀、循环泵之间如果联锁不到位很容易出现萃取罐溢流或者泵空转。控制需求梳理下来大概是这几块萃取罐温度PID闭环控制支持自动/手动无扰切换搅拌电机、进料泵、排液泵、循环泵的顺序启停与联锁补水阀、蒸汽调节阀、排液阀、放空阀的逻辑控制各罐体的液位、压力、温度信号采集与超限报警配方管理不同原料对应不同的萃取温度、恒温时间CIP清洗程序的步进控制与上位机WINCC的以太网通信完成画面监控、报警记录、趋势归档1.2 硬件选型与网络拓扑控制站我选了CPU 315-2 PN/DP一块CPU既带PN口又带DP口PN口直接接工业以太网和WINCC、触摸屏通信DP口用来挂远程IO站。之所以不用S7-1500或者S7-1200倒不是说它们不好而是这个项目属于老产线改造原有的备件、维修电工的熟悉程度、还有甲方明确的品牌兼容性要求都指向S7-300。S7-300在博途里依然受支持组态一个315-2 PN/DP非常顺手。信号点数的估算上整条线大概有数字量输入输出点各80点左右模拟量输入点在32点左右模拟量输出4点。数字量主要是泵启停、阀门开关、电机运行反馈、故障信号模拟量主要是温度、压力、液位、流量模拟量输出则是蒸汽调节阀开度、变频器频率给定。硬件配置清单大概是这样的模块规格数量用途说明CPU 315-2 PN/DP6ES7 315-2EH141主控制器集成PN口数字量输入模块SM321 DI32xDC24V3按钮、阀反馈、泵反馈数字量输出模块SM322 DO32xDC24V3阀门、泵、电机控制模拟量输入模块SM331 AI8x12bit4温度、压力、液位、流量模拟量输出模块SM332 AO2x12bit2调节阀开度、变频器给定远程IO站ET200MIM1532就近采集萃取段和灌装段信号上位机工控机WINCC Professional1中控室监控操作触摸屏KTP700 Basic PN1现场就地操作网络结构上CPU的PN口通过工业交换机连接上位机和触摸屏DP口连接ET200M从站。这一类项目我不建议把所有IO都拉到中控室距离远不说电缆成本就够喝一壶的。现场设备附近放ET200M从站DP总线拉过去调试和排查都方便得多。1.3 软件架构与程序框架软件方面用的是TIA Portal博途STEP7 Professional做PLC程序WinCC Professional做上位监控同一个项目文件里完成所有组态。很多人可能更熟悉STEP7 Classic和WinCC 7.x的组合但从我个人习惯来说博途一体化确实省事PLC变量和HMI变量在同一个数据库里管理PLC侧改个符号名HMI画面里的连接自动跟着变不用担心两边变量对不上。程序框架大致如下OB100初始化复位步进状态、清除保持型中间变量OB1主循环顺序调用各功能块OB35循环中断100ms处理PID运算和模拟量采样FB1电机控制带启动延时、故障复位FB2阀门控制带反馈超时检测FB10萃取顺序控制核心逻辑FC105/FC106模拟量工程量转换DB100配方数据块DB200报警与运行状态字OB35在这个项目里作用很明显。PID运算必须固定周期调用温度回路我设的是100ms一个周期放在OB35里最合适。OB1里头的逻辑再多再乱也不会影响PID的采样周期这一点对于大滞后温度对象很重要。2. 博途STEP7下的S7-300程序设计要点2.1 OB块分配与主循环逻辑很多刚用博途做S7-300的人会忽略一个问题S7-300和S7-1500的程序扫描机制是有差别的OB1里如果写的逻辑太多扫描周期会被拉长而PID和高速计数这类实时性要求高的功能会被拖累。所以我的习惯是把OB1只做“调度器”真正干活的功能块分散在OB1里按次序调用但每个FB内部逻辑要控制好长度能分步执行的不要在一个周期里全部跑完。电机控制FB1是典型的例子。我做一个电机启停块内部会处理启动延时、运行反馈、过载故障、急停联锁这些逻辑放在一个FB里没问题但不要做复杂的数组遍历、字符串处理这些耗时操作。S7-300的运算速度虽然不慢但在上位通信、触摸屏刷新、PID计算同时进行的情况下尽量给CPU留出余量。OB35里的PID计算用FB41连续PID控制器温度信号经过FC105转换后作为PV_IN设定值来自配方DB输出LMN直接控制蒸汽调节阀开度。这里有一个比较重要的细节PID从手动切自动时如果输出没有做无扰切换阀门会突然跳一下现场很容易吓到操作工。我的做法是在HMI做切换按钮时先把当前阀位写到FB41的LMN输出上再把手动模式切到自动模式这样切换过程阀门开度不会突变。2.2 模拟量采集与工程量换算S7-300的模拟量模块采回来的原始值不是真实的物理量0到27648对应4到20mA电流信号。比如一个量程0到10公斤的压力变送器如果模块读到的原始值是13824那实际压力就是5公斤。直接用原始值去做报警和显示很不直观所以现场程序里必须做工程量换算。博途STEP7里做换算最方便的是FC105这个块在标准库的TI-S7 Converting Blocks里调用时填好输入参数即可IN模拟量模块原始值地址比如PIW256HI_LIM工程量上限比如100.0LO_LIM工程量下限比如0.0BIPOLAR输入信号类型4到20mA是单极性填FALSERET_VAL错误代码字OUT转换后的工程量换算细节上有一点容易被忽略如果变送器是两线制还是四线制模块量程卡的位置和接线方式完全不同这一步要是错了程序里怎么换算都是错的。我一般调试时先强制一个4mA信号看看原始值是不是0再强制20mA看是不是27648如果没有现场信号源就直接在端子上短接或断开信号线来验证通道好坏。2.3 萃取罐温度PID控制温度回路是整个萃取工艺的核心。萃取罐用蒸汽夹套加热我选的是FB41连续PID控制器输出控制蒸汽调节阀。对象是大滞后、大惯性的温度系统整定参数的时候不能照搬流量或压力回路的经验。实际操作中我的整定顺序是先把积分时间放到最大比例增益从0.5开始往上加让温度出现小幅震荡后再退一点然后逐步减小积分时间让系统能在设定值附近稳定。因为萃取罐体积大热惯性明显积分时间通常会设置在300到600秒这个范围不能像流量回路那样几十秒的积分时间直接套上去。另外FB41有几个参数必须设置好GAIN比例增益现场实测大概1.2到2.0TI积分时间单位秒建议从600秒开始往下调DEADB_W死区宽度防止调节阀频繁动作LMN_HLM/LMN_LLM输出上下限蒸汽阀开度给0到100%INT_HLM/INT_LLM积分限幅防止积分饱和积分饱和这个问题在加热系统里特别容易发生。如果萃取罐温度差得远PID会拼命往上加输出温度到了设定值之后积分还存着“余量”导致超调。把积分限幅设在0到100之间能明显减小超调幅度。2.4 SCL下TON定时器与步进顺序逻辑萃取顺序控制我用的是SCL语言结构清晰不说步进逻辑写出来比LAD直观太多。SCL在博途里对S7-300的支持很成熟梯形图能做的事它都能做而且步进状态机这种东西用CASE语句极其好写。顺序控制的核心是萃取工步补水、升温、恒温萃取、排液。每一步都有进入条件和退出条件退出条件很多是时间延时这时候就要用到TON定时器。SCL里调用TON的用法是先在FB的静态变量区声明一个TON类型变量然后在代码中调用。下面是我在这个项目里写的一个简化版萃取步进逻辑FUNCTION_BLOCK FB_EXTRACT_STEP VAR_INPUT bStart : BOOL; // 启动按钮 bStop : BOOL; // 停止按钮 rSetTemp : REAL; // 萃取设定温度 rSetTimeMin : REAL; // 恒温时间(分钟) END_VAR VAR_OUTPUT nStep : INT; // 当前步号 0-待机 10-补水 20-升温 30-恒温 40-排液 bFillValve : BOOL; bHeatValve : BOOL; bStirMotor : BOOL; bDrainValve : BOOL; bFinished : BOOL; END_VAR VAR tonStep : TON; tPreset : TIME; bTonEnable : BOOL; END_VARCASE nStep OF 0: bFillValve : FALSE; bHeatValve : FALSE; bStirMotor : FALSE; bDrainValve : FALSE; bFinished : FALSE; IF bStart THEN nStep : 10; END_IF; 10: // 补水液位到位后进入升温步 bFillValve : TRUE; IF WaterLevelOK THEN bFillValve : FALSE; nStep : 20; END_IF; 20: // 升温温度达到设定值进入恒温步 bHeatValve : TRUE; bStirMotor : TRUE; IF ActualTemp rSetTemp - 0.5 THEN bHeatValve : FALSE; bTonEnable : TRUE; tPreset : REAL_TO_TIME(rSetTimeMin * 60000.0); nStep : 30; END_IF; 30: // 恒温计时时间到进入排液 IF bTonEnable THEN tonStep(IN : TRUE, PT : tPreset); IF tonStep.Q THEN bTonEnable : FALSE; bStirMotor : FALSE; nStep : 40; END_IF; END_IF; 40: // 排液排净后结束 bDrainValve : TRUE; IF NOT LevelLow THEN bDrainValve : FALSE; nStep : 0; bFinished : TRUE; END_IF; END_CASE;这段代码在实际项目里还能继续优化升温时如果温度迟迟不到要跳报警恒温阶段搅拌不能停排液时蒸汽阀必须关闭。SCL的好处就在这逻辑写起来像自然语言后期维护改步进条件非常直观。TON在S7-300的SCL里有一点要注意定时器实例不要建在临时变量区否则定时器状态每个扫描周期都会被清零定时永远走不完。我一般把它放在FB的静态变量区或者单独建一个背景DB这样TON的内部状态可以跨扫描周期保持。2.5 配方管理与CIP清洗配方管理在这个项目里不是简单给几个设定值而是将不同植物原料的萃取温度、恒温时间、搅拌速度、排液时间组合在一起。我建了一个DB100配方数据块内部用数组存储多个配方每个配方占用固定偏移HMI上通过配方视图组件选择配方编号PLC侧读取对应数组元素。配方DB结构简化后大概是这样配方编号原料名称萃取温度恒温时间搅拌速度1绿茶80.030min35Hz2菊花90.020min30Hz3枸杞75.040min40HzCIP清洗程序我单独做成了一个FB按时间步进依次执行清水冲洗、碱洗、清水冲洗、酸洗、清水冲洗五个阶段。每个阶段启动对应的泵和阀并在画面显示当前清洗阶段和剩余时间。CIP步进不参与萃取顺序控制靠设备选择开关切换“生产模式”和“清洗模式”。3. WINCC上位监控画面与脚本实现3.1 画面布局与变量连接WINCC画面我分了六个总览画面、流程监控、参数设置、配方管理、报警记录、趋势曲线。总览画面放整条产线的缩略流程图主要显示设备运行/停止状态和关键工艺参数流程监控是主操作界面操作员在这里启停设备、切换手自动、设定参数参数设置画面放PID参数和报警上下限一般只给工程师权限配方管理和报警记录、趋势曲线按功能独立成页。博途里的WinCC Professional和PLC在同一个项目里组态最大的优势就是HMI变量可以直接引用PLC变量不需要像经典WinCC那样手动一个个建变量、填地址区。在画面上放一个IO域下拉列表里就能直接选PLC符号变量省了很大工作量也减少了地址写错的可能。3.2 C脚本实现置位、复位和二次确认操作二次确认是饮料产线的刚需特别是排放阀、排污阀这种误动作会造成物料损失甚至安全事故的设备必须让操作员二次确认。我在WinCC Professional里用C脚本实现了一个“请求-确认-执行”的交互逻辑。第一次点击按钮时脚本弹出一个确认对话框同时置位“确认请求”变量操作员点击“是”之后目标变量才真正置位如果操作员取消则只复位请求变量不执行任何动作。#include apdefap.h void OnClick(char* lpszScriptName, char* lpszObjectName, char* lpszPropertyName) { int nRet; // 如果当前没有确认请求则发起一次确认 if (GetTagBit(CmdConfirmReq) 0) { nRet MessageBox(NULL, 确定要打开排放阀吗, 操作确认, MB_YESNO | MB_ICONQUESTION); if (nRet IDYES) { SetTagBit(CmdConfirmReq, 1); // 保存确认状态 SetTagBit(DrainValveOpen, 1); // 执行置位 } } else { // 已确认过再次点击则执行复位 SetTagBit(DrainValveOpen, 0); SetTagBit(CmdConfirmReq, 0); } }这种写法适合“置位/复位”双态按钮。还有一种场景是“只允许置位执行后自动复位”比如手动启动一台泵操作员确认后置位启动指令泵运行反馈回来后再自动清除启动指令。这种情况下我会把“执行”和“复位”分开写置位用按钮脚本复位在PLC里完成HMI只负责显示状态。实际项目中我还加了一个超时保护确认请求变量置位后如果60秒内没有完成执行全局脚本会自动把请求变量复位防止操作员点了确认又去忙别的事回来再误触按钮造成误操作。3.3 画面跳转、全局脚本与打印按钮画面跳转我一般推荐直接用WinCC的“系统函数”来做少写脚本就少一个报错点。在按钮事件里选择“ActivateScreen”填目标画面名称就行。但遇到需要带参数跳转或者跳转前做权限判断的场景用VB脚本更灵活Sub OnClick(ByVal Item) If GetTagBit(EngineerMode) True Then ActivateScreen ParamSetting Else MessageBox 当前非工程师模式无法进入参数设置 End If End Sub全局脚本在WinCC Professional里可以用C脚本或VBScript按周期触发。我常用的一个场景是检查“确认请求”是否超时以及设备运行状态的累计计时。全局脚本里写逻辑时注意变量读取频率不要太高扫描周期设1秒足够否则脚本长时间密集读变量会占用上位机资源。按钮打印这个需求在现场很常见操作工想留个纸质记录。实现方式也不复杂在WinCC Professional按钮事件里添加“打印当前画面”的系统操作或者用VBScript调用打印功能把当前画面发到打印机。我一般还会在打印前先弹一个预览或确认框防止误触打印一堆白纸。3.4 报警记录与数据归档报警组态上我把报警分成三类工艺报警温度高、液位低、设备报警电机故障、阀反馈丢失、系统报警通信中断。每一类在WinCC报警记录里建一个类别显示颜色和确认方式可以分别设置。操作员在报警画面可以单条确认也可以批量确认未确认报警。数据归档用的是WinCC自带的SQL Server数据库归档变量主要是萃取温度、罐压、液位、阀位这些关键工艺量。趋势曲线画面上选定几个变量后可以同时查看实时趋势和历史趋势。这里提醒一句归档变量不要选太多归档周期也不要太短否则运行几个月后SQL Server数据库文件会很大查询趋势越来越慢。4. 常见问题与排查技巧实录4.1 博途安装、许可证与卸载的“老大难”博途安装问题应该是后台问得最多的集中在许可证找不到、Automation License Manager服务未运行、卸载不干净导致重装失败这几类。许可证提示“Automation License Manager服务未运行”时先别急着重装软件。打开Windows服务管理器找Automation License Manager Service确认它是不是被禁用了右键启动然后把启动类型改成自动。如果服务启动不了多半是杀毒软件把它拦了或者系统加密服务Cryptographic Services被停用。把这两个服务都恢复成自动并启动再打开授权管理器重新找许可证。博途可以装D盘但要注意几个前提安装路径不能带中文和空格Windows用户目录不要有中文名安装前把杀毒软件退出、系统更新暂停安装过程中不要切换用户。如果没做到这些装到一半报错是很正常的。“卸载不干净”这个问题最麻烦。我遇到过一个电脑卸了V15装V16一直报SQL Server实例冲突。最后是把控制面板里的相关组件按顺序逐个卸载删除C盘ProgramData目录下Siemens残留文件夹再用注册表编辑器清理Siemens相关的注册表项重启之后才装成功。手动清注册表有风险操作前一定要先备份注册表。4.2 S7-300通信与IP地址排查博途STEP7里怎么看PLC的IP地址最快的方法是组态界面里双击CPU在以太网地址栏查看设置的IP也可以在线访问时选“可访问设备”按PN/IE接口扫描网段找到与自己电脑在同一网段的PLC。通信连不上是最常见的现场问题90%的原因是IP网段不一致。PLC地址是192.168.0.1电脑地址是192.168.1.10怎么Ping都通不了。还有一种是电脑开了多个网卡PG/PC接口选错了网卡博途里怎么扫描都找不到设备。排查时把无关网卡先禁用只保留连接PLC的那一块。WinCC运行时报“无法连接到服务器”或“无法启动基本应用程序”大概率是WinCC运行数据库SQL Server服务没有启动。打开服务管理器确认MSSQLSERVER或相应的实例服务在运行同时确认Windows的远程过程调用服务RPC正常。有时候授权过期也会导致Runtime启动失败连接不上授权服务器。4.3 画面显示旧字符串PLC值为0却不变这个问题的排查思路很值得展开说。触摸屏上显示一个字符串变量PLC侧该字符串的值已经复位为0了但屏上还是显示原来的字符很多人第一反应是“通信卡了”其实不完全是。首先要看S7字符串的数据结构。S7的String不是单纯的一串字符它由三部分组成最大长度字节、当前有效长度字节、字符数据区。如果HMI组态时连接的变量类型不是字符串而是直接指向了字符数据区的某个地址PLC更新了长度字节但HMI并没有去刷新长度就会显示旧值。另外检查画面对象的“更新周期”设置。WinCC里IO域属性的更新周期默认可能是“仅在变化时”如果PLC侧字符串内容没有触发变化事件HMI就不会重新读取。把更新周期改成“1秒”或“2秒”周期刷新问题一般就能解决。通信中断也会造成这个现象。HMI和PLC之间网线松动或者交换机端口停电画面上的数据会保持最后一次通信成功的值看起来就像“死数据”。排查时看一下通信诊断状态或者强制断开通信再恢复看数值是否重新刷新。4.4 常见问题速查表现象可能原因排查与处理博途安装最后报License Manager服务未运行ALM服务被禁用或依赖服务停止启动ALM服务设为自动检查Cryptographic Services许可证找不到或无法彻底完成授权文件未传递或授权版本不匹配用Automation License Manager重新传递授权密钥卸载博途后重装失败注册表和ProgramData残留按组件顺序卸载手动清理残留后再装S7-300无法在线IP网段不对、PG/PC接口选错网卡查看CPU IP设置同一网段禁用无关网卡WinCC Runtime无法启动SQL Server服务未启动或授权异常启动SQL服务检查授权状态PLC字符串为0但画面显示旧字符HMI变量类型/地址错误或更新周期不当核对S7字符串结构更新周期改为周期刷新触摸屏和PLC通信正常但数据不刷新HMI变量连接的不是同一个PLC变量检查HMI变量与PLC符号的关联映射C脚本/全局脚本不执行脚本周期未启用或脚本语法错误检查动作触发器确认脚本编译无误按钮无反应画面未激活或对象被锁定确认画面处于运行状态检查对象属性4.5 调试过程中的经验教训项目调试时有个细节差点把萃取温控全盘打乱。第一次通电后触摸屏上所有温度显示都是满量程排查半天发现是模拟量模块的量程卡拨片位置和变送器信号类型不匹配4到20mA的信号被当成了0到10V处理。这个教训告诉我们程序中FC105做得再好硬件通道配置错了全是白搭调试第一步就应该逐个通道验证原始值。另一个容易踩的坑是顺序控制中间步骤断电重启。萃取程序跑到恒温阶段突然全厂停电恢复供电后如果步序全归零罐里的料液就废了。我在OB100初始化时加了判断如果断电前已有工步在执行恢复后慢启动泵阀温控按照当前温度重新进入对应状态。S7-300的保持型DB在这里作用巨大关键步序信息一定要放在保持型DB里。写在最后做了这么多套S7-300的项目我的感觉是硬件老不老不是核心问题关键是程序架构是不是清爽上位画面是不是贴合操作工的习惯。植物萃取饮料产线看着简单真正跑起来温度、液位、泵阀联锁之间的坑一个接一个。每次调试完我都会把画面按钮的操作逻辑重新过一遍确认每个按钮都有明确的状态反馈和防误触机制。我的习惯是把这套萃取产线的程序框架和画面模板固定下来下个项目直接复制改配方表和IO表省了不少重复工作。如果你手头也在做类似的产线或者正准备把老S7-300项目搬到博途上希望这篇文章能帮你少走几步弯路。把架构想清楚再动手比急着往上堆逻辑重要得多。