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
SA0038: 对输出变量的读访问 检测输出变量( VAR_OUTPUT ) 可以通过 POU 内的读取权限进行访问 理由:根据 IEC 61131-3 标准,禁止读取 POU 内的输出。这表明输出不仅用作输出,而且还用作中间结果的临时变量。应该避免这种双重用途。 重要性:低 例 47 . 例子 VAR_GLOBAL g_xGlob AT %QX0.0 : BOOL ; g_iGlob AT %Q
SA0118:不使用常量的初始化 检测未分配常量的初始化 理由:如果可能,初始化应该是常量,并且不应该引用其他变量。特别是,您应该避免在初始化期间调用函数,因为这可能允许访问未初始化的数据。 重要性:中等 例 109 . 例子 PROGRAM PLC_PRG VAR dwTemp : DWORD := 22; dwTest : DWORD := dwTemp; // SA0118 dwVar :
SA0160:递归调用 检测功能块的动作、方法和属性中的递归调用。还检测来自虚拟函数调用和接口调用的可能递归。 理由:递归会导致不确定的行为,因此是错误的来源。 重要性:中等 PLCopen规则:CP13 例 117 . 例子 下面的方法 Call 分配给功能块 FB_Test : FUNCTION_BLOCK FB_Test VAR bParameter: BOOL; END_VAR METHO
SA0115:数据类型为 UNION 的变量 检测 a 的声明 UNION 数据类型和变量声明 UNION 类型 理由:IEC 61131-3 标准不包括工会。该代码在没有联合的情况下更容易移植。 重要性:低 例 99 . 例子 TYPE A_UNION: UNION lrTemp : LREAL; liTemp : LINT; END_UNION END_TYPE PROGRAM PLC_PRG
Naming Conventions ¶ Rule #10: Use clean Naming Conventions ( Optional ) The consistent use of a naming convention is the best way for clean code. (Checked by the Static Code Analysis [ 3 ] ) These ru