在原生功能块中定义自定义数组:实用指南
为何写此文?
开发原生功能块时发现无法使用自定义结构数组。或者说官方 PLCnext GitHub 缺此类教程。若用 C# 教程在原生功能块创建自定义数组,会编译失败或在 PLCnext Engineer 中设置数组值无响应。案例恰好涉及数据库。
演示说明
- 使用 PLCncli 工具链通过原生功能块创建用户定义数组接口
- 数组含 21 个元素,每个为结构体:两个 IecString80 和一个枚举,如下图所示。
https://github.com/Leeable/UserDefineArray_NativeFB/tree/Master
要求
- 确保 ToolChain 版本 23.0 或更高。本例用 23.6 ToolChain 演示。
- 熟悉建立原生功能块基本流程。
- Visual Studio 2019 或 2022 含 ToolChain 插件
$ plcncli --version plcncli 23.6.0.1450 (23.6.0.1450) 步骤 1
- 用 Visual Studio 创建新项目,选择“共享原生功能块”项目类型,命名为 "ArrayTest"。
- 在 Visual Studio 的 ArrayTest 项目中创建新原生功能块命名为 "ArrayCplus"。
步骤 2
将代码复制到 ArrayCplus.cs
因直接在此处包含源代码有显示问题(如 & 和 >),提供链接替代。
例如 & 会在此 html 编码为
&.....
ArrayCplus.cs
步骤 3
在 ArrayTestCpp 文件夹打开终端输入:
$ plcncli generate code 生成代码后,在 src 目录定位 ArrayTest-cli32.h 和 ArrayTest-cli64.h 文件,找到 #error 标记处。
需移除注释并改进代码。点击导航到 InArrayFB-cli.cpp 修改实现。
IntArrayFB-cli.cpp
步骤 4
在 ArrayCplus.cpp 输入以下代码。含字符串内容必须在 Process 过程中初始化而非 Init 区域;在 Init 区域初始化无效,导致无法通过 Engineer 写入 sName 和 sAttribute 值。
ArrayCplus-cli.cpp
步骤 5
在 ArrayTestCpp 文件夹打开终端输入:
$ plcncli build all $ plcncli deploy 步骤 6
打开 PLCnext Engineer 加载 ArrayTest.pcwlx 向 ArrayTest 添加变量 arr
现在可工作
问题
- 虽此法实践有效,为何含 IecString 或用户定义字符串的内容必须在 void PInvoke ArrayTest::ArrayCplus::Process() 初始化而非 void PInvoke ArrayTest::ArrayCplus::Init()?放在 Init() 不工作。
- GitHub 明无原生功能块用户定义数组教程。有人能补充完善吗?(C# 用户定义数组在原生功能块不工作)
- 另一困惑:无论 IecString、用户定义字符串或 IecStringEx*,含字符串时在 C# 代码中作为原生功能块使用必须为 【InOut】形式?
注意:
Makers Blog 展示社区成员应用和用户故事,未经 Phoenix Contact 测试或审核。使用风险自负。
工业技术