Domina tipos de datos simples y complejos en C++ con PLCnext Engineer
Hola a todos,
En esta entrada del blog exploraremos tipos de datos simples y complejos en C++ y PLCnext Engineer. Contendrá dos partes distintas: un ejercicio simple y uno complejo.
Este tutorial asume que tienes alguna experiencia con C++ y PLCnext Engineer.
Inicio
Primero necesitarás las herramientas adecuadas para el trabajo: un editor C++, el software PLCnext Engineer y un PLC Phoenix Contact para ejecutar esto. Estos son los materiales que he usado:
- AXC F 2152 en versión de firmware 2021.0.3
- PLCnext Engineer versión 2021.0.2
- Visual Studio 2019 Community versión 16.9.4
He elegido personalmente Visual Studio como mi editor C++, pero Eclipse también puede usarse. Los enlaces a los tutoriales se pueden encontrar aquí:
Para PLCnext Engineer, esto se puede encontrar en nuestra web.
Ejercicio simple
Para este primer ejemplo haremos una pequeña aplicación que comprueba si el número correcto se envía desde el PLC. Primero crea un nuevo proyecto C++. Luego ve al archivo de cabecera, el nombre debería ser algo como [NombreDelProyecto].hpp, también hay archivos con el nombre [nombreDelProyecto]component.hpp que no usaremos. Una vez en el archivo de cabecera habrá un muro de código delante de ti pero no te preocupes, será simple. Primero, definiremos los puertos, uno IN y uno OUT. Pueden definirse así, ten en cuenta que esto es solo para tipos de datos simples:
//#port //#attributes(input) //#name(InputTest) int64 InputTest = 0; //#port //#attributes(Output) //#name(outputTest) int64 OutputTest = 0;
Luego pasamos al siguiente archivo donde haremos la codificación real. Este debería llamarse [NombreDelProyecto].cpp y no debería contener mucho. Lo cambiaremos pronto. Añadamos algo de código para comprobar números ya sea usando If's o un switch case, eso depende de ti. He usado estructuras if en este:
void PLMProjectReadInputProgram::Execute() {
if (InputTest == 1) {
OutputTest = 15;
}
if (InputTest == 2) {
OutputTest = 150;
}
if (InputTest == 3) {
OutputTest = 1500;
}
if (InputTest == 4) {
OutputTest = 15000;
}
}
Antes de ir a PLCnext Engineer necesitamos convertir este proyecto C++ en una biblioteca para que el PLC la entienda. Esto se hace simplemente haciendo clic en build (compilar) en la parte superior de la pantalla. Esto debería ejecutarse un rato y te dirá cuando la biblioteca esté completa. Si este paso no está claro, te aconsejo encarecidamente que revises los tutoriales listados arriba.
Navega al programa principal en la pestaña componentes bajo programación en la carpeta 'Local' luego selecciona variables dentro de la pantalla principal para ver las variables en el PLC. Aquí podemos elegir un nombre, un tipo de dato y el uso. Los tipos de dato en PLCnext Engineer deben ser los mismos que en el programa C++. Un enlace a los diferentes tipos y sus equivalencias se puede encontrar aquí. El uso definirá si las variables son locales o pueden usarse para enviar y recibir datos de programas o variables externas.
Después de hacer esto empezaremos a conectar las variables después de haber añadido la nueva biblioteca. Esto se puede hacer así:
La biblioteca que hiciste se puede encontrar dentro de la carpeta bin de tu proyecto, cópiala a la carpeta de bibliotecas para PLCnext Engineer. La ubicación es algo así como:
C:\Users\Public\Documents\PLCnext Engineer\Libraries
Después volvemos a PLCnext Engineer para añadir la biblioteca a nuestro programa. Navegaremos a la pestaña componentes, abriendo el cuadro de bibliotecas y haciendo clic derecho en bibliotecas. Luego haz clic en 'add user library' (añadir biblioteca de usuario), esto te llevará a la carpeta de bibliotecas a la que fuimos antes. Elige la biblioteca que quieras usar y continúa.
Una vez hecho esto, necesitaremos añadir el programa a las tareas lo cual se hace de la siguiente manera. En el lado izquierdo de la pantalla dentro del área plant haz doble clic en PLCnext. Debería abrirse en el medio. Luego ve a la pestaña 'tasks and events' (tareas y eventos) y añade un nuevo programa después del MainInstance. Esto se puede hacer de dos formas, ya sea seleccionando el tipo de programa o arrastrándolo desde el área de componentes bajo 'PLCnext Components & Programs'.
Entonces las variables deberían aparecer en la pestaña 'Port list' (lista de puertos) que se encuentra junto a la pestaña 'tasks and events'. Ábrela para ser recibido por todas tus variables de C++ y PLCnext. Debería verse algo así:
Si lo hiciste todo correctamente deberías poder conectar los puertos OUT de tu PLC al puerto IN del programa C++, al revés también es posible, y debería verse algo así. Si esto no funciona intenta comprobar tus tipos de datos.
Para añadir un valor dummy a nuestra variable vayamos al programa principal en la pestaña componentes luego selecciona code dentro de la pantalla principal para ver el código y añadir algo del nuestro. Solo estableceremos la variable que sale a un valor numérico, en este caso 1.
Ahora despleguemos el proyecto en el PLC y deberíamos obtener 15 como respuesta del código C++. Puedes ver las variables en la 'Ports List' de antes.
Ejercicio complejo
Para este ejemplo, haremos una pequeña aplicación que enviará un array de structs hacia y desde el PLC. Primero crea un nuevo proyecto C++. Luego ve al archivo de cabecera, el nombre debería ser algo como [NombreDelProyecto].hpp, también hay archivos con el nombre [nombreDelProyecto]component.hpp que no usaremos. Una vez en el archivo de cabecera habrá un muro de código delante de ti pero no te preocupes, será simple. Primero, necesitaremos hacer un struct para este ejemplo haremos un struct para un coche. Esto se hace así:
public: // typedefs
struct StrCar{
StaticString<80> sbrand;
int16 iHorsepower;
int16 iYear;
boolean xInsured;
};
¡IMPORTANTE! ¡Los nombres y tipos en C++ y PLCnext Engineer deben ser los mismos! Los tipos de datos se pueden encontrar aquí.
Luego definiremos los puertos, uno IN y uno OUT porque serán listas de datos, hazlos como tales. También es importante hacerlos una lista de 'coches'. Esto se hace así:
//#port //#attributes(Input) //#name(CarIn) StrCar CarToC[2]; //#port //#attributes(Output) //#name(CarOut) StrCar CarFromC[2];
Luego pasamos al siguiente archivo donde haremos la codificación real. Este debería llamarse [NombreDelProyecto].cpp y no debería contener mucho. Lo cambiaremos pronto. Aquí cambiaremos los valores del coche uno y coche dos.
// Establecer el primer miembro de la lista de coches igual al coche del PLC CarFromC[0].sbrand = CarToC[1].sbrand; CarFromC[0].iHorsepower = CarToC[1].iHorsepower; CarFromC[0].iYear = CarToC[1].iYear; CarFromC[0].xInsured = CarToC[1].xInsured; // Añadir valores dummy al segundo miembro CarFromC[1].sbrand = CarToC[0].sbrand; CarFromC[1].iHorsepower = CarToC[0].iHorsepower; CarFromC[1].iYear = CarToC[0].iYear; CarFromC[1].xInsured = CarToC[0].xInsured;
Antes de ir a PLCnext Engineer necesitamos convertir este proyecto C++ en una biblioteca para que el PLC la entienda. Esto se hace simplemente haciendo clic en build en la parte superior de la pantalla. Esto debería ejecutarse un rato y te dirá cuando la biblioteca esté completa. Si este paso no está claro, te aconsejo encarecidamente que revises los tutoriales listados arriba.
Ahora antes de poder crear variables en PLCnext Engineer necesitaremos crear un tipo de dato propio, en este caso un struct coche y una lista de coches. Para esto necesitaremos un archivo de tipos de dato y se puede encontrar y crear aquí:
Abre este archivo si no lo ha hecho ya, luego podemos empezar a crear nuestro propio struct como sigue:
TYPE
StrCar:
STRUCT
sBrand: STRING;
iHorsepower: INT;
iYear: int;
xInsured: BOOL;
END_STRUCT
END_TYPE
¡IMPORTANTE! ¡Los nombres y tipos en C++ y PLCnext Engineer deben ser los mismos! Los tipos de datos se pueden encontrar aquí.
Después de crear el struct necesitamos crear un array de este tipo y se hace así y en el mismo archivo en el que estamos actualmente:
TYPE
carList: ARRAY[0..1] OF StrCar;
END_TYPE
Para crear una variable con el tipo 'carList' navega al programa principal en la pestaña componentes bajo 'programación' luego dentro de la carpeta 'Programas' luego selecciona variables dentro de la pantalla principal para ver las variables en el PLC. Aquí podemos elegir un nombre, un tipo de dato y el uso. Como tipo de dato selecciona nuestro personalizado:
Después de hacer esto empezaremos a conectar las variables después de haber añadido la nueva biblioteca. Esto se puede hacer así:
La biblioteca que hiciste se puede encontrar dentro de la carpeta bin de tu proyecto, cópiala a la carpeta de bibliotecas para PLCnext Engineer. La ubicación es algo así como:
C:\Users\Public\Documents\PLCnext Engineer\Libraries
Después volvemos a PLCnext Engineer para añadir la biblioteca a nuestro programa. Navegaremos a la pestaña componentes, abriendo el cuadro de bibliotecas y haciendo clic derecho en bibliotecas. Luego haz clic en 'add user library' esto te llevará a la carpeta de bibliotecas a la que fuimos antes. Elige la biblioteca que quieras usar y continúa.
Una vez hecho esto, necesitaremos añadir el programa a las tareas lo cual se hace de la siguiente manera. En el lado izquierdo de la pantalla dentro del área plant haz doble clic en PLCnext. Debería abrirse en el medio. Luego ve a la pestaña 'tasks and events' y añade un nuevo programa después del MainInstance. Esto se puede hacer de dos formas, ya sea seleccionando el tipo de programa o arrastrándolo desde el área de componentes bajo 'PLCnext Components & Programs'.
Entonces las variables deberían aparecer en la pestaña 'Port list' que se encuentra junto a la pestaña 'tasks and events'. Ábrela para ser recibido por todas tus variables de C++ y PLCnext. Debería verse algo así.
Si lo hiciste todo correctamente deberías poder conectar los puertos OUT de tu PLC al puerto IN del programa C++, al revés también es posible, y debería verse algo así. Si esto no funciona comprueba los tipos de datos y nombres de tus variables.
Para añadir un valor dummy a nuestra variable vayamos al programa principal en la pestaña componentes luego selecciona code dentro de la pantalla principal para ver el código y añadir algo del nuestro. Solo estableceremos la variable que sale a algunas especificaciones de coche. Estas pueden elegirse al azar pero necesitarán coincidir con los tipos de datos. (dependiendo de lo que elijas, usa strings donde usaste strings, etc.)
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;
Una vez desplegamos este ejemplo, la lista que sale debería estar intercambiada en la lista entrante. Puedes ver las variables en la 'Ports List' de antes.
Tecnología Industrial
- Análisis avanzado de circuitos DC reactivos con condiciones iniciales no nulas
- Redacción de procedimientos digitales: Simple, eficiente y fiable
- Acceso Remoto Seguro gRPC con grpcurl en Dispositivos PLCnext
- Desarrollar una aplicación de consola PLCnext usando C#: Guía para principiantes
- Instala el gestor de paquetes APT en PLCnext Linux: Guía paso a paso
- Estructuras vs Clases en C++: Guía práctica para desarrolladores embebidos
- Expandiendo horizontes cloud: Nuevas zonas, contenedores y estrategias multicloud
- Fundamentos de C#: Entrada y salida esenciales
- Clases y Objetos en C++: Guía Práctica de Programación Orientada a Objetos
- Punteros y arrays en C++: dominando su relación
- Guía Completa de Fecha y Hora en C++