尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

西门子CPG与PACKML:基于TIA Portal的PLC标准化状态机编程

西门子CPG与PACKML:基于TIA Portal的PLC标准化状态机编程 在包装机械、食品饮料和流程工业项目里程序“长什么样”往往取决于上一个工程师的习惯。有人喜欢把所有动作写进一个 OB1有人习惯用 S7-Graph 做顺控有人把状态字用整型 Int 存起来还有人干脆把所有气缸输出放在一个 Bool 数组里。设备单机跑起来没问题可一旦要联线、要接 MES/SCADA、要换人维护问题就来了MES 问“设备当前是什么状态”你要去翻 DB 块上位机要启停设备你不知道命令该往哪个地址写产线换产品型号程序里的配方逻辑改得人心力交瘁。这类问题的根源不是某个工程师写代码水平不够而是缺少一套统一的设备建模和状态管理标准。本文要聊的西门子 CPG PACKML 编程框架就是为了解决这类问题而出现的。文章适合三类读者一是正在做包装设备、单机自动化想提升程序复用性的 PLC 工程师二是做上位机、MES 对接的软件工程师想搞清楚设备侧状态和命令怎么定义三是刚入门西门子 TIA Portal、想建立规范编程思路的新人。读完你会掌握 PACKML 状态机的核心模型、CPG 编程框架的基本思想以及如何在 TIA Portal 中用 SCL 落地一个可复用的 PackML 状态机功能块。1. 为什么包装设备需要标准化编程框架1.1 一台设备一种程序带来的困境如果你做过三年以上包装线项目大概率遇到过这些场景A 工程师写的贴标机正转、反转用两个 Bool 变量控制B 工程师写的装箱机启停逻辑用 M 区中间位C 工程师写的码垛机状态字是 0~99 的魔法数字注释只写了“状态 23 是复位后等待进箱”。单看每一台设备程序都能运行。但把它们放在一条产线上时问题就集中爆发MES 要读取每一台设备的状态结果发现每台设备的状态地址不统一上位机要写好几套驱动。现场调试时操作员把 A 设备停在了“暂停”状态但 B 设备认为 A 已经“完成”上下游联锁逻辑全部错乱。换一个维护工程师光理解上一任的程序结构就要花两周。程序移植到同类新设备时复制一份再改地址排查隐患非常痛苦。这不是代码质量问题而是“数据字典”和“控制模型”没有统一。PACKML 和 CPG 解决的核心问题就是先把“设备状态”“设备模式”“设备命令”这些概念定义清楚。1.2 PACKML 是什么PACKML 的全称是 Packaging Machine Language即包装机器语言。它最初由 OMACOrganization for Machine Automation and Control机器自动化与控制组织面向包装机械行业提出相关的标准文档通常被称为“OMAC PackML Implementation Guide”。PACKML 做的事情可以拆成三块定义了一套标准的设备状态机比如 Idle、Starting、Execute、Stopping、Stopped、Aborting、Aborted 等。定义了一套标准的“模式”Modes比如自动模式、手动模式、维护模式。定义了一套标准的“命令”Commands比如启动、停止、复位、停机、暂停。换句话说PACKML 不关注你用的是西门子、罗克韦尔还是倍福它只关注“设备应该用什么样的语言来描述自己”。只要你的设备控制程序实现了这套状态机和变量命名MES、SCADA、机器人、HMI 都能用统一的方式跟它对话。这也是为什么很多国际招标文件里会明确要求“设备控制程序需符合 PACKML 标准”。在实际项目中哪怕是中小型单机提前把 PackML 状态机搭好也能省下大量后期联调时间。1.3 CPG 又是什么CPG 在西门子语境下通常指 Common Process Generator是西门子在 TIA Portal 中提供的一套面向流程行业和模块化机械的编程库/框架。它的核心思想源自 ISA-88 批量控制标准。简单理解CPG 帮助你把一台设备拆分成三个层级Unit单元一台设备或一条设备段比如贴标单元、装箱单元。Equipment Module设备模块单元里的具体部件比如贴标头、传送带、挡停气缸。Phase阶段设备模块执行的原子动作比如“工件进给”“贴标”“压紧”。在 CPG 框架中Unit 拥有自己的状态机Phase 可以被上层逻辑触发、暂停、恢复和停止。这样写出来的程序结构上很像搭积木每个设备模块可以单独调试单元只要组合模块并协调它们的 Phase 顺序即可。需要特别说明一点网上搜索“CPG”时会看到很多地理信息系统GIS相关的“cpg 插件”“.cpg 编码文件”。那是另一个领域的东西和西门子 CPG 编程框架无关。本文讨论的 CPG指的是西门子 TIA 生态里的模块化编程库以及围绕 ISA-88 思想的工程落地方法。2. PACKML 核心概念状态机与产品模式2.1 16 个标准状态PACKML 标准里设备状态被划分为一组有限状态。最常见的实现包含 16 个状态下面逐一说明状态含义说明Uninitialized未初始化上电后未复位的初始状态Idle空闲设备已复位等待启动命令Starting正在启动收到启动命令执行启动条件检查Execute运行设备正常执行生产动作Completing正在完成当前生产周期即将结束做收尾动作Complete已完成一个生产周期完成Resetting正在复位从各种状态回到空闲的中间过程Clearing正在清除从故障/中止状态清除报警的中间过程Stopping正在停止收到停止命令执行减速停车动作Stopped已停止设备停止完成Aborting正在中止发生严重故障或急停执行紧急停车Aborted已中止设备处于故障保持状态Holding正在暂停收到暂停命令正在暂停动作Held已暂停设备暂停完成Suspending正在挂起收到挂起命令执行挂起准备Suspended已挂起设备挂起完成需要注意不同厂家的实现会做少量合并或补充但核心状态迁移关系基本一致。PACKML 的价值就在于这些状态在业界已经形成了统一认知设备厂商和上位机供应商提到“Stopped”或“Aborted”双方都清楚代表什么。2.2 状态转换规则状态转换不是随意的PACKML 标准定义了哪些状态之间可以互相转换以及转换需要什么触发条件。下面是一个简化版的状态转换表适合作为 PLC 功能块的开发依据当前状态触发条件目标状态UninitializedResetIdleIdleStartStartingStarting启动条件满足ExecuteExecuteStopStoppingExecuteHoldHoldingExecuteAbortAbortingExecute生产周期完成CompletingStopping停止完成StoppedStoppedResetResettingResetting复位完成IdleCompleting收尾完成CompleteCompleteResetResettingHolding暂停完成HeldHeldResetResetting 或 ExecuteAborting中止完成AbortedAbortedResetResettingResetting复位完成Idle实际项目中Hold 和 Suspend 的恢复路径要看工艺要求。有些设备从 Held 恢复后直接回 Execute有些则必须先回 Idle 再重新启动。开发前一定要和机械、工艺工程师确认清楚不要凭空设计。2.3 模式管理与命令PACKML 除了状态机还定义了模式管理Mode。常见模式有自动模式Automatic设备根据工艺顺序自动运行。手动模式Manual操作员通过 HMI 或本地按钮逐个动作调试。维护模式Maintenance具备手动模式功能同时可以屏蔽部分安全联锁但通常需要钥匙开关或密码授权。命令Command是驱动状态机运行的输入信号。PACKML 标准建议使用短命令加边沿触发例如Reset复位设备。Start启动设备。Stop执行停车。Abort紧急中止。Hold暂停。Suspend挂起。在 PLC 程序里这些命令最好做上升沿检测避免长信号导致状态反复跳转。这也是很多初学者最容易忽略的点。3. CPG 编程框架与西门子 TIA Portal 生态3.1 CPG 的模块化思想前面提到CPG 是西门子对 ISA-88 的一种工程实现。如果只是做单台包装机直接用 PACKML 状态机就够了但如果是一条产线设备段之间有复杂的物料交接和批次关系CPG 的 Unit/Phase 模型会更有优势。CPG 的典型结构可以抽象为下面这个简图产线 / 机器 └── Unit单元 ├── Equipment Module设备模块 │ ├── 气缸 │ ├── 电机 │ └── 传感器 └── Phase阶段 ├── PH_Feed进给 ├── PH_Position定位 └── PH_Process加工Phase 由上层 Unit 调用一个 Unit 可以同时管理多个 Phase。这样做的好处是每个 Phase 是可复用单元换一台设备时把 Phase 库导入即可。Phase 支持启动、停止、保持、恢复等标准命令和 PACKML 的状态模型天然合拍。底层设备模块只用处理具体 IO 和动作不用关心整个产线逻辑。3.2 PACKML 与 CPG 如何配合很多初学者会把 PACKML 和 CPG 理解为互相替代的两套东西其实它们更像是“标准”和“框架”的关系PACKML 给出了“设备应该有哪些状态、如何命名变量”的标准。CPG 给出了“程序模块应该如何组织、Unit/Phase 如何封装”的框架。在实际工程中常见做法是用 CPG 的组织思路把设备拆成 Unit 和 Equipment Module。在 Unit 上层实现 PACKML 状态机作为设备对外统一的“状态窗口”。每个 Phase 内部再实现自己的动作细节但对外暴露统一的命令接口。这样既满足了 MES/SCADA 对标准化状态的需求又保证了设备程序本身具备良好的模块化和复用性。3.3 在 TIA Portal 中如何落地在 TIA Portal 中落地这套思路主要有三种方式自己写标准功能块用 SCL 实现 PackML 状态机把状态、命令、模式封装成一个 FB。这是最灵活、最容易理解的方式也是本文第 5 节要演示的重点。使用西门子 PACKML 库/模板TIA Portal 官方库中提供了面向包装行业的 PackML 示例程序可以直接在“全局库”里找到并参考不同版本名称可能略有差异。使用 SIMATIC CPG 库对于流程行业项目可以基于西门子 CPG 库展开 Unit、Equipment、Phase 建模。这套库的封装更完整但学习曲线也相对陡峭。无论选择哪种方式核心都是先理解状态机和模块化思想否则拿到库也只是会拖拽不会修改维护。4. 环境准备与版本说明本文示例以西门子 TIA Portal 为基础所用环境主要包含以下内容版本需要根据你的项目实际情况调整操作系统Windows 10/11 专业版推荐使用 64 位系统。编程软件TIA Portal V18或者 V16/V17 也可以运行界面略有差异。PLCS7-1200 或 S7-1500本文代码以 S7-1500 为示例S7-1200 完全支持 SCL但需要注意资源限制。编程语言SCL结构化控制语言。仿真软件S7-PLCSIM用于本地功能验证如果有实体 PLC 则更好。HMI如果做联调演示可以使用 WinCC V18 和仿真面板。需要注意TIA Portal V18 的项目文件不能被 V17 或更低版本直接打开这是 Siemens 软件一贯的版本机制。如果你还在使用旧版本照着代码思路手动创建即可不用纠结于能否直接打开项目文件。很多读者问“S7-1200 和 S7-1500 谁适合跑 PACKML”答案是都可以。S7-1200 更适合单机设备比如贴标机、小包装机S7-1500 更适合多单元联动、带 CPG 库的大型设备或产线。不过本文演示的状态机逻辑很简单S7-1200 也能轻松跑起来。5. 实战用 SCL 实现一个 PackML 状态机功能块5.1 功能规划我们要实现的 PackML 状态机功能块包含以下功能输入启动、停止、复位、中止、保持、挂起等命令。输出当前状态编号供 HMI、MES、上位机读取。输出一个运行标志位方便其他程序块引用。所有命令采用上升沿触发避免持续电平导致状态乱跳。为了不让示例过于复杂先不展开多级模式切换只保留自动模式下的核心状态迁移但保留足够的扩展接口。5.2 定义状态枚举类型在 TIA Portal 中建议先用 PLC 数据类型UDT定义 PackML 状态枚举。在项目树中选择“PLC 数据类型”新建一个类型命名为“PackMLStates”。TYPE PackMLStates ( UNINITIALIZED : 0, IDLE : 1, STARTING : 2, EXECUTE : 3, COMPLETING : 4, COMPLETE : 5, RESETTING : 6, CLEARING : 7, STOPPING : 8, STOPPED : 9, ABORTING : 10, ABORTED : 11, HOLDING : 12, HELD : 13, SUSPENDING : 14, SUSPENDED : 15 ) ; END_TYPE这里把枚举成员与整数一一对应后续 HMI 可以直接通过整数型状态字做文本列表显示也可以方便上位机解析。5.3 实现状态机核心逻辑下面创建一个功能块命名为“FB_PackMLCore”。语言选择 SCL。文件路径TIA Portal 项目树 - 程序块 - 添加新块 - 功能块 - FB_PackMLCoreFUNCTION_BLOCK FB_PackMLCore { S7_Optimized_Access : TRUE } VERSION : 0.1 VAR_INPUT bEnable : Bool; // 使能信号状态迁移完成后复位的判断条件 bStart : Bool; // 启动命令 bStop : Bool; // 停止命令 bReset : Bool; // 复位命令 bAbort : Bool; // 中止命令 bHold : Bool; // 暂停命令 bSuspend : Bool; // 挂起命令 bProcessDone : Bool; // 生产周期完成标志 END_VAR VAR_OUTPUT iState : Int; // 当前状态编号供 HMI/上位机读取 bExecuting : Bool; // 运行标志位 END_VAR VAR eState : PackMLStates; // 当前状态枚举 trgStart : R_TRIG; // 上升沿检测启动 trgStop : R_TRIG; // 上升沿检测停止 trgReset : R_TRIG; // 上升沿检测复位 trgAbort : R_TRIG; // 上升沿检测中止 trgHold : R_TRIG; // 上升沿检测保持 trgSuspend : R_TRIG; // 上升沿检测挂起 END_VAR BEGIN // 对命令做上升沿检测确保动作只触发一次 #trgStart(CLK : #bStart); #trgStop(CLK : #bStop); #trgReset(CLK : #bReset); #trgAbort(CLK : #bAbort); #trgHold(CLK : #bHold); #trgSuspend(CLK : #bSuspend); CASE #eState OF PackMLStates.UNINITIALIZED: // 上电后第一次复位进入 Idle IF #trgReset.Q THEN #eState : PackMLStates.IDLE; END_IF; PackMLStates.IDLE: // 空闲状态收到启动命令后进入 Starting IF #trgStart.Q THEN #eState : PackMLStates.STARTING; END_IF; PackMLStates.STARTING: // 启动条件满足后进入 Execute IF #bEnable THEN #eState : PackMLStates.EXECUTE; END_IF; PackMLStates.EXECUTE: // 运行中响应各类中断命令 IF #trgAbort.Q THEN #eState : PackMLStates.ABORTING; ELSIF #trgStop.Q THEN #eState : PackMLStates.STOPPING; ELSIF #trgHold.Q THEN #eState : PackMLStates.HOLDING; ELSIF #trgSuspend.Q THEN #eState : PackMLStates.SUSPENDING; ELSIF #bProcessDone THEN #eState : PackMLStates.COMPLETING; END_IF; PackMLStates.COMPLETING: // 一个生产周期收尾完成 IF #bEnable THEN #eState : PackMLStates.COMPLETE; END_IF; PackMLStates.COMPLETE: // 成品周期完成等待复位 IF #trgReset.Q THEN #eState : PackMLStates.RESETTING; END_IF; PackMLStates.HOLDING: // 暂停完成 IF #bEnable THEN #eState : PackMLStates.HELD; END_IF; PackMLStates.HELD: // 暂停恢复直接回 Execute或先复位回 Idle IF #trgReset.Q THEN #eState : PackMLStates.EXECUTE; END_IF; PackMLStates.SUSPENDING: // 挂起完成 IF #bEnable THEN #eState : PackMLStates.SUSPENDED; END_IF; PackMLStates.SUSPENDED: // 挂起恢复 IF #trgReset.Q THEN #eState : PackMLStates.EXECUTE; END_IF; PackMLStates.STOPPING: // 停止完成 IF #bEnable THEN #eState : PackMLStates.STOPPED; END_IF; PackMLStates.STOPPED: // 停止后复位 IF #trgReset.Q THEN #eState : PackMLStates.RESETTING; END_IF; PackMLStates.ABORTING: // 紧急中止完成 IF #bEnable THEN #eState : PackMLStates.ABORTED; END_IF; PackMLStates.ABORTED: // 故障排除后清除报警并复位 IF #trgReset.Q THEN #eState : PackMLStates.RESETTING; END_IF; PackMLStates.RESETTING: // 复位完成回到空闲 IF #bEnable THEN #eState : PackMLStates.IDLE; END_IF; PackMLStates.CLEARING: // 清除动作完成回到空闲 IF #bEnable THEN #eState : PackMLStates.IDLE; END_IF; END_CASE; // 更新输出 #iState : #eState; #bExecuting : (#eState PackMLStates.EXECUTE); END_FUNCTION_BLOCK这段代码是核心示例实际项目中你还需要加入急停、安全门、模式管理等功能。特别注意急停处理必须在状态机外围或上一级逻辑中实现不建议把急停信号直接作为 PACKML 状态机的一个普通输入因为急停属于安全功能应当由安全回路和安全 PLC 接管PACKML 状态机只是在安全停止后接收结果并进入 Aborted/Stopped 状态。5.4 在主程序中调用功能块创建 OB1将“FB_PackMLCore”拖入 OB1并生成一个背景数据块例如“DB_PackML_Unit1”。// 文件路径OB1 CALL FB_PackMLCore, DB_PackML_Unit1 bEnable : Tag_StartupOK, // 启动条件 bStart : HMI_PackML_Start, // HMI 启动按钮 bStop : HMI_PackML_Stop, // HMI 停止按钮 bReset : HMI_PackML_Reset, // HMI 复位按钮 bAbort : Tag_EmergencyStop, // 安全系统回读的急停状态注意这里是回读 bHold : HMI_PackML_Hold, // HMI 保持按钮 bSuspend : HMI_PackML_Suspend, // HMI 挂起按钮 bProcessDone : Tag_CycleComplete, // 工艺周期完成标志 iState : DB_PackML_Status.iState, bExecuting : DB_PackML_Status.bExecuting;这里使用了 TIA 的符号寻址方式用 PLC 变量表里的符号名来对应地址。如果 S7-1200 和 HMI 或上位机通讯时需要绝对地址可以在 PLC 变量表中取消“优化的块访问”或查看 PLC 自动分配的地址后面联调时再处理。5.5 在 PLCSIM 中运行验证如果你暂时没有实体 PLC可以用 S7-PLCSIM 做功能验证步骤非常简单在 TIA Portal 中编译整个项目确保无错误。点击“开始仿真”按钮下载项目到 PLCSIM。打开监控表将“HMI_PackML_Reset”置为 True 再置为 False观察“DB_PackML_Status”.iState 是否从 0 变为 1IDLE。将“HMI_PackML_Start”置为 True 再置为 False观察 iState 是否从 1 变为 2STARTING。将“Tag_StartupOK”置为 True观察 iState 是否从 2 变为 3EXECUTE。将“Tag_CycleComplete”置为 True观察 iState 是否从 3 变为 4COMPLETING然后把“Tag_StartupOK”置为 TrueiState 应变为 5COMPLETE。最后给 Reset观察状态回到 IDLE。通过 PLCSIM 验证后你再把同样的逻辑下载到实体 PLC 中会踏实很多。6. 从 PLC 到 HMI 与上位机的联调6.1 WinCC 显示状态文本在 WinCC 中显示 PACKML 状态最方便的方式是使用“文本列表”。在 WinCC 画面中新建一个“文本列表”类型选择“二进制”或者在“IO 域”中直接关联 PLC 的状态变量设置格式为十进制。然后在画面中添加一个 IO 域连接变量“DB_PackML_Status”.iState再创建一个“图形 IO 域”或“文本和图形列表”把状态编号映射为对应的状态文字数值文本0未初始化1空闲2正在启动3运行4正在完成5已完成6正在复位7正在清除8正在停止9已停止10正在中止11已中止12正在暂停13已暂停14正在挂起15已挂起这样操作员看到的不再是数字而是直观的状态文字排查设备问题时效率会提高很多。6.2 昆仑通泰触摸屏读取 S7-1200 DB 块数据很多国产 HMI比如昆仑通泰MCGS、威纶通都支持直接读西门子 S7-1200。如果你使用的是昆仑通泰触摸屏想提取 S7-1200 DB 块里的数据核心要理解两个概念“符号寻址”和“绝对地址”S7-1200 默认使用优化的块访问DB 块里的变量没有固定地址HMI 必须通过符号方式访问而很多国产触摸屏对符号访问的支持不如西门子 WinCC 好。解决方法是在 PLC 侧把需要给 HMI 的 DB 块取消“优化的块访问”这样每个变量都会分配一个偏移地址例如 DB 块的状态变量偏移地址可能是 DB1.DBW0、DB1.DBD2HMI 就能用绝对地址直接读取。在昆仑通泰组态软件中新建设备通道时选择“西门子 S7-1200”驱动通道类型选择“DB 块”填写 DB 编号、偏移地址、数据类型即可。注意字节偏移要算准整型数据占用 2 字节实数占用 4 字节。如果你读取 iState 之后发现数值和 PLC 监控的不一致优先检查字节顺序、数据长度和偏移量。6.3 C# 上位机采集状态如果上位机系统用 C# 开发读取 PACKML 状态通常有两种做法使用西门子官方通信库比如 S7-1200 的 PUT/GET 通信方式。使用第三方开源库例如 S7netplus 等按 S7 协议读取指定 DB 块。C# 上位机采集的关键点不是底层协议而是“状态变量的地址要固定”。所以前面建议把状态变量单独放到一个专用的“通讯 DB 块”里并且关闭优化块访问。这样上位机只需要读一个 DB 块就能一次性拿到设备当前状态 iState。设备模式 Mode。本班产量 Counter。当前故障代码 FaultCode。产品编号 ProductID。换句话说这块 CPU 里的“通讯 DB”实际上就是 PACKML 标准中 PackTag 概念的落地。7. 常见问题与排查清单7.1 常见问题表格问题现象常见原因解决思路状态机一直停在 Starting启动条件 bEnable 没有满足监控启动条件对应的变量确认设备各就绪信号点击 Start 没反应Start 信号是持续电平状态机要求上升沿检查 HMI 按钮是否配置为“复位为 0”或改用脉冲置位/复位设备运行中 Stop 后无法复位停在 Stopped但没有给 Reset 命令手动触发 Reset检查 HMI 按钮和上位机命令是否下发急停后状态没有进入 Aborted急停信号只是普通 IO状态机里没有相应迁移把安全系统回读的急停状态传入 Abort 输入走 Aborting - AbortedHMI 显示状态数字而不是文本IO 域没有关联文本列表在 WinCC 中新建文本列表并映射状态值国产触摸屏读不到 DB 块数据DB 块开启了优化块访问将通讯 DB 块取消“优化的块访问”记录绝对地址SUSPENDED 恢复后动作顺序乱了挂起和恢复路径设计不合理和工艺确认挂起时应停在哪个位置恢复时是否需要重新走启动流程程序一运行就报地址冲突多个设备模块复用了同一组 M 区或 DB 地址统一使用符号寻址状态机使用独立背景 DB7.2 排查建议清单在实际项目中遇到状态机行为异常建议按以下顺序排查先看输入命令是否真正到达 PLC。用 PLA 变量表或监控表实时监控 Start、Stop、Reset 等变量。再看状态机当前到底停在哪个状态。不要凭感觉直接看背景 DB 中 iState 的当前值。检查 bEnable 对应的就绪信号。启动、停止、复位这些迁移都需要 bEnable 置位才认为动作完成这是最常见的“状态卡住”原因。检查命令是否是脉冲。TIA 中的 HMI 按钮如果勾选了“保持”很容易让命令一直为 True。检查是否有多个地方在写同一个状态变量。比如 OB1 和 OB100 里如果同时写状态字会出现跳变。8. 最佳实践与工程建议8.1 从项目第一天就建立统一状态字刚接手新项目时不要急着写具体气缸、电机动作先花半天把 PACKML 状态机和通讯变量定义好。状态字不要用魔法数字散落在程序各处而是定义 PLC 数据类型每个状态值都有命名。这样 MES 对接、HMI 开发、现场调试都可以并行推进。8.2 单独划分通讯 DB 块建议把与上位机交互的变量统一放到一个或者几个专用的 DB 块中命名规则清晰例如TYPE DB_PackML_PackTag STRUCT // Admin 区域 DeviceName : String[40]; DeviceMode : Int; DeviceState : Int; FaultCode : Int; // Current 区域 CycleCount : DInt; GoodCount : DInt; BadCount : DInt; Speed : Real; // Command 区域 CmdStart : Bool; CmdStop : Bool; CmdReset : Bool; CmdAbort : Bool; END_STRUCT END_TYPE这样做的好处是无论后续上位机用 C#、Python 还是 WinCC都只需要读一个块不用关心设备内部复杂的电机、气缸逻辑。8.3 状态迁移必须保证完整性很多初版状态机只写了“正常启动、正常停止”这几条路径忽略了 Hold、Abort、Suspend。一旦现场出现异常状态就回不到 Idle。建议开发阶段就把所有合法迁移路径列成表格逐条对照实现不要等设备到现场再补。8.4 不要把安全功能写进普通状态机急停、安全门、光幕这类安全信号必须由安全回路和安全程序处理。普通 PLC 中的 PACKML 状态机只负责接收安全系统给出的“允许运行”信号和安全停止完成状态。千万不要用普通输入点直接接急停按钮再靠状态机逻辑去停车这既有安全风险也不符合 CE 和机械安全标准的常见要求。8.5 统一 Phase 命令接口如果使用 CPG 框架或自研 Phase 管理逻辑Phase 的输入命令尽量统一定义为 Start、Stop、Hold、Reset 四种。不要在某个 Phase 里单独引入五花八门的命名。这样上层 Unit 调度时可以像调用函数一样统一处理所有 Phase。9. 总结与学习路线这篇文章的核心内容可以归纳为三句话PACKML 是一套设备状态、模式和命令的行业标准它让设备有了统一的“对外语言”。CPG 是西门子面向 ISA-88 的模块化编程框架它让设备程序有了统一的“内部结构”。在 TIA Portal 中我们可以用 SCL 自己实现一个可复用的 PackML 状态机再通过标准 PackTag 变量与 HMI、MES、上位机对接。如果你是第一次接触这两个概念建议按下面的顺序学习先动手实现第 5 节的 SCL 状态机下载到 PLCSIM 中跑通状态转换。再对照 OMAC 发布的“PackML Implementation Guide”检查自己的状态迁移是否完整。然后去 TIA Portal 官方库中找一个 PackML 或 CPG 的示例程序对比专业库和自己的实现之间的差异。最后在实际设备或产线上把状态字、模式切换、PackTag 通讯变量全部打通。推荐做一个小练习给一台自动贴标机设计状态机要求包含手动模式、自动模式、暂停/恢复、急停后的 Aborted 与复位流程并定义 10 个 PackTag 变量供模拟 MES 读取。把整个过程做完你对 PACKML 和 CPG 的理解就不再是概念层面而是真正能落地到项目里的工程能力了。
返回列表