.
对话框“工程设置”-“静态分析灯”
.
.

符号:

功能: 每次生成代码时,此对话框都会激活测试,即CODESYS轻量级的静态分析执行。

调用: 菜单栏:工程 ➔ 工程设置 (静态分析灯类别)。

 

你可以通过使用编译指示{attribute 'analysis' := '...'}{analysis ...}标记代码来从静态代码分析中排除代码行。

.
附加的编译测试
.

SA0033: 未使用的变量

查找已声明但未在已编译程序代码中使用的变量。

对于全局变量:如果一个工程中有多个应用程序,则仅影响当前活动应用程序下的对象。如果只有一个应用程序,那么POUs视图中的对象也会受到影响。

SA0028: 重叠存储区

检测两个或多个变量保留相同存储空间的位置。例如,以下声明会发生这种情况:var1 AT %QB21: INTvar2 AT %QD5: DWORD。在这种情况下,两个变量都使用字节21,这意味着变量的存储范围重叠。

SA0006: 并发访问

检测由多个任务写入的变量。

SA0004 在输出上有多个写访问

检测写入多个位置的输出。

注意:在IFCASE语句的不同分支中写入输出变量(VAR_IN_OUT)时,不会报告错误。

注意:编译指示不能禁用此规则。

SA0027: 名称的多次使用

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

.检测到以下情况:

  • 枚举常量的名称与应用程序中另一个枚举的名称相同,或在包含的库中使用。
  • 变量的名称与应用程序或包含的库中的对象相同。
  • 变量的名称与应用程序或包含的库中的枚举常量和枚举相同。
  • 对象的名称与应用程序中的另一个对象相同。
  • 变量的名称与方法的名称相同。
  • 对象的名称与上级对象(“父对象”)的名称相同。

SA0167: 报告临时功能块实例

该测试检测被声明为临时变量的功能块实例。这涉及在方法,函数或VAR_TEMP中声明的实例,因此在每个处理周期和每个POU调用中重新初始化。

.

.例如

SA0003: 空语句


;
(* 内容 *);
iVar;
 

SA0006: 并发访问

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

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
 
 

SA0006: 并发访问


FUNCTION_BLOCK ADD_FB
g_iTemp1 := g_iTemp1 + INT#1;

PROGRAM PLC_PRG  // 由MainTask控制
g_iTemp1 := g_iTemp1 + INT#2;
g_xTemp2 := g_iTemp1 > INT#10;

PROGRAM PLC_PRG_1  //由SubTask控制 
g_iTemp1 := g_iTemp1 - INT#3;
g_xTemp2 := g_iTemp1 < INT#-10;
 

SA0027: 名称的多次使用

PROGRAM PLC_PRG
VAR
ton : INT;     // 报错SA0027
END_VAR
 

SA0029: 实现和声明中的符号不同

在设备树中,PLC_PRGPOU和一个fnc功能块。


PROGRAM PLC_PRG
VAR
    iVar:INT;
    _123test_var_: INT;
END_VAR
    ivar := iVar + 1; // 与声明部分-> SA0029中的符号不同
    _123TEST_var_ :=     _123test_var_INT; // 与声明部分-> SA0029中的符号不同
 Fnc(); // 符号与设备树中的符号-> SA0029不同
END_VAR
 

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