Podemos decir que una estructura es una forma de organizar una serie de variables relacionadas. Un ejemplo puede ser el control de un registro. Supongamos que tenemos una temperatura y queremos controlar que no supere unos valores.
Generaremos las siguientes variables dentro de la estructura:
1 2 3 4 | Valor: INT; Maximo: INT; Minimo: INT; Alarma: BOOL; |
Declaración de structuras:
Para declarar las estructuras tenemos que ir a Data types, pinchamos con el derecho y Add Object.

Y declaramos las diferentes variables con sus tipos:

Al definir la estructura hemos definido un tipo pero aún no tenemos declarada ninguna variable de este tipo. Para trabajar con las estructuras deberemos declara una variable de este tipo, en este caso Reg.

El ejemplo anterior muestra como declarar esta variable y como utilizarla posteriormente en el programa. Con este ejemplo quizás no le veamos demasiado sentido a este tipo de dato, pero veamos un ejemplo algo más complejo creando una matriz de estructura.
Ejemplo del uso de estructuras y matrices de estructuras para Codesys.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | (*ZONA DECLARACIÓN DE VARIABLES*) PROGRAM MAIN VAR Reg1:ARRAY[0..100] OF Reg; i:BYTE; END_VAR (*ZONA DE PROGRAMA*) FOR i := 0 TO 100 DO IF Reg1[i].Valor > Reg1[i].Maximo OR Reg1[i].Valor < Reg1[i].MInimo THEN Reg1[i].Alarma := TRUE; ELSE Reg1[i].Alarma := FALSE; END_IF; END_FOR; |
Y este es el resultado

Ejemplo del uso de estructuras y matrices de estructuras para Vb.net. Para que el programa funcione de una manera analoga a como lo Plc Control he creado un control timer que hará que el código se lea de forma recurrente cada seg.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | Public Class Form1 Structure Reg Dim Valor As Short Dim Maximo As Short Dim Minimo As Short Dim Alarma As Boolean End Structure Dim Reg1(101) As Reg Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim i As Integer For i = 0 To 100 If Reg1(i).Valor > Reg1(i).Maximo Or Reg1(i).Valor < Reg1(i).Minimo Then Reg1(i).Alarma = True Else Reg1(i).Alarma = False End If Next End Sub End Class |
Y este es el resultado:

Como se puede ver en la imagen he creado un BreakPoint para poder ver lo que pasa en el código. Si nos situamos encima de la variable Reg1 podremos ver los valores, así como modificarlos pinchando en el valor.

Hola!
Este tema de las estructuras lo veo perfecto para la gestion de recetas, por ejemplo recetas de un horno con los siguiente parámetros:
Temperatura SP: INT
Tiempo : INT
Resistencias 1 : BOOL
Resistencias 2 : BOOL
Resistencias 3 : BOOL
Resistencias 4 : BOOL
Aireador 1 : BOOL
Aireador 2 : BOOL
Con las estructuras es muy fácil gestionar este tipo de recetas!
Un saludo
Lo malo es que no pueden estar direccionadas, en una BX por ejemplo, no se pueden usar como retentivas. Y de la misma manera no pueden ser leidas desde modbus TCP, salvo que hagamos un paso intermedio, claro.
Hola David
Yo he utilizado las estructuras para gestionar 20 recetas compuestas por vaior tipos de datos ( Estructuras) utilizando el PC CP66XX, eso si he tenido que guardarlas en la NOVRAM.
Creo una estructura y luego una variable ARRAY del tipo de la estructura y es muy sencillo cupiar pegar recetas, trabajar con ellas y luego guardarlas en la NOVRAM (bueno esto de los dato no retentivos es un poco rollo)
Por que no pueden estar direccionadas en la BX?
Un saludo!
Esto es lo que dice el manual

Si declaramos una variable de estructura direccionada :
el compilador no tira error y de echo funciona pero no guarda la memoria. En la Bx para guardar las variables retentivas se deben direccionar y en el programa se utiliza un FB para decirle cual es el área de memoria retentiva. Lo mismo pasa con MODBUS TCP. Las variables accesibles por Modbus o por Vb.net tienen que estar direccionadas.
Yo he probado y todo funciona salvo el guardado de variables retentivas. Pero si el manual dice que no mejor sera no hacerlo. Digo yo.
Supongo que tu si lo puedes hacer por que no necesitas el AT, direccionarlas.