在本机功能块中定义自定义数组 - 实用指南
为什么写这篇文章?
事实上,创建这篇文章是因为当我开发 Native Function Block 时,我发现无法使用自定义结构数组。或者换句话说,遗憾的是PLCnext的官方GitHub上没有此类教程。如果您使用C#教程在Native Function Block中创建自定义数组,您会发现无法编译成功,或者在PLCnext Engineer中设置数组值没有反应。案例中的例子恰好与数据库有关,仅此而已。
演示说明
- 以下示例使用本机功能块通过 PLCncli 工具链创建用户定义的数组接口
- 数组由 21 个元素组成,每个元素都是一个结构体。该结构体包含两个IecString80和一个枚举,如下图所示。
https://github.com/Leeable/UserDefineArray_NativeFB/tree/Master
要求
- 确保 ToolChain 版本为 23.0 或更高版本。本示例使用 23.6 ToolChain 进行演示。
- 熟悉建立原生功能块的基本流程。
- 带有 ToolChain 加载项插件的 Visual Studio 2019 或 2022
第 1 步
- 使用 Visual Studio 创建一个新项目,选择“共享本机功能块”项目类型,并将项目命名为“ArrayTest”。
- 然后,在 Visual Studio 的 ArrayTest 项目中,创建一个名为“ArrayCplus”的新本机功能块。
第2步
-
将这些代码复制到 ArrayCplus.cs
-
由于这里直接包含源代码时存在一些显示问题,例如&和>,所以我提供了一个链接。
-
例如,&将被编码为
08在这个html中......
ArrayCplus.cs
第三步
打开 ArrayTestCpp 文件夹中的终端并输入以下内容。
<前>18前>生成代码后,找到ArrayTest-cli32.h 和ArrayTest-cli64.h src目录下的文件,找到#error的地方。
我们需要删除注释并改进代码。单击导航至 InArrayFB-cli.cpp 并修改实现。
IntArrayFB-cli.cpp
第四步
在ArrayCplus.cpp中 ,输入以下代码。包含字符串的内容必须在进程中初始化,而不是在Init区域中初始化;在Init区域初始化它们将不起作用,导致无法通过Engineer向sName和sAttribute写入值。
ArrayCplus-cli.cpp
第五步
打开 ArrayTestCpp 文件夹中的终端并输入以下内容。
<前>26前>第6步
打开 PLCnext Engineer 并加载 ArrayTest.pcwlx 向 ArrayTest 添加一个名为 arr 的变量
现在可以工作了
问题
- 虽然这种方法在实际中是有效的,但是为什么需要在void PInvoke ArrayTest::ArrayCplus::Process()中初始化包含IecString或用户定义字符串的内容 而不是在 void PInvoke ArrayTest::ArrayCplus::Init() 中 ?如果我将代码放入 void PInvoke ArrayTest::ArrayCplus::Init() 中,它将不起作用 .
- 很明显,GitHub 上没有关于 Native Function Blocks 的用户定义数组的相应教程。有人可以补充和改进吗? (Csharp Userdefine array的方式在native功能块中不起作用)
- 最后一点也让我很困惑的是,为什么无论是IecString、User-defined String还是IecStringEx*,如果它们包含字符串,那么它们必须是【InOut的形式 】在 CSharp 代码中用作本机功能块时?
注意:
创客博客显示未经菲尼克斯电气测试或审核的社区成员的应用程序和用户故事。使用它们的风险由您自行承担。
工业技术