Usar funciones pBool mediante variables

  • 3 Respuestas
  • 2341 Vistas

PabloS

  • Novato
  • *
  • Mensajes: 18
Usar funciones pBool mediante variables
« : agosto 26, 2013, 01:50:57 am »
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.
« Última Modificación: agosto 26, 2013, 01:54:01 am por PabloS »

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2032
  • Soporte Técnico
Re: Usar funciones pBool mediante variables
« Respuesta #1 : agosto 26, 2013, 14:11:54 pm »
Podes probar lo siguiente:

Código: [Seleccionar]
for(new n = 0; n < 8; n++)
{
// DIN1 empieza en direccion 0.
gai_DinAll[n+1] = pBoolRead(gb_DIN1+n)
}

Donde gai_DinAll es un array Int32 de 9 elementos.

La variable gb_DIN1 tiene la dirección 0 en memoria de periféricos. Las siguientes entradas discretas
le siguen en numeración ascendente.

Luego podes leer el estado de las entradas desde gai_DinAll, donde gai_DinAll[1] es la entrada DIN1, gai_DinAll[2] la DIN2 ...

Otra forma, es almacenar las entradas en diferentes bits dentro de un solo entero Int32 (para ahorrar memoria RAM).
Supongamos que gi_DinStat es una variable Int32.

Podes hacer:

Código: [Seleccionar]
for(new i = 0; n < 8; n++)
{
        // Leer entrada discreta.
        if(pBoolRead(gb_DIN1+n))
        {
           // Si es "1", escribir "1" en bit n+1 de gi_DinStat.
  BitSet(gi_DinStat, n+1)
        }
        else
        {
           // Si es "0", escribir "0" en bit n+1 de gi_DinStat.
           BitClr(gi_DinStat, n+1)
        }
}

Luego podes leer cada bit de gi_DinStat con xBitRead(gi_DinStat, 1) para la entrada DIN1.

Te adjunto un proyecto de ejemplo llamado ReadAllDiscretes.zip en StxLadder para el primer caso que solicitas.

Cualquier duda avísanos.
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com

PabloS

  • Novato
  • *
  • Mensajes: 18
Re: Usar funciones pBool mediante variables
« Respuesta #2 : agosto 26, 2013, 14:48:30 pm »
Es justo lo que necesitaba.

Y tanto la primera como la segunda opción me sirven. Ya que estoy tratando de armar un HMI en C#, y con cualquiera de los 2 ejemplos puedo transmitir, de una sola vez, el estado actual de relay o entradas.

Otra vez gracias por la buena predisposición.

Soporte

  • Global Moderator
  • Experto
  • *****
  • Mensajes: 2032
  • Soporte Técnico
Re: Usar funciones pBool mediante variables
« Respuesta #3 : agosto 26, 2013, 16:38:20 pm »
Si esa es la aplicacion, otra forma mas rapida es:

gi_DinState = DinRead()

DinRead() se describe en el Manual de Programacion Pawn y devuelve es estado de todas las entradas discretas (bit 0 = DIN1, bit 1 = DIN2, etc).

Pero a diferencia de las anteriores, es un metodo de acceso directo que significa que no toma
el valor de la memoria de periferico (que se actualiza en cada SCAN CYCLE) sino directamete del hardware.

Por lo tanto, tene en cuenta que si utilizas componentes o funciones que toman el valor de la memoria
de perifericos, se actualizan menos rapido que el valor que tomes con esta funcion (ya que dependen del SCAN CYCLE).

Pero si lo transmitis solamente, es lo mismo y no utilizas el ciclo for().

PD: Para los reles podes utilizar gi_RelayState = RelayGetState().

Saludos
« Última Modificación: agosto 26, 2013, 17:01:15 pm por Soporte »
SOPORTE TÉCNICO

Slicetex Electronics
www.slicetex.com