CAA 指南
VARIABLE NAMES

在所有函数库中变量的命名最好是唯一的,并且按照匈牙利命名法:

对于每个变量最好有一个由意义并且短的英文名作为基本名称。通常基本名称的第一个字母用大写字母其他的字母用小写字母 。 (例如: FileSize)。如果需要,添加一个转换文件或者可以使用其他语言。

基本的名称前面应该加上变量数据类型的标识作为前缀 (小写字母) 。参阅以下表格

数据类型

最小值

最大值

长度

前缀

标识

注意

BOOL

FALSE

TRUE

1/8 Bit

x

0x01

 
       

b

 

预留

       

n

 

预留

       

f

 

预留

BYTE

 

位字符串,不能用于数学操作

8 Bit

by

0x02

 

WORD

 

位字符串,不能用于数学操作

16 Bit

w

0x03

 

DWORD

 

位字符串,不能用于数学操作

32 Bit

dw

0x04

 

LWORD

 

位字符串,不能用于数学操作

64 Bit

lw

-

 
             

SINT

-128

127

8 Bit

si

0x06

 

USINT

0

255

8 Bit

usi

0x07

 

INT

-32.768

32.767

16 Bit

i

0x08

 

UINT

0

65.535

16 Bit

ui

0x09

 

DINT

-2.147.483.648

2.147.483.647

32 Bit

di

0x0A

 

UDINT

0

4.294.967.295

32 Bit

udi

0x0B

 

LINT

-263

263-1

64 Bit

li

-

 

ULINT

0

264-1

64 Bit

uli

-

 
             

REAL

 

单精度 IEEE 754

32 Bit

r

0x0C

 

LREAL

 

双精度 IEEE 754

64 Bit

lr

-

 
             

STRING

 

每个字符8 位

 

s

-

 

WSTRING

 

每个字符16 位

 

ws

-

 
             

TIME

T#0

T#49d17h2m37s295ms

32 Bit

t

0x0D

ms

LTIME

T#0

T#213503d23h34m33s709ms551us 615ns

64 Bit

lt

-

ns

TIME_OF_DAY

TOD#0:0:0.0

TOD#23:59:59.999

32 Bit

tod

0x0E

ms

DATETIME

DT#1970-1-1-0:0:0

DT#2106-2-7-6:28:15

32 Bit

dt

0x0F

s

DATE

D#1970-1-1

D#2106-2-7

32 Bit

dat

0x11

d

ENUM

   

16 Bit

e

0x12

 

INTERFACE

 

I<接口库>

 

I

   

接口相关

 

itf>接口

 

itf

   

REFERENCE

 

r>Prefix><变量>

       

注意 1:对于布尔变量使用前缀 "x" 是为了与类型 BYTE 进行区分并且与 IEC 程序进行匹配 (地址 %IX0.0)。

示例:

bySubIndex:BYTE;
sFileName:STRING;
udiCounter:UDINT;
 

请注意更多的数据类型定义在函数库 CAA_Types中。这些数据类型基于平台属性确定 (通常是自然处理字的大小)。

在嵌套声明的情况下,前缀串连根据其声明的顺序:

类型

最小值

最大值

存储空间

前缀

标识

注意

Pointer

     

p

0x13

 

Array

     

a

0x14

 

示例:

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

功能块接口 以及 用户定义变量作为一个前缀必须获得功能块以及数据类型的一个短定义 (例如:sdo)。

示例:

sdoReceivedTelegram: CAN_SDOTelegram;
TYPE CAN_SDOTelegram : (* prefix: sdo *)
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) 和 全局常量 (gc) 使用一个前缀 +下划线的方式进行定义:

示例:

VAR_GLOBAL
    CAN_g_iTest: INT;
END_VAR
VAR_GLOBAL CONSTANT
    CAN_gc_dwExample: DWORD;
END_VAR
 
位于 CoDeSys V3 函数库中的变量

位于CoDeSysV3中组合的变量名对应于上面描述的( “VARIABLE NAMES”) 除了全局变量和常量不需要一个函数库前缀,因为这些函数都将会被函数库的命名空间代替。

示例:

g_iTest: INT; (declaration)
CAN.g_iTest  (usage, call in program)
 

用户定义数据类型 (DUT)

每个结构体的数据类型应该包含函数库前缀 (例如 CAN),一个下划线以及结构体的短的解释描述 (例如 SDO 报文)。这个结构定义的变量应遵循相应的前缀,冒号后面直接为注释。

示例:

TYPE CAN_SDOTelegram :   (* prefix: sdo *)
STRUCT
   wIndex: WORD;
   bySubIndex: BYTE;
   byLen: BYTE;
   abyData: ARRAY [0..3] OF BYTE;
END_STRUCT
END_TYPE
 

枚举变量应该以函数库前缀起始 (例如 CAL),后跟一个下划线和大写字母标识符。

注意在之前的CoDeSys版本中 ENUM 值 >16#7FFF 会产生错误,因为他们没有自动转化为 INT。因为这个原因 ENUMs 通常应该被正确的 INT 值指定。

示例:

TYPE CAL_DAY:(
CAL_MONDAY,
CAL_TUESDAY,
CAL_WEDNESDAY,
CAL_THIRSDAY,
CAL_FRIDAY,
CAL_SATURDAY,
CAL_SUNDAY);
 

Declaration

eToday:CAL_DAY;
 
CoDeSys V3 函数库中的DUTs

位于CoDeSys V3.x 函数库中的 DUT 的名称不适用任何的前缀,因为函数通过函数库的命名空间进行调用。如果要精确的使用命令空间那么在属性调用中会进行声明。在定义 DUT 之前 “{attribute 'qualified_only'}” 短语应该被使用。

其中的枚举变量也没有函数库前缀:

示例 (具有 CAL 命名空间的函数库)

{attribute 'qualified_only'}

TYPE Day :(
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THIRSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY);

 

定义:

eToday: CAL.Day;
 

应用中使用:

IF eToday = CAL.Day.MONDAY THEN
 

FUNCTIONS, FUNCTION BLOCKS, PROGRAMS (POU)

函数,功能块和程序的定义都应该具有函数库前缀 (例如: CAN),一个下划线以及一个含义,做成一个更好的 POU 名称 (例如: SendTelegram)。变量一样应该具有一个字的基本名称的并且第一个字母大写,其余小写。建议组成一个动词和一个实质性的POU的名称。

示例:

FUNCTION_BLOCK CAN_SendTelegram     (* prefix: canst *)
 

在定义部分一个功能块的 短的描述应该作为一个注释被加上。包括所有的输入以及输出变量都应该有一个注释说明。功能块的前缀用于定义一个实例应该作为一个注释被插入到名字之后。

动作基本上没有前缀;动作的定义只能进行内部调用,例如,pou本身的以 „prv_“. 开始的函数库可以作为一个外部函数库进行实现但是不能包含动作除非这些动作是通过 „prv_“进行定义的。动作不能通过 CoDeSys 2.3 中的 ANSI-C 实现。

每个 函数 –与以前的CoDeSys版本兼容性的原因 - 至少包含一个参数。外部函数必须使用结构体作为返回变量。

CoDeSys V3 函数库中的 POUs

CoDeSys V3.x 函数库中的 POU 名称函数库前缀不是必须的因为函数通过命名空间进行调用。

对于命名方法同样的规则适用于动作。方法的输入应该添加英语的注释。在定义区域也应该包含方法的描述。对于方法来说没有显示其使用内部或者外部函数库。

接口名字应该以 „I“,开头,例如:

ICANDevice
 

CoDeSys V3 函数库中的可视化工程

有时候需要一些函数或者变量的帮助。这些成员应该是CoDeSys V3中输入助手的成员。对于这种需求有另一种属性。在每个名目的定义前使用 “{attribute 'hide'}” 短语。

行为和接口功能POUS模型的

动作的执行时间取决于外部设备(例如:从串口中读取)或受参数大小的影响(如64K字节 CRC),应该按照异步处理定义为功能块(FB)例如,被分割为多个周期内。

2 用于启动行为的模块

1. xExecute边缘控制

上升沿:动作启动

在一个上升沿 POU 开始启动。标准情况下输入首先进行本地复制,在动作过程中修改输入是无效的,其他输入的任何动作都必须有详细说明。

下降沿:复位输出

如果在 POU 结束动作之前发生一个下降沿,输出仍将继续执行知道另一个动作结束或者被中断 (xAbort),或者一个错误产生。在这种情况下,相关变量 (xDone, xError, eError) 必须在一个执行周期内可获得。

可选输出xAbort:停止动作

如果这个输入为 TRUE,动作将会立即停止并且所有输出将会被设置为初始值。在这种情况下中断输出 xAborted 将会在中断后被设为 TRUE。

可选输入udiTimeLimit:激活功能块之后应该返回的时间

这个输入显示一个功能块(处理通常是一个常量时间)在调用返回前需要的时间 (µs) 。值 0 表示没有显示时间。

可选输入udiTimeOut:激活功能块错误中断时间

这个输入定义多长时间 (µs) – 动作启动时测试 - 一个功能块(例如:等待外部输入的功能块) 将会因为超时中断处理。

这些输入如果被使用,首先需要进行定义,按照名称的顺序从上到下显示。以下模式详细定义了输入输出功能:

以下模式详细定义了输入输出函数的功能:

错误-/自由中断处理:

错误-/自由中断处理 xExecute 在繁忙时的下降沿:

中断:

错误情况:

当 xExecute 的下降沿繁忙时处理:

2. xEnable 触发水平控制

TRUE: 动作运行;默认情况下输入的任何改变都会影响当前的动作。任何不同的动作都必须文档注明。

FALSE: 动作停止,输出 xDone, xBusy, xError, eError 被复位

预定义输出:

xDone: 动作成功完成

xBusy: 功能块被激活

xError: 产生错误

这些输出如果被使用,通常需要首先进行定义, 在xBusy 之前命名 xDone ,如果应用跟随错误输出 xError 和 eError。

POUs 只能在以上描述的函数中使用这些输入和输出。

函数库的描述中上面提到的函数中默认的输入和输出没有进行描述以便避免多个特殊情况。

一个示例工程 „BehaviourModel.pro“,包含上述功能的功能块,将会按照当前版本工程发布。

对于CoDeSys V3 有一个函数库 CAA_BehaviourModel.library,唯一的实现动作模式。同样也会有一个工程模板CAA_Template.library 以及 CAA_Template_Extern.library,根据特定用户扩展动作模式。所有这些函数库都会根据当前引导文档进行发布并且是CoDeSys V3 安装时自动安装。

CAA_BehaviourModel.library FBs:

ETrig: 边缘触发

ETrigA: 中断输入的边缘触发

ETrigTo: 具有超时的边缘触发

ETrigTl: 时间限制的边缘触发

ETrigToA: 时间限制以及中断输入的触发

ETrigTlA: 时间限制和中断输入的触发

ETrigToTl: 超时和时间限制的边缘触发

ETrigToTlA: 超时,时间限制以及中断输入的边缘触发

LTrig: 水平触发

ERROR HANDLING

对于每个函数库所有通过函数库模块创建的错误 IDs - 不是通过相关函数库的实例 – 被进行区分并罗列。 因为这个目的每个函数库应该定义一个枚举类型<libraryprefix>_ERROR。这个枚举变量的组件是 "<libraryprefix>_<error description>"。如果CoDeSys V3 函数库的前缀没有使用,因为这个功能被函数库的命名空间取代。

通过函数库前缀一个错误范围也会被关联到函数库。 这些错误范围被区分为默认范围 (第一部分) 以及制造商指定范围 (第二部分)。 范围是受每个函数库中的枚举变量限制的: <libraryprefix>_FIRSTERROR, <libraryprefix>_FIRST_MF 以及 <libraryprefix>_LAST_ERROR。这些限制值没有描述错误。枚举变量的允许值不像错误序号那样长。位于 <libraryprefix>_FIRST_ERROR 和 <libraryprefix>_FIRST_MF 默认错误定义,位于 <libraryprefix>_FIRST_MF 和 <libraryprefix>_LAST_ERROR 是制造商错误。

附加情况下每个枚举变量应该包含<libraryprefix>_NO_ERROR 其变量值为 0。

每个函数库使用功能块输入udiTimeOut 作为附加错误枚举变量包含图标名<libraryprefix>_TIMEOUT 其值为 <libraryprefix>_FIRST_ERROR+1。其他函数库不能包含这个值。

如果需要,特殊错误可以进行手动指定,并且子项目模块的错误可以通过收集错误数量进行报告并且可以被另一个错误模块详细描述。

Function Blocks

每个功能块应该包含以下输出:

xError (BOOL): 没有错误; TRUE:错误发生,模块中止动作。

eError (<libraryprefix>_ERROR): 本地函数库错误ID (0: 没有错误)。

如果默认输入 (xExecute/xEnable, xAbort, udiTimeLimit, udiTimeOut) 被使用,这必须位于输入列表的顶端,跟随特殊输入和 VAR_IN_OUTs。更多的详细输出按照以下语法进行定义: xDone, xBusy, xError, eErro。对于子队列需要定义特殊输出。