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

Páginas: [1]
1
STX8081 / Entrada Analógica
« : agosto 27, 2014, 09:10:08 am »
Buenos días Boris,

Quería hacerte una consulta a ver si me podes orientar con un problema que tengo con la entrada analógica de datos.

Sobre la entrada AI1 y AGND tengo conectada una resistencia de 500Ω (2 de 1KΩ en parelelo), y a la vez un generador de señal de 4-20mA. De esta forma leo valores de entre 2 y 10V. Todo funciona bien hasta que conecto el borne GND de la plaqueta a tierra. En ese momento el generador de corriente produce un funcionamiento erróneo.

Estuve viendo y recordando un poco como son los generadores de señal de 4-20mA, y según como este planteado el circuito, el problema puede ser que al estar vinculados los bornes AGND y GND en la plaqueta, no esten ofreciendo una lectura correcta ya que el Loop no se cierra correctamente.

Por un problema de ruido necesito conectar la plaqueta a tierra, pero también me es útil leer ese valor. ¿Se te ocurre alguna solución? Creo que voy a tener que poner un circuito intermedio entre ambos equipos de modo de poder adaptar la señal antes que llegue al PLC.

Gracias,

Pablo

2
STX8081 / Soluciones al Ruido eléctrico.
« : noviembre 06, 2013, 16:20:07 pm »
Bueno, aprovechando que este es un foro, no voy a preguntar nada sino que les voy a comentar cual fue mi problema y espero que puedan aprovecharlo al momento de montar el PLC en el tablero.

Cometí algunos erroes y no fue por no tener el conocimiento, pero desde que me recibí en el secundario, casi que no había hecho nada de electrónica. Y eso que hice la orientación de automatización y control!!!... Pero se me escaparon algunos detalles. Por falta de tiempo yo no monté el PLC sino que lo hizo personal de la fábrica donde trabajo y donde estoy por instalar el PLC, pero no tuvimos en cuenta algunos detalles que luego nos generarian problemas, siendo el mas grave, que el puerto de expnasión dejaba de funcionar.

Primer error
: Al momento de montar el PLC y el puerto de expansión, no tuvimos en cuenta, que quedó mucha distancia entre el PLC y la expansión. Lo cual me obliga a tener un cable de 40cm. Mirando de frente el tablero, creo que lo más óptimo, en el caso del STX8081, es poner la placa del PLC a la izquierda, con los relays hacia la izquierda y el puerto de expansión a la derecha, con los relay hacia abajo. De esta forma, el espacio que queda entre ambas placas va a estar casi libre de cableado (excpeto el cable de red y la fuente del PLC). Con lo cual, el cable plano no cruza sobre cableado que puede inducirle corrientes parásitas.

La etapa de potencia queda a criterio de cada uno. POr mi parte, utilice relay tipo Izumi o Aea, con bobinas de 24 Vac, ya que mucho de los componentes que manejo son electrónicos. Excepto 4 bombas, las cuales conmuto mediante contactores. Es decir que los Relay del PLC manejan una tensión "de control" de 24Vac. No me gusta mucho la idea de manejar directamente 220vac, pero repito, esto va a criterio y experiencia de cada uno.  Pero esto me llevó a cometer el Segundo error: Debido a que el PLC ya estaba mal puesto, y de la manera en que se ordenaron los componentes en el tablero, los cables de 24Vac se me cruzaron con los cables de señal de las entradas discretas. Al desconectar el contactor, y por el fenomeno de autoinducción, mis 24Vac se convertían en picos de 800V. Con lo cual podía ver un leve destello en todos los leds y el puerto serie dejaba de funcionar.

La solución para este problema, sin mover el PLC, fue implementar las sugerencias de Boris las cuales copio:

Citar
- Conectar a tierra la bornera GND del PLC (esto es importante).
- En paralelo a los contactos del relay, podes utilizar algun capacitor de 0.1µF/630V ceramico en serie con un resitor ( de 5 ohms  a 330ohms por ej). Esto disminuye el arco electrico.
- Tambien alejar los cables de potencia del PLC.
- Referir a tierra tambien todos los gabinetes y superficies metalicas cercanas.
 - En lo posible utilizar cables mallados, con la malla conectada a masa.

Desde ya que comencé por lo mas fácil. Verifique las tierras. Noté que la fuente switching para riel DIN de 12Vcc que utilizo para generar los 1 en las entradas discretas, tenía desconectada la masa. También conecté a tierra el borne GND del puerto de expansión.

Por último fui a la casa de electronica y compré los capacitores y una serie de resitencias. Empecé a probar con una resistencia de 220ohms y 100ohms. Pero no había caso. Colocandolo en paralelo al contacto de los relays que manejaban los contactores no funcionaba. En eso se me ocurrió colocar el capacitor de 0,1uF en serie con la resistencia de 220ohms, en parelelo a la bobina del contactor. Y ahí comencé a notar las mejoras. Hice varios test y los leds se dejaron de iluminar. Y además, el puerto funcionó sin caerse en ningun momento.

Después de detectar el problema y lidiar varios días, se puede decir que el problema esta resuelto.


Cualquier cosa que los pueda ayudar, estoy a su disposición.

Pablo.

3
Hola Boris,

Siendo que mi duda puede ser de utilidad para muchos usuarios, te amplio un poco lo que te consultaba por mail. Cada X segundos tomo una muestra de VIN1 y un timestamp para crear un datalogger. El mismo tiene que funcionar como un sistema FIFO (Primero en entrar, Primero en Salir)

Lo primero que debo tener en cuenta, es reservar los primeros 4 bytes, para poder grabar un número entero con la última posición o address disponible. Estando la memoria vacía, se supone que la primera posición libre es la 4. Con lo cual, por única vez, puedo ejecutar un programa para grabar este valor, y evitar errores futuros.

Esto es un resumen de mi programa Ladder, aunque lo copio en Pawn para que sea mas facil de visualizar:
Código: [Seleccionar]
//En el evento Al inicio del programa puedo leer la última posición libre:
EepromReadCells(0, 4, gai_ValorRead)

//Y acá es donde tengo dudas de como armar el entero gi_UltimaDisponbile, en base al array gai_ValorRead. ¿Con desplazamiento de bits?
gi_UltimaDisponible =  

//Luego armo los valores que quiero grabar, y los escribo
gai_ValorWrite[0] = RtcGetTimestamp()
gai_ValorWrite[1] = Vin1Read()
EepromWriteCells(gi_UltimaDisponible, 2, gai_ValorWrite)

// Como cada entero ocupa 4 bytes, incremento la última posición disponible y la guardo,
// Siempre y cuando no me exceda de la capacidad de mi memoria. Si me excedo, arranco en la primera
// Posición para ir descartando los registros mas antiguos
// Después no hace falta volver a leerla porque la voy guardando en gi_UltimaDisponible

gi_UltimaDisponible = gi_UltimaDisponible + 8
if(gi_UltimaDisponible > EepromSize())
{
    gi_UltimaDisponible = 4
}
//Escribo la última disponible en la address 0
[b]EepromWriteCells[/b](0, 1, gi_UltimaDisponible)

Ahora, y a modo de ejemplo, ¿Cómo hago para recuperar los datos guardados, ya sea para mostrar en display o enviar por UDP, mail, etc?
Me encuentro con el mismo problema, que al leer los datos, del array tengo que armar un entero. Supongo que lo mejor es trabajar con datos empaquetados, pero no estoy familiarizado con los comandos.

Agradecería si me podes mostrar un ejemplo para realizar un datalogger.

Gracias,
Pablo.


4
StxLadder - Slicetex Ladder Designer Studio / Envio datos UDP
« : octubre 17, 2013, 19:27:22 pm »
Hola Boris,

Te quería comentar lo que me sucede, al manejar datos por UDP. Como la PC cliente que ejecuta la interfaz en C#, no siempre tiene la misma IP, en el evento OnUdpRx, guardo la IP en un array. De esta forma puede responder a una ip que no siempre es fija.

Código: [Seleccionar]
UdpRxGetAddr(gai_IpPC[0], gai_IpPC[1], gai_IpPC[2], gai_IpPC[3],gi_PuertoPC)
De acuerdo al dato que recibo, tengo que enviar datos de vuelta y siempre lo hago dentro del evento OnUdpRx, por ejemplo:

Código: [Seleccionar]
UdpSend(gai_IpPC[0], gai_IpPC[1], gai_IpPC[2], gai_IpPC[3], gi_PuertoPC, 4, gai_PaqueteTx, false)
El problema que esta línea de código, no envía el paquete, o al menos no lo recibo ni en mi interfaz ni en el programa de ejemplo del SDK ¿Puedo estar olvidandome de algo?

También me surgieron dos ideas. La primera incluir un componente Ladder para la función UdpRxGetAddr. La segunda que el evento UdpSend, soporte un array como metodo de configuración de la IP (como si se puede asignar una variable al puerto).


Gracias,

Pablo.

5
Hola Boris,

Una consulta, para cuando una línea en Pawn es muy larga, hay alguna manera de generar una salto de línea como existe el &_ para visual?

Código: [Seleccionar]
if(SmtpSend("mi@correo.com.ar", "avisos@correo.com.ar", "Email automatico", "Este es un correo automático que muestra el estado de las primeras cuatro entradas discretas\n DIN1: %d\n, DIN2: %d\n, DIN3: %d\n DIN4: %d, pBoolRead(gb_DIN1),pBoolRead(gb_DIN2),pBoolRead(gb_DIN3),pBoolRead(gb_DIN4)) < 0) CurrentFlow = 0

Estaría bueno que se pueda escribir algo asi, para que sea mas facil de leer:

Código: [Seleccionar]
if(SmtpSend("mi@correo.com.ar", "avisos@correo.com.ar", "Email automatico", (concatenador)
"Este es un correo automático que muestra el estado de las primeras cuatro entradas discretas\n" (concatenador)
"DIN1: %d\n, DIN2: %d\n, DIN3: %d\n DIN4: %d, pBoolRead(gb_DIN1),pBoolRead(gb_DIN2), (concatenador)
pBoolRead(gb_DIN3),pBoolRead(gb_DIN4)) < 0) CurrentFlow = 0

Gracias,

Pablo

6
Quería saber si había alguna manera de utilizar las funciones pBool, pero en combinación con una string concatenada con un entero, por ejemplo:

Código: [Seleccionar]
for(new n = 1; n < 9; n++)
{
//Aca es donde no se como hacer:
EstadoEntradas[n] = pBoolRead(gb_DIN%i,n)
}


Se que la forma gb_DIN%i, n no es lo que corresponde, pero quería saber si había alguna manera para no tener que escribir a mano todas las opciones.

Desde ya muchas gracias.

7
STX8081 / Pawn en Ladder
« : agosto 18, 2013, 14:22:31 pm »
Estoy creando un script de ejecución, que de acuerdo al valor de una entrada analógica, lo convierto en PH con una fórmula y deseo cambiar el valor de una variable Booleana Global (gb_PHAdecuado). Hay otra alarma que es gb_AlarmaPH que directamente para el proceso cuando el PH es muy ácido. Y la otra variable int (gi_EstadoPH) que utilizo para luego mostrar distintos mensajes en el display.

El error se produce en todas las líneas donde utilizo gBoolSet y gBoolClr, produce un error 029: Invalid expression, assumed zero. Si utilizo pBoolSet, el programa compila bien pero logicamente no es una variable de perifericos y pro ende no funciona.



Código: [Seleccionar]
if(CurrentFlow)
{

lf_Principal_VoltajeV1 = Float: VinReadVolt(1)
lf_Principal_PH = (lf_Principal_VoltajeV1 - 1) * (14 / 9)

gBoolClr(gb_AlarmaPH)

  if(lf_Principal_PH >= 8)
  {
  if(lf_Principal_PH <= 8.7)
  {
  gi_EstadoPH = 1
  gBoolSet(gb_PHAceptable)
}
else
{
gBoolClr(gb_PHAceptable)
gi_EstadoPH = 2
}
}
else
{
gi_EstadoPH = 0
gBoolSet(gb_PHAceptable)
if (lf_Principal_PH < 7)
{
gBoolClr(gb_PHAceptable)
gBoolSet(gb_AlarmaPH)
}
}
}


 

Páginas: [1]