PLCnext Engineer 中掌握 C++ 简单与复杂数据类型
大家好,
本文将探讨 C++ 与 PLCnext Engineer 中的简单和复杂数据类型,包含简单和复杂两个练习。
假设您具备 C++ 和 PLCnext Engineer 基础经验。
准备工作
所需工具:C++ 编辑器、PLCnext Engineer 软件、Phoenix Contact PLC。我使用的环境:
- AXC F 2152,固件 2021.0.3
- PLCnext Engineer 2021.0.2
- Visual Studio 2019 Community 16.9.4
我选用 Visual Studio,Eclipse 亦可。教程链接:Visual Studio、Eclipse。PLCnext Engineer 可在官网下载。
简单练习
创建一个检查 PLC 发送数字是否正确的小应用。新建 C++ 项目,打开头文件(形如 [ProjectName].hpp,忽略 [ProjectName]component.hpp)。定义一个输入端口和一个输出端口(仅适用简单数据类型):
//#port
//#attributes(input)
//#name(InputTest)
int64 InputTest = 0;
//#port
//#attributes(Output)
//#name(outputTest)
int64 OutputTest = 0;
打开 [ProjectName].cpp 编写逻辑,用 if 或 switch 判断数值。我用 if 结构:
void PLMProjectReadInputProgram::Execute() {
if (InputTest == 1) { OutputTest = 15; }
if (InputTest == 2) { OutputTest = 150; }
if (InputTest == 3) { OutputTest = 1500; }
if (InputTest == 4) { OutputTest = 15000; }
}
点击构建生成 PLC 可识别的库。若不清晰请参考上述教程。
在 PLCnext Engineer 中:组件标签页→编程→Local 文件夹→主程序→Variables,添加变量名、数据类型(需与 C++ 一致,对照表见此处)、用途(决定是否对外交互)。
连接变量:将生成的库(项目 bin 目录)复制到 C:\Users\Public\Documents\PLCnext Engineer\Libraries。组件标签页→Libraries→右键“add user library”选择库。
添加程序到任务:Plant 区域双击 PLCnext→“Tasks and Events”标签→在 MainInstance 后添加新程序(选类型或从组件区拖拽)。
“Port List”标签页会显示所有变量,将 PLC OUT 端口连到 C++ IN 端口,反之亦然。若失败请检查数据类型。
主程序 Code 视图中赋值测试:设输出变量为 1。
下载项目到 PLC,Port List 中应看到 C++ 返回 15。
复杂练习
实现结构体数组在 PLC 与 C++ 间双向传递。新建 C++ 项目,头文件定义汽车结构体:
public: // typedefs
struct StrCar {
StaticString<80> sbrand;
int16 iHorsepower;
int16 iYear;
boolean xInsured;
};
重要! C++ 与 PLCnext Engineer 中名称和类型必须完全一致!数据类型对照见此处。
定义输入输出端口为结构体数组:
//#port
//#attributes(Input)
//#name(CarIn)
StrCar CarToC[2];
//#port
//#attributes(Output)
//#name(CarOut)
StrCar CarFromC[2];
在 .cpp 中交换两辆车数据并赋予虚拟值:
// 将第二辆车数据赋给第一辆输出
CarFromC[0].sbrand = CarToC[1].sbrand;
CarFromC[0].iHorsepower = CarToC[1].iHorsepower;
CarFromC[0].iYear = CarToC[1].iYear;
CarFromC[0].xInsured = CarToC[1].xInsured;
// 给第二辆输出赋第一辆车数据
CarFromC[1].sbrand = CarToC[0].sbrand;
CarFromC[1].iHorsepower = CarToC[0].iHorsepower;
CarFromC[1].iYear = CarToC[0].iYear;
CarFromC[1].xInsured = CarToC[0].xInsured;
构建生成库后,在 PLCnext Engineer 中创建自定义数据类型:数据类型文件中定义结构体 StrCar 与数组 carList:
TYPE
StrCar:
STRUCT
sBrand: STRING;
iHorsepower: INT;
iYear: INT;
xInsured: BOOL;
END_STRUCT
END_TYPE
TYPE
carList: ARRAY[0..1] OF StrCar;
END_TYPE
重要! 名称和类型必须与 C++ 完全一致!
后续步骤同简单练习:复制库、添加用户库、加入任务、连接端口。Port List 中连接 PLC OUT 到 C++ IN。
主程序 Code 中赋值测试:
CarToC[0].sBrand := 'Audi';
CarToC[0].iHorsepower := 200;
CarToC[0].iYear := 2020;
CarToC[0].xInsured := TRUE;
CarToC[1].sBrand := 'Mazda';
CarToC[1].iHorsepower := 120;
CarToC[1].iYear := 2001;
CarToC[1].xInsured := FALSE;
部署运行后,输出列表将与输入列表交换顺序。可在 Port List 中查看变量值。
工业技术