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.


Mensajes - guille

Páginas: [1] 2
1
Hola Boris!

Finalmente creo que dimos (diste!) en la tecla: era una cuestion de software, de "formatos". Como bien decis, invocando ahora la función con BitSet(...) activo solo la salida pretendida!

Con respecto a "ruido", el sistema mejoró cuando conecté correctamente las tierras y los 10 puntos que me señalaste para corregir. Con respecto a la etapa de "potencia", actualmente estoy usando tanto los relays de salida como los sensores inductivos de forma directa, sin ningún diodo o circuito RC de protección, por lo que no parece ser un problema de ruido por las entradas y/o salidas digitales/analógicas.

Voy desarrollando este proyecto a medida que la empresa avanza con el diseño mecánico de los diferentes prototipos y te voy a seguir consultando, es muy valioso tu soporte como fabricante. Gracias por tu asistencia. Muy buena la post vent ehh !! jaja!

Saludos,

Guillermo.

2
Hola Boris!

Te pego el código antirrebote que saque de este foro:

//anti-rebote
DinReadFiltered(Din)
{
   new timeOut = 25
   new lastLevel = 0

   lastLevel = DinValue(Din)

   while(timeOut > 0) 
   {
      if(DinValue(Din) == lastLevel)
      {
          // Retardo de 500 mS.
          DelayMS(20)
          timeOut--
      }
      else
      {
          // Valor difiere al ultimo leído, reiniciar timeout.
          lastLevel = DinValue(Din)
          timeOut = 25
      }
   }

   return lastLevel
}

//anti-rebotes placa expansión
EXT_DinReadFiltered(Din)
{
   new timeOut = 25
   new lastLevel = 0

   lastLevel = Stx570_DinGetValue(0, Din)

   while(timeOut > 0) 
   {
      if(Stx570_DinGetValue(0, Din) == lastLevel)
      {
          // Retardo de 500 mS.
          DelayMS(20)
          timeOut--
      }
      else
      {
          // Valor difiere al ultimo leído, reiniciar timeout.
          lastLevel = Stx570_DinGetValue(0, Din)
          timeOut = 25
      }
   }

   return lastLevel
}


Existen en total 10 finales de carrera (5 actuadores) por el momento. Hay 5 conectados al PLC y 5 al módulo de expansión.

Con respecto al circuito, al tablero lo armaron otros contratistas y no hay planos completos todavía. Según lo que pude apreciar, parece que el modo de conexión es de 3 hilos: +,GND y Señal, que va la entrada del PLC y modulo de expansión. La tensión de alimentación es 12V y cuando conmuta he medido valores de 11V y pico. La interfaz "extra" de transistores creo que se utiliza sólo para la placa de expansión. (tengo que fijarme bien y en todo caso pedir planimetria precisa). En ningún lugar IFM dice que el cuerpo esta unido a algún contacto eléctrico ni tampoco advierte de su aislación de otros elementos metálicos "no sometidos a tension".

Gracias por tu ayuda!

Estamos en contacto,

Guille.

3
Hola Boris!

Ya corregi algunas cosas q me sugeriste: agregue un delay de 50mS despues de la lectura de EEPROM y la variable STEPS la hice entera, total no necesito los valores decimales.

Estuve probando la rutina, quitando la siguiente porción de código:

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

 y

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


O sea, no tuve en cuenta los finales de carrera, pero sólo posicioné los actuadores en posiciones intermedias, evitando llegar a los extremos asi no me pasaba del tope mecánico.

El programa anduvo perfecto, sin errores. Descarto que el ruido ingrese por los relays de interfase o por las entradas analógicas de los potenciómetros. Tampoco observo un bug en la programación.

Luego volví a agregar el mencionado código y el bug apareció enseguida. Trate de filtrar la entrada de los finales de carrera con un RC, pero esto solo empeoró la cuestión. Entonces llego a la conclusión de que el ruido ingresa por acá.

Los FC utilizados son los siguientes:

https://www.ifm.com/products/ar/ds/IF7100.htm

Inductivos, M12, cuerpo metálico.

Me preguntaba, es posible que al estar en contacto con el chasis de la maquina el ruido ingrese por alli? Sera mejor aislar estos componentes? Como son NA, hay una interfaz de transistores que los cambia a NC, cuestión de comodidad. Podrá ingresar por aqui el ruido?

Segun tengo entendido IFM es una marca "respetable" (?). No encontré ni un solo foro en que alguien se quejara de algo como ruido....ni una queja! jajaa

Otro opcion seria optoaislar las entradas? (No es que el PLC tiene su circuiteria interna asi?)

Gracias por tu ayuda Boris!

4
Hola Boris,

después de probar las siguientes configuraciones:

1-RC 100ohm 10uF entre relays y actuadores - Diodo 1N4007 entre PLC y relays

2-RC 100ohm 10uf en entrada de finales de carrera inductivos - Diodo 1N4007 entre PLC y relays.

3-Tengo 3 fuentes de DC; vinculé todos los GND y los conecte al chasis y a la puesta a tierra del tablero.

4-Los variadores tienen una conexión del chasis a GND, pero creo que es en AC. (Se entiende?) Es conveniente unir las tierras/masas AC y DC??

No logro dar con el problema de "ruido" y empiezo a pensar si no habrá un problema de formatos o "representación" numéricos en la comparación del valor analógico leído y el set point...

Inicialmente se calibran los actuadores: se los hace recorrer a todos desde el final de carrera 0% hasta el final de carrera 100%, se toman los valores de potenciómetro "inicial" y "final", se restan y se dividen por 10, obteniéndose un valor de "escalón" para cada actuador.

....PORCIÓN RUTINA CALIBRADO....

for(new i=1;i<=5;i++) STEPS=Float:(POT_Fin-POT_Inicio)/10

         EepromWriteCells(52,6,STEPS)
         EepromWriteCells(76,6,POT_Inicio)

....PORCIÓN RUTINA CALIBRADO....

El usuario puede elegir entre estos 11 escalones (0 incluido!) mediante el HMI para determinar la posición del actuador. La siguiente linea de codigo calcula el setpoint

for(new i=1;i<=5;i++) SetPoint_Compuertas=FloatToInt(X[i+1]*STEPS) + POT_Inicio // + Offset!

El vector X contiene los numeros del 0 al 10.

Cuando se da arranque al programa, y remitiéndome al codigo anterior,
Citar

      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) OpenClose=0
         else OpenClose=1
      
         if(!OpenClose)
            {
            //Abrir
            while(POTENCIOMETRO<=SetPoint_Compuertas)
             {
               
               if(DinReadFiltered(i))
               {
                  LedOn()
                  break    //Final de carrera?
               }
               
               POTENCIOMETRO=VinRead(i+3)
               DelayMS(60)
               DoutSetOn(Salida)
             }
            DoutSetOff(Salida)
            }   
         else
            {
            //Cerrar
            while(POTENCIOMETRO>=SetPoint_Compuertas)
             {
               
               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 conversión AD devuelve un SIGNED de 12 bits, que puede ser complemento a 0. El valor de Setpoint se almacena en una variable cell de 32bits. Y los datos de la EEPROM son de tipo cell, 32bits. Es posible que exista algun error de truncado, conversión, formato, y que esto lleve a una comparación errónea en el programa??

Agradezco tu ayuda ya que realmente no logro encontrar cual es el problema.

Saludos!

Guillermo.

5
Hola Boris,

te comento que los relays instalados son marca IDEC,  los siguientes modelos:

Variadores:  base + rele = SV1H-07L-1 + RV1H-G-12
Actuadores: RJ1S-C-D12

Ninguno tienen diodo de protección, según indican sus hojas de datos:

https://www.kele.com/Catalog/20%20Relays_Contactors/PDFs/RV8H%20Data%20Sheet.pdf
https://www.idec.com/language/english/catalog/Relays/RJSeries.pdf

Por el momento voy a probar con agregar protecciones externas a los relays. Ambas hojas de datos indican circuitos de protección en su penúltima página. Vos recomendás alguno de esos? Coloco un diodo o un RC?

Después de esta modificación, veré si hace falta una fuente de mejor calidad. La instalada es marca "X", voy a probar con un Siemens.

Gracias por tu asistencia!

Saludos!

6
Hola Boris!

En respuesta a tus preguntas:

¿ Como conectas los actuadores de CC ?.
¿ Es decir, los activas usando un rele de interface o directamente conectado al PLC ? ¿ Que tensión de control ?.
¿ Los activas con el PLC o con las salidas de expansión ?.

Los motores se activan manejando un puente H con dos relés en 12V, según se active uno o el otro, cambiará el sentido de la corriente. Cada actuador es manejado por 2 salidas, para abrir (de DO1 a DO5) o cerrar(de EDO1 a EDO5).

¿Los variadores los manejas con la salidas analogicas 0-10V?.
El variador se maneja con 2 salidas digitales para subir o bajar velocidad y una entrada analógica 4..20mA que retroalimenta la velocidad actual.
*MOTOR 1 (1HP) : +DOUT8,-EDOUT8, VIN2
*MOTOR 2 (20HP) : +DOUT9,-DOUT10,VIN3

¿Crees que los variadores generan el ruido o que son los actuadores de CC cuando los prendes/apagas?.
Creo que es cuando enciendo los motores que me aparece con mas frecuencia este bug, pero a veces me lo hace en frio y realmente me desconcierta!!

¿A que velocidad en tiempo se prenden apagan los actuadores de CC normalmente (mas o menos, cada 1 segundos, cada cientos de mS ...) ?
En el código existe un DelayMS(60), que es debido al tiempo de espera para que se actualice el conversor AD y lea la entrada del pote y detenga el actuador. También hay que sumarle el tiempo de la función antirrebote que está actualmente en 350mS.

¿ Los fines de carrera te entregan una salida estatica "1" o "0" fija, o es una señal cuadrada con una frecuencia de 800 Hz ?
Si, me exprese mal! La salida de los inductivos es NA, entrega 0 o 1, claro. Hay un dato de "frecuencia de conmutación" en la hoja de datos que yo interpreté que esa era la ventana en la que el inductivo puede "ver" un ruido.... (?) .. Entonces en base a ese dato, 800Mhz, establecí un filtro "antirrebote" varias veces mas grande... Llegue hasta los 600mS!! Pero el problema persiste.. Igualmente esta interpretación de la hoja de datos puede ser un bolazo... jajaja..

Gracias por tu ayuda!

7
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!



8
STX8091 - Familia PLC Cube / Re:Problema VIN y RS-485
« : abril 12, 2017, 14:57:18 pm »
Hola Boris,

después de revisar todo lo que me dijiste procedi a re-cablear la salida de los sensores de corriente de los variadores hasta el PLC con cable mallado. Esto soluciono el problema!! Quedó midiendo los valores analógicos a la perfección!

Gracias por tu ayuda! Saludos!

9
STX8091 - Familia PLC Cube / Re:Problema VIN y RS-485
« : marzo 31, 2017, 11:55:18 am »
Buen día Boris,

retomando el tema de la lectura de los variadores de velocidad, ahora estoy sobre el mismo asunto pero ya con los motores instalados. En el taller, sólo con el variador, logré hacer funcionar el siguiente código a la perfección (te pego solo el fragmento de interés):

VinSetRange(1,VIN_RANGE_5V)

VinFilterAOn(1000, 1000)
   
AD_FLOAT= Float:VinToCurrent(1,100)
AD_FLOAT=AD_FLOAT*1000000   //para no perder los decimales, debí correr la coma por 6 lugares...
M2= FloatToInt(AD_FLOAT)
MbRtuServLoadRegister(42008,M2)

Por supuesto el Jumper J3 colocado, para leer 4..20mA.

Cuando vengo a la planta y trabajo sobre la máquina, con los motores instalados, no hay forma de que se muestren los valores correctos, utilizando el mismo código! Además, los valores mostrados cambian constantemente y son muy disímiles.

Adjunto una foto de los valores medidos por el tester y por el PLC, ambos en mA.

El código es correcto? El filtro esta correctamente seteado? Puede ser que tenga problemas de ruido, al estar presente los motores? Que sugerencia tenes para mi?

Gracias!



10
STX8091 - Familia PLC Cube / Re:Problema VIN y RS-485
« : diciembre 06, 2016, 09:48:57 am »
Buen día Boris,

gracias por tus respuestas rápidas y completas!

Sigo con preguntas, jeje. Para la resistencia pull up, de donde saco los 5V? De algún pin del bus?...

11
STX8091 - Familia PLC Cube / Re:Problema VIN y RS-485
« : diciembre 05, 2016, 16:51:27 pm »
Exacto Boris, estoy conectando simplemente el PLC con el HMI (Array SH-300) mediante RS-485. Veo la hoja de dato que me pasas y en la página 77 indica los pines del lado del HMI: 1 y 9 (D+), 6 y 8 (D-), 5 (GND). Es correcto?

12
STX8091 - Familia PLC Cube / Re:Problema VIN y RS-485
« : diciembre 05, 2016, 11:05:41 am »
Hola Boris,

armé el cable como sugiere la hoja de datos (pines 2,3,5.... D+,D-, GND respectivamente y chasis a GND) y coloqué los jumpers J1 y J2. Lo raro es que cuando activo GPCOils anda, responde, pero cuando quiero mostrar el resultado del conversor AD, o del RTC, no muestra nada y al ratito el mensaje en el HMI de "No responde"... Debo tener algo más en cuenta?

Saludos.

13
STX8091 - Familia PLC Cube / Re:Problema VIN y RS-485
« : noviembre 21, 2016, 20:40:04 pm »
El problema de el escalado AD está solucionado! Gracias!!

En cuanto al conector RS485, son correctos los pinout que de la imagen adjunta? (Para 2 y 4 cables, respectivamente) Gracias!

Saludos.

14
STX8091 - Familia PLC Cube / Problema VIN y RS-485
« : noviembre 18, 2016, 09: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!

15
STX8091 - Familia PLC Cube / Re:Problema con @OnRtcSecond() ???
« : noviembre 18, 2016, 09:02:04 am »
Hola Boris,
efectivamente uno de esos delays estaba generando este "bache". Aquí la porción de programa y el delay que se borró. Gracias por la asistencia!

.
.
.
.
.
           Start=0
           MbRtuServLoadRegister(42008, Start)
                                   
                        Cuenta=0xFF
           MbRtuServLoadRegister(42013, Cuenta)
           //DelayS(3)
                       
           Pantalla=0
           MbRtuServLoadRegister(42009, Pantalla)

           Ejecutando=1
                       
                        }
       
  }
     
      //Delay sugerido por fabricante
      DelayMS(250)
  // Retorno.
  return 0
}

Páginas: [1] 2