Active alarm access in ST

talhaali
2024-06-06
24 hours ago
  • talhaali - 2024-06-06

    Hi, I am trying to access active alarms in code(As alarm count variable updates only when we go to to alarm table frame in visualization). I wrote following code but it is not working:

    VAR
    iCountActiveAlarms : INT;
    parritfActiveAlarms : POINTER TO ARRAY[0..0] OF IAlarm;
    itfAlarmManagerClientAll : IAlarmManagerClient;
    END_VAR

    AlarmManager.g_AlarmHandler.GetActiveAlarms(
    itfAlarmManagerClient :=itfAlarmManagerClientAll,
    iCountActiveAlarms => iCountActiveAlarms,
    parritfActiveAlarms => parritfActiveAlarms);

    The Value is always 0.
    Please help.

     
  • TimvH

    TimvH - 24 hours ago

    See https://forge.codesys.com/forge/talk/Engineering/thread/280fdf4806/#9fe5
    And https://forge.codesys.com/prj/codesys-example/alarm-manager/home/Home/

    The application should contain:
    - an FB which implements AlarmManager.IAlarmFilterCriteria (see example - FB_AlarmFilterCriteria)
    - an FB which implements AlarmManager.IAlarmManagerClient (see example - FB_AlarmManagerClient)

    Then register the client and get the information through this client.

    VAR
        xInit : BOOL := TRUE;
        udiResult : UDINT;
        fbAlarmFilterCriteriaAll : FB_AlarmFilterCriteria;
        fbAlarmManagerClientAll : FB_AlarmManagerClient;
        itfAlarmManagerClientAll : IAlarmManagerClient := fbAlarmManagerClientAll;
    
        xAlarm1 : BOOL;
        xAlarm2 : BOOL;
        xWarning : BOOL;
    
        iNrOfAlarmsInAlarmList : INT;
        iNrOfActiveAlarmsInAlarmList : INT;
        paitfAlarm: POINTER TO ARRAY [0..0] OF AlarmManager.IAlarm;
        iAlarmIndex : INT;
        eAlarmState: AlarmManager.AlarmState;
    END_VAR
    
    IF xInit THEN
        xInit := FALSE;
        fbAlarmManagerClientAll.m_itfAlarmFilterCriteria := fbAlarmFilterCriteriaAll;
        // register alarm client to get updated about alarm status / changes
        udiResult := AlarmManager.g_AlarmHandler.RegisterClient(itfAlarmManagerClientAll, 0, 0);
    END_IF
    
    // Polling the number of alarms
    udiResult := AlarmManager.g_AlarmHandler.GetActiveAlarms(itfAlarmManagerClientAll, parritfActiveAlarms => paitfAlarm, iCountActiveAlarms => iNrOfAlarmsInAlarmList);
    iAlarmIndex := 0;
    iNrOfActiveAlarmsInAlarmList := 0;
    WHILE iAlarmIndex < iNrOfAlarmsInAlarmList DO
        eAlarmState := paitfAlarm^[iAlarmIndex].GetState();
        IF eAlarmState = AlarmManager.AlarmState.Active OR eAlarmState = AlarmManager.AlarmState.ActiveAcknowledged THEN
            iNrOfActiveAlarmsInAlarmList := iNrOfActiveAlarmsInAlarmList + 1;
        END_IF
        iAlarmIndex := iAlarmIndex + 1;
    END_WHILE
    
     

    Last edit: TimvH 24 hours ago

Log in to post a comment.