属性:nameprefix 该属性为结构化数据类型的变量定义前缀。前缀必须添加到此类型声明的变量的标识符之前。这 静态分析 检查此命名约定。 插入位置 :在声明结构化数据类型之前的行中 句法 : {attribute 'nameprefix' := '<prefix>'} 例子 在以下示例中,Static Analysis 为 pB 发出一条消息,因为变量名称不以“point”开头。 {attri
SA0026: 可能的截断字符串 检测未使用足够字符串长度的字符串分配和字符串初始化 理由:当分配不同长度的字符串时,字符串可能会被截断。这可能会产生意想不到的结果。 重要性:中等 例 37 . 例子 PROGRAM PLC_PRG VAR strVar1 : STRING[10]; strVar2 : STRING[6]; strVar3 : STRING[6] := 'abcdefghi';
SA0073:使用不充分的计数器变量 检测非临时变量的使用 FOR 循环。 理由:这是一个性能警告。每次调用 POU 时都会初始化一个计数器变量。您可以将此变量创建为临时变量 ( VAR_TEMP )。访问它可能会更快,并且该变量不会占用任何永久内存。 重要性:中等 PLCopen规则:CP21/L13 例 80 . 例子 PROGRAM PLC_PRG VAR nIndex : INT; iVa
SA0076: 缺少枚举常量 确定每个枚举常量是否用作条件 CASE 语句并在 a 中查询 CASE 分支。 理由:防御性编程需要处理枚举的所有可能值。如果特定枚举值不需要执行操作,则应添加注释以明确指出这一点。然后,代码的读者很清楚,该值并没有被简单地遗忘。 重要性:低 例 82 . 例子 TYPE My_Enum : ( red := 1, blue := 2, green := 3, bla
SA0077:类型与 CASE 表达式不匹配 检测条件数据类型与条件数据类型不匹配的代码位置 CASE 分支 理由:如果数据类型之间 CASE 变量和 CASE 本身不匹配,则这可能表示错误。 重要性:低 例 83 . 例子 TYPE My_Enum : ( eins := 1, zwei := 2, drei := 3, vier := 4 ); END_TYPE PROGRAM PLC_PRG
SA0057:可能丢失小数位 检测可能丢失小数位的语句 理由:以下类型的一段代码( diTemp2 := 1 rTemp1 := TO_REAL(diTemp2 / DINT#2) ) 可能会导致误解。这行代码的作者或读者可以假设除法将作为 REAL 操作,在这种情况下,结果将是 REAL#0.5 .然而,事实并非如此。它是一个整数运算。结果被转换为 REAL 和 rTemp1 获取值 REAL#
SA0060:零用作无效操作数 检测操作数具有以下值的操作 0 导致无效或无意义的操作 理由:这种表达方式可能表明存在编程错误。在任何情况下,它都会不必要地浪费运行时间。 重要性:中等 例 70 . 例子 PROGRAM PLC_PRG VAR byTemp1 : BYTE; wTemp2 : WORD; dwTemp3 : DWORD; END_VAR byTemp1 := byTemp1 +
SA0048:直接地址的 AT 声明 检测到 AT 直接地址声明 在代码中使用直接地址是有问题的,因为地址会出现在多个位置: 首先在控制器配置中定义物理对象到地址的分配 程序中的第二个变量被分配给这些地址。 如果由于配置更改而重新定位地址,则需要将变量重新分配给程序中完全不同位置的地址。这是错误的原因并导致代码的可读性和可维护性较差。因此,最好在设备编辑器的 I/O 映射中执行所有分配。 重要性:
SA0166:最大。输入/输出/输入输出变量的数量... 检测是否有定义数量的输入变量 ( VAR_INPUT ), 输出变量 ( VAR_OUTPUT ) 或者 VAR_IN_OUT 在 POU 中超出变量。在里面 项目设置 ,双击规则条目以打开一个对话框,您可以在其中定义最大数量。 理由:这是关于检查个人编程指南。许多编程指南都规定了 POU 参数的最大数量。太多的参数使代码不可读,POU 难
SA0169:忽略的输出 检测调用方法或函数时未指定的方法和函数的输出。 理由:忽略的输出可能是关于未处理错误或无意义函数调用的通知,因为未使用结果。 重要性:中等 例 126 . 例子 FUNCTION Fun1 VAR_INPUT bIn : BOOL; VAR_END VAR_OUTPUT bOut : BOOL; END_VA ; PROGRAM PLC_PRG VAR bValue :B