SA0047:访问直接地址 检测实现代码中的直接地址访问 理由:符号编程总是更可取的。变量的名称也可以具有含义。地址不能表明它的用途。 重要性:高 PLCopen 规则:N1 / CP1 例 58 . 例子 PROGRAM PLC_PRG VAR xVar : BOOL; byVar : BYTE; END_VAR xVar := %IX0.0; %QX0.0 := xVar; %MX0.1 :=
SA0048:直接地址的 AT 声明 检测到 AT 直接地址声明 在代码中使用直接地址是有问题的,因为地址会出现在多个位置: 首先在控制器配置中定义物理对象到地址的分配 程序中的第二个变量被分配给这些地址。 如果由于配置更改而重新定位地址,则需要将变量重新分配给程序中完全不同位置的地址。这是错误的原因并导致代码的可读性和可维护性较差。因此,最好在设备编辑器的 I/O 映射中执行所有分配。 重要性:
SA0051:对 BOOL 变量的比较操作 检测类型变量的比较操作 BOOL 理由: CODESYS 允许进行这些类型的比较。但它们非常不寻常并且可能令人困惑。 IEC 61131-3 标准没有提供这些比较。通过避免它们,您可以提高代码到其他开发系统的可移植性。 重要性:中等 例 60 . 例子 PROGRAM PLC_PRG VAR xBool1, xBool2 : BOOL; xResult
SA0052:不寻常的移位操作 检测有符号变量的移位操作(位移)。在对位域数据类型进行移位操作的情况下( Byte , DWORD , LWORD , WORD ),不报错。 理由: CODESYS 允许对有符号数据类型进行移位操作。但是,这些操作是不寻常的并且可能会令人困惑。 IEC 61131-3 标准不提供此类操作。因此,应该避免它们以增加代码对其他开发系统的可移植性。 重要性:中等 例 6
SA0100: 大于 <n> 字节的变量 检测使用超过 n 个字节的变量,其中 n 由当前配置定义。默认值:1024 字节。可以通过双击该行来更改该值。 理由:一些编程指南指定了单个变量的最大大小。这可以用这个来检查。 重要性:低 例 88 . 例子 PROGRAM PLC_PRG VAR aobyTest : ARRAY [0..1024] OF BYTE; END_VAR aobyTest[I
SA0101:名称长度无效 检测长度无效的名称。在里面 项目设置 ,双击规则条目以打开一个对话框,您可以在其中定义名称的长度并定义任何例外。 理由:一些编程指南指定了变量名的最小长度。此分析可用于检查合规性。 重要性:低 PLCopen规则:N6 提示 所有规则都列在 设置静态分析:规则 对话。您可以在其中双击规则 101 以打开特定于规则的配置。然后,您可以定义最小和最大字符数,并在 名称长度
SA0102:从外部访问程序/fb变量 检测对程序或功能块的局部变量的外部访问。 理由: CODESYS 允许对程序或功能块的局部变量进行外部读取访问。这违背了数据封装(隐藏数据)的原则,不符合IEC 61131-3标准。 重要性:中等 例 90 . 例子 PROGRAM PLC_PRG VAR iCounter : INT; afb_Instance : AFB; bfb_Instance :
SA0103:对非原子数据的并发访问 检测是否非原子变量(例如,具有数据类型 STRING , WSTRING , ARRAY , STRUCT 、FB 实例、64 位数据类型)用于多个任务 理由:在访问过程中没有同步的情况下,在一个任务中读,同时在另一个任务中写入时,可能会读到不一致的值。 重要性:中等 提示 对于某些数据类型,尤其是 64 位整数,访问是否是原子的取决于平台。仅当控制器不支持对
SA0105:多个实例调用 检测被多次调用的功能块的实例。为此,必须使用以下编译指示来标记功能块: {attribute 'analysis:report-multiple-instance-calls'} 理由: 某些功能块的设计方式是在一个循环中只能调用一次。此测试检查是否在多个位置进行呼叫。 重要性:低 PLCopen规则:CP16 / CP20 例 92 . 例子 // {attribut