Cargar registro en HMI SH-300

  • 2 Respuestas
  • 2911 Vistas

InduxSA

  • Aprendiz
  • **
  • Mensajes: 25
Cargar registro en HMI SH-300
« : julio 08, 2016, 14:45:36 pm »
Estimado Boris

Estoy tratando de imprimir las Rpm que me proporciona una señal cuadrada de 12V conectada al contador 1 en la entrada DIN7

En el panel HMI SH-300, el modelo del PLC que tengo es un 8091-D1  y la funcion nativa que estoy utilizando es la siguiente
   
      // Cargar  registro Rpm
     
      MbRtuServLoadRegister(42001,Count1GetEventRPM())

Mi problema es que en el LCD del panel me muestra una medicion mucho mas grande de lo que en realidad es

Realice la prueba en el Virtual HMI y funciona correctamente

A que se debe que las mediciones en el SH-300 sean mas elevadas??

Como lo puedo corregir

Te dejo el codigo que estoy usando para ver en que me puedes ayudar


Código: (Pawn) [Seleccionar]
PlcMain()
{

   // Inicializar rutinas Virtual-HMI.
   VirtualHmiInit()

new Select
  // new x
   //new y

   // Activar contador, cuenta por flanco ascendente.

   Count1Enable(COUNT_EDGE_RISING)
 
//
   // Inicializar Servidor ModBus RTU.
   //
   // Velocidad 9600 bps, formato 8E1 y direccion ModBus RTU 1.
   //
   // Interfaz: RS-232 (consulte hoja de datos de dispositivo)
   //
   // A partir de este momento, el servidor esta activo.
   //
   
   if(MbRtuServInit(1, 9600, SERIAL_8E1, MB_RTU_INTERFACE_RS232) < 0)
   {    
   // Error, pausar programa en este punto.
   while(true)
   {
   DelayMS(2000)
   LedToggle()
   }
   }

   //
   // Loop Principal.
   //
   Count1Reset()
   for(;;)
   {
   
             
   // Cargar  regustro Rpm
     
   MbRtuServLoadRegister(42001,Count1GetEventRPM())
   
   // Leer Holding Register en direccion 42020.
     
   MbRtuServGetRegister(42020, Select)
   
      switch (Select)
     
      {
          case 1:
          { 
             if (Count1GetEventRPM()<180)
              {
                 DoutSetOn(DOUT1)
          }
          if (Count1GetEventRPM()>200)
          {
             
          DoutSetOn(DOUT2) 
          }
          else
          {
           
          DoutSetOn(DOUT3)
             }
          }
      case 2:
          {  if (Count1GetEventRPM()<200)
              {
                 DoutSetOn(DOUT1)
          }
           if (Count1GetEventRPM()>200)
          {
             
          DoutSetOn(DOUT2)
          }
          else
          {
          DoutSetOn(DOUT3)
             }
             }
          case 3:
          {  if (Count1GetEventRPM()<220)
              {
                 DoutSetOn(DOUT1)
          }
           if (Count1GetEventRPM()>200)
          {
             
          DoutSetOn(DOUT2) 
          }
          else
          {
          DoutSetOn(DOUT3)
             }
             }
          case 4:
          {  if (Count1GetEventRPM()<240)
              {
                 DoutSetOn(DOUT1)
          }
           if (Count1GetEventRPM()>200)
          {
             
          DoutSetOn(DOUT2) 
          }
          else
          {
          DoutSetOn(DOUT3)
             }
             }
default:
            {
            DoutSetOn(DOUT1)
               }
      }
// Pausar ejecucion
DelayMS(250)
   
   }

   // Retorno.
   return 0
}

Saludos
« Última Modificación: julio 08, 2016, 17:30:21 pm por Soporte »

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2324
  • Soporte Técnico
Re:Cargar registro en HMI SH-300
« Respuesta #1 : julio 08, 2016, 17:29:04 pm »
Buenas tardes Jose,

El error se debe a que la función Count1GetEventRPM() retorna una variable del tipo "Float", es decir con punto decimal, mientras
que la funcion MbRtuServLoadRegister() solo acepta un numero entero, de alli que la diferencia de formatos crea una interpretacion
errónea del dato.

Ver pagina 127 en manual STX80XX-MP-PLC.

La funcion Count1GetEventRPM_I() retorna el mismo valor de RPM, pero sin punto decimal. Podrias hacer:

MbRtuServLoadRegister(42001, Count1GetEventRPM_I())

Otra alternativa es utilizar la funcion FloatToInt() que convierte de Float a Int:

MbRtuServLoadRegister(42001, FloatToInt(Count1GetEventRPM()))

Ver pagina 27 en manual STX80XX-MP-PLC.

Quedamos a disposición por cualquier otra consulta.

Saludos


SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2324
  • Soporte Técnico
Re:Cargar registro en HMI SH-300
« Respuesta #2 : julio 08, 2016, 17:40:04 pm »
También te recomiendo modularizar tu código en varias rutinas independientes, para evitar que una sola funcion tenga todo el código, por ejemplo,
podrias crear una funcion ProcesarRPM() fuera de PlcMain() para agrupar el procesamiento de RPM en un lugar por separado.

Esto independiza el codigo y tambien lo emprolija, asi a futuro te es mas facil modificarlo sin afectar a otras partes.

Deberias separar tambien la parte que obtenes o modificas datos en el HMI.

Es posible poner rutinas en archivos separados tambien.

A modo de ejemplo, te modifiqué el codigo para que tengas una idea:

PlcMain()

Código: (Pawn) [Seleccionar]

PlcMain()
{

   // Inicializar rutinas Virtual-HMI.
   VirtualHmiInit()

   new Select
   new RPM
   // new x
   //new y

   // Activar contador, cuenta por flanco ascendente.

   Count1Enable(COUNT_EDGE_RISING)
 
//
   // Inicializar Servidor ModBus RTU.
   //
   // Velocidad 9600 bps, formato 8E1 y direccion ModBus RTU 1.
   //
   // Interfaz: RS-232 (consulte hoja de datos de dispositivo)
   //
   // A partir de este momento, el servidor esta activo.
   //
   
   if(MbRtuServInit(1, 9600, SERIAL_8E1, MB_RTU_INTERFACE_RS232) < 0)
   {    
   // Error, pausar programa en este punto.
   while(true)
   {
   DelayMS(2000)
   LedToggle()
   }
   }

   //
   // Loop Principal.
   //
   Count1Reset()
   for(;;)
   {
         RPM = FloatToInt(Count1GetEventRPM())
   
             
   // Cargar  regustro Rpm     
   MbRtuServLoadRegister(42001, RPM())
   
   // Leer Holding Register en direccion 42020.     
   MbRtuServGetRegister(42020, Select)

           // Procesar RPM
           ProcesarRPM(Select, RPM)
   
  // Pausar ejecucion
  DelayMS(250)
   
   }

   // Retorno.
   return 0
}


ProcesarRPM()

Código: (Pawn) [Seleccionar]
ProcesarRPM(Select, RPM)
{

      switch (Select)
     
      {
          case 1:
          { 
             if (RPM<180)
              {
                 DoutSetOn(DOUT1)
              }
             if (RPM()>200)
             {
             
                DoutSetOn(DOUT2) 
            }
          else
          {
           
          DoutSetOn(DOUT3)
             }
          }
      case 2:
          {  if (RPM()<200)
              {
                 DoutSetOn(DOUT1)
          }
           if (RPM()>200)
          {
             
          DoutSetOn(DOUT2)
          }
          else
          {
          DoutSetOn(DOUT3)
             }
             }
          case 3:
          {  if (RPM()<220)
              {
                 DoutSetOn(DOUT1)
          }
           if (RPM()>200)
          {
             
          DoutSetOn(DOUT2) 
          }
          else
          {
          DoutSetOn(DOUT3)
             }
             }
          case 4:
          {  if (RPM()<240)
              {
                 DoutSetOn(DOUT1)
          }
           if (RPM()>200)
          {
             
          DoutSetOn(DOUT2) 
          }
          else
          {
          DoutSetOn(DOUT3)
             }
             }
default:
            {
            DoutSetOn(DOUT1)
               }
      }

}

« Última Modificación: julio 08, 2016, 17:43:02 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com