项目设置 - 静态分析灯

概述

EcoStruxure Machine Expert 中的静态分析意味着,在可以将项目下载到目标系统而不发生生成错误之前,将搜索源代码是否与特定编码标准存在偏差。为此,可以在项目设置中配置要遵循的一组规则。在每次生成代码时均将根据这些定义规则执行自动验证。

注: 如要将代码行排除在静态代码分析之外,可以用 {analysis ...} pragma{attribute 'analysis' := '...'} pragma来标记相应代码。

分析结果作为错误显示在消息视图中,并添加有前缀 SA

注: 仅对项目中的应用程序代码执行分析。不考虑库。对于 GVL(全局变量列表)变量,如果项目中有多个应用程序,则仅分析活动应用程序下面的对象。如果只有一个应用程序,则分析 POU 公用池中的对象。

未使用的变量 (SA0033):

检测已编译的程序中已声明但未使用的变量。

Overlapping memory areas (SA0028):

检测两个或更多变量向相同内存位置的分配。

比如,如果存在以下声明,则会出现这种情况:var1 AT %QB21: INTvar2 AT %QD5: DWORD。在此情况下,两个变量都使用 21,这是变量重叠的内存区域。

并发访问 (SA0006):

检测由一个以上任务写入的变量。

示例 (SA0006):

FUNCTION_BLOCK ADD_FB
g_iTemp1 := g_iTemp1 + INT#1;
PROGRAM PLC_PRG  //controlled by MainTask
g_iTemp1 := g_iTemp1 + INT#2;
g_xTemp2 := g_iTemp1 > INT#10;
PROGRAM PLC_PRG_1  //controlled by SubTask
g_iTemp1 := g_iTemp1 - INT#3;
g_xTemp2 := g_iTemp1 < INT#-10;

在输出上有多个写访问 (SA0004):

检测在一个以上位置被写入的输出。

示例 (SA0004):

VAR_GLOBAL
    g_xVar AT %QX0.0 : BOOL ; 
    g_iTest AT %QW0 : INT ;
END_VAR
PROGRAM PLC_PRG
IF iCondition < INT#0 THEN
    g_xVar := TRUE;
    g_iTest := INT#12;
END_IF
CASE iCondition OF
    INT#1:
        g_xVar := FALSE;
    INT#2:
        g_iTest := INT#11;
    ELSE
        g_xVar := TRUE;
        g_iTest := INT#9;
END_CASE

名称的多次使用 (SA0027):

检测变量或对象 (POU) 的名称/标识符在项目范围内的多次使用。

可能检测到以下情况:

  • 枚举常量的名称与应用程序或所包含的库中的其他枚举中所用的名称相同。

  • 变量的名称与应用程序或所包含的库中的对象的名称相同。

  • 变量的名称与应用程序或所包含的库中的枚举常量的名称相同。

  • 对象的名称与应用程序中的对象的名称相同。

  • 变量的名称与方法的名称相同。

  • 对象的名称与上级对象(父对象)的名称相同。

示例 (SA0027):

PROGRAM PLC_PRG
VAR
ton : INT;     // error SA0027
END_VAR

Standard.library 包含在项目中,并提供功能块 TON,从而导致名称多次使用。

Report temporary Function Block instances (SA0167):

测试检测到被声明为临时变量的功能块实例。这适用于在方法或函数中声明或者声明为 VAR_TEMP 的实例,这些实例因此在每个处理循环中都要针对每个 POU 调用重新初始化。

示例 (SA0167):

PROGRAM PLC_PRG
VAR
END_VAR
VAR_TEMP
    yafb: AFB;
END_VAR
FUNCTION Fun : INT
VAR_INPUT
END_VAR
VAR
    funafb: AFB;
END_VAR
METHOD METH : INT
VAR_INPUT
END_VAR
VAR
    methafb: AFB;
END_VAR
注: AFB 功能块。