符号:
功能: 每次生成代码时,此对话框都会激活测试,即CODESYS轻量级的静态分析执行。
调用: 菜单栏:静态分析灯类别)。
(你可以通过使用编译指示{attribute 'analysis' := '...'}或{analysis ...}标记代码来从静态代码分析中排除代码行。 |
SA0033: 未使用的变量 | 查找已声明但未在已编译程序代码中使用的变量。 对于全局变量:如果一个工程中有多个应用程序,则仅影响当前活动应用程序下的对象。如果只有一个应用程序,那么POUs视图中的对象也会受到影响。 |
SA0028: 重叠存储区 | 检测两个或多个变量保留相同存储空间的位置。例如,以下声明会发生这种情况:var1 AT %QB21: INT和var2 AT %QD5: DWORD。在这种情况下,两个变量都使用字节21,这意味着变量的存储范围重叠。 |
SA0006: 并发访问 | 检测由多个任务写入的变量。 |
SA0004 在输出上有多个写访问 | 检测写入多个位置的输出。 注意:在IF和CASE语句的不同分支中写入输出变量(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