SA0008:检查子范围类型 检测超出范围的子范围类型违规。编译器已经检查了分配的文字。分配常量时,值必须在定义的范围内。分配变量时,数据类型必须相同。 说明:如果使用子范围类型,则确保不退出此子范围。编译器仅针对常量分配检查这些类型的子范围违规。 重要性:低 提示 不对 CFC 对象执行检查,因为代码结构不允许这样做。 例 19 . 例子 VAR_GLOBAL iVarGlob:INT; END
SA0009:未使用的返回值 检测未使用返回值的函数、方法和属性调用 理由:当函数或方法返回返回值时,您也应该对其进行评估。返回值通常表明函数是否执行成功。如果没有评估,那么您稍后将无法识别返回值是否被遗忘或者是否实际上不需要。 例外:如果返回值与调用无关,那么您应该对此进行记录并省略赋值。错误返回永远不应该被忽略。 重要性:中等 PLCopen规则:CP7/CP17 例 20 . 例子 FUNC
SA0010:只有一个组件的数组 检测只有一个元素的数组 理由:一个元素的数组可以被一个基本类型的变量替换。访问此变量比通过索引访问变量快得多。 例外:数组的长度通常由常量确定,并且是程序的参数。那么程序就可以处理不同长度的数组,并且如果长度仅为1则不必更改。这种情况应该相应地记录下来。 重要性:低 例 21 . 例子 PROGRAM PLC_PRG VAR aoiEmpty : ARRAY [2
SA0023:复杂的返回值 确定无法使用处理器的简单注册表副本返回的复杂返回值。这包括结构、数组和类型的返回值 STRING (不管已用内存的大小)。 理由:这是一个性能警告。如果函数、方法或属性的结果返回较大的值,则处理器在执行代码时会多次复制它们。这可能会导致运行时问题,应尽可能避免。可以通过传递结构化值来提高性能 VAR_IN_OUT 到一个函数或方法并将其填充到该函数或方法中。 重要性:中
SA0024:无类型文字/常量 标识属于操作一部分的无类型文字 理由:无类型文字会根据其用法自动类型化。在某些情况下,例如 dw := ROL(DWORD#1, i); ,这可能会导致意外的情况,最好使用类型化文字来提供独特的说明。 重要性:低 例 35 . 例子 PROGRAM PLC_PRG VAR iTemp1 : INT := 10; //no part of operation diTe
SA0025:不合格的枚举常量 检测限定名称未在枚举前面添加的枚举常量 理由:合格的访问使代码更具可读性且更易于维护。如果不强制使用限定变量名,则可以在扩展程序时插入附加枚举。该枚举包含一个与现有枚举同名的常量(参见下面的示例:“red”)。这将导致对这段代码的访问不明确。 在每种情况下,我们建议仅使用带有编译指示的枚举 {attribute 'qualified-only'} 。 重要性:中等
SA0026: 可能的截断字符串 检测未使用足够字符串长度的字符串分配和字符串初始化 理由:当分配不同长度的字符串时,字符串可能会被截断。这可能会产生意想不到的结果。 重要性:中等 例 37 . 例子 PROGRAM PLC_PRG VAR strVar1 : STRING[10]; strVar2 : STRING[6]; strVar3 : STRING[6] := 'abcdefghi';
SA0027:标识符的多种用途 检测项目范围内变量或对象 (POU) 的名称/标识符的多次使用。 对于枚举,将考虑限定名称。 理由:阅读代码时,相同的名称可能会造成混淆。如果意外访问了错误的对象,它们可能会导致错误。定义并遵循命名约定以避免出现此类情况。 检测到以下情况: 枚举的名称与应用程序或集成库中的另一个枚举的名称相同。 变量的名称与应用程序或集成库中的另一个对象的名称相同。 变量的名称与应
SA0028:重叠的内存区域 检测两个或多个变量保留相同内存的代码行。 理由:当两个变量保留相同的内存时,代码可能会出现意外的结果。应不惜一切代价避免这种情况。如果您无法避免在不同的解释中使用某个值(例如,一次作为 DINT 还有一次作为 REAL ),那么你应该定义一个 UNION 。您还可以使用指针访问不同类型的值,而无需转换该值。 重要性:高 例 39 . 例子 PROGRAM PLC_PR
SA0029:代码中的符号与声明不同 检测标识符的符号与其声明中的符号不同的代码位置 理由:IEC 61131-3 标准将标识符定义为不区分大小写。这意味着变量声明为“ varx “也可以用作” VaRx ” 在代码中。但是,这是令人困惑和误导的,应该避免。 重要性:中等 例 40 . 例子 一个 PLC_PRG POU 和一个 fnc (函数) POU 存在于设备树中。 PROGRAM PLC_