Hemos agregado recientemente un nuevo método que le estaba faltando a TAS-HMITalk y que venía siendo sugerido y solicitado por varios de nuestros clientes. Se trata de una variante del método Trigger, que se utiliza habitualmente para disparar manualmente una comunicación, con la diferencia de que TriggerAndWait no retorna el control a la aplicación que lo llama hasta que la comunicación que se haya iniciado haya finalizado, ya sea exitosamente o por algún tipo de error.
Este método permite implementar de manera más sencilla estrategias donde varios objetos deben comunicarse de manera secuencial y encadenada. Hasta el momento, mantener el sincronismo en el disparo de varios objetos se lograba mediante semáforos y llamadas desde los eventos de terminación de la comunicación.
Como ejemplo de uso del nuevo método TriggerAndWait, mostramos este extracto de código que corresponde a un botón que dispara la lectura de un relé de protección y muesra sus datos en un listbox. El código está escrito en C# con Visual Studio.NET 2005:
private void button1_Click(object sender, EventArgs e)
{
axHMITalk1.CommPort = HMITalkLib.enumCommPort.COM1;
axHMITalk1.CommBaudRate = HMITalkLib.enumCommBaudRate._19200_Bauds;
axHMITalk1.CommParity = HMITalkLib.enumCommParity.None;
axHMITalk1.CommDataBits = HMITalkLib.enumCommDataBits._8_Bits;
axHMITalk1.CommStopBits = HMITalkLib.enumCommStopBits._1_Bit;
axHMITalk1.DriverP0 = "1"; // Numero de rele
if (axHMITalk1.TriggerAndWait()) // Se dispara la lectura y si resulta exitosa, se muestran los valores recibidos
{
listBox1.Items.Clear();
listBox1.Items.Add("Numero de Rele: " + axHMITalk1.DriverP0);
listBox1.Items.Add("Eventos disponibles (0=No/1=Sí): " + axHMITalk1.get_PointValue(5).ToString());
listBox1.Items.Add("Alarma declarada (0=No/1=Sí): " + axHMITalk1.get_PointValue(6).ToString());
listBox1.Items.Add("Disparado (0=No/1=Sí): " + axHMITalk1.get_PointValue(7).ToString());
listBox1.Items.Add("Relay 0 (0=No/1=Sí): " + axHMITalk1.get_PointValue(50).ToString());
listBox1.Items.Add("Relay 1 (0=No/1=Sí): " + axHMITalk1.get_PointValue(51).ToString());
listBox1.Items.Add("Relay 2 (0=No/1=Sí): " + axHMITalk1.get_PointValue(52).ToString());
listBox1.Items.Add("Relay 3 (0=No/1=Sí): " + axHMITalk1.get_PointValue(53).ToString());
listBox1.Items.Add("Relay 4 (0=No/1=Sí): " + axHMITalk1.get_PointValue(54).ToString());
listBox1.Items.Add("Relay 5 (0=No/1=Sí): " + axHMITalk1.get_PointValue(55).ToString());
listBox1.Items.Add("Relay 6 (0=No/1=Sí): " + axHMITalk1.get_PointValue(56).ToString());
listBox1.Items.Add("Relay 7 (0=No/1=Sí): " + axHMITalk1.get_PointValue(57).ToString());
listBox1.Items.Add("Corriente en fase A [I0 en Amp]: " + axHMITalk1.get_PointValue(94).ToString());
listBox1.Items.Add("Corriente en fase B [I1 en Amp]: " + axHMITalk1.get_PointValue(95).ToString());
listBox1.Items.Add("Corriente en fase C [I2 en Amp]: " + axHMITalk1.get_PointValue(96).ToString());
listBox1.Items.Add("Corriente en fase N [IN en Amp]: " + axHMITalk1.get_PointValue(90).ToString());
listBox1.Items.Add("Frecuencia [Hertz]: " + axHMITalk1.get_PointValue(8).ToString());
listBox1.Items.Add("Cantidad de operaciones del relay: " + axHMITalk1.get_PointValue(122).ToString());
listBox1.Items.Add("Tensión en fase A [V0 en Volts]: " + axHMITalk1.get_PointValue(104).ToString());
listBox1.Items.Add("Tensión en fase B [V1 en Volts]: " + axHMITalk1.get_PointValue(105).ToString());
listBox1.Items.Add("Tensión en fase C [V2 en Volts]: " + axHMITalk1.get_PointValue(106).ToString());
listBox1.Items.Add("Tensión en fase N [VN en Volts]: " + axHMITalk1.get_PointValue(100).ToString());
}
else MessageBox.Show("Se produjo el siguiente error durante la lectura: " + axHMITalk1.DriverStatus);
}