SA0100: 大于 <n> 字节的变量 检测使用超过 n 个字节的变量,其中 n 由当前配置定义。默认值:1024 字节。可以通过双击该行来更改该值。 理由:一些编程指南指定了单个变量的最大大小。这可以用这个来检查。 重要性:低 例 88 . 例子 PROGRAM PLC_PRG VAR aobyTest : ARRAY [0..1024] OF BYTE; END_VAR aobyTest[I
SA0163:嵌套注释 检测嵌套评论 理由:应避免嵌套注释,因为它们难以阅读。 重要性:低 PLCopen 规则:C3 例 120 . 例子 {attribute 'do-analysis'} (* That is (* nested comment 1 *) *) PROGRAM PLC_PRG VAR (* That is // nested comment 2 comment *) iVal
SA0164:多行注释 检测编码为的多行注释 (* comment *) .仅编码为的单行注释 // comment 被允许。 理由:一些编程指南禁止代码中的多行注释,因为注释的开头和结尾可能会丢失,并且结束注释括号可能会被意外删除。 提示 您可以通过编译指示停用此检查 analysis ,也用于声明部分的注释。 重要性:低 PLCopen规则:C5 例 121 . 例子 {attribute '
SA0168:不必要的分配 检测对代码没有任何影响的变量的赋值。 理由:当值被多次赋值给一个变量而没有在赋值之间评估变量时,第一次赋值对程序没有任何影响。 重要性:低 例 125 . 例子 PROGRAM PLC_PRG VAR dwVal1 : DWORD; dwVal2 : DWORD; END_VAR // unnecessary assignment dwVal1 := 1; IF dwV
SA0036:未使用的输出变量 确定未在相关功能或功能块内分配的功能和功能块的输出变量。 理由:未使用的变量使程序的可读性和可维护性降低。未使用的变量不必要地填充内存并在初始化期间不必要地浪费运行时间。 重要性:中等 PLCopen规则:CP24 例 44 . 例子 FUNCTION_BLOCK FB_Afb VAR_INPUT iIn1: INT; iIn2: INT; END_VAR VAR_
SA0037: 对输入变量的写访问 检测输入变量( VAR_INPUT ) 可以通过 POU 内的写权限进行访问 理由:根据 IEC 61131-3 标准,输入变量不得在 POU 内更改。这种访问也是导致错误的原因,并使代码难以维护。这表明变量既用作输入变量又用作辅助变量。应该避免这种双重用途。 重要性:中等 例 46 . 例子 VAR_GLOBAL g_xGlob AT %QX0.0 : BOO
SA0038: 对输出变量的读访问 检测输出变量( VAR_OUTPUT ) 可以通过 POU 内的读取权限进行访问 理由:根据 IEC 61131-3 标准,禁止读取 POU 内的输出。这表明输出不仅用作输出,而且还用作中间结果的临时变量。应该避免这种双重用途。 重要性:低 例 47 . 例子 VAR_GLOBAL g_xGlob AT %QX0.0 : BOOL ; g_iGlob AT %Q
SA0041:检测可能的循环不变代码 检测循环中为每个循环周期计算相同值的分配。这些代码行可以插入到循环之外。 理由:这是一个性能警告。在循环中执行但在每个循环中执行相同操作的代码可以在循环外执行。 重要性:中等 例 49 . 例子 PROGRAM PLC_PRG VAR iCounter, iVar1, iVar2 : INT; END_VAR FOR iCounter := 0 TO 10 D
SA0039:可能的空指针引用 检测可能取消引用空指针的代码位置 理由:在每次取消引用之前应检查指针以确保它不等于零。否则,运行时可能会发生访问冲突。 重要性:高 例 113 . 例子 PROGRAM PLC_PRG VAR ptiVar1:POINTER TO INT; ptiVar2:POINTER TO INT; ptiVar3:POINTER TO INT; iVar:INT; iCoun
SA0122:数组索引定义为表达式 检测数组索引声明中表达式的使用 理由:并非所有系统都允许将表达式作为数组限制。 重要性:低 例 105 . 例子 PROGRAM PLC_PRG VAR CONSTANT c_iValue : INT := INT#15; END_VAR VAR arr : ARRAY [0..c_iValue + 1] OF INT; END_VAR 输出在 留言 看法: S