Skip to main content

定义命名约定

在里面 静态分析设置 对话框,在 命名约定 选项卡,定义您将在代码中遵循的命名约定。您可以根据其范围和限定符为 POU、变量和数据类型的标识符定义前缀。

然后,您可以让静态分析检查命名约定的合规性。

有关说明,请参阅: 检查是否符合定义的命名约定

定义前缀

在里面 静态分析设置 对话框,在 命名约定 选项卡,在输入字段中定义命名约定 字首 柱子。

  • 字符字面量

    例子:

    PRG_POU 的前缀, POU 类型的前缀, 程序 (102)

  • 每个条目有多个文字,用逗号分隔

    句法: <prefix> ( , <next prefix> )*

    例子:

    PRG_, PRGPOU 的前缀, POU 类型的前缀, 程序 (102)

  • 正则表达式 正则表达式 它定义了一组前缀

    句法: @ <expression>

    例子:

    @x[a-dA-D] 定义一个以 x, 紧接着是集合中的一个字符 a-dA-D

    @[A-Za-z][A-Za-z][A-Za-z][A-Za-z0-9] 定义一个由四个字符组成的前缀:前三个字符是字母,第四个字符也可以是数字。

定义可组合数据类型的前缀

以下数据类型基于标准数据类型、现有数据类型或功能块:

  • 指针: POINTER TO <basic type>

  • 参考: REFERENCE TO <basic type>

  • 大批: ARRAY[ <lower index bound> .. <upper index bound> ] OF <basic type>

这些数据类型可以嵌套和相互组合。当。。。的时候 可组合数据类型的递归前缀 选项被选中时,静态分析期望此类可组合数据类型的变量递归组合前缀。前缀遵循声明并对应于为基本数据类型定义的命名约定。

例子

已设置以下命名约定:

  • i变量的前缀, 情报 (26)

  • p变量的前缀, 指针 (26)

  • ref变量的前缀, 参考 (27)

  • struct变量的前缀, 结构 (32)

  • 可组合数据类型的递归前缀 选项: standard icon

以下代码违反了命名约定并且难以阅读。

PROGRAM plc1
VAR
        var1 : ARRAY[100..110] OF ARRAY[30..50] OF ARRAY[6..7] OF BOOL;
        var2 : ARRAY[1..3] OF INT;
        var3 : REFERENCE TO INT;
        iVar4 : INT;
        iVar5 : INT;
        var6 : ARRAY[1..3] OF INT := [11, 22, 33];
        var7 : POINTER TO ARRAY[1..3] OF INT;
        var8 : REFERENCE TO INT;
        var9 : S_POLYGONLINE := (aiStart:=[1,1], aiPoint1:=[5,2], aiPoint2:=[7,3], aiPoint3:=[8,5], aiPoint4:=[5,7], aiEnd:=[1,1]);
        var0 : ARRAY[0..3] OF S_POLYGONLINE; // S_POLYGONLINE is a already defined structure
END_VAR

iVar4 := iVar4 + 1;
var8 REF= iVar4;
var1[100][30][6] := TRUE;
var9.aiPoint1[1] := 99;
var7 := ADR(var6);
var6[2] := 44;
iVar5 := var7^[2];
var0[0] := var9;

静态分析报告以下违反命名约定的情况:

  • NC0102:无效名称“plc1”:预期前缀“PRG_”

  • NC0014:无效的变量名“var0”:预期的前缀“astruct”

  • NC0014:无效的变量名“var1”:预期的前缀“aaax”

  • NC0014:无效的变量名称“var2”:预期的前缀“ai”

  • NC0014:无效的变量名“var3”:预期的前缀“refi”

  • NC0014:无效的变量名“var6”:预期的前缀“ai”

  • NC0014:无效的变量名“var7”:预期的前缀“pai”

  • NC0014:无效的变量名“var8”:预期的前缀“refi”

  • NC0014:无效的变量名“var9”:预期的前缀“结构”

定义别名变量的前缀

您可以为数据类型的变量定义前缀 别名 作为占位符的文字 {datatype}.然后静态分析需要基本数据类型的前缀而不是占位符。

结合范围前缀和数据类型前缀 选项对前缀的使用没有影响 {datatype}.

例子

已设置以下命名约定:

  • s变量的前缀, 类型的前缀, 字符串()19

  • A_{datatype}变量的前缀, 别名 (33)

代码

TYPE A_MESSAGE : STRING[50]; // base data type is STRING
END_TYPE

VAR
        A_sMessage_N1 : A_MESSAGE := 'Robot is running.';
        A_s_Message_N2 : A_MESSAGE := 'Robot has been finished.';
        As_Message_N3 : A_MESSAGE := 'Robot has been stopped.';
        AsMessage_N4 : A_MESSAGE := 'Error 3 has been occured.';
END_VAR

静态分析报告以下违反命名约定:

  • NC0033:无效的变量名称“As_Message_N3”:预期的前缀“A_s”

  • NC0033:无效的变量名称“AsMessage_N4”:预期的前缀“A_s”

为属性定义前缀

您可以为数据类型的 POU 定义前缀 PROPERTY 作为占位符的文字 {datatype}.然后静态分析需要属性的返回数据类型的前缀而不是占位符。

结合范围前缀和数据类型前缀 选项对占位符的使用没有影响 {datatype}.

例子

已设置以下命名约定:

  • fb变量的前缀, 类型的前缀, 功能块实例

  • FB_POU 的前缀, POU 类型的前缀, 功能块 (103)

  • prop_{datatype}POU 的前缀, POU 类型的前缀, 物业 (107)

代码

FUNCTION_BLOCK blocka // Invalid function block name
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
    iA : INT;
END_VAR
iA := iA + 1;

PROPERTY PUBLIC vara : INT // Invalid property name, return data type is INT
Get
        vara := iA;
Set
iA := vara;

PROGRAM plc1
VAR
        var10 : blocka; // Invalid variable name of typ function block
        iVar11: INT;
END_VAR

var10();
IF var10.vara > 500 THEN
        var10.vara := 0;
END_IF
iVar11 := var10.vara;

静态分析报告以下违反命名约定:

  • NC0102:无效名称“plc1”:预期前缀“PRG_”

  • NC0031:无效的变量名“var10”:预期的前缀“fb”

  • NC0103:无效的变量名“blocka”:预期的前缀“FB_”

  • NC0107:无效的变量名“blocka.vara”:预期的前缀“prop_i”

根据命名约定编码

FUNCTION_BLOCK FB_A
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
    iA : INT;
END_VAR
iA := iA + 1;

PROPERTY PUBLIC prop_iA : INT
Get
        prop_iA := iA;
Set
        iA := prop_iA;

PROGRAM PRG_PLC1
VAR
        fbA : FB_A;
        iVar11: INT;
END_VAR

fbA();
IF fbA.prop_iA > 500 THEN
        fbA.prop_iA := 0;
END_IF
iVar11 := fbA.prop_iA;

定义结构的前缀

您可以在项目中为结构定义一个通用前缀 DUT 的前缀, 结构 (151).你也可以给一个结构一个特殊的前缀。然后,特殊前缀将覆盖一般前缀。

特殊前缀在结构的数据类型声明中用 pragma 定义 {attribute 'nameprefix' := <special prefix> '}.然后以这个前缀开始这个结构的所有变量 <special prefix>.

例子

已设置以下命名约定:

  • struct变量的前缀, 结构 (32)

  • S_DUT 的前缀, 结构 (151)

  • 可组合数据类型的递归前缀standard icon

代码

TYPE S_POLYGONLINE :
STRUCT
        aiStart : ARRAY[1..2] OF INT := [-99, -99];
        aiPoint1 : ARRAY[1..2] OF INT;
        aiPoint2 : ARRAY[1..2] OF INT;
        aiPoint3 : ARRAY[1..2] OF INT;
        aiPoint4 : ARRAY[1..2] OF INT;
        aiEnd : ARRAY[1..2] OF INT := [99, 99];
END_STRUCT
END_TYPE

{attribute 'nameprefix' := 'penta'} // Pragma to define a special prefix
TYPE S_PENTA EXTENDS S_POLYGONLINE :
STRUCT
        aiPoint5 : ARRAY[1..2] OF INT;
END_STRUCT
END_TYPE

PROGRAM PRG_Compute
VAR
        structPolygon : S_POLYGONLINE := (aiStart:=[1,1], aiPoint1:=[5,2], aiPoint2:=[7,3], aiPoint3:=[8,5], aiPoint4:=[5,7], aiEnd:=[1,1]);
        structPentagon : S_PENTAGON := (aiStart:=[0,0], aiPoint1:=[1,1], aiPoint2:=[2,2], aiPoint3:=[3,3], aiPoint4:=[4,4], aiPoint5:=[5,5]);
        structLine0 : S_PENTA;
        pentaLine1 : S_PENTA;
        iXPoint: INT;
        aPoint0: ARRAY [1..2] OF INT;
        aPoint1: ARRAY [1..2] OF INT;
END_VAR

iXPoint := structPolygon.aiPoint1[1];
aPoint0 := structLine0.aiEnd;
aiPoint1 := pentaLine1.aiEnd;

静态分析报告以下违反命名约定:

  • 无效的变量名“structLine0”:预期的前缀“penta”

提供其他 CODESYS Static Analysis 具有命名约定的项目

将命名约定保存在 CSA 文件中。您可以在其他地方加载和使用此文件 CODESYS Static Analysis 项目。

过程. 保存到文件
  1. 点击 构建→静态分析→设置.

  2. 点击 保存 按钮。

    文件选择对话框打开。在那里,您可以将命名约定存储在具有文件扩展名 CSA 的任何名称下的文件中。

过程. 使用命名约定加载文件
  1. 点击 构建→静态分析→设置.

  2. 点击 加载 按钮。

    文件选择对话框打开。选择下面显示的 CSA 文件之一。