SA0078:缺少 CASE 分支 检测到 CASE 没有的陈述 CASE 分支,只有一个 ELSE 陈述 理由:A CASE 没有 case 的语句会浪费执行时间并且难以阅读。 重要性:中等 例 84 . 例子 PROGRAM PLC_PRG VAR iVar : INT; xTemp : BOOL; END_VAR iVar := iVar + INT#1; //in the followin
SA0061:指针上的异常操作 检测操作一种类型的变量 POINTER TO 哪些不是 = (平等), <> (不等式), + (加法),或 ADR . 在 CODESYS , 指针算术一般是允许的,也可以适当使用。因此,将指针与整数值相加被认为是对指针的常见操作。这使得可以使用指针来处理可变长度的数组。使用 SA0061 报告所有其他(不寻常的)指针操作。 重要性:高 PLCopen 规则:E2
SA0019:隐式指针转换 检测隐式生成的指针转换 理由:在 CODESYS ,指针没有严格类型化,它们可以以任何方式相互赋值。这经常被使用,因此编译器不会报告。但是,它也可能意外地导致意外访问。如果您指定一个 POINTER TO BYTE 到一个 POINTER TO DWORD ,那么您可能会无意中使用后一个指针覆盖内存。因此,请务必检查此规则,并在您故意想要访问不同类型的值的情况下阻止该消
SA0005:无效的地址和数据类型 检测无效地址和数据类型规范。地址中的有效大小前缀:X 表示 BOOL B 表示 1 字节数据类型,W 表示 2 字节数据类型,D 表示 4 字节数据类型。 理由:位于直接地址上的变量最好与与其数据类型宽度相对应的地址相关联。代码的读者可能会感到困惑,例如,如果 DWORD 分配给一个 BYTE 地址。 重要性:低 例 57 . 例子 PROGRAM Check_
SA0047:访问直接地址 检测实现代码中的直接地址访问 理由:符号编程总是更可取的。变量的名称也可以具有含义。地址不能表明它的用途。 重要性:高 PLCopen 规则:N1 / CP1 例 58 . 例子 PROGRAM PLC_PRG VAR xVar : BOOL; byVar : BYTE; END_VAR xVar := %IX0.0; %QX0.0 := xVar; %MX0.1 :=
SA0051:对 BOOL 变量的比较操作 检测类型变量的比较操作 BOOL 理由: CODESYS 允许进行这些类型的比较。但它们非常不寻常并且可能令人困惑。 IEC 61131-3 标准没有提供这些比较。通过避免它们,您可以提高代码到其他开发系统的可移植性。 重要性:中等 例 60 . 例子 PROGRAM PLC_PRG VAR xBool1, xBool2 : BOOL; xResult
SA0111:指针变量 检测类型变量 POINTER TO 理由:IEC 61131-3 标准不允许指针。 重要性:低 例 95 . 例子 VAR piTemp : POINTER TO INT; pbyTemp : POINTER TO BYTE; END_VAR 输出在 留言 看法: SA0111:不允许数据类型 POINTER 本节内容如下 :
SA0112:参考变量 检测类型变量 REFERENCE TO 理由:IEC 61131-3 标准不允许引用。 重要性:低 例 96 . 例子 VAR ref_int : REFERENCE TO INT; ref_dw : REFERENCE TO DWORD; END_VAR 输出在 留言 看法: SA0112:不允许数据类型引用 本节内容如下 :
SA0167:临时功能块实例 检查检测声明为临时变量的功能块实例。这会影响在方法或函数中声明的实例,或者 VAR_TEMP ,因此在每个处理周期或每个 POU 调用中重新初始化。 理由: 功能块的状态通常在多个 PLC 周期内维持。堆栈上的实例仅在函数调用期间存在。因此,创建实例作为临时变量几乎没有意义。 其次,功能块实例通常很大,并且需要大量堆栈空间(通常仅限于控制器)。 第三,功能块的初始化以
SA0168:不必要的分配 检测对代码没有任何影响的变量的赋值。 理由:当值被多次赋值给一个变量而没有在赋值之间评估变量时,第一次赋值对程序没有任何影响。 重要性:低 例 125 . 例子 PROGRAM PLC_PRG VAR dwVal1 : DWORD; dwVal2 : DWORD; END_VAR // unnecessary assignment dwVal1 := 1; IF dwV