You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CODESYS中遍历报警变量列表实现免修改程序新增报警?

在CODESYS中遍历报警变量的可行思路

以下是几种无需手动逐个修改程序,即可批量管理和遍历报警变量的方案:


1. 用结构体数组统一组织报警变量

把每个报警的状态、ID、描述等信息封装成结构体,再用数组存储所有报警实例。新增报警时只需在数组中添加元素,程序遍历数组即可覆盖所有报警。

示例代码:

// 定义报警结构体
TYPE ST_Alarm :
STRUCT
    bTriggered : BOOL;       // 报警触发状态
    nAlarmID : UINT;         // 唯一报警ID
    sAlarmText : STRING(64); // 报警描述文本
END_STRUCT
END_TYPE

// 全局变量中定义报警数组
VAR_GLOBAL
    arrAlarms : ARRAY[1..20] OF ST_Alarm; // 可按需调整数组长度
END_VAR

// 初始化示例(可在启动程序或变量初始化中配置)
arrAlarms[1].bTriggered := g_bOverTempAlarm;
arrAlarms[1].nAlarmID := 1001;
arrAlarms[1].sAlarmText := '设备温度过高';

arrAlarms[2].bTriggered := g_bLowVoltAlarm;
arrAlarms[2].nAlarmID := 1002;
arrAlarms[2].sAlarmText := '电源电压过低';

遍历逻辑:

VAR
    nLoopIndex : UINT;
END_VAR

FOR nLoopIndex := 1 TO SIZEOF(arrAlarms)/SIZEOF(ST_Alarm) DO
    IF arrAlarms[nLoopIndex].bTriggered THEN
        // 执行报警处理逻辑:记录日志、触发提示等
        ;
    END_IF
END_FOR

2. 利用CODESYS内置报警管理器

CODESYS自带的Alarm Manager模块可以直接管理报警,无需手动维护变量列表,新增报警只需在配置中添加即可。

操作步骤:

  1. 在项目树中添加Alarm Configuration,逐个配置报警关联的变量、触发条件(如上升沿、持续激活)、优先级等。
  2. 在程序中调用内置函数获取激活的报警列表,无需手动遍历变量:
VAR
    stAlarmData : ALARM_INFO;
    nResult : DWORD;
    nCurrentIndex : UINT;
END_VAR

nCurrentIndex := 0;
REPEAT
    // 逐个获取激活的报警信息
    nResult := ALARM_GetActiveAlarms(nCurrentIndex, ADR(stAlarmData));
    IF nResult = 0 THEN
        // 处理报警数据:stAlarmData包含ID、描述、触发时间等
        ;
        nCurrentIndex := nCurrentIndex + 1;
    END_IF
UNTIL nResult <> 0
END_REPEAT

3. 运行时符号表遍历(高级场景)

通过CODESYS的符号API遍历项目中的符号表,筛选出标记为报警的变量(比如统一前缀ALM_),适合需要动态识别变量的场景。

示例代码:

VAR
    hSymbolHandle : SYMBOL_HANDLE;
    stSymbolInfo : SYMBOL_INFO;
    bAlarmState : BOOL;
END_VAR

// 打开符号表
hSymbolHandle := SYMBOL_Open(0);
IF hSymbolHandle <> 0 THEN
    // 遍历所有符号
    WHILE SYMBOL_FindNext(hSymbolHandle, ADR(stSymbolInfo)) = 0 DO
        // 筛选以ALM_开头的报警变量
        IF LEFT(stSymbolInfo.sName, 4) = 'ALM_' THEN
            // 读取变量当前状态
            SYMBOL_Read(hSymbolHandle, ADR(stSymbolInfo), ADR(bAlarmState), SIZEOF(bAlarmState));
            IF bAlarmState THEN
                // 处理报警逻辑
                ;
            END_IF
        END_IF
    END_WHILE
    // 关闭符号表
    SYMBOL_Close(hSymbolHandle);
END_IF

注意:需在项目属性中启用符号访问权限,该方法性能略低,适合调试或特殊需求场景。

内容的提问来源于stack exchange,提问作者Oriol Galceran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:52:21