SA0168:不必要的分配 检测对代码没有任何影响的变量的赋值。 理由:当值被多次赋值给一个变量而没有在赋值之间评估变量时,第一次赋值对程序没有任何影响。 重要性:低 例 125 . 例子 PROGRAM PLC_PRG VAR dwVal1 : DWORD; dwVal2 : DWORD; END_VAR // unnecessary assignment dwVal1 := 1; IF dwV
SA0169:忽略的输出 检测调用方法或函数时未指定的方法和函数的输出。 理由:忽略的输出可能是关于未处理错误或无意义函数调用的通知,因为未使用结果。 重要性:中等 例 126 . 例子 FUNCTION Fun1 VAR_INPUT bIn : BOOL; VAR_END VAR_OUTPUT bOut : BOOL; END_VA ; PROGRAM PLC_PRG VAR bValue :B
SA0170:不应使用输出变量的地址 检测输出变量地址所在的代码位置( VAR_OUTPUT , VAR_IN_OUT 使用功能块的 )。 理由: 不允许按以下方式使用功能块输出的地址: 通过 ADR 操作员 通过 REF= 例外:如果在同一功能块中使用输出变量,则不会报告错误。 重要性:中等 例 127 . 例子 功能块 FB1 有 VAR_OUTPUT 多变的 iOutVal : INT; 另
SA0171:枚举应具有“strict”属性 检测未提供的枚举声明 {attribute 'strict'} 属性。 理由: {attribute 'strict'} 如果代码违反了严格的枚举编程规则,属性会导致编译器错误。默认情况下,创建新枚举时,声明会自动分配 'strict' 属性。 有关更多信息,请参阅: 数据类型:枚举 重要性:高 例 128 . 例子 TYPE COLOR : ( re
SA0172:可能尝试访问数组边界之外 检测对数组边界之外的数组索引的可能访问。 通常会超出数组索引的范围 FOR 循环,其中索引变量用于访问数组索引。 重要性:高 例 129 . 例子 PROGRAM Test VAR_TEMP iIndex: INT; arUSINT: Array[0..10] OF INT; END_VAR FOR iIndex := INT#0 TO INT#50 DO
SA0035:未使用的输入变量 检测未被任何功能块实例使用的输入变量 理由:未使用的变量使程序的可读性和可维护性降低。未使用的变量不必要地填充内存并在初始化期间不必要地浪费运行时间。 重要性:中等 PLCopen规则:CP24 例 43 . 例子 FUNCTION_BLOCK FB_Afb VAR_INPUT iIn1: INT; iIn2: INT; END_VAR VAR_OUTPUT iOu
SA0036:未使用的输出变量 确定未在相关功能或功能块内分配的功能和功能块的输出变量。 理由:未使用的变量使程序的可读性和可维护性降低。未使用的变量不必要地填充内存并在初始化期间不必要地浪费运行时间。 重要性:中等 PLCopen规则:CP24 例 44 . 例子 FUNCTION_BLOCK FB_Afb VAR_INPUT iIn1: INT; iIn2: INT; END_VAR VAR_
SA0034:分配不正确的枚举 检测分配给枚举变量的值。仅允许分配枚举变量的已定义枚举常量。 理由:枚举类型的变量应该只具有预期的值,否则使用该变量的代码可能无法正常工作。我们建议始终将枚举与 pragma 一起使用 {attribute 'strict'} 。然后编译器已经检查了枚举组件的正确使用。 重要性:高 例 45 . 例子 TYPE COLOR : ( Red := 0, Green,
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