4. 梯形图与功能块图编程基础

在ControlLogix的过程控制项目中,梯形图(Ladder Diagram,LD)与功能块图(Function Block Diagram,FBD)是两种最常用的编程语言。它们并非互相替代,而是各自擅长不同的控制任务。理解常用指令、选用原则、标签命名规范以及过程对象的数据结构设计,是写出可维护、可调试程序的基础。

一、过程控制常用指令

梯形图以“能流”从左母线经触点、线圈到右母线的方式表达逻辑,适合处理布尔量、联锁、顺序启停和故障复位。过程控制中常用的LD指令包括:XIC/XIO(常开/常闭检查)、OTE(输出线圈)、OTL/OTU(置位/复位)、ONS(单次触发)、TON/TOF/RTO(延时通/断/保持定时器)、CTU/CTD(加/减计数器)、以及比较指令EQU、NEQ、GRT、LES、GEQ、LEQ和限值指令LIM。例如泵的启停联锁常用XIC、XIO与OTE组合,而“运行超过10秒仍未建立压力则报警”则用TON配合比较指令实现。

功能块图以方框和连线表达信号流,输入在左、输出在右,适合连续量调节、回路计算和复杂数学运算。常用功能块包括:PID(比例积分微分调节)、AI/AO(模拟量输入/输出通道处理)、SCL(标定缩放)、ADD/SUB/MUL/DIV(算术运算)、AVG(平均值)、MAX/MIN(最大/最小选择)、LIM(限幅)、TOT(累积)、以及ALM(报警)。在过程控制中,一个温度回路通常由AI块读取原始信号,经SCL换算为工程量,再送入PID块,PID输出经LIM限幅后由AO块输出到调节阀。

二、功能块图与梯形图的选用原则

选用原则可以概括为:逻辑与联锁用梯形图,连续调节与回路计算用功能块图。具体判断依据如下:

  • 信号以开关量、状态位、联锁条件为主,且需要清晰的“通/断”因果链时,优先用LD。
  • 信号以模拟量、连续变化的过程变量为主,需要PID、滤波、标定、累积等运算时,优先用FBD。
  • 需要顺序步进、定时器链、计数器逻辑时,LD更直观;需要多回路并行计算、参数传递时,FBD更紧凑。
  • 同一项目中两者可以混用:用LD处理设备启停和联锁,用FBD处理调节回路,再通过标签互相引用。

实际工程中常见的做法是:一个反应釜控制程序,用FBD实现温度PID和压力补偿计算,用LD实现搅拌电机启停、阀门联锁和报警复位。两者通过控制器标签(Controller Tags)共享数据,而不是互相嵌套。

梯形图与功能块图在过程控制中的分工 梯形图 LD — 逻辑与联锁 左母线 XIC Start XIO Stop OTE Pump_Run TON XIC Pump_Run .DN XIC Level_Hi XIC Pump_Run OTL Alarm XIC Reset OTU Alarm 功能块图 FBD — 连续调节 AI 通道0 SCL 0~100℃ PID 回路1 LIM 0~100% AO 通道0 SP 80℃ PV 反馈 信号流:AI → SCL → PID → LIM → AO SP 与 PV 在 PID 内比较,输出经限幅后驱动调节阀 LD 与 FBD 通过控制器标签共享数据 标签共享

三、标签命名规范

标签命名是程序可读性的第一道关口。ControlLogix的标签分为控制器标签(Controller Tags)和程序标签(Program Tags),过程控制中建议采用“区域_设备_功能_信号类型”的分段结构,用下划线连接,避免空格和中文。例如:R01_P01_Run表示1号反应区1号泵的运行状态;R01_TIC101_PV表示1号反应区温度调节回路101的过程变量。命名时应遵循以下约定:

  • 区域代号用R01、R02等,设备代号用P(泵)、V(阀)、M(电机)、T(温度)、F(流量)、L(液位)等。
  • 回路号用三位数字,如101、205,便于与P&ID图对应。
  • 后缀区分信号类型:_PV(过程变量)、_SP(设定值)、_OUT(输出)、_Run(运行)、_Alm(报警)、_Flt(故障)。
  • 布尔量用肯定语义命名,如Pump_Run而不是Pump_NotStop,避免双重否定。
  • 同一项目内命名风格必须统一,禁止混用拼音、英文缩写和中文。

四、过程对象的数据结构设计

过程控制中,一个设备往往有多个相关信号:运行状态、故障、手自动模式、输出值、报警等。如果把这些信号散落成独立标签,程序会变得零散且难以复用。更好的做法是使用用户自定义数据类型(UDT),把同一对象的信号组织成一个结构体。例如定义一个UDT_Pump:

UDT_Pump
  Run        : BOOL;   // 运行反馈
  Cmd        : BOOL;   // 启动命令
  Fault      : BOOL;   // 故障
  Auto       : BOOL;   // 自动模式
  Out        : REAL;   // 输出百分比
  RunTime    : DINT;   // 累计运行时间(s)
  AlmHi      : BOOL;   // 高报警

定义好UDT后,在控制器标签中建立P01、P02等实例,每个实例都自动拥有上述成员。程序中用P01.Run、P01.Cmd访问,既清晰又便于批量复制。对于调节回路,可以定义UDT_PIDLoop,包含PV、SP、OUT、Kp、Ki、Kd、Auto、Alm等成员,配合FBD中的PID块使用。数据结构设计的关键是:按对象聚合,而不是按信号类型聚合;同一对象的信号放在一个UDT里,不同对象用不同实例,这样新增设备时只需复制实例,不必重新组织标签。

在实际项目中,建议先根据P&ID图列出所有过程对象,再为每类对象定义UDT,最后统一命名标签。这样LD中的联锁逻辑和FBD中的回路计算都能直接引用结构体成员,减少标签数量,也降低改错风险。

总结来说,梯形图负责“什么时候允许动作、什么时候禁止动作”,功能块图负责“动作多少、如何连续调节”;标签命名让程序可读,UDT让程序可复用。四者配合,才能构成一个结构清晰、便于调试和维护的ControlLogix过程控制程序。