Mostrar Mensajes

Esta sección te permite ver todos los mensajes hechos por este usuario, recuerda que solo puedes ver los mensajes en áreas en donde tu tienes acceso.


Temas - guille

Páginas: [1]
1
Hola gente del foro!

Estoy automatizando una seleccionadora de granos con un STX8091, placa de expansión STX570 y HMI Array SH300.

Debo manejar 5 actuadores lineales con motor de CC, que mueven 5 compuertas. Dichos actuadores me proporcionan salida potenciométrica y al final de su recorrido tienen instalados finales de carrera inductivos. Además, debo comandar 2 variadores que manejan motores trifásicos de 1 y 20HP.

Cuando la máquina inicia en frio, posiciona las compuertas y configura y activa los variadores. El programa permite modificar todos los parámetros sobre la marcha. Es aquí cuando se repite más el problema, cuando están ambos motores andando.

Mi problema es el siguiente:

Cuando inicio la rutina de posicionar los actuadores, el soft erráticamente se saltea pasos, ya que detecta que el final de carrera esta activado (cuando no lo esta!). El código en cuestión es el siguiente (sólo esa parte):

Código: (Pawn) [Seleccionar]

   for(new i=1;i<=5;i++)
{
POTENCIOMETRO=VinRead(i+3)

LedOff()

/////////////////////////DEBUG/////////////////////////////////////
debug_point:
        if(!DinValue(DIN13)) goto debug_point
///////////////////////////////////////////////////////////////////

BitSet(Salida,i-1)

if(POTENCIOMETRO<=SetPoint_Compuertas[i]) OpenClose=0
else OpenClose=1

if(!OpenClose)
{
//Abrir
while(POTENCIOMETRO<=SetPoint_Compuertas[i])
{

if(DinReadFiltered(i))
{
LedOn()
break //Final de carrera?
}

POTENCIOMETRO=VinRead(i+3)
DelayMS(60)
DoutSetOn(Salida)
}
DoutSetOff(Salida)
}
else
{
//Cerrar
while(POTENCIOMETRO>=SetPoint_Compuertas[i])
{

if(EXT_DinReadFiltered(i))
{
LedOn()
break//Final de carrera?
}

POTENCIOMETRO=VinRead(i+3)
DelayMS(60)
Stx570_DoutSet(0, Salida)

}
Stx570_DoutClr(0, Salida)
}

BitClr(Salida,i-1)

  /////////////////////////DEBUG/////////////////////////////////////
debug_point2:
   if(!DinValue(DIN13)) goto debug_point2
          ///////////////////////////////////////////////////////////////////


}

La funciones DinReadFiltered y EXT_DinReadFiltered son códigos de antirrebote que saqué de acá, escritos por Boris. Llego a probar con tiempos de hasta 600mS para evitar el ruido, pero igual se mete. Los inductivos usados son IFM7100, que indican una frecuencia de operación de 800HZ, por lo cual con un tiempo de "antirrebote" mayor a 1.25mS estaría cubierto... (?). Las compuertas se mueven a 1mm/seg, por lo cual no tendría problemas de velocidades excesivas.

Los debug point los utilizo como puntos de debug de hardware, para detener el programa y observar como se modificaron las variables en el HMI, actuador por actuador. La placa de expansión tiene LEDs que indican si se activo o no una entrada: sucede que a veces este LED está apagado y el programa sale por el "break"....

Cumplí todas las siguientes recomendaciones con respecto al ruido, obtenidas también de este foro:

1. Conectar a tierra la bornera GND del PLC y placa de expansión.
2. La tierra tiene que ser mediante jabalina y muy cerca de la instalación.
3. Poner a tierra también gabinetes, partes metálicas, mallados, etc.
4. Utilizar cables mallados para las conexiones, con su malla conectada a tierra.
5. No pasar cerca del PLC o lógica (por arriba o abajo) los cables de potencia u otros del tablero.
6. Utilizar contactores o reles secundarios (desmontables) en lo posible para comandar las válvulas.
7. Colocar un circuito-serie RC con un valor de capacitor (0.1uF cerámico) y resistencia (220 ohms), en paralelo a la parte de potencia de las válvulas, donde conmuta o en su defecto, cerca del la bobina del contactor o rele secundario utilizado.
8. No pasar cerca del cable de control de la STX570A señales de potencia.

3.---> El tablero trifásico al cual se conecta la máquina esta debidamente puesto a tierra, pero la jabalina no esta "muy cerca".
4.--->El cableado de los sensores se lleva por un caño metálico corrugado con recubrimiento plástico, el cual está conectado a GND.
7.---> coloqué ese circuito RC en la entrada de todos los finales de carrera.

Espero que puedan ayudarme porque ya llevo más de dos semanas con el mismo problema y estoy agotando las posibles soluciones!

Muchas gracias! Saludos!



2
STX8091 / Problema VIN y RS-485
« : noviembre 18, 2016, 08:21:35 am »
Hola Boris!

Estoy midiendo la salida de un variador de velocidad que está configurada en 0~10V. Como verás en el código, realizo varias conversiones y las guardo en diferentes variables, con diferentes métodos para mostrarlo en el HMI Array S300, como sigue:

new Motor1_VInt, Motor1_VInt1
new Float: Motor1_VFloat

PlcMain()
{
   
   if(MbRtuServInit(1, 9600, SERIAL_8E1, MB_RTU_INTERFACE_RS232) < 0) //RS485 "No responde" !!!!!
   {      
      // Error, pausar programa en este punto.
      while(true)
      {
         DelayMS(2000)
         LedToggle()
      }
   }
   
   VinSetRange(1, VIN_RANGE_5V)
   VinSetRange(2, VIN_RANGE_5V)
   VinSetRange(3, VIN_RANGE_5V)
   VinSetRange(4, VIN_RANGE_10V)
   VinSetRange(5, VIN_RANGE_10V)
   VinSetRange(6, VIN_RANGE_10V)
   VinSetRange(7, VIN_RANGE_10V)
   VinSetRange(8, VIN_RANGE_10V)

   VinFilterAOn(1000, 1000)
   
   while(true)
   {
      Motor1_VFloat= VinReadVolt(6)
      Motor1_VInt= FloatToInt(VinReadVolt(6))
      Motor1_VInt1= VinRead(6)
      
      MbRtuServLoadRegister(42016, Motor1_VFloat)
      MbRtuServLoadRegister(42017, Motor1_VInt)
      MbRtuServLoadRegister(42018, Motor1_VInt1)
      MbRtuServLoadRegister(42019, Motor1_VFloat)
   
}
}   


Te adjunto una imagen de los valores mostrados y al mismo tiempo medido por un voltímetro. No hay forma de mostrar el valor correcto! También probé con la salida 4..20mA del variador, colocando los jumpers J3, J4, J5 (entradas VIN1, 2 o 3) y utilizando la función "VinToCurrent" y tampoco hay forma. Qué puede estar pasando?

Por otro lado, si coloco el jumper J1 e inicio el bus en RS485, el HMI me dice "No Responde"... ni aún colocando el jumper J2 para la resistencia de terminación. En el datasheet indica que soporta tanto RS232 como 485.

Gracias por la ayuda!

Saludos!

3
STX8091 / Problema con @OnRtcSecond() ???
« : octubre 28, 2016, 11:36:33 am »
Estimados,

buenos dias! Algo raro sucede con el evento RTC cada 1 segundo. Lo estoy utilizando para contabilizar las "Horas de uso" del sistema.... Pero después de ingresar en la rutina principal del programa, donde se accionan diferentes actuadores por tiempos establecidos, cuando vuelvo el sistema tiene un "delay", hasta el segundero del RTC cambia cada 2 segs. Detecté que es el evento de RTC porque al borrarlo dicho problema no existe. Adjunto el código a ver si pueden ayudarme!

Gracias!!

4
STX8091 / Error MODBUS - Solucionado
« : septiembre 20, 2016, 19:39:05 pm »
Hola Boris,

estoy programando en PAWN utilizando el HMI ARRAY SH300 y venia todo bien, hasta que en un momento empezó a titilar el Led DEBUG del PLC y el HMI ya no actualiza los valores que le envío, como los valores de RTC....

Después de buscar el problema me di cuenta de lo siguiente: yo inicio el servidor con el siguiente código, obtenido de de la AN023.pdf, a saber:

if(MbRtuServInit(1, 9600, SERIAL_8E1, MB_RTU_INTERFACE_RS232) < 0)
{
// Error, pausar programa en este punto.
while(true)
{
DelayMS(2000)
LedToggle()
}
}

Me di cuenta que la función estaba retornando un valor menor a 0 y el programa quedaba pausado ahí...

Modifique el código de modo de mostrar que retornaba dicha función de inicialización y observe que me devuelve -1, o sea, "Error, el servidor ya se encuentra inicializado"..... Venia programando normal, sin errores, y de la nada apareció esto. Obviamente solo invoco esa función una vez, por lo cual no se porque me dice esto! Probé restaurar los valores de fabrica del PLC, reseteando con la combinación "DEF/BOOT" y "RESET", como indicas aquí en el foro. El error persiste!!

Porque me dice que ya esta iniciado el servidor Modbus aunque solo invoque 1 vez dicha función? Puedo seguir utilizándolo aun con este valor de error?? Que se puede hacer para volver a la normalidad?

Adjunto el código (casi) completo por las dudas:

///////////////////////////////////////////////////////////////////////////////////////////////////

PlcMain()
{
   // Crear variables para almacenar información del reloj.
   new Day, Month, Year, Hour, Min, Sec, DOW
     
   //Inicia servidor ModBus
   
   new R = MbRtuServInit(1, 9600, SERIAL_8E1, MB_RTU_INTERFACE_RS232);
         if(R < 0)
         {
            MbRtuServLoadRegister(42017, R)         
            while(true)
            {
            DelayMS(2000)
            LedToggle()
            }
          }
         
   // Inicializar placa STX570, dirección 0, conectada al puerto de expansión.
   //Stx570_Init(0)
   
   //Evento RTC
   RtcOnSecondSetEvent()
   
   //Lee EEPROM Programa A, TiempoUsoHs
   EepromRead(1,9,A)
   MbRtuServLoadRegisters(42001,9, A)

   EepromReadByte(0,TiempoUsoHs)
   MbRtuServLoadRegister(42017, TiempoUsoHs)
   
   while(true)
   {
      // Obtener información del reloj.
      RtcGetAll(Day, Month, Year, Hour, Min, Sec, DOW) //Reg 42010 al 42015
           
      MbRtuServLoadRegister(42010, Day)
      MbRtuServLoadRegister(42011, Month)
      MbRtuServLoadRegister(42012, Year)
      MbRtuServLoadRegister(42013, Hour)
      MbRtuServLoadRegister(42014, Min)
      MbRtuServLoadRegister(42015, Sec)
      //MbRtuServLoadRegister(42017, TiempoUsoHs)

      //Elige programa
      MbRtuServGetRegister(42018, Programa)
     
      //Comprueba si se ha modificado un programa
      MbRtuServGetRegister(42019, Config)
     
      //Iniciar Programa
      MbRtuServGetRegister(42020, Start)
     
      //Guarda las modificaciones realizadas sobre el programa en EEPROM
      if(Config)
         {
               Config=0
               DelayS(2)
               MbRtuServLoadRegister(42019, Config)
               
               MbRtuServGetRegisters(42001,9,A)
               EepromWrite(1,9,A)
               
               MbRtuServLoadRegisters(42001,9, A)
         
         }
   // Retorno.
   
   return 0
   }
}
   

//Interrupcion cada 1 seg - RTC
  @OnRtcSecond()
{
      CountMinReset++
      MbRtuServLoadRegister(42016, CountMinReset)
     
      if(CountMinReset==59)
         {
            CountMinReset = 0
            TiempoUsoHs++
            MbRtuServLoadRegister(42017, TiempoUsoHs)
           
            //EepromWriteByte(0, TiempoUsoHs)
           
         }
}

Gracias !!

Páginas: [1]