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
SA0040:可能被零除 检测可能被零除的代码位置 理由:除以 0 导致错误。应始终首先检查要除法的变量是否为 0。 重要性:高 例 48 . 例子 VAR_GLOBAL g_iVar AT %QW1 : INT; END_VAR PROGRAM PLC_PRG VAR iCounter : INT; iSumme:INT; iMid:INT; iVal1:INT := INT#2; iVal2:
SA0041:检测可能的循环不变代码 检测循环中为每个循环周期计算相同值的分配。这些代码行可以插入到循环之外。 理由:这是一个性能警告。在循环中执行但在每个循环中执行相同操作的代码可以在循环外执行。 重要性:中等 例 49 . 例子 PROGRAM PLC_PRG VAR iCounter, iVar1, iVar2 : INT; END_VAR FOR iCounter := 0 TO 10 D
SA0042:使用不同的访问路径 检测同一变量的不同访问路径的使用情况 理由:对同一元素的不同访问会降低程序的可读性和可维护性。我们建议一致使用 {attribute 'qualified-only'} 用于库、全局变量列表和枚举。这会强制进行完全限定的访问。 重要性:低 例 50 . 例子 VAR_GLOBAL iTemp:INT; instPOU:POU; END_VAR FUNCTION_B
SA0043:仅在一个 POU 中使用全局变量 仅在单个 POU 中检测全局变量的使用 理由:仅在一个位置使用的全局变量也只能在该位置声明。 重要性:中等 PLCopen规则:CP26 例 51 . 例子 VAR_GLOBAL g_xVar AT %QX0.0 : BOOL ; g_iTest AT %QW1 : INT ; g_wTest AT %QW2 : WORD; END_VAR PROG
SA0044:关于接口的声明 检测声明 REFERENCE TO 接口和声明 VAR_IN_OUT 带接口的变量(通过 REFERENCE TO ) 理由:接口类型总是隐含地引用实现该接口的功能块实例。因此,对接口的引用就是对引用的引用,并且可能导致不需要的行为。 重要性:高 例 52 . 例子 ITF 是在项目中定义的接口。 FUNCTION_BLOCK POU VAR_INPUT inst_i