SA0105:多个实例调用 检测被多次调用的功能块的实例。为此,必须使用以下编译指示来标记功能块: {attribute 'analysis:report-multiple-instance-calls'} 理由: 某些功能块的设计方式是在一个循环中只能调用一次。此测试检查是否在多个位置进行呼叫。 重要性:低 PLCopen规则:CP16 / CP20 例 92 . 例子 // {attribut
SA0040:可能被零除 检测可能被零除的代码位置 理由:除以 0 导致错误。应始终首先检查要除法的变量是否为 0。 重要性:高 例 48 . 例子 VAR_GLOBAL g_iVar AT %QW1 : INT; END_VAR PROGRAM PLC_PRG VAR iCounter : INT; iSumme:INT; iMid:INT; iVal1:INT := INT#2; iVal2:
SA0043:仅在一个 POU 中使用全局变量 仅在单个 POU 中检测全局变量的使用 理由:仅在一个位置使用的全局变量也只能在该位置声明。 重要性:中等 PLCopen规则:CP26 例 51 . 例子 VAR_GLOBAL g_xVar AT %QX0.0 : BOOL ; g_iTest AT %QW1 : INT ; g_wTest AT %QW2 : WORD; END_VAR PROG
指标 提供的指标的详细描述 CODESYS Static Analysis 提示 这 代码大小 , 尺寸可变 , 堆栈大小 , 和 通话次数 仅报告项目中集成的库中的 POU 的指标。 指标:代码大小(字节数) 类别: 信息丰富、效率 功能块为应用程序代码贡献的字节数 该数量还取决于代码生成器。例如,ARM 处理器的代码生成器通常比 x86 处理器的代码生成器生成更多字节。 指标:可变大小(字节数
配置和运行静态分析 使用下面的基本示例项目,您将找到配置和运行静态分析的最重要的步骤和选项。 要求: CODESYS Static Analysis 已安装。 示例项目 如果要重现示例项目,请创建一个标准项目并将 POU 插入设备树中的应用程序下方。然后配置连接到本地的通信设置 CODESYS Control Win V3 。 FUNCTION_BLOCK fb1 VAR_INPUT iVar_f
SA0013:具有相同变量名的声明 检测名称已被其他变量使用的变量(例如,具有相同名称的全局变量和局部变量)。还可以检测其函数、操作、方法或属性名称在同一访问范围内使用的变量。还检测在 GVL 中声明的变量 设备 查看或在 POU 池中。然而,为此,GVL POU 视图必须在应用程序中使用。 说明:相同的名称在阅读代码时可能会造成混淆,如果无意中访问了错误的对象,它们可能会导致错误。我们建议您使用
SA0066:临时结果的使用 检测数据类型小于寄存器大小的语句中临时结果的使用。在这种情况下,隐式强制转换可能会导致不良结果。 理由:出于性能原因, CODESYS Static Analysis 对处理器的寄存器宽度执行操作。中间结果不会被截断。这可能会导致误解,如下例所示: 例 77 . 例子 usintTest := 0; xError := usintTest - 1 <> 255; 在
SA0054:REAL/LREAL 的相等/不等比较 检测比较运算符是否 = (平等)和 <> (不等式)比较类型的操作数 REAL 或者 LREAL . 理由: REAL / LREAL 根据 IEEE 754 标准,值被实现为浮点数。该标准意味着特定的、看似简单的十进制数无法精确表示。因此,可能会有不同的表示形式: LREAL 对于相同的十进制数。 考虑以下代码行: lr11 := 1.1;
SA0058:对枚举变量的操作 检测对枚举数据类型的变量的操作 允许赋值。 理由:枚举不应用作普通整数值。或者,可以定义别名数据类型或者可以使用子范围类型。 重要性:中等 例外:如果枚举用 pragma 标记 {attribute 'strict'} ,那么编译器已经报告了这种操作。 如果枚举被 pragma 声明为标志 {attribute 'flags'} ,则不会发出错误 AND , OR
SA0012:可以声明为常量的变量 检测未使用写权限访问的变量,因此可以声明为常量 理由:如果变量仅在声明点写入并且仅用于读取,则静态分析假定该变量也不应该被更改。首先,声明为常量会导致检查程序更改时变量是否未更改。其次,声明为常量可能会导致代码更快。 重要 如果一个项目中存在多个应用程序,则仅影响当前活动应用程序下的对象。如果只有一个应用程序,那么公共 POU 池中的对象也会受到影响。 重要性: