# Integrating C模块

使用集成C代码插件，可以在MetaFacture工程中包含外部实现的C代码文件，可以从IEC对象生成C存根。

在MetaFacture中，C代码模块对象类型可用于此目的。C代码文件和使用的IEC对象位于C代码模块的下面。硬盘上的一个文件目录与C代码文件被分配给每个C代码模块。

在这个项目中，您可以从C代码文件中以*.h或*.hpp的格式生成IEC对象(头文件)，以便在其他POUs中使用它们。

生成c存根的目的是为了以下用例:

- C代码文件访问IEC对象: C代码文件不能直接访问IEC对象。它只能访问由IEC对象生成的C存根。
- 生成可合并到库工程中的预编译模块。

导入后，导入的源代码文件是MetaFacture项目的一部分，因此它们与磁盘上的原始文件解耦。

在编译期间，从C代码模块生成一个动态模块，并将其保存为项目的一部分。信息、警告和错误显示在C代码模块类别的消息视图中。

在下载过程中，应用程序的所有动态模块都被传输并加载到Runtime系统。Runtime系统必须为此支持动态链接。

注意：Runtime系统的许可证

Runtime系统需要一个允许加载C模块的许可证。没有此许可证，动态模块在下载期间无法链接，因此下载将被中止。

动态模块是启动应用程序的一部分，它们在控制器重新启动时被重新加载和激活。Reset Origin命令卸载应用程序中的所有C代码模块。冷复位和热复位命令不会导致C代码模块的重复初始化。

提示：没有C代码的模拟模式！

在模拟模式下，不生成C代码并将其加载到runtime系统。为了模拟C模块中包含的代码，您可以在C代码模块的各个IEC对象中实现这一目标。

MetaFacture不支持在C代码文件中监视变量或在C源代码中设置断点。

库中预编译模块:

C代码集成提供了分配预编译Runtime模块的功能(例如: *.dll)在库中保存一个设备，然后将其保存在库中。然后，可以动态加载这些模块。

### 配置C代码模块​

要求：打开的项目已经包含一个C代码模块。

1.单击设备树中的工程C代码模块。

2.右键菜单中选择属性命令

3.在属性对话框中打开编译标签。

4.指定计算机上Visual Studio安装的文件路径。输入助手（ ）和搜索工具(放大镜)也可用。

5.指定安装在计算机上的MS Windows SDK的文件路径。输入助手（ ）和搜索工具(放大镜)也可用。

6.指定用于MetaFacture存储临时编译文件的文件路径。

### 从文件目录导入包含C源文件的文件夹​

要求：一个工程是开放的。工程控制器支持C代码的集成。

1.在设备树中选择Application点击工程 ➔ 添加对象 ➔ C代码模块。

2.如果需要，在添加C代码模块对话框中为您的C代码模块指定一个新名称。如果您不这样做，那么您的对象将被赋予标准名称C代码模块。

3.单击源目录输入字段旁边的符号（）。

4.打开查找文件夹对话框。

5.在查找文件夹对话框中，选择包含C源文件的文件夹 (*.c, *.cpp, *.h, or *.hpp)。

6.当选择用于源代码更改的监视文件夹选项时，MetaFacture将在对文件系统选定文件夹中的C源文件进行更改时显示一条消息。

7.点击添加。
⇒MetaFacture使用文件夹扩展名、IEC接口和源文件将C代码模块插入到设备树中。

8.在设备树中，单击源文件文件夹的加号(+)。⇒在打开文件夹中列出了导入的C源文件。

9.如果双击其中一个C源文件( )，则C代码文件将在编辑器中打开。

### 导入单独的C代码文件​

要求：打开的项目已经包含一个C代码模块。

1.单击设备树中的工程C代码模块。

2.点击工程 ➔ 添加对象 ➔ C代码文件。

3.在添加C代码文件对话框中，使用输入助手（ ）在 *.c,*.cpp,*.h,或*.hpp格式中选择一个文件，然后单击添加。
⇒MetaFacture将选择的C代码文件插入到C代码模块下面的设备树中。

4.如果双击设备树中的新C代码文件()，它将在编辑器中打开以进行修改。

### 生成空的C代码文件​

要求：打开的项目已经包含一个C代码模块。

1.单击设备树中的工程C代码模块。

2.点击工程 ➔ 添加对象 ➔ C代码文件。

3.在“添加C代码文件”对话框中，使用适当的文件扩展名指定新C代码文件的名称，然后单击“添加”。
⇒MetaFacture将选择的C代码文件插入到C代码模块下面的设备树中。

4.如果双击设备树中的新C代码文件()，它将在编辑器中打开以进行修改。

### 将C代码文件转换成IEC对象，在应用程序中用作编程对象 ​

要求：打开的项目包括C代码模块和C代码文件。例如，C代码文件包含以下C代码: int adder(int a, int b);

1.单击文件扩展名为*.h的C代码文件。在例子中，他是test.h文件。

2.点击编译 ➔ C-Integration ➔ 创建IEC接口
⇒创建C接口对话框打开并列出文件test.h及其函数adder (int, int)。导入时激活了这两个变量。

3.点击导入。

4.MetaFacture生成adder (FUN)函数并将其作为对象插入设备树中的IEC接口文件夹中。

5.当您双击adder (FUN)对象时，它将在编辑器中打开。
⇒包含以下声明部分:
6.现在可以在POU的实现部分调用adder函数(例如:adder (diVar1, diVar2);)。

### 创建C存根​

要求：打开的项目包含一个C代码模块。一个POU被添加到C代码模块，这个POU已经实现了代码。

1.在设备树中，选择C代码模块下面的POU，然后单击 C-Integration ➔ Create Stub Implementation in C。
⇒MetaFacture创建对象iec_external.c和iec_external.h，并将它们添加到设备树中的扩展文件夹。
在消息视图(C代码模块类别)中，您将发现一条消息，说明已经成功创建了一个m4文件。

注意：当您在单击在C中创建存根实现时，应用程序将自动编译。如果过程中出现错误，则这些错误将在消息视图中显示。另外，请监视C代码模块类别中的消息。

### 将预编译的Runtime模块分配给设备并将其保存到库中​

要求：在MetaFacture中一个库(*.library)是打开的。

1.点击视图 ➔ POUs。
⇒POUs视图打开并显示库项目及其对象。

2.选择库工程并且点击工程 ➔ 添加对象 ➔ C-Implemented库。

3.在添加C-Implemented库对话框中点击添加。
⇒MetaFacture将对象C实现的库添加到POUs视图。

4.双击C Implemented库对象。
⇒对象在其编辑器中打开

5.在这个编辑器中点击添加。
⇒选择设备对话框打开。

6.在目标文件输入字段中，以*.dll或*.so格式指定可动态加载模块的名称。
提示！dll文件必须在其名称中包含库项目的标题。例如，如果库项目被命名为XYlib，那么对象文件必须被调用: _XYlib.dll.

7.在设备窗口中，选择用于分配目标文件的设备。

8.点击选择设备⇒MetaFacture在已编译组件的选项卡编辑器中显示已创建的设备文件分配。

9.保存库工程。