1. 项目概述与工艺背景
1.1 生物发酵系统到底在做什么
接到这个项目时,客户的需求只有一句话:把一套制药车间的生物发酵系统从老旧的继电器+仪表控制升级为西门子S7-1200+博途V16的统一控制。但真正接手后才意识到,生物发酵不是简单的"温度到了就停机、时间到了就出料"那种流程控制,它牵扯到微生物生长代谢的每一个环节,任何一个参数失控,整罐几十万的产品就可能报废。
说得直白一点,生物发酵系统控制的核心是:为微生物提供一个稳定、可重复、符合GMP规范的生长环境。这里面包含几个关键工艺环节:
- 灭菌(SIP):发酵罐在使用前必须经过高温蒸汽灭菌,通常121℃保持30分钟,这个过程的温度控制、冷凝水排放、保压时间逻辑必须严谨。
- 培养基配制与实消:将培养基在罐内直接加热灭菌,然后降温到接种温度。
- 接种与培养:将种子液接入发酵罐,进入微生物指数生长期。
- 发酵过程控制:温度、pH、溶解氧(DO)、搅拌转速、罐压、消泡、补料等多参数联动控制。
- 放罐与清洗(CIP):发酵结束后放料,然后对罐体进行自动清洗。
这套系统的控制难点不在于单个回路,而在于多参数耦合。比如:搅拌转速升高会带动溶解氧变化、也会产生更多热量进而影响温度;补料会增加底物浓度,进而影响pH和DO;消泡剂加入后又会干扰电极读数。所以PLC程序不是简单地把PID回路堆在一起就完事,它需要一套兼顾优先级、容错机制和操作员干预权限的整体架构。
1.2 为什么选S7-1200配博途V16
客户现场的使用习惯和运维水平是选型的重要依据。S7-1200在当前中小型制药项目中确实是一个很均衡的选择:
- 性价比高:相比S7-1500,1200的硬件成本低一截,但对于发酵罐这种I/O点数并不海量的场景,性能完全够用。
- 博途平台统一:从PLC到HIM(精简系列/精智系列)都在同一个TIA Portal项目里组态,省去不同软件之间来回倒腾的麻烦。
- 支持PID_Compact等工艺对象:博途V16内置的PID_Compact指令比老式S7-300的FB41好调得多,支持自整定,这对现场调试非常友好。
- 合规性基础好:CPU自带密码保护、Know-How保护,程序块可以加密,日志和诊断缓冲也支持审计追踪,这对GMP验证(计算机化系统验证CSV)是必要的。
博途V16还有一个在制药行业被低估的优势:它对项目数据和程序块的版本管理能力强。在验证阶段,审计师经常要检查"当前运行的程序和验证时确认的程序是否一致",博途的在线/离线比较功能、程序块的上载/下载对比,能直接给出答案,省了很多解释工作。
当然,S7-1200也不是没有短板。如果发酵车间有几十个罐体需要集中到中控室统一监控,或者需要做复杂的批次报表和电子批记录,那单靠1200的存储和WinCC Runtime Advanced还是有压力的。这时候通常采用"PLC做底层控制 + 上位机SCADA做数据采集和报表"的分层架构。这个项目就是按这种方式来的:S7-1200负责现场控制和基础联锁,上位机用WinCC做配方下发和趋势记录。
2. 程序架构设计与功能规划
2.1 程序块的整体规划:OB、FB、FC、DB怎么分
写发酵控制程序最忌讳的就是把所有逻辑塞进OB1。我见过不少新手项目,OB1里拉了上百个网络,看着头大,维护起来更头大,一个线圈被重复赋值都找不出来。做这类项目,一开始就要把程序块的组织结构规划好。
我的习惯是按照"工艺单元+功能类型"两个维度划分:
- 组织块OB:OB100(启动初始化)、OB1(主循环,调用各FB)、OB30(循环中断,用于PID和模拟量滤波,默认100ms中断周期)、OB80/OB82/OB83/OB86(处理时间错误、诊断中断、插拔中断、机架故障等)。
- 功能块FB:每个工艺设备一个FB,比如FB_Temperature(温度控制)、FB_PH(pH控制)、FB_DissolvedOxygen(DO控制)、FB_Feed(补料控制)、FB_Antifoam(消泡控制)、FB_Sequencer(顺序控制)。
- 函数FC:用于一些通用计算和转换,比如FC_AnalogScale(模拟量工程量换算)、FC_CheckAlarm(报警条件判断)。
- 数据块DB:全局DB(如DB_ProcessData工艺参数、DB_Alarm报警信息、DB_Recipe配方)、每个FB对应的背景DB,以及用于HMI数据交互的通信DB。
这里有一个关键设计思路:HMI和PLC之间的数据交互,不要直接满天飞地访问M区或I/O地址,而是集中通过一个"接口DB"来交换。这样做的好处是:HMI画面组态时可以统一引用DB地址,程序修改内部逻辑时只要保持接口DB的结构不变,HMI侧就不用动;同时上位机通过S7通讯读取数据时也更容易维护。
2.2 顺序控制是怎么做的:手动/自动/联动三种模式
发酵系统的操作模式和普通设备不一样。以发酵罐为例,它的运行流程涉及多个阶段,而且每个阶段能否进入下一步,取决于一系列工艺条件是否满足。我的设计思路是:
- 手动模式:每个阀门、泵、搅拌电机都可以在HMI上单独操作。这个模式主要用于设备调试、清洗、紧急手动干预。注意:即使手动模式,安全联锁仍然生效——比如罐压过高时排气阀不能关死,温度过高时加热阀不能打开。
- 自动模式:由顺序控制程序按照预定的工序(灭菌→降温→接种→发酵→放罐)逐步执行。每个步骤有进入条件、执行动作、退出条件,整套逻辑用步进器(Step Sequencer)实现。
- 联动模式:针对发酵过程中的连续控制回路,如温度PID、pH补酸补碱、DO与搅拌联动。联动模式下,操作员可以修改设定值,但不能随意启停回路。
顺序控制的具体实现,我建议用整型变量作为当前步号(StepNo),配合CASE指令(SCL)或者跳转/比较指令(LAD)来做。在博途V16里,我偏向用SCL写这个步进器,因为逻辑清晰,而且后续要加步进时间限制、步进超时报警都很方便。
举个简单的"实消阶段"步进逻辑例子(SCL):
CASE #StepNo OF 0: // 等待启动 IF #StartReq THEN #StepNo := 10; END_IF; 10: // 打开排气阀,开始升温 #ExhaustValve := TRUE; #HeatingValve := TRUE; IF #Temp >= 105.0 THEN #StepNo := 20; // 记录升温完成时间 #HeatUpDoneTime := TON_Time(); END_IF; 20: // 保温105度,排气赶氧 #ExhaustValve := TRUE; IF #ExhaustTimer.Q THEN #StepNo := 30; END_IF; // 后续步骤... END_CASE;使用这种方法,每一个步骤都可以独立查看当前状态,故障时能快速定位到具体是哪一步卡住了。HMI上也可以做一个"当前步骤高亮"的画面,操作员一眼就能看到罐子走到哪了。
2.3 报警和联锁体系的设计
制药发酵系统的报警设计要遵循一个原则:分级报警、优先处理。我把报警分为三级:
- 工艺报警(低级):参数偏离设定范围但不影响安全,如pH在5.8-6.2之外但在5.5-6.5的"宽限"内,只提示操作员关注。
- 设备报警(中级):设备运行异常,比如电机过载、阀门反馈丢失、模拟量通道断线。这类报警需要操作员确认并处理,必要时暂停当前自动步骤。
- 安全联锁(高级):可能造成人身伤害或设备损坏的工况,比如罐压超过0.3MPa、温度超过134℃。这类联锁直接硬接线到安全继电器或PLC的故障安全程序,不经过HMI确认直接动作。
博途V16里做报警有个好用的地方:PLC变量可以直接关联到HMI的报警控件,不需要在HMI里单独建报警文本。只要在PLC变量表的"属性→报警"里勾选"生成报警",然后写好报警文本,WinCC就可以直接显示。这个功能用好了能省一半报警组态时间。
联锁方面,我有一个血的教训:联锁不能只写在线圈输出上,还要在下游设备的允许条件里再查一遍。比如加热阀和安全联锁,如果只在加热阀的输出网络里加了一个"NOT HighPressure"的条件,一旦程序其他地方有重复赋值把加热阀置位了,联锁就被绕过了。正确的做法是把联锁状态放到一个全局DB里,所有需要联锁保护的输出网络都检查这个DB里的联锁标志,这条规则我在这个项目里是强制执行的。
3. 核心控制回路的实现细节
3.1 温度控制:PID_Compact与分段控制策略
发酵罐的温度控制是整个系统中我最花心思的部分。发酵罐通常有夹套(或者盘管),通过蒸汽加热、冷却水降温。但这个系统有一个特性:升温阶段希望越快越好,降温阶段又怕降温速率太快对微生物产生温度冲击。同时,在发酵过程中,微生物代谢自身会产热,所以温度控制不仅仅是"加热到设定值",还要能自动切换到冷却模式。
我采用的方案是博途V16自带的PID_Compact V2.x工艺对象,配合一个自定义的"温度分段策略"块。
温度控制分三个阶段:
- 升温阶段(从灭菌后降温到接种温度):全速加热,不做PID调节,阀门全开,直到温度接近设定值(比如还差5℃)时切到PID。
- 恒温阶段(接种后发酵进行中):PID_Compact自动切换正反作用。PID_Compact在博途里有一个非常好的特性——支持"正反作用自动切换",也就是当测量值低于设定值时输出加热、高于设定值时输出冷却,两者之间还有死区/滞后,不会出现加热和冷却阀频繁交替开关的尴尬场面。
- 降温阶段(发酵结束放罐前):全速冷却,但限制冷却水阀的最大开度,防止罐温骤降。
在PID_Compact的参数设置上,我直接说几个实际调出来的数值供参考:
- PID_Compact的采样时间通过循环中断OB30实现,我设置了100ms。对温度这种大滞后对象,100ms采样完全够用,甚至200ms也行,但100ms在处理后续可能加的"补料闪温"(补料罐温度低,瞬时拉低罐温)时反应更及时。
- 增益(Gain)初始值我一般从3开始,积分时间(Ti)从300s开始,微分时间(Td)关闭(温度回路不建议开启微分,因为传感器噪声会被放大,导致阀门频繁动作)。
- 关键是PID_Compact的"Output"上限要设好。加热阀和冷却阀是二选一的输出,我把PID输出映射成:0~50%对应冷却阀开度,50%~100%对应加热阀开度,50%是死区。这样用单一PID输出即可驱动两个阀门,不需要两套PID切换。
3.2 pH控制和补酸补碱的防过冲设计
pH控制是一个典型的"非线性、大滞后"回路,而且还有一个让控制工程师头疼的特点:酸碱的加入对pH的影响不是线性的,同样是1mL酸液,pH在7附近和在4附近造成的pH变化幅度差很多倍。
我的pH控制方案是:
- 测量:pH电极信号进入AI模块后,先做数字滤波和斜率限制(Rate Limit)。因为pH电极在补料或加酸碱后会有短暂的波动,如果直接送给PID,容易误触发。
- 执行:采用分程+脉冲输出的策略。pH偏离设定值较大时(比如超过0.5),打开加酸/加碱电磁阀连续输出;偏离较小时(0.1~0.5),采用脉冲输出,比如每5秒周期里输出1~2秒;进入死区(±0.05)则完全关闭。
- 防过冲:在加碱(或加酸)后,设置一段"等待观察时间"(我一般设置为20~30秒,视罐容而定),期间即使pH偏差还存在,也不继续加料。这个等待时间在发酵行业也叫"死区时间"或"响应时间",它能有效防止pH过冲导致的反复加酸加碱,浪费试剂不说,还可能抑制微生物生长。
这个方案的逻辑不算复杂,但有一个容易被忽略的地方:pH电极的保养和校准状态必须进到程序里作为操作提示。电极长期使用会漂移,我在DB里存储了上次校准时间,超过7天(或客户规定的周期)后,HMI上会出现"请校准pH电极"的提示,但不强制停止控制。这套小逻辑在审计时还被客户和审计师专门夸过,因为体现了对测量可靠性的关注。
3.3 溶解氧(DO)控制与搅拌转速联动的两种模式
溶解氧控制有几种常见策略:
- 恒定通气量+调节搅拌转速
- 恒定搅拌转速+调节通气量(通过质量流量计)
- 搅拌转速和通气量联动(双回路)
在这个项目里,我采用了"搅拌优先,通气辅助"的策略。原因是发酵罐的传氧效果主要靠搅拌桨剪切气泡,搅拌转速对DO的影响最直接、最迅速。
程序里我做了两种DO控制模式,可以由操作员在HMI上切换:
- DO-PID直接控制:PID_Compact测量DO值,输出直接接到变频器的转速给定(4-20mA或Modbus RTU通讯给定)。这种方式简单,但有一个缺点:如果DO一直低于设定值,PID输出会一直升,把搅拌转速推到上限,这样能耗大,而且过高转速对某些微生物(尤其是丝状菌)有剪切损伤。
- DO-搅拌串级控制:主回路PI控制DO,输出作为副回路的搅拌转速设定值,副回路再用一个PID控制实际转速跟踪设定。博途V16里用PID_Compact做主回路,PID_3Step或一个简单的斜坡函数做副回路也够用。这个方案响应快、抗扰动能力强。如果客户还要求转速不能超上限(比如某些菌种限制在400rpm),就在主回路输出端设置一个上限限幅。
搅拌变频器的通讯,我推荐直接用Modbus RTU走RS485,不推荐用模拟量控制。原因很简单:Modbus通讯可以直接读写变频器的运行电流、故障代码、母线电压等参数,排查故障时省事得多。S7-1200做Modbus RTU主站非常方便,只需要调用MB_COMM_LOAD和MB_MASTER指令。有的工程师对通讯不太自信,总觉得模拟量更可靠,但在变频器频率给定这个场景,Modbus RTU的实时性(100ms左右)完全够用,而且省掉了一堆信号隔离器和模拟量通道。
3.4 补料控制:用称重模块实现精确补料
发酵过程中,补料(碳源、氮源、诱导剂等)的精确性直接影响产物的产量和品质。这个项目的补料系统用的是"补料瓶(罐)+称重模块"的方案,通过检测补料罐的重量变化来推算补入发酵罐的量。
PLC这边,我使用了一个称重变送器(比如西门子SIWAREX MS或第三方变送器),输出4-20mA对应0-50kg,进入AI模块。补料泵采用变频器或蠕动泵,后者虽然精度高但泵管损耗快,这个项目用的是小型离心泵+调节阀。
补料控制的实现逻辑:
- 累计补料量:在OB30循环中断里,用补料罐重量变化量做累计。为了防止称重信号抖动导致累计误差,我加了两个保险:一是数字滤波(移动平均,窗口5个采样点),二是重量变化率限制(如果两个扫描周期之间重量变化超过5kg,认为是干扰,丢弃本次采样)。
- 补料速率:PID控制泵频率/阀门开度,使补料速率跟踪设定值。补料通常在发酵中后期进行,速率如果不稳,会导致底物浓度波动,进而影响pH和DO,会引起连锁反应。
- 安全限制:补料泵的运行时间连续累计,超过设定时间(比如8小时)需要强制暂停并提示操作员检查泵管和管路,防止泵管磨损导致实际补料量与累计值不符。
说到补料,我得提醒一个容易踩的坑:称重模块的安装和信号隔离。发酵罐的补料管路通常是硬管连接,如果管路应力传递到称重传感器上,称重数值会有静差和漂移。我在现场吃过这个亏——补料累计量数据总是忽高忽低,后来查下来是管路法兰拧得太紧,把力传到传感器上了。后来让机械人员加装了软连接,问题才解决。做程序之前一定要先确认称重传感器的机械安装是否零应力,否则程序里加再多滤波也无济于事。
4. 配方管理、数据记录与合规性设计
4.1 配方管理:让工艺员不用看代码也能改参数
制药发酵的工艺参数(温度、pH、DO、搅拌转速、补料速率、发酵时间等)不同产品、不同批次可能都不一样。如果每次换产品都让工程师去改程序里的DB初始值,既不安全也不现实。所以必须做配方管理。
博途V16的配方功能通常是通过HMI(WinCC)的"Recipe"控件来实现的。但这个项目里,我没有完全依赖HMI配方,而是结合PLC DB做了一套"半自动配方":
- 在PLC里建一个Recipe数组DB,比如
Recipe[1..10],每个元素是一个UDT(用户自定义类型),包含发酵阶段的各项参数。 - HMI上做一个"配方管理"画面,工艺员可以选择配方号、查看配方参数、修改配方参数,并保存到PLC的保持性DB里。
- 批次启动时,操作员选择配方号,点击"下发配方",PLC将Recipe[选中的配方号]复制到当前工艺参数DB(DB_ProcessData)中。
这样做的好处是:配方数据在PLC本地,即使上位机挂了,PLC自己仍然能按照最近一次下发的参数运行;HMI配方控件掉电后需要手动重新激活,但PLC保持性DB里的数据不会丢。在制药行业这种对数据可靠性要求高的场景,双保险很重要。
配方的管理和修改权限也要注意。我建议在HMI用户管理里把"配方修改"权限只开放给工艺员或以上角色,操作员只有"查看"和"选择下发"的权限。同时,每次配方修改和下发都要记录操作日志(用户名、时间、修改内容),这是审计追踪的基本要求。
4.2 数据记录与审计追踪:GMP验证绕不开的坎
制药车间的自动化系统要过验证,数据完整性(Data Integrity)是审计的重中之重。具体到PLC层面,我做了以下几件事:
- 报警和事件日志:利用PLC的系统诊断缓冲区和HMI的报警记录功能,记录每次报警的产生时间、恢复时间、确认人、确认时间。特别注意:报警和事件的时钟必须统一,PLC和HMI时间同步要做,否则审计时对不上时间线就麻烦了。
- 关键工艺参数的连续记录:温度、pH、DO、转速、罐压、补料量等关键参数,通过上位机WinCC的归档数据库(SQL Server)按秒级或分钟级记录。PLC本身不存档,因为它存储有限,但PLC负责给数据打批次号和时间戳(通过读取系统时钟)。
- 电子签名:这往往是审计中容易被挑毛病的地方。如果客户要求严格的电子签名(符合21 CFR Part 11),就需要上位机系统支持,PLC层面的操作权限和记录是基础但不充分。我在这个项目里做的是:HMI上的关键操作(启动自动程序、修改设定值、确认报警)都要求登录用户操作并记录审计日志;更严格的放行、偏差处理则在上位机的电子批记录系统里完成。
说句实话,很多中小型项目对合规的要求并没那么苛刻,但作为程序设计师,我仍然建议把这些合规功能做进去。原因很简单:控制系统要满足验证要求,补做合规功能比一开始就做要贵得多。程序里多留几个接口DB、多记几条日志,成本几乎为零,但将来过验证时能省下巨大的人力物力。
4.3 与上位机和HMI的通讯配置
这个项目有独立的HMI(触摸屏)直接连接PLC,同时还有一套上位机SCADA(WinCC)通过以太网读取PLC数据。通讯组态要注意几点:
- S7-1200的PUT/GET通讯:如果上位机要用S7协议读取PLC,需要在CPU属性里勾选"允许来自远程对象的PUT/GET通信访问"。但从安全角度,不建议对所有上位机开放,最好通过访问列表只允许指定IP的SCADA站访问。
- Modbus TCP:如果现场有一些第三方设备(比如在线分析仪、称重仪表),S7-1200可以同时做Modbus TCP客户端或服务器。我一般复用PLC的PROFINET口,配置多个TSAP或使用MB_SERVER指令的"IP端口"参数区分。
- OPC UA:博途V16的S7-1200从固件4.4开始支持OPC UA服务器。如果上位机是第三方软件(比如Ignition、LabVIEW、自研系统),OPC UA是更现代的通讯方式,优于老式S7协议。我建议新项目优先考虑OPC UA,因为它跨平台、安全性好,而且支持数据建模。
HMI画面组态方面,我分享一个经验:画面不要贪多,关键信息要一屏覆盖。发酵罐操作画面我一般就三屏:
- 第一屏"工艺流程总览":罐体、管路、阀门、传感器、设备状态的颜色动画,让操作员一眼看清整个系统在什么状态。
- 第二屏"参数趋势与设定":温度/pH/DO的实时趋势曲线和PID设定窗口。
- 第三屏"顺序控制监视":当前步号、当前步骤说明、各步骤的完成条件/等待原因。
细节上,HMI的每个操作按钮都建议加"权限控制+二次确认"。"二次确认"不是说多个弹窗就完事,弹窗上要显示操作对象的当前状态、目标状态和可能的影响,让操作员想清楚再下手。酿造行业还好,制药行业误操作的后果可能整批报废,多这一步确认不亏。
5. 实操过程与调试心得
5.1 博途V16项目组态:从硬件配置到符号表管理
博途V16的项目组态有几步看着简单,但细节处理不好,后面调试会非常难受。
第一步:硬件配置。根据实际采购的模块型号,在设备视图里组态:CPU 1215C DC/DC/DC(我推荐DC供电型,比AC供电型的抗干扰能力好一些),AI模块(SM1231 8路模拟量输入)用于温度、pH、DO、压力、称重等信号;AQ模块(SM1232 4路模拟量输出)用于阀门/变频器给定;DQ/DL模块用于阀门、泵、电磁阀控制;通信模块(CM1241 RS485)用于Modbus RTU接变频器。
第二步:IP地址规划。这一步看似简单,但一定要提前做一张表格:CPU、HMI、上位机、各变频器、各智能仪表的IP、子网掩码、网关、物理位置、用途。我见过太多现场因为IP冲突导致通讯时断时续的案例。制药车间如果还有上层MES/SCADA网络,还要注意PLC的IP段与办公网隔离,不能直接暴露到公司大网里。
第三步:符号表与UDT定义。维护良好的符号表(或者更进阶的做法:使用PLC变量表里的"常量"和"UDT")可以让程序的可读性大幅上升。我在这个项目里定义了一个TYP_Valve(阀门UDT:开/关命令、开反馈、关反馈、故障、手自动、操作时间统计),一个TYP_Motor(电机UDT:启/停命令、运行反馈、过载故障、电流值),一个TYP_AnalogIn(模拟量UDT:原始值、工程量值、上限报警、下限报警、断线状态)。这样整个程序的DB结构非常整齐,所有设备都套用统一的数据结构,后续扩展新罐体时只要复制粘贴UDT的实例,不用重写逻辑。
5.2 仿真调试与实物调试的差异
博途V16的PLCSIM仿真功能在逻辑验证阶段很好用,但一定要清醒认识到:仿真是验证"逻辑",不是验证"硬件和信号"。
我用PLCSIM做过的测试包括:
- 顺序控制步进逻辑:把各步的进入条件逐一置位/复位,确认步号能正确跳转。
- 报警逻辑:模拟温度、压力超限,确认报警DB对应的位能正确置位,并能传到HMI侧。
- 配方下发逻辑:在仿真器里修改配方数据,确认下发后当前参数DB被正确赋值。
但到了实物调试阶段,很多问题只有现场才露头:
- 模拟量通道偏移:虽然是4-20mA标准信号,但不同通道之间可能有±0.1%的偏差,需要用万用表或信号发生器逐一验证通道,并在AI模块组态里做"通道校准"或程序里做增益/偏移修正。
- 现场干扰:变频器启动时,AI信号可能瞬间波动。我的做法是在OB30里对所有关键模拟量加了"变化率限制",如果信号变化速率超过物理极限(比如温度在1秒内变化超过10℃),判定为干扰并输出上一拍的值加一个"质量标志"供上位机判断。
- 阀门动作时间:调节阀从全关到全开可能需要几十秒,PID输出变化不能太激进。我给每个调节阀设置了"最小开度变化量"和"输出变化率限幅"(比如每100ms最多变化0.5%),防止阀门机械疲劳和管路水锤。
5.3 调试中的几个关键步骤
空载测试:在罐内无物料的情况下,先用手动模式逐个测试所有阀门、泵、电机,确认动作方向正确、反馈信号有效。这个测试一定要做记录表,逐项打勾,不要凭记忆。我一般会把测试表打印出来,一项项签。
模拟量整定校准:用信号发生器给AI模块送标准信号,核对HMI显示的工程量值是否准确。比如4mA对应0℃、20mA对应150℃,在HMI上检查线性度。对pH和DO电极,还要进行两点校准,并把校准斜率写入PLC变量,方便追溯。
PID自整定:PID_Compact支持一键自整定(Tuning),这个功能在温度回路上非常管用。但我建议自整定之前先把阀门的正反作用设置正确,否则自整定可能会把PID参数调得乱七八糟。自整定完成后,我还会手动微调增益和积分时间,通常把增益降10%~20%,因为在真实负载下系统增益往往会比自整定结果高一点,留点余量更稳。
故障注入测试:这不是可选项,而是制药项目必须做的事。人为断开温度传感器、短接pH电极输入端、关掉变频器通讯、模拟阀门反馈丢失,确认PLC能正确检测并触发报警和联锁。GMP验证里叫FAT(工厂验收测试)/SAT(现场验收测试),这一环节过不了,后面审计会很狼狈。
6. 常见问题与排查技巧实录
6.1 PID震荡和参数不收敛
这个可以说是发酵控制里出现频率最高的问题。典型表现是温度曲线在设定值附近来回摆动,或者DO波动很大。
排查路径:
- 先确认执行机构是否正常:阀门能否憋住蒸汽压力?冷却水阀是否卡涩?变频器给定和实际转速是否一致?先保证执行机构线性度好,再谈PID参数。
- 检查采样周期和输出周期:PID_Compact的输出更新和阀门的动作周期必须匹配。如果输出每100ms更新一次,但阀门执行器响应很慢,反而容易造成积分饱和和震荡。
- 试试只用P控制:先把积分时间设到最大(实际相当于禁用积分),只用比例控制,看系统是否稳定。如果纯P控制震荡,说明增益太高,往下降;如果纯P控制有静差但稳定,再逐步减小积分时间来消除静差。
- 检查滞后:温度测量点离加热夹套是否太远?如果温度传感器响应慢,PID看到的是"过去的温度",参数整定必然不准。必要时把传感器移到代表性位置。
6.2 模拟量信号漂移和断线误报
发酵现场的模拟量信号漂移,有一个常见但隐蔽的原因:pH和DO电极的电缆连接器受潮或接触不良。这种问题不是一直断线,而是间歇性电阻变化,导致读数跳动。我在调试时遇到过一次DO值上下乱跳但电极本身是新的情况,后来发现是电极接头没有拧紧,发酵过程中蒸汽冷凝水渗进去了。
排查这类问题,我的建议是:
- 在PLC里给每个关键模拟量增加"断线检测"和"跳变检测"。AI模块本身就支持断线检测(线电流<3.6mA即断线),但"跳变检测"要在程序里做——如果相邻两个中断周期工程量变化超过了设定阈值,就把"信号质量"位置位,趋势画面上该曲线显示为灰色/虚线。
- 现场用万用表测信号电流是否稳定。把信号发生器接到AI模块前端,如果PLC读数稳定,说明问题出在传感器或电缆;如果PLC本身读数不稳定,可能是模块或供电问题。
- 注意接地和屏蔽。模拟量信号线一定要用屏蔽双绞线,屏蔽层单端接地(一般在PLC柜侧接地),千万不要两端都接地,否则形成地环路电流,干扰更严重。
6.3 通讯中断和丢站
S7-1200和变频器/上位机的通讯偶尔会有断线重连的情况。比较常见的坑是:
- Modbus RTU的地址和参数表搞错:变频器的寄存器地址(比如运行频率是40001还是40001+偏移,每个厂家不一样)需要逐一验证。写频率时先写一个固定值,看变频器实际频率是否跟随,再接入PID输出。
- 通讯超时和安全停机:如果PLC一段时间没有收到变频器的响应,要做"看门狗"处理——把变频器给定降到0或按工艺要求保持原值并报警。我遇到过现场把"保持原值"做成"持续输出上次给定值",结果变频器在通讯中断后一直高速运行,把物料打飞了。正确的做法是:通讯故障后,根据预设策略执行"安全输出"(通常是最小转速或停机),同时操作员可以手动接管。
- 上位机读取PLC数据阻塞:如果PLC的PUT/GET通讯被大量读取请求占用,可能导致程序扫描周期变长。解决方案是:上位机不要对PLC每个变量做高频轮询,而是把关键数据打包到几个连续的DB数组里,一次性读取,频率控制在500ms以上。
6.4 程序下载后丢失数据
调试中经常遇到改了程序下载后,保持性数据丢失的问题。在博途V16里,DB块的"保持性"属性(Retain)默认是关闭的,如果不手动勾选,PLC断电或停机后该DB里的数据会被重置。配方、累计量、批次号、报警计数这些数据必须设为保持性。
有两点特别注意:
- 仅对需要的数据设置为保持性,不要整个DB都保持。保持性数据太多会占用掉电保持存储器,S7-1200的保持性存储区是有限的(CPU 1215C通常100KB级别),而且频繁写入保持性存储区(如每100ms写一次累计值)会缩短数据保持寿命。我的做法是:配方参数、批次信息放保持性DB;运行过程中的中间变量(PID输出、报警状态)放非保持DB。
- 修改DB结构后下载,即使勾选了保持性,某些版本博途可能仍会提示"将初始化DB"。如果不想丢数据,用"装载存储卡"的方式下载,或者把原数据导出,下载后再导入。最稳妥的是在修改DB结构前先做好数据备份。
7. 项目验收与后续维护建议
项目交付不是程序下载完、HMI能显示就结束了。制药项目的验收还涉及文档、验证、培训和运维交接,这些环节有一整套事情要准备。
文档交付方面,至少要包含:FS(功能说明)、DS(设计说明)、IO清单、程序架构图、报警清单、联锁矩阵表、操作手册、维护手册。这些文档不是随便写写,验证时审计师会拿着FS对照DS,再拿着DS去现场看实际运行是否一致。如果文档和实际程序对不上,会直接影响验证结论。
代码交付方面,我会把整个博途项目导出成归档文件(.zap17),同时导出一份程序块的PDF/A3打印件,方便检查和存档。PLC的源文件、HMI画面文件也要一并归档。注意归档时要包含注释,代码注释在验证时能大大降低审计师的检查难度。
培训方面,药厂操作人员、维护人员、工艺员三个角色的培训内容是完全不同的。操作员要会:HMI基本操作、报警确认、异常情况上报、批次启动/停止;维护人员要会:模拟量校准、I/O点测试、常见故障排查、PLC程序在线监视;工艺员要会:配方修改、参数调整、趋势曲线分析。我在项目里给每个角色都准备了一张"速查卡",把常见操作和维护流程缩印在一张A4纸上,现场使用非常受用。
运维建议方面,我特别强调几点:
- 定期备份PLC程序和HMI项目。建议每月一次,更新归档文件并记录版本号和变更内容。
- 配置好PLC的日期时间同步,在博途里可以设置NTP时间同步,或由上位机定期下发时间。没有统一时间的系统,报警和审计记录根本没法查。
- 关键备件(CPU模块、模拟量模块、电源模块)建议客户采购库存,不要等坏了再买,发酵车间的停产损失一天远大于模块价格。
说实话,发酵控制系统在整个制药自动化里是一个"看起来不复杂、实际很考验功底"的领域。它不像运动控制那样对实时性要求极致,也不像过程控制那样有大量高级算法,但它对工艺理解、系统可靠性、合规性的要求非常高。做这类项目,程序员不能只懂PLC指令,还得和工艺员、设备工程师、QA充分沟通,把工艺需求吃透,才能写出一套真正好用的程序。
如果你正在或者准备接手类似的生物发酵项目,我的建议是:先花一周时间泡在现场看操作员怎么干活、老系统怎么跑,再去写第一行代码。程序里最难写的不是控制逻辑,而是那些"操作员没有说出口的需求"——比如停电恢复后罐子里的料还能不能用、误操作后的紧急后退路径、交接班时如何快速判断当前状态。这些细节才是一套程序值不值钱的地方。