SA0063:可能不是 16 位兼容的操作 检测具有临时结果的 16 位操作。背景:在 16 位系统上,可以截断 32 位临时结果。例子: (int+10) 可以超过 16 位。 理由:在极少数情况下,您必须编写应该在 16 位处理器和 32 位处理器上运行的代码,此消息应该有助于防止出现任何问题。 重要性:低 例 73 . 例子 PROGRAM PLC_PRG VAR iVar : INT; E
SA0005:无效的地址和数据类型 检测无效地址和数据类型规范。地址中的有效大小前缀:X 表示 BOOL B 表示 1 字节数据类型,W 表示 2 字节数据类型,D 表示 4 字节数据类型。 理由:位于直接地址上的变量最好与与其数据类型宽度相对应的地址相关联。代码的读者可能会感到困惑,例如,如果 DWORD 分配给一个 BYTE 地址。 重要性:低 例 57 . 例子 PROGRAM Check_
SA0095:条件分配 检测条件下的分配 IF , CASE , 或者 REPEAT 结构体 理由:赋值 (:=) 和比较 (=) 很容易被误解。结果,条件中的分配很容易是无意的,因此会被报告。这也会使代码的读者感到困惑。 重要性:高 例 87 . 例子 PROGRAM PLC_PRG VAR iCond1:INT := INT#1; iCond2:INT := INT#2; xCond:BOOL
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