Mensajes recientes

Páginas: 1 ... 7 8 [9] 10
81
StxLadder - Slicetex Ladder Designer Studio / Re:Esquema básico con salidas relé temporizadas
« Último mensaje por Soporte septiembre 20, 2017, 21:17:38 pm »
Buenas tardes, le hago una consulta sobre la lógica que nos solicita, así nos puede aclarar:

1)   Que se active la salida a relé DO2 y DO5 durante 15 segundos
2)   Que se active la salida a relé DO1, DO2 y DO8 durante 20 segundos
3)   Que se active la salida a relé DO1, DO3 y DO9  durante 120 segundos
4)   Que durante 5 segundos no se haga nada
5)   Que se active la salida a relé DO7 durante 10 segundos
6)   Fin del proceso
Que el ciclo se repita cuando vuelva a apretar el pulsador.

¿Son pasos secuenciales? Es decir, al apretar el botón de inicio, comienza el paso 1, se activa el relé DO2 / DO5 por 15 segundos, luego transcurrido el tiempo, recién comienza el paso 2 que mantiene el rele DO2 activado por 15 segundos más, junto a reles DO1 / DO8, para luego a partir de ese tiempo, continuar con el paso 3...y así con los siguientes pasos.

O ¿los pasos 1, 2, y 3 ocurren al mismo tiempo cuando inicia el ciclo?

Aguardamos que nos aclare ese punto.

Saludos.

82
SH-300 / Re:Carga valores de un array en los registros "Holding"
« Último mensaje por Soporte septiembre 20, 2017, 17:06:40 pm »
Pero no termine de comprender. Yo tengo un valor en int32 y lo paso copiándolo a int32_array. Y en el componente lo cargo le pongo 42001 y en qty le coloque uno. Ahora tengo que mostrar otro valor más que es el valor de la salida analógica y cuando tomo ese valor como pongo entre paréntesis que es el mismo nombre y cambia el número y debo modificar el qty a 2 ? O para hacerlo más fácil puedo colocar un componente nuevo y el pongo 42002 qty 1 ?

Primero en el Int32_Array copias los dos valores del Int32 de forma consecutivas. Cada valor que copias, esta dentro de un elemento independiente dentro del array.

Luego en el componente seleccionas el Int32_Array en su elemento "0" (que es el inicial) y le pones QTY=2, así el componente lee dos elementos consecutivos del array a partir del elemento inicial seleccionado.

Automáticamente, copiará los dos elementos del array en el ADDRESS ModBus que le especifiques, de forma consecutiva.

No te conviene poner un componente nuevo, porque estarias haciendo dos llamadas, cuando lo podes hacer de una sola vez.

Nota: Fijate que también hay otro componente para cargar a la dirección ModBus que solo lee un Int32, más practico para cuando no tenes un array.

Avísame si seguís con dudas y te subo algún ejemplo.

Saludos
83
SH-300 / Re:Carga valores de un array en los registros "Holding"
« Último mensaje por Esteban E septiembre 20, 2017, 16:24:10 pm »
Mucha gracias por la respuesta.

Pero no termine de comprender. Yo tengo un valor en int32 y lo paso copiándolo a int32_array. Y en el componente lo cargo le pongo 42001 y en qty le coloque uno. Ahora tengo que mostrar otro valor más que es el valor de la salida analógica y cuando tomo ese valor como pongo entre paréntesis que es el mismo nombre y cambia el número y debo modificar el qty a 2 ? O para hacerlo más fácil puedo colocar un componente nuevo y el pongo 42002 qty 1 ?



Saludos.ñ
84
SH-300 / Re:Carga valores de un array en los registros "Holding"
« Último mensaje por Soporte septiembre 20, 2017, 11:47:39 am »
Buenos días Esteban,

Hola, tengo la siguiente duda, se utiliza el componente MbRtuServLoadRegisters para cargar desde una entrada Array y luego la lea el panel. Pero en QTY no comprendo que valor se coloca.

En la entrada QTY especificas el número de elementos que se van a leer desde el array tipo Int32_Array y luego cargar a la direccion ADDRESS de los registros ModBus Holding.

Por ejemplo, si tenes un array llamado "Valores" con 5 elementos con los siguientes valores:

Valores[0] = 21
Valores[1] = 50
Valores[2] = 200
Valores[3] = 500
Valores[4] = 1000

Y deseas cargar los primeros tres valores en las direcciones ModBus 42001, 42002 y 42003, entonces en el componente MbRtuServLoadRegisters especificas en su puertos:

ARRAY = Valores[0]
QTY = 3
ADDRESS = 42001

Luego de ejecutar el componente, te queda en las direcciones de registros holding los valores de los 3 elementos del array:

42001 = 21
42002 = 50
42003 = 200

Y la otra duda es pasar de un valor int32 a int32_array como se realiza ?

Utilizo lenguaje ladder.

Una opción fácil si queres cargar un Int32 a dirección de registro Holding ModBus es utilizar el componente MbRtuServLoadRegister, similar al MbRtuServLoadRegisters pero que solo requiere una variable tipo Int32, no un array.

La otra opción es cargar el array Int32_Array copiando en cada elemento el valor de la variable/constante Int32 con el componente: Int32Copy o Copia Int32, que lo podes encontrar en el grupo de componentes "Operaciones de variables".

Saludos

85
SH-300 / Carga valores de un array en los registros "Holding"
« Último mensaje por Esteban E septiembre 19, 2017, 21:13:53 pm »
Hola, tengo la siguiente duda, se utiliza el componente MbRtuServLoadRegisters para cargar desde una entrada Array y luego la lea el panel. Pero en QTY no comprendo que valor se coloca.

Y la otra duda es pasar de un valor int32 a int32_array como se realiza ?

Utilizo lenguaje ladder.

Gracias.
86
Buenas tardes Esteban,

Te adjunto un ejemplo que muestrea la entrada VIN1 (configurada para corriente con jumper J3) cada 100 mS y escala el valor leído a un valor entero en el siguiente rango:

  • 4 mA a 0
  • 20 mA a 1000

En el diagrama de Inicio.sld se establece rango 0-5V para la entrada y se activa el filtro analógico para filtrar ruidos o variaciones pequeñas en la lectura.

Para escalar el valor, primero se toma la muestra de la entrada en la variable float CurrentF1, luego se convierte a entero y copia a la variable entera Current1, donde su multiplica para que 4 mA sea 400 y 20 mA sea 2000. Esto te es útil por si queres ver corriente directamente en el panel HMI.

Luego a la variable Current1 se la escala y copia a la variable entera Scaled1 utilizando la ecuacion de la recta que pasa por dos puntos, de esta forma obtenemos una ecuación que nos permite limitar el valor de Current1 entre 0 y 1000, donde 0 representa 4mA y 1000 representa 20 mA.

Ecuación de la recta por dos puntos:

(x-x1)/(x2-x1)=(y-y1)/(y2-y1)

Hacemos:

  • x1=400 (4mA, recordar que viene de variable Current1)
  • x2=2000 (20mA)
  • y1=0 (limite inferior)
  • y2=1000 (limite superior, podemos usar 100 aquí si queremos limitar a 100)

Remplazando en ecuacion:

(x-400)/(2000-400)=(y-0)/(1000-0)
x/1600 - 0.25 = y / 1000

Obtenemos una ecuación, cuya salida "y" estará limitada entre 0 y 1000 para todos los valores de "x" entre 400 (4mA) y 2000 (20mA)

y = 0.625 x - 250

En Ladder, quedaría el algoritmo implementado como en la siguiente imagen:




Cualquier duda quedo a disposición.

Saludos
87
Necesito un ejemplo para saber como tomo los valores de una entrada anogica 4 - 20 con el jamper j3 colocado. POr ejemplo que cuando tenga 4 sea un 0 y cuando tenga 20 mili ampers me de 100 o 1000. Y cada cuanto tiempo conviene ir tomando ese valor.
88
StxLadder - Slicetex Ladder Designer Studio / Re:Esquema básico salidas relé temporizadas
« Último mensaje por Sidaep septiembre 19, 2017, 11:27:45 am »
Muchas gracias!
89
StxLadder - Slicetex Ladder Designer Studio / Re:Esquema básico salidas relé temporizadas
« Último mensaje por Soporte septiembre 19, 2017, 10:57:33 am »
Buenos días,

Ningún problema, en el transcurso de esta semana le pasamos por este medio el ejemplo completo, con un diagrama de conexión de hardware para los reles y entrada del pulsador al PLC en su proyecto.

Saludos
90
STX8091 - Familia PLC Cube / Re:Comunicación Serial Rx problem (RS232)
« Último mensaje por Soporte septiembre 19, 2017, 10:45:55 am »
Buenos días,

La función SerialGetByte() retorna "-1" si no hay datos en el buffer de recepción, por lo tanto, estarías enviando constantemente datos incorrectos con SerialSendByte() en el código que pasas. Ver manual STX80XX-MP-PLC-AX_CX_DX.pdf, pág. 196.

Por otro lado, como lo pones adentro de un "loop", se llama constantemente a SerialSendByte() más rápido de lo que la velocidad del puerto serie puede transmitir, por lo tanto se sobreescribe el buffer de salida, antes de que los bytes puedan transmitirse.

Proba el siguiente código:

Código: (Pawn) [Seleccionar]

// Variable para almacenar bytes recibidos.
new RxByte

 // Inicializar puerto serie, 9600 bps, 8N1.
 SerialInit(9600)

 // Loop principal del programa.
 while(1)
 {
    // Comprobar si hay datos recibidos en el puerto serie, obtener byte.
    if((RxByte = SerialGetByte()) != -1)
    {
       // Enviar byte recibido.
       SerialSendByte(RxByte)
       
       // Conmutar led DEBUG.
       LedToggle()
    }
 }

También otra forma es utilizando un evento, que solo se llame al evento de recepción si hay bytes pendientes, independiente del programa principal:

Código: (Pawn) [Seleccionar]

// Variable para almacenar byte recibido.
new RxByte

PlcMain()
{
   // Inicializar puerto serie, 9600 bps, 8N1.
   SerialInit(9600)

   // Crear evento Serial Rx Event para cada byte recibido
   SerialRxSetEvent(1)

   // Loop principal del programa.
   while(1)
   {
      // Solo crear un retardo de 250 mS
      // Se puede hacer cualquier otra lógica aquí adentro.
      DelayMS(250)
      LedToggle()
   }
}

// ***************************************************************************
// OnSerialRx(): Esta función se llama cuando ocurre el evento OnSerialRx al recibir bytes
// ***************************************************************************

@OnSerialRx()
{
   // Obtener todos los bytes recibidos del buffer
   // Solo salir cuando se lean todos los bytes en buffer.
   while((RxByte = SerialGetByte()) != -1)
   {
      // Enviar el byte recibido de vuelta al puerto serie, salida.
      SerialSendByte(RxByte)
   }
}

La ventaja de los eventos, es que no ocupas el programa principal en verificar si llegaron bytes, lo manejas en el momento en que llegan.

Quedamos a disposición.
Páginas: 1 ... 7 8 [9] 10