Random para lenguaje Pawn

  • 8 Respuestas
  • 486 Vistas

MaxiG

  • Novato
  • *
  • Mensajes: 4
Random para lenguaje Pawn
« : septiembre 28, 2016, 20:12:52 pm »
Alguien sabe como crear un numero al azar? necesito prender salidas del plc al azar para un juego, pero probe varias formas del lenguaje y me dice que "random" no es valido
saludos!!

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1722
  • Soporte Técnico
Re:Random para lenguaje Pawn
« Respuesta #1 : septiembre 29, 2016, 11:32:08 am »
Buenos días,

No hay implementada una función random() actualmente, podría ver de implementarla e incorporarla en una actualización de firmware.

Decime, ¿necesitas un numero cualquiera y luego lo adaptas a un valor de salida por tu cuenta?.
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1722
  • Soporte Técnico
Re:Random para lenguaje Pawn
« Respuesta #2 : septiembre 30, 2016, 21:24:30 pm »
Buenas tardes Maximiliano,

Ya tengo implementadas funciones Random() para generar números pseudo aleatorios, ¿te interesa usar dicha función?.

Saludos
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

MaxiG

  • Novato
  • *
  • Mensajes: 4
Re:Random para lenguaje Pawn
« Respuesta #3 : septiembre 30, 2016, 21:31:38 pm »
Buenas noches !! Mi idea principal era activar las salidas llamándolos con una variable string con su nombre y ir variando el numero aleatoriamente. Pero después probé y no lo pude realizar ya que el programa no reconoce la función de activar tal variable string .. sería posible con condicionales obvio. Tal vez use swicht .. pero ya voy entendiendo bastante. como puedo utilizar ramdom ahora?
Muchas gracias por tu tiempo

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1722
  • Soporte Técnico
Re:Random para lenguaje Pawn
« Respuesta #4 : septiembre 30, 2016, 21:47:33 pm »
Buenas noches,

Acabo de implementarlas, aún tengo que subir la actualización al sitio web, tanto de firmware para el PLC, como para el entorno StxLadder.

Calcula que entre Lunes o Martes de la semana que viene, podría estar subiendo las actualizaciones para que las bajes y puedas usarlas, ya que de paso se agregan otras cosas nuevas.

La función que implementé, se llama RandomRange(Min, Max), y te devuelve un número aleatorio entre Min y Max, que podes
utilizar para comandar tus salidas.

Te aviso por este medio cuando este listo para descargar la actualización en el sitio web y de paso te doy un ejemplo.

Saludos


« Última Modificación: septiembre 30, 2016, 21:55:06 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

MaxiG

  • Novato
  • *
  • Mensajes: 4
Re:Random para lenguaje Pawn
« Respuesta #5 : septiembre 30, 2016, 21:56:34 pm »
 ;D ;D ;D ;D Muchísimas gracias !!!!

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1722
  • Soporte Técnico
Re:Random para lenguaje Pawn
« Respuesta #6 : octubre 04, 2016, 12:13:08 pm »
Buenos días Maximiliano,

Te paso los links así actualizas StxLadder a la versión 1.7.9 que soporta números aleatorios:

http://www.slicetex.com/ladder/soft/old/StxLadder-Setup-1.7.9.zip

En el caso del PLC, debes actualizar el firmware a la version 204:

http://www.slicetex.com/hw/stx8092/soft.html

Podes leer este documento para la actualización de firmware:

http://www.slicetex.com/ladder/docs/files/STXLADDER-FU.pdf



Adjunto te paso un ejemplo para usar las funciones Ramdom().

El ejemplo genera secuencias de números pseudo-aleatorios y las muestra en VirtualHMI.

Conectar VirtualHMI al PLC, tocar botón "ON" en VirtualHMI para conectarse, y esperar la secuencia de números que se imprimirán en la pantalla LCD de VirtualHMI, cambiando cada 3 segundos.



Las funciones disponibles son:

RandomSeed(Seed) = Establece una semilla (Seed) para generar una nueva secuencia de números pseudo-aleatorios. Debe llamarse antes de generar números con las funciones Ramdom. Si la semilla es diferente, cada secuencia de N números generados por las funciones Random será diferente, de lo contrario, serán secuencias iguales.

Ejemplo:

El siguiente ejemplo genera dos secuencias de 10 números aleatorios diferentes, ya que se utilizan dos semillas diferentes antes de la generacion de cada secuencia.

Código: [Seleccionar]

      new NumbersA[10]
      new NumbersB[10]

      // Inicializar semilla.
      RandomSeed(1)
   
      // Generar secuencia de 10 números aleatorios.
      for(new i=0; i < 10; i++)
      {
         // Generar un numero entre 0 y 1000.         
         NumbersA[i] = Random(1000)
      }

      // Inicializar semilla con otro valor.
      RandomSeed(2)
   
      // Generar secuencia de 10 números aleatorios.
      for(new i=0; i < 10; i++)
      {
         // Generar un numero entre 0 y 1000.         
         NumbersB[i] = Random(1000)
      }


Una semilla diferente puede obtenerse leyendo la hora/fecha en segundos con la función RtcGetTimestamp(), pero este numero cambia cada 1 segundo. De la misma manera, la función TimeGetTickCount() devuelve un numero entero diferente cada 10 mS. Ambas funciones pueden usarse como semillas, si las secuencias generadas pueden estar a intervalos mayores a los tiempos descriptos. De lo contrario, deben buscarse métodos alternativos para generar semillas.



RandomRange(Min, Max) = Genera un numero pseudo-aleatorio entre el rango Min y Max. Donde Max es igual o mayor a Min.

Ejemplo:

El siguiente ejemplo genera una secuencia de 10 números aleatorios diferentes.

Código: [Seleccionar]

      new Numbers[10]

      // Inicializar semilla.
      RandomSeed(TimeGetTickCount() + RtcGetTimestamp())
   
      // Generar secuencia de 10 números aleatorios.
      for(new i=0; i < 10; i++)
      {
         // Generar un numero entre 0 y 1000.         
         Numbers[i] = RandomRange(0, 1000)
      }




Random(Max) = Genera un numero pseudo-aleatorio entre el rango 0 y Max.

Ejemplo:

El siguiente ejemplo genera una secuencia de 10 números aleatorios diferentes.

Código: [Seleccionar]

      new Numbers[10]

      // Inicializar semilla.
      RandomSeed(TimeGetTickCount() + RtcGetTimestamp())
   
      // Generar secuencia de 10 números aleatorios.
      for(new i=0; i < 10; i++)
      {
         // Generar un numero entre 0 y 1000.         
         Numbers[i] = Random(1000)
      }


Nota: También existe la función random(Max), que genera números entre el rango 0 y Max-1.



RandomR() = Genera un numero pseudo-aleatorio entre el rango 0 y la constante MATH_RAND_MAX (2147483647).

Esta función a diferencia de RandomRange(), Random() y random(), es mas rápida en cuanto a velocidad para generar el numero aleatorio, y puede ser utilizada en situaciones donde se deban generar grandes cantidades de números aleatorios por secuencia.

Ejemplo:

El siguiente ejemplo genera una secuencia de 10 números aleatorios diferentes.

Código: [Seleccionar]

      new Numbers[10]

      // Inicializar semilla.
      RandomSeed(TimeGetTickCount() + RtcGetTimestamp())
   
      // Generar secuencia de 10 números aleatorios.
      for(new i=0; i < 10; i++)
      {
         // Generar un numero entre 0 y MATH_RAND_MAX .         
         Numbers[i] = RandomR()
      }




Saludos, quedamos a disposición por cualquier duda.






SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

MaxiG

  • Novato
  • *
  • Mensajes: 4
Re:Random para lenguaje Pawn
« Respuesta #7 : octubre 04, 2016, 17:04:34 pm »
Buenisimo! muchas gracias por actualizarlo! una consulta mas, hay alguna forma de realizar esto?

Numero = Random(1000)
new string Salida = "EDOUT"+ Convertir string(Numero)
Stx570_DoutSet(0, "Salida") 

Saludos!!

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 1722
  • Soporte Técnico
Re:Random para lenguaje Pawn
« Respuesta #8 : octubre 04, 2016, 18:45:10 pm »
Buenas tardes,

No, si te fijas, el argumento Dout la función Stx570_DoutSet(Addr, Dout) es un valor numérico. No le podes pasar una cadena.

Fijate que las constantes EDOUT1...EDOUT8 tienen valores que "prenden" el bit de la salida correspondiente.

Por ejemplo EDOUT1 es en binario 00000001 (el bit numero 0), EDOUT2 es 00000010 (el bit numero 1)...y así. Podes ver la tabla completa en STX570-UM.pdf, página 13.

Entonces, lo que debes hacer es para prender y apagar las salidas, es generar un numero entre 0 y 255 (que son las posibilidades de un numero de 8 bits).

Para ello utiliza Stx570_DoutWrite(Addr, DoutValue), que apaga las salidas con valor de bit=0 y prende las salidas con valor de bit=1.

Ejemplo:

Código: (Pawn) [Seleccionar]

new ValorDeSalidas

// Obtener numero entre 0 y 255
ValorDeSalidas = Random(255)

// Escribir salidas.
Stx570_DoutWrite(0, ValorDeSalidas)


Recorda que debes usar una semilla con RandomSeed() por cada secuencia.

Por ejemplo, podes modificar la secuencia, cada 10 números aleatorios que generas asi:

Código: (Pawn) [Seleccionar]

new ValorDeSalidas

while(1)
{
      // Inicializar semilla.
      RandomSeed(TimeGetTickCount() + RtcGetTimestamp())
   
      // Generar secuencia de 10 números aleatorios.
      for(new i=0; i < 10; i++)
      {
            // Obtener numero entre 0 y 255
           ValorDeSalidas = Random(255)

          // Escribir salidas.
          Stx570_DoutWrite(0, ValorDeSalidas)

          // Pausar 5 segundos.
          DelayS(5)
      }
}

Saludos
« Última Modificación: octubre 04, 2016, 18:48:00 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com