Освоение простых и сложных типов данных в C++ с PLCnext Engineer
Привет всем!
В этом блоге рассмотрим простые и сложные типы данных в C++ и PLCnext Engineer. Две части: простая и сложная.
Предполагается опыт с C++ и PLCnext Engineer.
Инструменты
- AXC F 2152 на FW 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++ проект. В заголовочном файле [NameOfTheProject].hpp (не component.hpp) определяем порты для простых типов:
//#port
//#attributes(Input)
//#name(InputTest)
int64 InputTest = 0;
//#port
//#attributes(Output)
//#name(OutputTest)
int64 OutputTest = 0;
В файле [NameOfTheProject].cpp добавим логику (if или switch):
void PLMProjectReadInputProgram::Execute() {
if (InputTest == 1) { OutputTest = 15; }
if (InputTest == 2) { OutputTest = 150; }
if (InputTest == 3) { OutputTest = 1500; }
if (InputTest == 4) { OutputTest = 15000; }
}
Соберите проект (Build) — получится библиотека для PLC. Если неясно — смотрите туториалы выше.
В PLCnext Engineer: главная программа → Components → Programming → Local → Variables. Создайте переменные с теми же типами данных (соответствие типов здесь). Usage определяет, локальные они или для обмена данными.
Скопируйте библиотеку из bin проекта в C:\Users\Public\Documents\PLCnext Engineer\Libraries. В Engineer: Components → Libraries → правый клик → Add user library → выберите библиотеку.
Добавьте программу в задачи: Plant → двойной клик на PLCnext → Tasks and Events → новая программа после MainInstance (выбор типа или drag&drop из Components).
Вкладка Port List покажет переменные из C++ и PLCnext. Соедините OUT порты PLC с IN портом C++ (и наоборот). Если не работает — проверьте типы данных.
Добавьте тестовое значение: Main Program → Code → установите выходную переменную в 1.
Деплой на PLC — ответ должен быть 15. Проверьте в Port List.
Сложное упражнение
Передача массива структур между 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;
Соберите (Build) — библиотека готова.
В PLCnext Engineer создадим свой тип данных: Datatypes файл (создание здесь).
Опишем структуру и массив:
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++!
Создайте переменную типа carList: Main Program → Components → Programming → Programs → Variables.
Подключите библиотеку так же, как в простом упражнении.
Добавьте программу в задачи (после MainInstance).
Port List покажет переменные. Соедините порты (проверьте типы и имена).
Задайте тестовые значения в коде Main Program:
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.
Промышленные технологии
- Расширение облачных горизонтов: новые зоны, контейнеры и мультиоблачные стратегии
- Продвинутый анализ DC реактивных цепей с ненулевыми начальными условиями
- Основы ввода-вывода в C#: Console.WriteLine, ReadLine и форматирование
- Классы и объекты в C++: практическое руководство по объектно-ориентированному программированию
- Структуры C++ против классов: практическое руководство для разработчиков встроенных систем
- Полное руководство по дате и времени в C++
- Цифровое написание процедур: простое, эффективное и надежное
- Безопасный удаленный gRPC доступ с grpcurl на устройствах PLCnext
- Разработка консольного приложения PLCnext на C#: Руководство для начинающих
- Установка пакетного менеджера APT на PLCnext Linux: пошаговое руководство