SA0095:条件分配 检测条件下的分配 IF , CASE , 或者 REPEAT 结构体 理由:赋值 (:=) 和比较 (=) 很容易被误解。结果,条件中的分配很容易是无意的,因此会被报告。这也会使代码的读者感到困惑。 重要性:高 例 87 . 例子 PROGRAM PLC_PRG VAR iCond1:INT := INT#1; iCond2:INT := INT#2; xCond:BOOL
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
SA0106:FB_INIT 中的虚拟方法调用 检测方法调用 FB_Init 基本功能块的方法,被从基本功能块派生的功能块覆盖 理由:在这些情况下,可能是覆盖方法中的变量未在基础 FB 中初始化。 重要性:高 例 93 . 例子 功能块 FB_A 包括方法 FB_Init 和 Meth_MyInit . FB_Init 来电 Meth_MyInit 用于初始化。功能块 FB_B 来源于 FB_A
SA0107:缺少形式参数 检测是否缺少形式参数 理由:在调用中指定形式参数时,代码变得更具可读性。 重要性:低 例 94 . 例子 FUNCTION FUNA : BOOL VAR_INPUT bDo : BOOL; bInit : BOOL; bManual : BOOL; END_VAR VAR iInit : INT; iLocal : INT; iManual : INT; END_VA
SA0111:指针变量 检测类型变量 POINTER TO 理由:IEC 61131-3 标准不允许指针。 重要性:低 例 95 . 例子 VAR piTemp : POINTER TO INT; pbyTemp : POINTER TO BYTE; END_VAR 输出在 留言 看法: SA0111:不允许数据类型 POINTER 本节内容如下 :