Skip to main content

命令:生成

象征: ac_icon_generate.png

此命令(类别“Composer”)启动构建过程,自动生成 CODESYS 模块树中的应用程序和设置 发电机配置

消息和错误将显示在消息视图中。

标准生成器创建的所有对象(任务对象和应用程序除外)将存储在应用程序的子文件夹中。 POU池命名 AC_StdAC_FBs。如果已存在同名文件夹,将通过添加后缀创建唯一名称 _0

39. 生成的功能块
生成的功能块


所有创建的对象 产生 命令标有蓝色覆盖图标。如果用户尝试删除、移动或修改这些对象之一,将打开一个对话框,告知此操作可能会导致编译问题。如果用户继续,覆盖图标的颜色将变为红色(请参阅功能块 AC_PRG_RMP (PRG) 在上面的屏幕截图中)。

提示

如果您将 Application Composer 与 CODESYS SVN

所有 Composer 生成的对象都标有 Ignore on Commit 对于SVN。此外,SVN 会切换到离线模式,以避免执行内置命令时 SVN 锁定。

通过标准生成器创建功能块实例

对于每个模块实例,将创建一个功能块(在文件夹中 AC_FBs)。该功能块源自模块功能块。

功能块包含输入变量

  • 子模块实例

  • 可配置大小的数组

  • 直接 I/O 连接的缓冲区变量

  • 多槽数组和实例引用

各个数组变量的名称由前缀创建 AC_ARRAY_ 后跟相应指针变量的变量名。对于具有可变索引大小的数组 (VarArrays),名称可以被参数覆盖 VarArray.InstName

功能块的实现部分包含命令 SUPER^(); 它调用模块功能块的实现部分。

11. 例子

模块实例 ModuleInstanceA 属于类型 ModuleA 及相关功能块 ModuleA_FB。该实例有一个类型的子模块实例 ModuleB

模块实例 ModuleInstanceA 属于类型 ModuleA 及相关功能块 ModuleA_FB。该实例有一个类型的子模块实例 ModuleB

FUNCTION_BLOCK AC_ModuleInstanceA EXTENDS ModuleA_FB

VAR_INPUT
        Inst_Sub1 : AC_ModuleInstanceB ;
END_VAR

功能块的名称是根据模块实例路径和前缀创建的 AC_

子模块实例的变量名称是根据前缀创建的,后跟相应子模块实例的名称。



每个功能块被实例化一次,顶层模块的FB实例直接在GVL中——其余的在父实例的相应功能块中。

对于位于另一应用程序中的每个引用的模块实例,将在引用模块实例的一个 GVL 中创建恰好一个代理 FB 的功能块实例。代理实例的名称是 AC_PROXY_<InstanceName> 其中 <InstanceName> 是其他应用程序中目标实例的名称。

唯一的地址被分配给所有模块实例。代理 FB 实例由远程应用程序中模块实例的地址分配。

方法 IBaseInstance.Main 代理实例的调用在通信任务中循环调用。

创建应用程序和任务调用

  • 如果将模块分配给不存在的应用程序,则将创建该应用程序。

  • 创建不存在的标准任务

    • TASK_MODULE_HIGH

    • TASK_MODULE_MEDIUM

    • TASK_MODULE_LOW

    任务的优先级和循环时间根据生成器设置进行设置。此外,将创建具有给定设置的模块特定任务。

  • 每个顶层创建一个全局变量列表。在此 GVL 中,将创建位于同一应用程序的顶级模块实例下的模块实例。全局变量列表有模块中定义的名称,如果没有定义的名称,则获取名称 GVL_MODULE。 GVL 位于所选应用程序下方或全局 POU 树中。

    创建一个名为 GVL GVL_ MODULE_TREE 对于每个应用程序。该列表包含用于管理模块树的变量。 GVL 将在文件夹中创建 AC_Std

  • 创建在下载和在线更改时自动调用的初始化代码:

    • 将创建树结构。

    • 将设置参数值。

    • 将分配引用和子模块实例。

    • 将填充可变大小的数组。

    • 将设置实例参考。

    下载时仅设置参数,而不设置为其默认值。在线更改时,将设置所有参数。 POU 将在文件夹中创建 AC_Std

  • 对于每个定义的入口点 PROGRAM 将创建 POU(ST 语言),其中包含顶层模块的调用。这个新 POU 的调用将添加到任务下方。对于标准任务,POU 名称为:

    • MODULE_CALL_<TASKNAME>_START

    • MODULE_CALL_<TASKNAME>_END

    POU 将在文件夹中创建 AC_Std

  • 对于顶层模块 POU 将在所有应用程序中创建任务调用池。

创建 I/O 分配

根据 I/O 分配的类型,将执行以下操作:

  • 【I/O通道】:在对应的设备通道中会添加模块实例的I/O的实例名称。

  • [ST 表达式]:将表达式分配给输入或将输出分配给表达式将针对同一顶级实例下面的所有模块实例。如果有相应的分配,则对于每个顶级实例,都有一个名为

    • AC_Io_SetInputs_<instance name> 或者

    • AC_Io_SetOutputs_<instance name>

    将被创建。

    定义输入和输出的任务将由标志标识 UPDATE-IOS 在模块描述中。在下面的描述中该任务将被称为“I/O任务”。

    在调用模块实例的任务方法之前,将在 I/O 任务中调用输入函数。 (如果 I/O 任务是标准任务,则在 start 方法之前。)输出函数将在模块实例的任务方法之后的 I/O 任务中调用。 (如果I/O任务是标准任务,则在end方法之后。)

  • [直接连接到模块I/O,本地]:将在输入实例的功能块中创建兼容类型的缓冲区变量。缓冲区变量的名称以前缀开头 AC_Io_Buffer_

    在应用程序初始化期间,缓冲区变量将被初始化为所连接输出的当前值。生成器处理输入和输出分配,就像对此缓冲区变量的 ST 分配一样(请参阅 [ST 表达式]。

  • [直接连接到模块 I/O,远程]:对于连接到另一个应用程序的模块实例的输入的每个输出,将在相应的发送网络 GVL 中创建具有兼容类型的缓冲区变量。缓冲区变量的名称以前缀开头 AC_RemoteIo_Buffer_ 并将根据实例路径和输出的变量路径构建。缓冲区变量将使用输出变量中的初始化表达式(如果存在)进行初始化。如果预编译信息中不包含此初始化表达式的值(因为该表达式使用示例:变量、函数和常量),则会产生错误。

    生成器处理输出分配就像对此缓冲区变量的分配一样。其他应用程序中的输入赋值的处理方式与接收器 NVL 中相应变量的赋值类似(请参阅 [ST 表达式])。

    注:尚未实现需要更新网络变量的任务与模块I/O 任务之间的同步。因此,当 I/O 任务读取值时,值的写入可能不完整。

创建通信基础设施

定义:在以下描述中,如果满足以下条件,则应用程序 A1 向应用程序 A2 发送(或 A2 从 A1 接收):

  • 分配给应用程序 A1 的模块实例引用分配给应用程序 A2 的模块实例,反之亦然。

  • 通过使用直接模块 I/O 连接,将分配给 A1 的模块实例的输出连接到分配给 A2 的模块实例。

下面提到的所有对象都将在该文件夹中创建 AC_RMP 对于生成器创建的每个应用程序。

  • 将创建一个通信任务。 (循环时间和优先级根据发电机配置的设置而定)。在此任务中,将调用代理实例,并分别读取镜像模块代理 FB 变量。书面。

  • 对于发送到当前应用程序的每个应用程序,将创建(发送)GVL 并定义网络设置。 (协议“UDP”、循环传输、校验和、根据设置的循环时间、通信任务)。 “列表标识符”必须是1到2^15-1之间的整数值,将在生成开始时随机确定,并在每次发送GVL后加1。该值至少为 128 并且在有效范围内。如果应用程序之间存在模块引用,则类型变量 RMPExchangeData 将在 GVL 中创建。变量的名称包含源应用程序和目标应用程序的名称。如果模块实例在其代理定义中定义了要镜像的变量(MirrorVar)并且从其他模块实例引用,对于每个 MirrorVars,将在引用的模块实例的(发送)GVL 中创建一个变量。它的名称包含模块实例的实例路径和相应“MirrorVar”定义的TargetID。

  • 对于当前应用程序发送到的每个应用程序A2,将创建一个(接收)NVL,并将其连接到A2的相应发送GVL和通信任务。

  • 类型的功能块 RMPService 将被实例化在 GVL AC_RMP 并在声明中初始化(使用属性 init_on_onlchange)。两个类型的数组 RMPConnection 将创建引用类型的创建变量 RMPExchangeData 在 GVL 和 NVL 中。

  • 一个程序 AC_PRG_RMP 将创建调用类型的功能块 RMPService。该程序将被添加到通信任务中。此外,镜像变量(“MirrorVars”)的值将在 AC_PRG_RMP 程序。这意味着代理“MirrorVars”将被分配给(接收)GVL 的相应变量。然后 Main 调用代理实例的方法,最后调用“MirrorVars”模块的(发送者)GVL 的相应变量。这是根据模块实例到代理的发送方向发生的。