标识符命名最佳做法

概述

标识符的定义方式是:

  • 在声明变量时(变量名称)

  • 在声明用户定义的数据类型时

  • 在创建 POU 时(功能、功能块和程序)

除了在定义标识符时要考虑的常规项目外(请参阅变量声明的概述),还需考虑以下事项以使命名尽可能具有唯一性:

注: 下文中提供的命名约定和示例基于在开发 Schneider Electric 库的过程中应用的良好做法,并对应于EcoStruxure Machine Expert Code Analysis 中使用的缺省约定查询。以下各节中以括号的形式提供了来自其他组织的替代命名约定。

变量名称

要在应用程序和库中命名变量,请尽可能遵循匈牙利命名法。

为每个变量挑选一个有意义的简短描述。这用作基本名称。对于基本名称的每个单词,请使用大写字母。对于其余内容,请使用小写字母(示例:FileSize)。

数据类型

下限

上限

信息内容

前缀

注释

BOOL

FALSE

TRUE

1 位

x*

b

保留

BYTE

8 位

by

位字符串,不适用于算术运算

WORD

16 位

w

位字符串,不适用于算术运算

DWORD

32 位

dw

位字符串,不适用于算术运算

LWORD

64 位

lw

位字符串,不适用于算术运算

SINT

-128

127

8 位

si

算术整数数据类型,8 位

USINT

0

255

8 位

usi

算术整数数据类型,8 位

INT

-32,768

32,767

16 位

i

算术整数数据类型,16 位

UINT

0

65,535

16 位

ui

算术整数数据类型,16 位

DINT

-2,147,483,648

2,147,483,647

32 位

di

算术整数数据类型,32 位

UDINT

0

4,294,967,295

32 位

udi

算术整数数据类型,32 位

LINT

–263

263-1

64 位

li

算术整数数据类型,64 位

ULINT

0

264-1

64 位

uli

算术整数数据类型,64 位

REAL

32 位

r

算术浮点数据类型,32 位

LREAL

64 位

lr

算术浮点数据类型,64 位

STRING

s

长度可变的单字节字符串(缺省设置:80 个字符)

WSTRING

ws

长度可变的双字节字符串(缺省设置:80 个字符)

TIME

tim

时长,32 位

LTIME

ltim

时长,64 位

  • TIME_OF_DAY

  • TOD

tod

时间,32 位

  • LTIME_OF_DAY

  • LTOD

ltod

时间,64 位

  • DATE_AND_TIME

  • DT

dt

日期和时间

  • LDATE_AND_TIME

  • LDT

ldt

DATE

  • dat

  • d

日历日期

LDATE

  • ldat

  • ld

日历日期

Enumeration

et (e)

POINTER

p

ARRAY

a

Structure

st

Function block

fb

Interface

if (itf)

Union

ut

* 针对布尔变量,刻意选择 x 作为前缀以区分 BYTE,也是为了适应 IEC 程序员的认知(请参阅寻址 %IX0.0)。

简单声明

简单声明的示例:

bySubIndex: BYTE;

sFileName: STRING;

udiCounter: UDINT;

嵌套声明

嵌套声明的示例(其中的前缀按照声明的顺序彼此连接):

pabyTelegramData: POINTER TO ARRAY [0..7] OF BYTE;

功能块实例以及用户定义数据类型的变量

功能块实例以及用户定义数据类型的变量会获取功能块或数据类型名称的简写作为前缀(例如:stSDO)。

示例

stSDOReceivedTelegram: ST_SDOTelegram;
TYPE ST_SDOTelegram : 
STRUCT
  wIndex:WORD;
  bySubIndex:BYTE;
  byLen:BYTE;
  aby: ARRAY [0..3] OF BYTE;
END_STRUCT
END_TYPE

本地常量

本地常量 (c) 以前缀 c 以及紧接的下划线开头,后跟类型前缀和变量名称。

示例

VAR CONSTANT
  c_uiSyncID: UINT := 16#80;
END_VAR

全局变量和全局常量

全局变量以 G_ 作为前缀 (g_),全局常量以 Gc_ 作为前缀 (gc_)。

示例

VAR_GLOBAL
  G_iTest: INT;
END_VAR
VAR_GLOBAL CONSTANT
  Gc_dwExample: DWORD;
END_VAR

库中的变量名称

结构

基本上,请参阅上述变量名称的描述。在应用程序代码中访问变量时,请使用库命名空间作为前缀。

示例

G_iTest: INT; (declaration)
CAN.G_iTest (implementation, call in an application program

库中的用户定义数据类型 (DUT)

结构

每个结构数据类型的名称由相应的类型前缀(另请参阅 POU 前缀)和结构的简短、有意义的名称(例如 ET_Day)组成。

示例(在命名空间为 CAL 的库中):

TYPE ET_Day :(
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY);

声明:

etToday: CAL.ET_Day;

在应用程序中使用:

IF etToday = CAL.ET_Day.MONDAY THEN
注: 使用在库中声明的 DUT 或枚举时,请注意命名空间的用法。

功能、功能块、程序 (POU) 和操作

功能、功能块和程序的名称由相应的类型前缀(另请参阅 POU 前缀)和 POU 的简短的、有意义的名称(例如 FB_SendTelegram)组成。与变量一样,POU 名称单词的第一个字母应始终是大写字母,而其他字母应为小写字母。例如,使 POU 名称由动词和名词实词组成,可清楚指示功能块的运算。

示例

FUNCTION_BLOCK FB_SendTelegram

在声明部分中,请提供 POU 的简短描述作为注释。此外,还应该为输入和输出提供注释。如果是功能块,请直接在名称后面为设置实例插入关联的前缀。

动作

操作不包含前缀。只有那些仅在内部(即,由 POU 自身)调用的操作才以 prv_ 开头。

库中的 POU

结构

对于创建方法名称,适用的规则与创建操作时适用的规则相同。针对方法的可能输入,请输入注释。向方法的声明中添加方法的简短描述。以前缀 IF_ (I) 作为接口名称的开头;例如,IF_CANDevice

注: 使用在库中声明的 POU 时,请考虑使用命名空间。