SA0130:隐式扩展转换 检测算术运算期间隐式执行从较小数据类型到较大数据类型的转换的代码位置 理由:当源类型的值范围完全包含在目标类型的值范围内时,编译器允许不同类型的任何赋值。但是,编译器将尽可能晚地构建对代码的转换。对于类型的赋值 lint := dint * dint ,编译器仅在乘法之后执行隐式转换: lint := TO_LINT(dint * dint); 因此溢出被截断。如果你想
SA0133:显式缩小转换 检测从较大数据类型到较小数据类型的显式转换 理由:大量类型转换可能表明您为变量选择了错误的数据类型。因此,有一些编程指南要求对数据类型转换提供明确的理由。 重要性:低 例 55 . 例子 PROGRAM SA0133 VAR siVar:SINT; diVar:DINT; liVar:LINT; byVar:BYTE; uiVar:UINT; dwVar:DWORD;
SA0134:显式有符号/无符号转换 检测从有符号数据类型到无符号数据类型的显式转换,反之亦然 理由:过度使用类型转换可能表明为变量选择了错误的数据类型。因此,有一些编程指南要求对数据类型转换提供明确的理由。 重要性:低 例 56 . 例子 PROGRAM PLC_PRG VAR byVar :BYTE; udiVar : UDINT; uliVar : ULINT; lwVar : LWORD;
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 :=
SA0048:直接地址的 AT 声明 检测到 AT 直接地址声明 在代码中使用直接地址是有问题的,因为地址会出现在多个位置: 首先在控制器配置中定义物理对象到地址的分配 程序中的第二个变量被分配给这些地址。 如果由于配置更改而重新定位地址,则需要将变量重新分配给程序中完全不同位置的地址。这是错误的原因并导致代码的可读性和可维护性较差。因此,最好在设备编辑器的 I/O 映射中执行所有分配。 重要性:
SA0052:不寻常的移位操作 检测有符号变量的移位操作(位移)。在对位域数据类型进行移位操作的情况下( Byte , DWORD , LWORD , WORD ),不报错。 理由: CODESYS 允许对有符号数据类型进行移位操作。但是,这些操作是不寻常的并且可能会令人困惑。 IEC 61131-3 标准不提供此类操作。因此,应该避免它们以增加代码对其他开发系统的可移植性。 重要性:中等 例 6
SA0095:条件分配 检测条件下的分配 IF , CASE , 或者 REPEAT 结构体 理由:赋值 (:=) 和比较 (=) 很容易被误解。结果,条件中的分配很容易是无意的,因此会被报告。这也会使代码的读者感到困惑。 重要性:高 例 87 . 例子 PROGRAM PLC_PRG VAR iCond1:INT := INT#1; iCond2:INT := INT#2; xCond:BOOL