Actualizar Relays en Modo DAQ

  • 3 Respuestas
  • 5003 Vistas

MatiasG

  • Novato
  • *
  • Mensajes: 7
Actualizar Relays en Modo DAQ
« : abril 25, 2012, 01:56:19 am »
Buenas, estoy iniciandome con la placa en modo DAQ, tengo en un list con el estado que quiero que tenga cada uno de los 8 relay.
He realizado un if para cada relay (aqui pego el codigo de los 1eros 2, pero se repite para todos).

Mi codigo es mas o menos asi:

  if ((list[2][0].Equals("1")) && (PioBoard.Cmd.Relay.CheckIfClose(RelayStatus, Relays.Relay1) != true))
                {
                    MessageBox.Show("Relay1");
                    CmdStat = PioBoard.Cmd.Relay.Toggle(Relays.Relay1);
                    if (CmdStat != SendStat.Success)
                    {
                        MessageBox.Show(CmdStat.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                if (list[2][1].Equals("1") && (PioBoard.Cmd.Relay.CheckIfClose(RelayStatus, Relays.Relay2) != true))
                {
                    if (list[2][1].Equals("1")) MessageBox.Show(list[2][1]);
                    if ((PioBoard.Cmd.Relay.CheckIfClose(RelayStatus, Relays.Relay2) != true)) MessageBox.Show("2");
                    CmdStat1 = PioBoard.Cmd.Relay.Toggle(Relays.Relay2);
                    if (CmdStat1 != SendStat.Success)
                    {
                        MessageBox.Show(CmdStat1.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
              
Cuando intento grabar el segundo relay, obtengo el siguiente mensaje:

"Sólo se permite un uso de cada dirección de socket"
Alguna idea que puede estar pasando?
« Última Modificación: julio 18, 2012, 23:21:16 pm por admin »

Boris Estudiez

  • Novato
  • *
  • Mensajes: 12
Re: Q
« Respuesta #1 : abril 25, 2012, 12:56:47 pm »
Buenas Matias,

Ese error suele ocurrir cuando hay dos o mas instancias del programa tratando de acceder
al mismo tiempo a una conexion a la placa.

Tambien puede ocurrir que tengas abierto otra aplicacion que este haciendo
uso de la conexion mientras envias los comandos.

Podes confirmarme si desde otra parte del programa no estas realizando una
conexion o enviando un comando a la placa cuando ejecutas estas rutinas ?.

Saludos

MatiasG

  • Novato
  • *
  • Mensajes: 7
Re: Q
« Respuesta #2 : abril 25, 2012, 13:16:48 pm »
La parte del codigo se ejecuta cada 300 ms en un while, leyendo modificaciones en un archivo y cargandolo en el list. Es posible que cuando se indica que cambie el valor del Relay1, todavia no respondio y ya se solicita cambios al Relay2?

Ademas he realizado instanciación para escuchar en segundo plano cambios en las entradas. "digitales.PioBoard.Cmd.Din.InformChanges(true)"

Boris Estudiez

  • Novato
  • *
  • Mensajes: 12
Re: Q
« Respuesta #3 : abril 25, 2012, 14:00:30 pm »
La parte del while() no es problema, ya que el codigo se bloquea al enviar cada comando para esperar su
respuesta. Por lo tanto, el comando siguiente se realiza cuando termino el primero.

Como prueba, realize el siguiente codigo que envia 1000 veces 8 comandos para cerrar los
relays (sin delay), y no da problemas:

        private void button1_Click(object sender, EventArgs e)
        {
            SendStat CmdStat = SendStat.Success;

            MessageBox.Show("INICIO: Puede tardar unos segundos...");

            for (int i = 0; i < 1000; i++)
            {
                if ((CmdStat = PioBoard.Cmd.Relay.Close(Relays.Relay1)) != SendStat.Success)
                {
                    MessageBox.Show(CmdStat.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if ((CmdStat = PioBoard.Cmd.Relay.Close(Relays.Relay2)) != SendStat.Success)
                {
                    MessageBox.Show(CmdStat.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if ((CmdStat = PioBoard.Cmd.Relay.Close(Relays.Relay3)) != SendStat.Success)
                {
                    MessageBox.Show(CmdStat.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if ((CmdStat = PioBoard.Cmd.Relay.Close(Relays.Relay4)) != SendStat.Success)
                {
                    MessageBox.Show(CmdStat.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if ((CmdStat = PioBoard.Cmd.Relay.Close(Relays.Relay5)) != SendStat.Success)
                {
                    MessageBox.Show(CmdStat.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if ((CmdStat = PioBoard.Cmd.Relay.Close(Relays.Relay6)) != SendStat.Success)
                {
                    MessageBox.Show(CmdStat.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if ((CmdStat = PioBoard.Cmd.Relay.Close(Relays.Relay7)) != SendStat.Success)
                {
                    MessageBox.Show(CmdStat.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if ((CmdStat = PioBoard.Cmd.Relay.Close(Relays.Relay8)) != SendStat.Success)
                {
                    MessageBox.Show(CmdStat.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

            MessageBox.Show("FIN");
        }
    }

Fijate desabilitando todo codigo que (excepto la parte de los reles) y comproba si continua el error.

Si podes, enviame el proyecto completo a mi email (solo el programa que da error), asi lo pruebo y
analizo mejor.

Saludos, Boris.-