FAQs Técnicas

Realizar una pregunta

Cómo puedo leer los registros en bloque de un PM1200 en la HMI (lectura de registros en bloque)?

Los PM1200 tienen registros que pueden ser leídos únicamente en forma de bloque y para realizar dicho procedimiento en la HMI y para que se pueda manejar esos registros de forma independiente (como mostrar un determinado valor en la pantalla) es necesario realizar algunas configuraciones. A continuación se muestra una de las formas de hacer ese procedimiento.

Nota:
  • Primer hay que tener en cuenta que las direcciones de los registros del PM si se utiliza el formato IEC de la HMI, van a estar defasados en una unidad. Para evitar errores en la lectura de los registros puede ser que convenga utilizar los registros en formato Modbus y así apuntar a los registros tal como se muestran en el mapa Modbus del equipo.
  • En ese ejemplo se realizará la lectura de los registros 0101 y 3152 del PM.
  • Para leer la dirección 0101 habrá que leer un bloque que contiene 40 registros, siendo los registros del tipo Float y el bloque siendo real, la declaración del bloque tiene que ser de 20, pues las variables de este tipo ya son de 2 bytes.
  • Lo mismo pasa con el registro 3152 pero a la diferencia del anterior se trata de un bloque de 20 registros, por lo que el tamaño del boque de lectura tendría que ser de 10.
  • Cómo la HMI no realiza las encuestas de comunicación en forma automática, una de las formas de mantener la comunicación siempre activa es generando acciones periódicas:


Las Lecturas se van a realizar a través de scripts.
En los scripts se van a utilizar las peticiones de lecturas y variables auxiliares. 
//REALXX  Son variables internas que me muestran los registros leídos en forma independiente (es decir que una vez leído el bloque de registros los separo en forma independiente y guardo los valores en esas variables para que se pueda utilizar en la HMI).
//BlockRealxx  Es una variable declarada como un bloque que realiza la lectura de registros del tipo //Real/Float en bloque del PM, los registros tienen que ser consecutivos.


Declaración de las variables en el VD:

Lectura del bloque para obtener el registro 3152:



Declaración del bloque para la lectura del registro 0101:




Las variables creadas quedarían:



Creación de las acciones:







Los scripts:

//Lectura del Registro 3152
//Quality data verifica si el dato leído es válido
//DATOS_OK es una variable inter que me permite visualizar la validez del dato leído.
boolean qualitydata;
qualitydata=BlockREAL01.isDataQualityGood();
DATOS_OK.write(qualitydata);
if (qualitydata)
  {
//Los índices que están en los paréntesis hacen referencia a la ubicación del dato dentro del bloque //leído
  REAL01.write(BlockREAL01.getFloatValue(0));
  REAL02.write(BlockREAL01.getFloatValue(1));
  REAL03.write(BlockREAL01.getFloatValue(2));
  REAL04.write(BlockREAL01.getFloatValue(3));
  REAL05.write(BlockREAL01.getFloatValue(4));
  REAL06.write(BlockREAL01.getFloatValue(5));
  REAL07.write(BlockREAL01.getFloatValue(6));
  REAL08.write(BlockREAL01.getFloatValue(7));
  REAL09.write(BlockREAL01.getFloatValue(8));
  REAL10.write(BlockREAL01.getFloatValue(9));
  }
 
//Lectura del Segundo registro 0101:
 
boolean qualitydata_OK;
qualitydata_OK=BlockREAL02.isDataQualityGood();
Data_ok.write(qualitydata_OK);
if (qualitydata_OK)
  {
  REAL20.write(BlockREAL02.getFloatValue(0));
  REAL21.write(BlockREAL02.getFloatValue(1));
  REAL22.write(BlockREAL02.getFloatValue(2));
  REAL23.write(BlockREAL02.getFloatValue(3));

  REAL24.write(BlockREAL02.getFloatValue(4));
  REAL25.write(BlockREAL02.getFloatValue(5));
  REAL26.write(BlockREAL02.getFloatValue(6));
  REAL27.write(BlockREAL02.getFloatValue(7));
  REAL28.write(BlockREAL02.getFloatValue(8));
  REAL29.write(BlockREAL02.getFloatValue(9));
  REAL30.write(BlockREAL02.getFloatValue(10));
  REAL31.write(BlockREAL02.getFloatValue(11));
  REAL32.write(BlockREAL02.getFloatValue(12));
  REAL33.write(BlockREAL02.getFloatValue(13));
  REAL34.write(BlockREAL02.getFloatValue(14));
  REAL35.write(BlockREAL02.getFloatValue(15));
  REAL36.write(BlockREAL02.getFloatValue(16));
  REAL37.write(BlockREAL02.getFloatValue(17));
  REAL38.write(BlockREAL02.getFloatValue(18));
  REAL39.write(BlockREAL02.getFloatValue(19));
  }




 
¿Ha sido útil?
¿Qué podemos hacer para mejorar la información?