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

Páginas: [1] 2 3 ... 52
1
STX8091 - Familia PLC Cube / Re:Uniones sobre estructuras de variables
« : diciembre 14, 2017, 17:01:33 pm »
Buenisimo. Asi si funciona. En C o C++ convertis las variables directamente anteponiendo Float o word o dword a la variale o ecuacion en cuestion. en otros plcs convertis las variables con funciones determinadas dado que el formato float es diferente al binario en CA1 o CA2. Pense que podia existir alguna funcion asi. no importa, armo las funciones de conversion y listo.
muchas gracias.
saludos.

Podríamos crear algunas funciones genéricas para que ya este soportado de forma estándar en una actualización de firmware.

¿Cómo son en los PLC que utilizas?.

Se me ocurre que podría implementarse algo similar a lo siguiente para fácil uso:

  • FloatToReg16(FloatValue, Reg16Low, Reg16High): Separa FloatValue en dos variables enteras, con valores de 16-bits en Reg16Low y Reg16High.
  • Reg16ToFloat(Reg16Low, Reg16High): Une dos registros o variables enteras que contienen un valor float, retorna el valor convertido.

Básicamente para ser utilizado en operaciones ModBus.

2
STX8091 - Familia PLC Cube / Re:Uniones sobre estructuras de variables
« : diciembre 14, 2017, 13:40:15 pm »
En realidad ambas cosas dado que despues voy a tener que enviar un dato flotante por modbus a la pantalla.

Bien, lo que debes utilizar es el operador "desplazamiento de bits" en Pawn.

Leer variable Float desde registros ModBus

En este caso, lees dos registros de 16-bits del dispositivo remoto que representan un valor float de 32-bits.

El float, debería estar almacenado en las direcciones de registros como sigue:

RegistroH  = 16-bits mas significativos.
RegistroL  = 16-bits menos significativos.

Entonces, debes leer ambos registros (supongamos que ya recibiste ambos valores vía ModBus y los tenes en las variables RegistroH y RegistroL):

// En Pawn (en rojo los valores ya recibidos)
new RegistroH = Valor Y
new RegistroL = Valor X


// Crear dos variables intermedias.
new RawValue
new Float: FloatValue = 0


// Convertir a 32-bits (unir ambos registros para formar el float de 32-bits).
// Notar en segunda linea como realizo una operación SHIFT y luego un OR bit-a-bit.
RawValue = RegistroL
RawValue |= (RegistroH << 16)


// Almacenar en float haciendo un cast (para que se interprete correctamente).
FloatValue = Float: RawValue


Finalmente, en FloatValue tenes el float obtenido del registro ModBus.

Escribir variable Float en registros ModBus

Acá debes hacer al revés, del float, copiar 16-bits más significativo en un registro y 16-bits menos significativos en otro registro.

// Valor float a transmitir.
new Float: FloatValue = 123.456

// Variables enteras a copiar en registros.
new RegistroH
new RegistroL


// Almacenamos 16-bits más significativos, desplazando 16 bits a la derecha:
RegistroH = FloatValue >> 16

// Almacenamos 16-bits menos significativos, haciendo cero 16-bits más significatios con operación AND.
RegistroL = FloatValue & 0xFFFF


Luego en RegistroH y RegistroL tenes el float descompuesto, que podes copiar a los registros ModBus.



En ambos ejemplos podes usar VirtualHMI para imprimir en pantalla el valor y corroborar operación.

Te recomiendo hacer la prueba con un código básico para entender el proceso.

Las operaciones con bits (desplazamientos, AND, OR, etc) son iguales que en lenguaje C. Si tenes alguna duda conceptual, avísanos.

Saludos.


3
STX8091 - Familia PLC Cube / Re:Uniones sobre estructuras de variables
« : diciembre 14, 2017, 12:54:00 pm »
El problema que me surge es que cada modulo genera una variable a transmitir flotante (32bits), y el tipo de variable en modbus es de 16 bits. lo que hago habitualmente es en un micro generar una estructura tipo union donde puedo convertir ese flotante en dos variables de 16 bits que copia bit a bit el flotante en estas dos variables. Del otro lado hago lo inverso, es decir cargo estos registros de 16 bits y a traves de una union paso bis a bit a una variable de 32 bits y tengo el flotante transmitido. El concepto de union es un clasico en C.

se puede hacer algo asi? no he encontrado data en lo que he leido de los manuales.

Buenos días,

Si, es posible, aclárame si lo que querés hacer, ¿es leer dos registros de 16-bits por ModBus, para luego unirlo en un float en el PLC y tenerlo disponible?.

O al revés, ¿tenés un float en el PLC y deseas transmitirlo como 2 registros de 16-bits vía ModBus?.

¿Que lenguaje estas utilizando?

Saludos

4
Buenos días Esteban,

Muy bien, lo que voy a hacer es probar la parte de las alarmas de forma aislada, pero conservando la configuración de las mismas, y ver si los eventos se generan o se pasan por alto.

Te mantengo al tanto.

Saludos

5
Podría revisar el comando OnTimeAlarm  ya que capaz que una vez al mes no funciona justo es evento. Esta programado para todos los dias a las 13 hs, el plc estuvo funcionando ya que la alarma a las 10 funciono pero ese no trabajo hoy 06/12/2017. Yo voy a ir anotando los dias pero es como que tiene algo puntual que hace que no funcione esa determinada alarma en un día puntual y en su momento crei que era por algo de calendario que tenia de lunes a viernes y lo modifique a todos los dias pero igual sigue con esa falla, y no es siempre el de las 13 aveces es el de las 8:00 y todas van al mismo rele.

Buenas tardes Esteban. ¿Tendría el código relacionado al evento para compartir así puedo testearlo y reproducir el error?. Gracias.

6
STX8091 - Familia PLC Cube / Re:Ciclo scan
« : diciembre 06, 2017, 11:13:29 am »
Le envío un ejemplo donde con un pulsador activo una marca y luego con el mismo le hago un reset si esta activado, pero no lo desactiva.



En ese código que pasas en ladder, DOUT1 se activa mientras DIN1=1, y se desactiva cuando DIN1=0.

Si lo analizás:

N001: inicialmente M1=0, DIN1=1, entonces M1=1.
N002: M1=1, entonces DOUT1=1.
N003: DOU1=1, DIN1=1, entonces M1=0.

Siguiente SCAN CYCLE:

N001: Nuevamente M1=0, DIN1=1, entonces M1=1.
N002: M1=1, entonces DOUT1=1.
N003: DOUT1=1, DIN1=1, entonces M1=0.

Solo si DIN1 cambia a 0, tenemos:

N001: M1=0, DIN1=0, M1 sin cambios (viene de ciclo anterior con valor 0).
N002: M1=0, entonces DOUT1=0.
N003: DOUT1=0, DIN1=0, M1 (sin cambios, viene con valor 0).



Si lo que necesitas es que cuando DIN1 pase de 0 a 1 se active DOUT1, pero cuando DIN1 pase de 1 a 0, no produzca cambios en DOUT1, sino que para desactivar otra vez tenga que pasar DIN1 de 0 a 1 (como si fuera un pulsador toggle), podes usar el siguiente código:



O también más simple:



Es lo que interpreto que querés hacer.

Si no es esto, decime que valor debe tener DOUT1, frente al comportamiento de DIN1, para que te pueda guiar.

Saludos.

7
STX8091 - Familia PLC Cube / Re:Variables retentivas
« : diciembre 05, 2017, 19:45:19 pm »
Buenas tardes Damian,

Para guardar valores y no perderlos luego cortar energía eléctrica, debes usar la memoria EEPROM del PLC.

Te paso un link a un ejemplo que guarda en memoria EEPROM, 4 valores de una variable tipo Int32_Array.

Ejemplo: EepromVirtualHMI_Version_1.zip

Para guardar se da la orden con la entrada DIN2.

Para cargar/leer se da la orden con la entrada DIN3.

Los 4 valores se pueden incrementar como contadores, pulsando la entrada DIN1.

Todo el proceso se puede ver por VirtualHMI.

Leer también archivo info.txt en proyecto.



A modo de nota, cuando grabe/escriba en EEPROM, intente asegurar que no se realice la operación infinita veces, por ejemplo usando una condición con algún componente de flanco ascendente (ver ejemplo), o alguna variable que inmediatamente se haga FALSA y no permita grabar nuevamente en la EEPROM.
Esto importante, ya que la EEPROM tiene un ciclo limitados de escrituras, alrededor de 1 millón, pero si el programa por error graba indefinidamente, se acorta la vida útil.

Si tiene dudas, quedamos a disposición.

Saludos.

8
STX8091 - Familia PLC Cube / Re:Activar rele en otro PLC por tcp/ip
« : diciembre 05, 2017, 19:31:54 pm »
Buenas tardes Esteban,

Te paso link a dos proyectos que te permiten configurar dos PLC, uno como cliente ModBus TCP y otro como servidor ModBus TCP para el intercambio de datos:

  • MbTcpClientReadWrite.zip: Ejemplo en lenguaje Ladder para configurar un PLC como cliente ModBus TCP. Permite enviar comandos al servidor para leer entradas DIN, escribir/leer registros, escribir salidas DOUT, etc. Recuerde leer el archivo info.txt.
  • MbTcpServerReadWrite.zip: Ejemplo en lenguaje Ladder para configurar otro PLC como servidor ModBus TCP y aceptar las conexiones ModBus TCP del cliente. Recuerde leer el archivo info.txt.

Debes conectar ambos PLC en la red Ethernet, con dos IP diferentes.

Al PLC que le cargues el cliente ModBus TCP le debes especificar la dirección IP del PLC con el servidor ModBus TCP.



Estos ejemplos requieren que tengas instalada la última versión de StxLadder (1.8.5 o superior).



Para probar el cliente ModBus TCP tenes que usar VirtualHMI para ver los resultados en pantalla, ya que según el ejemplo, cuando activas:

- DIN1: Envía un requerimiento para leer 4 holding registers en dirección 40001.
- DIN2: Envía un requerimiento para escribir coil (DOUT1) en direccion 1.
- DIN3: Envía un requerimiento para leer 16 entradas DIN en direccion 10001.
- DIN4: Envía un requerimiento escribir 1 holding registers en direccion 40017.
- DIN5: Envía un requerimiento para escribir coil (BIT) en dirección 4002.

Como podes notar, el ejemplo te permite escribir variables, leer variables y activar/desactivar reles directamente en el PLC remoto.

Esto es más fácil que realizar conexiones TCP/IP directamente, ya que tiene un esquema de registros. El protocolo usado base, es el TCP/IP igualmente.

Puede ser conveniente que leas las notas de aplicación AN021 y AN022 respectivamente, ya que describen el protocolo.

Cualquier duda, avisame.

Saludos.





9
STX8091 - Familia PLC Cube / Re:Ciclo scan
« : diciembre 04, 2017, 21:59:10 pm »
Hola cómo trabaja el ciclo scan, porque tengo problema cuando uso una misma entrada para distinto evento entonces abajo del todo reset una marca y arriba el mismo botón activa una marca pero tiene otra marca adelante que cuando se reset recién puede activarse. Pero la realidad es que resetea la marca y luego la de arriba ya toma que se desactivo y vuelve a activarla.

Estimado Esteban,

El SCAN CYCLE comienza de arriba hacia abajo, ejecuta los componentes ciclicamente en el diagrama Principal.

En el diagrama hay una opción (click botón derecho) para Ver el orden de ejecución de los componentes (requiere compilar).

Con ello podes ver que se ejecuta primero, en caso que estés modificando/leyendo una variable en un orden diferente al deseado.

También hay una explicación del SCAN CYCLE en el manual de usuario.

No comprendí bien el texto, en el sentido a la secuencia que mencionas, decime si es esto lo que estas buscando, o si podes pasame una captura del fragmento del código que tenes duda.

Saludos.

 




10
STX8091 - Familia PLC Cube / Re:Activar rele en otro PLC por tcp/ip
« : diciembre 04, 2017, 21:51:35 pm »
Estimado Esteban,

Creo que la mejor manera de hacerlo es a través de ModBus TCP, ya que tiene funciones para escribir/leer registros/bits, desde el cliente al servidor.

Disculpe la demora, estaba trabajando en hacerle un ejemplo básico para orientarlo.

Lo estaré publicando en cuanto lo termine.

Saludos.

11
No, Boris no funciona. La necesidad es la siguiente:
"Un contactor abre y cierra sus contactos bajo los comandos SET & RESET, yo necesito que cuando sea SET actué en una bobina y cierre sus contactos (1 bool) y cuando sea RESET abra sus contactos. (0 bool)".

Si mal no entiendo, se me ocurre que podes hacer lo siguiente:



En este caso, si Variable es 1, bobina DOUT cierra contactos. Si Variable es 0, bobina DOUT abre contactos.

Podes hacer que funcione a la inversa también.

12
Si, asi mismo es.
Por favor que debe hacerse para que corresponda la salida Slda5 proveniente de un arreglo SET & RESET, y que corresponda en comportamiento bool a una salida DOUT-X

Entonces debes usar una bobina normal abierta para comandar DOUT, como te puse en la siguiente imagen:



La bobina que usas es una SET, no una normal abierta, por eso siempre te queda cerrada cuando la condición es verdadera.

¿Ahora, con esta bobina que te puse en la imagen, no te funciona? ¿Por qué?.

13
Si la salida es set = 1 y reset = 0 correcto. (cerrando o abriendo la bobina Slda5)
El contacto NA Slda5 (E013) que debe cerrar y abrir la bobina DOUT1 (E012), no se comporta de la misma manera; se queda en 1 (cerrado).

Yo requiero que sea proporcional si hay un set sea un 1 y reset 0.... Tal vez estoy en un error y esta aplicacion por ahi no es.

A ver si comprendo, entonces ¿vos querés que si variable Slda5 es "1", DOUT sea "1" y si Slda5 es "0", DOUT sea "0"?.

14
De esa manera no hay problema, pero no es asi como lo necesito------ tienes alguna solución para la aplicación del diagrama que pase...es de ahi que necesito que el contacto abra y cierre, dependiendo de una bobina set/reset.

Es que no comprendo cuál es el resultado deseado.

En el diagrama que me pasaste la variable Slda5, puede adoptar el valor "0" o "1" según valor de VIN.

Luego lees la variable Slda5 y si es "1" con una bobina SET aplicas "1" a DOUT1.

Eso hace tu diagrama.

Bien, ¿Como querés que se comporte?.

Explícame mediante valores, como querés que se comporte la salida.

Saludos

15
Boris realice este ejercicio y no responde como tal......

Para que active/desactive la salida deberías usar una bobina normal abierta como te puse en la imagen:



Saludos

Páginas: [1] 2 3 ... 52