Skip to main content

使用警报表创建可视化效果

在以下说明中,报警表可视化元素配置为示例。

有关详细信息,请参阅下列内容:定义警报组成和警报

配置

要求:AG_PartsShortage报警组和AC_PartsShortage警报类别在您的项目中定义。

  1. 在您的应用程序下方添加可视化效果。

    1. 选择应用程序并单击添加对象可视化命令。

    2. 指定名称为VIS_PartsShortage

  2. 打开可视化编辑器。

  3. 拖动报警表元素来自报警管理器类别进入可视化编辑器并打开元素的属性视图。

  4. 报警表配置如下。

    1. 元素名称财产,在价值列,指定名称AT_PartsShortage

    2. 配置Alarm groups可视化元素属性:

      1. 报警配置报警组属性,单击相应的值单元格。

        选定的报警组成对话框打开。

      2. 清除全部选项并选择AG_PartsShortage报警组。

      3. 点击_visu_img_add_selected_alarm_group.png按钮将组添加到选定的报警组成列表。

      4. 点击好的确认配置。

    3. 配置报警类别可视化元素属性:

      1. 报警配置报警类别属性,定义要可视化的警报类别。点击值字段。

        报警配置报警类别属性,单击相应的值单元格。

        选择报警类别对话框打开。

      2. 清除全部选项并选择AC_PartsShortage报警类别。

      3. 点击_visu_img_add_selected_alarm_group.png按钮将该报警类别添加到选定的报警类别中。

      4. 点击好的确认配置。

    4. 列的配置:

      1. 属性,单击创建新的按钮。

        柱子[2]可用。名为Bitmap在可视化编辑器中列出。

      2. 数据类型属性,选择状态列 [2] 的值。

        在表中,该列被赋予新的默认标题State

      3. 列标题属性,指定名称Parts Shortage State

        列 [2] 已重命名。

    5. 配置选择可视化元素属性:

      1. 选择颜色属性,选择颜色Green价值柱子。

        在运行时,可视化用户可以选择表格单元格。选中后,这些单元格会变为绿色。

    6. 配置控制变量可视化元素属性:

      1. 在您的应用程序代码中,声明bQuitAlarm控制变量。

      2. 确认选择属性,指定PLC_PRG.bQuitAlarm值单元格中的变量。

    配置属性

    _visu_img_alarm_table_porperties.png

使用控件补充警报可视化

可视化用户需要控件来操作报警可视化。编程时,您可以使用报警表向导。只有在可视化中选择了报警表后,调用向导的命令才可用。

  1. 在可视化编辑器中,选择警报表元素。

  2. 在上下文菜单中,单击插入警报确认元素命令。

    Alarm Table Wizard对话框打开。

  3. 点击好的接受所有设置。

    确认选择Acknowledge all visibleHistory, 和Freeze scrolling position添加了按钮。元素具有完整的输入配置。

    _visu_img_alarm_table_controls.png

评估程序代码中的警报信息

报警表可视化元素可以在运行时将可视化信息写入应用程序变量。此变量可以通过编程方式进行评估。

您可以从结构中获取有关警报的信息(例如:警报组、警报 ID、状态转换的时间戳、锁存变量、消息文本)AlarmSelectionInfo ( VisuElemsAlarm图书馆)。

为了做到这一点,在选择有关选定警报的信息变量报警表的属性,指定一个类型变量AlarmSelectionInfo然后在应用程序中使用该变量,如下所示:

  1. 添加新的PRG_VISU頁面。

  2. 添加PRG_VISU POU 至VISU_TASK

  3. 打开PRG_VISU在编辑器中打开 POU 并插入以下程序行。

    宣言

    PROGRAM PRG_VISU
    VAR
        alarmSelectionInfoDefault : AlarmSelectionInfoDefault;
        sLastTimestampDate : STRING;
        sLastTimestampTime : STRING;
        sLatch1 : STRING;
        sLatch2 : STRING;
        wsMessage1 : WSTRING := "No selection";
        wsMessage2 : WSTRING := "No selection";
        pInt : POINTER TO INT;
        xInit: BOOL := TRUE;
        pString : POINTER TO STRING;
        cbsFormattedValueLatch1 : CharBufferString(uiBufferSize := 0, stringType := TYPE_CLASS.TYPE_STRING);
        cbsFormattedValueLatch2 : CharBufferString(uiBufferSize := 0, stringType := TYPE_CLASS.TYPE_STRING);
        abyLocalBufferLatch1 : ARRAY[0..LENGTH] OF BYTE;
        abyLocalBufferLatch2 : ARRAY[0..LENGTH] OF BYTE;
        iPrevSelectionChangedCounter: INT;
        END_VAR
    VAR CONSTANT
        // The length of the string of the local CharBufferString instance
        LENGTH : INT := 80 * 2;
    END_VAR                        

    执行

    IF xInit THEN
        cbsFormattedValueLatch1.Init(pBuffer:=ADR(abyLocalBufferLatch1), uiBufferSize:=INT_TO_UINT(LENGTH + 1), stringType:=TYPE_CLASS.TYPE_STRING);
        cbsFormattedValueLatch2.Init(pBuffer:=ADR(abyLocalBufferLatch2), uiBufferSize:=INT_TO_UINT(LENGTH + 1), stringType:=TYPE_CLASS.TYPE_STRING);
        xInit := FALSE;
    END_IF
    IF alarmSelectionInfoDefault.AlarmSelectionInfo.iSelectionChangedCounter <> iPrevSelectionChangedCounter THEN
        // Format Date/Time as string
        sLastTimestampDate := AlarmManager.FormatDate(alarmSelectionInfoDefault.AlarmSelectionInfo.timeStampLast, AlarmManager.AlarmGlobals.g_sDateFormat);
        sLastTimestampTime := AlarmManager.FormatTime(alarmSelectionInfoDefault.AlarmSelectionInfo.timeStampLast, AlarmManager.AlarmGlobals.g_sTimeFormat);
        // Retrieve latch variables as string
        cbsFormattedValueLatch1.FromString('');
        pString := FormatTypedValue(alarmSelectionInfoDefault.AlarmSelectionInfo.paLatchVariables^[0], cbsFormattedValueLatch1);
        STU.StrCpyA(ADR(sLatch1), SIZEOF(sLatch1), pString);
        cbsFormattedValueLatch2.FromString('');
        pString := FormatTypedValue(alarmSelectionInfoDefault.AlarmSelectionInfo.paLatchVariables^[1], cbsFormattedValueLatch2);
        STU.StrCpyA(ADR(sLatch2), SIZEOF(sLatch2), pString);
        // Retrieve messages
        STU.StrCpyW(ADR(wsMessage1), SIZEOF(wsMessage1), alarmSelectionInfoDefault.AlarmSelectionInfo.papwsAlarmMessages^[0]);
        STU.StrCpyW(ADR(wsMessage2), SIZEOF(wsMessage2), alarmSelectionInfoDefault.AlarmSelectionInfo.papwsAlarmMessages^[1]);
        iPrevSelectionChangedCounter := alarmSelectionInfoDefault.AlarmSelectionInfo.iSelectionChangedCounter;
    END_IF