SA0073:使用不充分的计数器变量 检测非临时变量的使用 FOR 循环。 理由:这是一个性能警告。每次调用 POU 时都会初始化一个计数器变量。您可以将此变量创建为临时变量 ( VAR_TEMP )。访问它可能会更快,并且该变量不会占用任何永久内存。 重要性:中等 PLCopen规则:CP21/L13 例 80 . 例子 PROGRAM PLC_PRG VAR nIndex : INT; iVa
SA0075:缺少 ELSE 检测到 CASE 没有的陈述 ELSE 分支 理由:防御性编程需要包含一个 ELSE 在每个分支 CASE 陈述。如果在里面无事可做 ELSE 分支,然后包含注释以表明这一点。代码的读者很清楚,这个案例并没有被简单地遗忘。 重要性:低 PLCopen 规则:L17 重要 For CASE 使用带有属性的枚举的语句 strict 并且所有枚举常量都用在 CASE 使用
SA0077:类型与 CASE 表达式不匹配 检测条件数据类型与条件数据类型不匹配的代码位置 CASE 分支 理由:如果数据类型之间 CASE 变量和 CASE 本身不匹配,则这可能表示错误。 重要性:低 例 83 . 例子 TYPE My_Enum : ( eins := 1, zwei := 2, drei := 3, vier := 4 ); END_TYPE PROGRAM PLC_PRG
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
SA0056:常数超出有效范围 检测运算符有效范围之外的文字(常量) 说明:在将某个值与超出该值范围的常数进行比较时发出该消息。然后比较不断返回 TRUE 或者 FALSE .这是编程错误的指示。 重要性:高 例 65 . 例子 PROGRAM PLC_PRG VAR byTestVar: BYTE; END_VAR WHILE byTestVar >= 260 DO byTestVar := b
SA0059: 比较操作总是返回 TRUE 或 FALSE 检测与结果始终为的文字的比较 TRUE 或者 FALSE ,并且可以在编译期间进行处理。 理由:持续产生的操作 TRUE 或者 FALSE 是编程错误的指示。 重要性:高 例 69 . 例子 PROGRAM PLC_PRG VAR byTemp1 : BYTE; END_VAR WHILE byTemp1 <= 255 DO byTemp
SA0060:零用作无效操作数 检测操作数具有以下值的操作 0 导致无效或无意义的操作 理由:这种表达方式可能表明存在编程错误。在任何情况下,它都会不必要地浪费运行时间。 重要性:中等 例 70 . 例子 PROGRAM PLC_PRG VAR byTemp1 : BYTE; wTemp2 : WORD; dwTemp3 : DWORD; END_VAR byTemp1 := byTemp1 +
SA0063:可能不是 16 位兼容的操作 检测具有临时结果的 16 位操作。背景:在 16 位系统上,可以截断 32 位临时结果。例子: (int+10) 可以超过 16 位。 理由:在极少数情况下,您必须编写应该在 16 位处理器和 32 位处理器上运行的代码,此消息应该有助于防止出现任何问题。 重要性:低 例 73 . 例子 PROGRAM PLC_PRG VAR iVar : INT; E
SA0005:无效的地址和数据类型 检测无效地址和数据类型规范。地址中的有效大小前缀:X 表示 BOOL B 表示 1 字节数据类型,W 表示 2 字节数据类型,D 表示 4 字节数据类型。 理由:位于直接地址上的变量最好与与其数据类型宽度相对应的地址相关联。代码的读者可能会感到困惑,例如,如果 DWORD 分配给一个 BYTE 地址。 重要性:低 例 57 . 例子 PROGRAM Check_
SA0095:条件分配 检测条件下的分配 IF , CASE , 或者 REPEAT 结构体 理由:赋值 (:=) 和比较 (=) 很容易被误解。结果,条件中的分配很容易是无意的,因此会被报告。这也会使代码的读者感到困惑。 重要性:高 例 87 . 例子 PROGRAM PLC_PRG VAR iCond1:INT := INT#1; iCond2:INT := INT#2; xCond:BOOL