晟辉智能制造

维修电工高级plc试题编程

以下为您设计一套完整的高级PLC编程模拟试题,包含理论题编程实操题,并附有详细的答案和解析。

维修电工高级plc试题编程-图1
(图片来源网络,侵删)

维修电工(高级)PLC编程理论试题

考试时间: 60分钟 总分: 100分

选择题(每题3分,共30分)

  1. 在S7-1200/1500 PLC中,要实现一个具有“断电保持”功能的定时器,最合适的方法是? A. 使用TONR(保持型接通延时定时器) B. 使用TON(接通延时定时器),并将定时器变量存储在“保持性”数据块中 C. 使用TOF(断开延时定时器) D. 使用TP(脉冲定时器)

  2. 一个高速计数器需要对外部编码器输出的A、B、Z三相脉冲进行计数,并要求在达到设定值时触发一个中断,在S7-1200/1500中,应采用哪种工作模式? A. 模式0:对A相信号的上升沿计数 B. 模式4:带内部方向控制的A/B相正交计数 C. 模式9:对A/B相信号的上升沿和下降沿进行4倍频正交计数 D. 模式11:单路脉冲输入,带外部方向控制

    维修电工高级plc试题编程-图2
    (图片来源网络,侵删)
  3. 在PLC编程中,为了避免双线圈输出(一个输出线圈在程序中被赋值两次)可能引起的逻辑混乱,通常的最佳实践是? A. 使用中间继电器(M)来重置输出 B. 使用“置位/复位”(S/R)指令代替直接输出 C. 在程序的最后才对输出线圈进行赋值 D. 将两个逻辑分支用“或”指令连接起来

  4. 关于PLC的模拟量模块,下列说法正确的是? A. 模拟量输入模块的分辨率越高,其测量精度一定越高。 B. PLC可以直接处理标准4-20mA或0-10V的模拟量信号,无需进行量程转换。 C. 模拟量输出模块的“写入”操作是周期性自动完成的,与用户程序无关。 D. 在进行模拟量PID控制时,必须先将工程值转换为PLC的整数或浮点数。

  5. 以下哪种通信方式通常用于连接HMI(人机界面)和PLC,实现实时数据交换? A. Modbus RTU (串口) B. PROFINET C. Ethernet/IP D. 以上都可以,取决于硬件和配置

  6. 在SCL(结构化控制语言)中,#Var := IN1 AND IN2; 这行代码的含义是? A. 将IN1和IN2的“与”运算结果赋值给局部变量#Var B. 将IN1和IN2的“或”运算结果赋值给局部变量#Var C. 声明一个名为#Var的变量,其初始值为IN1 AND IN2 D. 比较IN1和IN2是否相等

    维修电工高级plc试题编程-图3
    (图片来源网络,侵删)
  7. 下列哪个指令不是S7-1200/1500用于处理字符串的指令? A. "FIND" B. "DELETE" C. "CONCAT" D. "DECO" (译码)

  8. 一个电机启动控制回路,要求按下启动按钮后,电机运行5分钟后自动停止,并且在运行期间,按下停止按钮可以立即停止,最合适的程序结构是? A. 一个TON定时器,其输入与启动按钮并联,输出控制电机。 B. 一个TON定时器,其输入与启动按钮串联,输出控制电机。 C. 使用置位/复位指令,启动按钮置位电机和定时器,定时器到期或停止按钮复位电机。 S. 使用计数器来计时。

  9. 在PID控制功能块(FB41 "CONT_C")中,"LMN_HLM"参数的作用是? A. 比例增益 B. 积分时间 C. 微分时间 D. PID输出上限值

  10. 全局数据块”和“背景数据块”的说法,正确的是? A. 全局数据块只能用于存储静态数据,背景数据块用于存储临时数据。 B. 背景数据块是当功能块(FB)被调用时自动创建的,用于存储该FB的实例数据。 C. 全局数据块可以被任意程序块(OB, FB, FC)访问,而背景数据块只能被其对应的FB访问。 D. 全局数据块和背景数据块没有区别,可以互换使用。


填空题(每空2分,共20分)

  1. PLC最常用的三种编程语言是: 和 ___
  2. S7-1200/1500 PLC中,用于处理浮点数运算的指令是 ___
  3. 在进行模拟量PID控制时,通常需要将传感器采集的物理量(如温度、压力)转换为PLC的 数,同时将PID运算结果(通常是0-27648或0-100%)转换为对应的 信号(如4-20mA)输出给执行器。
  4. 为了防止程序在单个扫描周期内因干扰导致输出错误,可以采用“”或“”的方法来增加输出的可靠性。
  5. 在S7-1200/1500中,使用“___”指令可以方便地实现多个分支的“或”逻辑组合,使程序结构更清晰。
  6. 对于需要频繁读写、但数据量不大的I/O点,可以使用PLC的___区进行映像,以提高扫描效率。

简答题(每题10分,共20分)

  1. 简述在PLC程序中实现“互锁”控制的两种常用方法,并说明各自的优缺点。
  2. 解释什么是“扫描周期”?它对PLC程序的执行有什么影响?如何通过编程手段来优化一个较长的扫描周期?

程序分析题(共15分)

请分析以下梯形图程序,并写出其对应的布尔逻辑表达式(或语句表),并说明当I0.0I0.1I0.2的状态分别为不同组合时,Q0.0的输出状态。

|   Network 1:      |
|   I0.0     I0.1   |
|----| |-----------( )--|    |
|    |              |    |    |
|    |              |    |----( ) Q0.0
|    |              |    |
|    I0.2           |    |
|----|/|------------|    |
|                       |
|   Network 2:      |
|   M0.0            |
|----| |-----------( )--|    |
|                       |
|   Network 3:      |
|   I0.3            |
|----| |-----------( )--(R) M0.0
|

设计题(共15分)

设计一个交通信号灯控制程序,控制要求如下:

  • 东西方向: 绿灯亮30秒,然后黄灯亮3秒,然后红灯亮。
  • 南北方向: 红灯亮33秒,然后绿灯亮30秒,然后黄灯亮3秒,然后红灯亮。
  • 东西和南北方向信号灯同时变化,构成一个完整的周期为36秒的循环。
  • 有一个“紧急模式”选择开关(I0.0),当I0.0为ON时,所有方向的信号灯全部变为黄灯闪烁(0.5秒亮,0.5秒灭),直到I0.0恢复OFF,程序自动从初始状态(东西绿灯,南北红灯)重新开始运行。

要求:

  1. 画出I/O分配表。
  2. 画出功能流程图或时序图。
  3. 使用TON定时器,编写核心控制逻辑的梯形图或SCL代码片段。

理论试题参考答案

选择题

  1. B (解析:TONR本身不具备断电保持功能,其保持性依赖于PLC的超级电容或电池,在S7-1200/1500中,更现代和可靠的方法是将普通TON定时器的变量存入具有“保持性”属性的数据块中,这样即使PLC断电,数据块中的值也能被保存。)
  2. C (解析:A/B/Z三相脉冲通常用于判断零位和多倍频计数,模式9(4倍频)能提供最高的分辨率,Z相用于复位计数器或寻找参考点。)
  3. B (解析:S/R指令是构建复杂、稳定逻辑的标准方式,它将逻辑判断和最终输出解耦,避免了因扫描顺序不同导致的双线圈问题。)
  4. D (解析:A选项,分辨率和精度是两个概念,还受噪声、线性度等影响,B选项,模拟量模块需要根据量程进行配置和转换,C选项,模拟量输出需要用户程序周期性地写入数值。)
  5. D (解析:这三种都是工业自动化领域主流的HMI-PLC通信协议,具体使用哪一种取决于PLC品牌、HMI品牌和项目要求。)
  6. A (解析:SCL中,是赋值运算符,AND是逻辑与运算符,表示局部变量。)
  7. D (解析:"DECO"是译码指令,将二进制数转换为对应的十进制位输出,是标准位操作指令,不是字符串处理指令。)
  8. C (解析:S/R结构能很好地处理“启动/停止”和“定时到停止”两个条件,逻辑清晰,是此类控制的首选。)
  9. D (解析:在PID功能块中,LMN_HLM和LMN_LLM分别代表PID输出值的高限和低限,用于限制执行器的动作范围。)
  10. B (解析:这是FB功能块的核心特性,背景数据块与FB实例绑定,存储特定调用的数据,全局数据块独立存在,可被任何块调用。)

填空题

  1. 梯形图、功能块图、语句表
  2. MOVE / MOVE_BLK / 数学运算指令 (如 ADD, SUB, MUL, DIV)
  3. 整数 或 浮点数,模拟量
  4. 硬件互锁,软件互锁 (或 输出延时、置位/复位)
  5. "块传送" (BLKMOV) 或 "多路复用器" (MUX) 思想 (实际编程中常用"或"指令组合,或使用"选择器"指令)
  6. 过程映像

简答题

  1. 互锁方法:

    • 软件互锁。 在程序中,当一个输出(如Q0.0)为ON时,其常闭点串在另一个输出(如Q0.1)的控制回路中,反之亦然。
      • 优点: 实现简单,节省一个I/O点。
      • 缺点: 存在“竞争冒险”,如果PLC扫描周期恰好处于两个状态切换的瞬间,可能两个输出会同时为ON一个扫描周期,导致危险,需要配合硬件互锁。
    • 硬件互锁。 在PLC外部输出回路中,将两个接触器的常闭触点分别串在对方的线圈回路中。
      • 优点: 安全性极高,不受程序扫描影响,是防止电气短路的最可靠方法。
      • 缺点: 增加了外部硬件成本和接线复杂性。
  2. 扫描周期与优化:

    • 定义: 扫描周期是PLC执行一次完整程序循环所需的时间,包括:读取输入、执行程序、处理通信、写入输出。
    • 影响: 扫描周期决定了PLC对输入信号变化的响应速度和对输出信号的控制精度,周期越长,系统的实时性越差。
    • 优化手段:
      • 优化程序结构: 合理组织网络,避免不必要的逻辑嵌套,将不常执行的复杂逻辑(如报警处理、配方数据加载)放在单独的功能块或组织块中,由特定事件触发。
      • 使用“调用”代替“复制”: 将重复使用的逻辑封装成功能块,通过调用实现,减少程序代码量。
      • 精简I/O: 只读取和写入必要的I/O点。
      • 合理使用定时器和计数器: 避免在主循环中进行复杂的数学运算或数据处理,尽量使用定时中断或循环中断来执行这些任务。
      • 利用PLC的优化功能: 如S7-1200/1500的“优化的块访问”模式。

程序分析题

  • 布尔逻辑表达式: Q0.0 = (I0.0 AND I0.1) OR M0.0 M0.0 = I0.2 (Network 1的等效逻辑) M0.0 = NOT (M0_0 AND I0.3) (Network 2, 3的等效逻辑,更正:应为M0.0 = (M0.0 AND NOT I0.3) OR (I0.2 AND NOT I0.3),但根据梯形图,更直接的理解是Network 2和3构成了一个置位/复位结构,I0.2置位M0.0I0.3复位M0.0。)

    • 重新分析Network 2 & 3:

      • Network 2: M0.0 的输出线圈,其启动条件是 I0.2,这是一个置位操作。
      • Network 3: M0.0 的输出线圈,其启动条件是 I0.3,这是一个复位操作。
      • M0.0 的正确逻辑是:M0.0I0.2 置位,由 I0.3 复位。
    • 最终逻辑表达式: Q0.0 = (I0.0 AND I0.1) OR M0.0 M0.0 = I0.2 (置位) M0_0 = NOT M0_0 (当I0.3有效时,复位)

  • 真值表分析:

I0.0 I0.1 I0.2 I0.3 M0.0 Q0.0 解释
0 0 0 0 0 0 初始状态
0 0 1 0 1 1 I0.2置位M0.0,M0.0使Q0.0为ON
0 0 0 1 0 0 I0.3复位M0.0,Q0.0随之OFF
0 1 0 0 0 0 条件不满足
1 0 0 0 0 0 条件不满足
1 1 0 0 0 1 (I0.0 AND I0.1)为真,直接使Q0.0为ON
1 1 1 0 1 1 两个条件同时满足,Q0.0为ON
1 1 0 1 0 1 (I0.0 AND I0.1)为真,即使I0.3复位了M0.0,Q0.0仍保持ON

设计题

I/O分配表

描述 地址 类型 备注
Inputs (输入)
紧急模式开关 I0.0 BOOL ON=紧急模式
Outputs (输出)
东西绿灯 Q0.0 BOOL
东西黄灯 Q0.1 BOOL
东西红灯 Q0.2 BOOL
南北绿灯 Q0.3 BOOL
南北黄灯 Q0.4 BOOL
南北红灯 Q0.5 BOOL
紧急模式指示灯 Q0.6 BOOL (可选)

功能流程图 / 时序图

时序图:

时间(s)  0-----------30------33---------------------------------63------66---------------------------------...
         |           |      |                                   |      |                                   |
东西绿   ***********      |                                   |      |                                   |
         |           |      |                                   |      |                                   |
东西黄   |           *****|                                   |      |                                   |
         |           |      |                                   |      |                                   |
东西红   |           |      ***********************************|      |                                   |
         |           |      |                                   |      |                                   |
南  红   ***********      ***********************************|      |                                   |
         |           |      |                                   |      |                                   |
南  绿   |           |      |                                   ***********                                   |
         |           |      |                                   |      |                                   |
南  黄   |           |      |                                   |      *****|                                   |
         |           |      |                                   |      |      |                                   |
紧急模式 |           |      |                                   |      |      ***********************************
(I0.0)   |-----------|------|-----------------------------------|------|------|-----------------------------------
         |           |      |                                   |      |      |
所有黄灯 |           |      |                                   |      |      ***********************************
(闪烁)   |           |      |                                   |      |      |
         |           |      |                                   |      |      |

核心控制逻辑 (LAD/SCL)

这里提供一种基于TON定时器和“移位寄存器”思想的SCL代码实现,结构清晰,易于扩展。

SCL 代码片段:

// 定义定时器变量
VAR
    // 主循环定时器,每36秒一个周期
    TON_Cycle : "TON";
    // 东西绿灯定时器 (30s)
    TON_EW_G : "TON";
    // 东西黄灯定时器 (3s)
    TON_EW_Y : "TON";
    // 南北绿灯定时器 (30s)
    TON_NS_G : "TON";
    // 南北黄灯定时器 (3s)
    TON_NS_Y : "TON";
    // 紧急模式闪烁定时器 (0.5s)
    TON_Flash : "TON";
END_VAR
// 主程序逻辑
BEGIN
    // === 紧急模式处理 ===
    IF "Emergency_Switch" THEN // I0.0
        // 启动闪烁定时器
        TON_Flash(IN := TRUE, PT := T#500ms);
        // 根据定时器状态控制所有黄灯
        IF TON_Flash.Q THEN
            "EW_Yellow_Light" := FALSE; // Q0.1
            "NS_Yellow_Light" := FALSE; // Q0.4
            TON_Flash(IN := FALSE); // 重置定时器以准备下一次翻转
        ELSE
            "EW_Yellow_Light" := TRUE;  // Q0.1
            "NS_Yellow_Light" := TRUE;  // Q0.4
        END_IF;
        // 紧急模式下,所有其他灯熄灭
        "EW_Green_Light"  := FALSE; // Q0.0
        "EW_Red_Light"    := FALSE; // Q0.2
        "NS_Green_Light"  := FALSE; // Q0.3
        "NS_Red_Light"    := FALSE; // Q0.5
    ELSE // 正常模式
        // 启动主循环定时器
        TON_Cycle(IN := TRUE, PT := T#36s);
        // 如果一个周期结束,复位所有定时器,重新开始
        IF TON_Cycle.Q THEN
            TON_Cycle(IN := FALSE);
            TON_EW_G(IN := FALSE);
            TON_EW_Y(IN := FALSE);
            TON_NS_G(IN := FALSE);
            TON_NS_Y(IN := FALSE);
            // 稍作延迟后重新启动,确保所有复位完成
            TON_Cycle(IN := TRUE, PT := T#36s);
        END_IF;
        // === 正常模式下的状态机逻辑 ===
        // 状态1: 东西绿灯 (0-30s)
        IF TON_Cycle.ET < T#30s THEN
            "EW_Green_Light" := TRUE;  // Q0.0
            "EW_Red_Light"   := FALSE; // Q0.2
            "NS_Red_Light"   := TRUE;  // Q0.5
            // 启动东西绿灯定时器,30s后切换
            TON_EW_G(IN := TRUE, PT := T#30s);
        // 状态2: 东西黄灯 (30-33s)
        ELSIF TON_EW_G.Q AND (TON_Cycle.ET < T#33s) THEN
            "EW_Green_Light" := FALSE; // Q0.0
            "EW_Yellow_Light" := TRUE;  // Q0.1
            "EW_Red_Light"   := FALSE; // Q0.2
            "NS_Red_Light"   := TRUE;  // Q0.5
            // 启动东西黄灯定时器
            TON_EW_Y(IN := TRUE, PT := T#3s);
        // 状态3: 南北绿灯 (33-63s)
        ELSIF TON_EW_Y.Q AND (TON_Cycle.ET < T#63s) THEN
            "EW_Yellow_Light" := FALSE; // Q0.1
            "EW_Red_Light"   := TRUE;  // Q0.2
            "NS_Green_Light" := TRUE;  // Q0.3
            "NS_Red_Light"   := FALSE; // Q0.5
            // 启动南北绿灯定时器
            TON_NS_G(IN := TRUE, PT := T#30s);
        // 状态4: 南北黄灯 (63-66s)
        ELSIF TON_NS_G.Q AND (TON_Cycle.ET < T#66s) THEN
            "NS_Green_Light" := FALSE; // Q0.3
            "NS_Yellow_Light" := TRUE;  // Q0.4
            "EW_Red_Light"   := TRUE;  // Q0.2
            "NS_Red_Light"   := FALSE; // Q0.5
            // 启动南北黄灯定时器
            TON_NS_Y(IN := TRUE, PT := T#3s);
        // 循环结束,回到状态1 (由TON_Cycle.Q处理)
        END_IF;
    END_IF;
END_BLOCK

解析:

  • 该程序使用一个主定时器TON_Cycle来定义整个36秒的周期。
  • 通过IF-ELSIF结构构建了一个清晰的状态机,每个状态对应一个时间段。
  • 每个状态的结束条件由前一个状态的定时器完成位(Q)来触发,保证了状态的顺序切换。
  • 紧急模式的优先级最高,用一个IF-ELSE块将其逻辑完全分离,确保在紧急情况下能立即覆盖所有正常输出。
  • 使用SCL语言使得这种基于时间和状态的控制逻辑非常紧凑和可读。

维修电工(高级)PLC编程实操试题

任务: 恒压供水系统PID控制

系统描述: 一个由变频器、压力传感器、水泵和管网组成的恒压供水系统,目标是将管网压力稳定在用户设定的值(0.6 MPa)。

控制要求:

  1. 手动/自动模式切换: 有一个旋钮开关(I0.0),OFF为手动模式,ON为自动模式。
  2. 手动模式:
    • I0.0OFF时,系统处于手动模式。
    • 通过一个自复位式按钮(I0.1)来手动启动/停止水泵(Q0.0)。
    • PID控制块不工作,变频器由Q0.0直接启停。
  3. 自动模式:
    • I0.0ON时,系统处于自动模式。
    • 用户通过HMI设定一个目标压力值(0,代表0.8MPa)。
    • 压力传感器(模拟量输入 IW64,量程0-10MPa,对应PLC整数0-27648)将当前管网压力反馈给PLC。
    • PLC使用PID功能块,根据目标压力和当前压力的偏差,计算出PID输出值(0-100%)。
    • PID的输出值(MD100)通过模拟量输出模块(PQW80)送给变频器,控制水泵的转速,从而实现恒压控制。
  4. 报警功能:
    • 当压力传感器故障(模拟量输入值小于100或大于27000)时,系统报警(Q0.5闪烁),并自动切换到手动模式,且停止水泵。
    • 当变频器故障(I0.2ON)时,系统报警(Q0.5闪烁),并自动停止水泵。

编程要求:

  1. 硬件配置: 在TIA Portal中完成PLC、AI模块、AO模块的硬件组态。
  2. 符号编程: 为所有I/O点、PID参数、中间变量等创建有意义的符号名。
  3. 程序结构:
    • 主程序(OB1)负责调用各功能块。
    • 创建一个功能块(FB41或自定义FB)来实现PID控制算法。
    • 创建一个组织块(OB40)用于处理模拟量输入的硬件中断(可选,但能体现高级能力)。
    • 创建一个数据块(DB)来存储PID的参数和过程值。
  4. 核心程序: 编写主程序和PID功能块的程序代码,实现上述所有控制逻辑。

考核点:

  • 硬件组态的正确性。
  • 程序结构的合理性。
  • 手/自动模式切换的无扰动手动/自动切换(关键!)。
  • 模拟量信号(工程值与整数值)的标准化处理。
  • PID参数的整定与限幅。
  • 报警逻辑的完整性。
  • 代码的可读性和注释的规范性。

实操试题指导与思路

硬件组态 (TIA Portal)

  • 添加新PLC(如CPU 1511C-1 PN)。
  • 添加一个AI模块(如AI 8xU/I xT RTD/TC,订货号 6ES7231-5PF22-0XA0),双击进行设置。
    • 通道0: 选择"4-20mA",启用"诊断"和"断线检测"。
    • 测量范围: 根据传感器量程设置,例如4mA对应0MPa,20mA对应1.0MPa。
    • 积分时间: 20ms。
  • 添加一个AO模块(如AO 2xU/I xT,订货号 6ES7232-5HD32-0XB0),双击进行设置。
    • 通道0: 选择"4-20mA"。
    • 输出范围: 4mA对应0.0%,20mA对应100.0%。
  • 编译并保存硬件配置。

符号表创建 创建一个符号表, | 地址 | 符号名 | 数据类型 | 注释 | | :--- | :--- | :--- | :--- | | I0.0 | Mode_Manual_Auto | Bool | 手动/自动模式切换 | | I0.1 | Pump_Manual_Start_Stop | Bool | 手动启停泵 | | I0.2 | VFD_Fault | Bool | 变频器故障 | | IW64 | AI_Pressure_Value | Word | 压力传感器原始值 | | PQW80 | AO_Frequency_Setpoint | Word | 变频器频率给定值 | | Q0.0 | Pump_Motor | Bool | 水泵电机运行 | | Q0.5 | Alarm_Light | Bool | 报警指示灯 | | MD100 | PID_Output_Real | Real | PID输出值 (0.0 to 1.0) | | MD104 | SP_Pressure_Setpoint | Real | 目标压力设定值 (e.g., 0.8) | | MD108 | PV_Pressure_Actual | Real | 当前实际压力值 (e.g., 0.75) |

程序结构与数据块

  • DB_PID:
    • 在块中声明以下变量:
      • SP: Real; // 设定值
      • PV: Real; // 过程值
      • Gain: Real; // 比例增益
      • Ti: Time; // 积分时间
      • Td: Time; // 微分时间
      • LMN: Real; // PID输出
      • LMN_HLM: Real := 100.0; // 输出上限
      • LMN_LLM: Real := 0.0; // 输出下限
  • FB_PID_Control:
    • 使用标准的"PID_Compact"或"CONT_C"(FB41)功能块。
    • 如果使用"PID_Compact",其背景数据块可以自动创建。
    • 如果使用"CONT_C",则需要为其创建一个背景数据块(如DB41)。

核心程序代码 (LAD/SCL)

OB1 (主程序) 逻辑:

Network 1: 系统模式切换与安全联锁
|   Mode_Manual_Auto | VFD_Fault |
|----| |--------------|/|---------( ) Pump_Motor |
|                                         |
|   // 在自动模式下,如果变频器故障,立即停泵 |
|                                         |
|   Mode_Manual_Auto | Alarm_Condition |
|----| |--------------|/|-----------------( ) Pump_Motor |
|                                         |
|   // 在自动模式下,如果报警条件满足,立即停泵 |
|                                         |
|   Alarm_Condition |
|----| |------------( ) Alarm_Light |
|                                         |
|   // 报警灯闪烁逻辑 (可以使用TON定时器实现) |
Network 2: 手动模式逻辑
|   Mode_Manual_Auto | Pump_Manual_Start_Stop |
|----|/|--------------| |-----------------( ) Pump_Motor |
|                                         |
|   // 手动模式下,按钮直接控制泵 |
Network 3: 自动模式逻辑
|   Mode_Manual_Auto |
|----| |-----------------------------------|
|                                         |
|   // 只有在自动模式下,才执行PID控制逻辑 |
|   CALL "PID_Compact" (                 |
|       enable := Mode_Manual_Auto,      |
|       setpoint := DB_PID.SP,           |
|       actual_value := DB_PID.PV,       |
|       gain := DB_PID.Gain,             |
|       ... // 其他参数                  |
|       output => DB_PID.LMN             |
|   );                                   |
|                                         |
|   // 将PID的输出值(0.0-1.0)转换为整数(0-27648)并送给AO模块 |
|   LPID_DB.LMN;                          |
|   LREAL_TO_DINT;                        |
|   L #Temp_DINT;                         |
|   ITD;                                  |
|   DTR;                                  |
|   *R 27648.0;                           |
|   RND;                                  |
|   T #Temp_DINT;                         |
|   T PQW80;                              |
|                                         |
|   // 将PID输出转换为Bool量,用于启停泵 (如果需要) |
|   // 或者直接用模拟量控制变频器启停 |
|   L #Temp_DINT;                         |
|   L 27648;                              |
|   >=I;                                  |
|   = "Pump_Motor"; // 当输出>99%时认为满速运行 |
|                                         |
|   // 无扰动手动/自动切换的关键! |
|   // 在切换到自动模式前,将手动时的输出值作为PID的初始输出 |
|   // 这通常在模式切换的上升沿触发,并写入PID功能块的LMN_HLM和LMN_LLM参数 |

SCL 代码片段 (OB1 自动模式处理与转换):

// 在OB1中处理自动模式
IF "Mode_Manual_Auto" THEN // 自动模式
    // 调用PID功能块 (以PID_Compact为例)
    "PID_Compact" (
        enable := TRUE,
        setpoint := "DB_PID"."SP",
        actual_value := "DB_PID"."PV",
        // ... 其他参数如 Gain, T, TM ...
        output => "DB_PID"."LMN"
    );
    // 标准化处理:将PID输出(0.0-1.0)转换为AO模块的整数值(0-27648)
    "AO_Frequency_Setpoint" := DINT_TO_WORD(ROUND("DB_PID"."LMN" * 27648.0));
    // 无扰切换逻辑 (在模式切换的上升沿执行)
    // 假设我们有一个上升沿检测位 "Rising_Edge_Manual_Auto"
    // "Rising_Edge_Manual_Auto" 在 Mode_Manual_Auto 的上升沿为 TRUE 一个周期
    IF "Rising_Edge_Manual_Auto" THEN
        // 获取手动模式下的输出值 (手动时泵开,则输出为100%)
        ManualOutput := 100.0; // 如果手动时泵是开着的
        // 如果手动时泵是关着的,则为 0.0
        // 将这个值作为PID的初始输出限幅,实现无扰动
        "PID_Compact".LMN_HLM := ManualOutput;
        "PID_Compact".LMN_LLM := ManualOutput;
    END_IF;
ELSE // 手动模式
    // PID功能块禁用
    "PID_Compact".enable := FALSE;
    // 手动逻辑已在LAD中实现
END_IF;
// 压力传感器故障检测
IF ("AI_Pressure_Value" < 100) OR ("AI_Pressure_Value" > 27000) THEN
    "Alarm_Condition" := TRUE;
    // 自动模式下,故障则停泵
    IF "Mode_Manual_Auto" THEN
        "Pump_Motor" := FALSE;
    END_IF;
ELSE
    "Alarm_Condition" :=
分享:
扫描分享到社交APP
上一篇
下一篇