什么是SICAR?
SICAR 是西门子基于 TIA Portal 的汽车行业自动化标准。
SICAR 标准具有以下特点和优势:
- 提供了统一的硬件和软件标准,以及统一的接口。
- 涵盖了从 PLC 程序、HMI 画面到特定工艺功能块(如机器人、阀岛、视觉系统等),再到报警、诊断、文档、培训、服务等多个方面,实现了全面的标准化。
- 降低后期的人员培训和设备维护成本。
- 使自动化设备和产线达到更高质量的一致性。
- 利用预定义好的软件和硬件,可缩短工程周期,提高工程效率。
- 更利于汽车厂管理和维护线体供应商的代码质量。
例如,SICAR 4.0的 HMI 界面由原先的 OT 风格变成了 IT 风格,但画面结构未发生变化;PLC 程序结构及结构文件夹命名也延续之前的版本,不过功能块、DB 块、引脚的命名有变化,如大写改小写并去掉下划线。SICAR 标准通过 opmode 和 hmipanel 功能将多块屏和多操作区域建立联系,每个操作区域的 opmode 可独立管理包括“自动”和“手动”及相关特殊模式在内的操作模式,具体哪个操作面板控制哪个操作区域通过参数设置在 PLC 功能块调用,每个操作区域可分配多达16个操作面板,一个 PLC 中可配置多达32个操作模式区域,区域信息数据存储在全局 DB 中,同时每个 PLC 也可定义多达32个 hmIPanel,操作区域和面板的数量由 PLC 用户常量集中管理,这些常量用作数组限制。
另外,SICAR 标准中的 Prodiag 报警方式可以将 PLC 定义的报警文本信息直接推送到 HMI 上显示,无需在 HMI 侧定义报警文本,降低了 PLC 编程人员的工作量及人工出错率,同时可让上位系统直接订阅现场 PLC 报警信息。
不同版本的 SICAR 标准可能会有所更新和改进,具体内容可能会有所差异。它的产生源自车厂对产线维护的需求,目的是使维护工程师班组能根据工作需要随时调配到任何一条产线,并胜任相关工作。对于设备供应商来说,SICAR 标准是个紧箍咒,无论供应商原本的自动化工程师水平高低,都必须按规定好的规范来设计,不许有过多的个性发挥。但对于自动化工程师水平低的公司,这是好事,因为有现成的模板学习;而对于水平高的工程师,可能会感到痛苦,限制了其发挥空间。
汽车行业足够大,只要车厂有需求,像西门子、罗克韦尔这样的厂家,会自愿出面组织力量为车厂开发设计专用标准模板,车厂消化吸收后提供给设备供应商,要求其严格按照标准来设计,如有违反,可能导致验收不通过。一个车厂采用该标准后,其他车厂可能会直接套用或略加改进后发布为自己家标准并要求供应商执行。
SICAR 标准在一定程度上实现了汽车厂的目标,但对于实施过程中的设备方工程师的工作效率,可能并没有显著提升。在资本扩张时,仍需人海战术来实现,工程师们可能成为其中的一环。
SICAR 标准下的程序框架有哪些?
以下是一个较为常见的 SICAR 标准下的 PLC 程序框架的主要部分:
- 全局变量和常量定义:
定义整个程序中使用的全局常量,如设备参数、时间阈值等。
声明全局变量用于存储系统状态、故障信息等。 - 初始化块(OB100):
在 PLC 启动时执行一次,用于初始化变量、设置初始状态等。 - 主循环块(OB1):
程序的主要执行部分,包含系统的主要逻辑控制和流程。 - 故障处理块(OB80 - OB87 等):
用于处理不同类型的故障情况,如电源故障、通讯故障等。 - 定时中断块(OB30 - OB38 等):
以固定的时间间隔执行特定的任务,如周期性的数据采集或控制动作。 - 硬件中断块(OB40 - OB47 等):
响应硬件事件,如外部输入信号的变化。 - 功能块(FB)和功能(FC):
封装可重复使用的功能逻辑,提高程序的可读性和可维护性。 - 数据块(DB):
存储程序运行过程中的数据,包括输入、输出、中间变量等。
例如,在一个汽车生产线上的 SICAR 标准程序中,可能会有一个专门的故障处理块 OB82 来处理 PLC 与传感器之间的通讯故障。在主循环块 OB1 中,会根据各种输入信号和条件,通过调用功能块来控制生产线上不同工位的设备动作。
需要注意的是,具体的 SICAR 标准程序框架可能会因项目的具体需求和应用场景而有所不同,但上述部分通常是常见的组成元素。
程序的示例
以下是一个非常简单的 SICAR 标准下的 PLC 程序示例框架,用于控制一个简单的生产流程中的电机启动和停止:
FUNCTION_BLOCK FB_ProductionControl VAR_INPUT StartButton : BOOL; // 启动按钮输入 StopButton : BOOL; // 停止按钮输入 END_VAR VAR_OUTPUT MotorRunning : BOOL; // 电机运行状态输出 END_VAR VAR InternalFlag : BOOL; // 内部标志位 END_VAR BEGIN // 启动逻辑 IF StartButton AND NOT InternalFlag THEN InternalFlag := TRUE; END_IF; // 停止逻辑 IF StopButton THEN InternalFlag := FALSE; END_IF; // 输出电机运行状态 MotorRunning := InternalFlag; END_FUNCTION_BLOCK