static void TagValueUpdated(ICommon.ITag sender, ICommon.TagValueUpdateEventArgs e) { LogixUDT logixUDT = sender as LogixUDT; if (logixUDT != null) { PrintStructure(logixUDT); } }
static void TagValueUpdated(ICommon.ITag sender, ICommon.TagValueUpdateEventArgs e) { LogixUDT udtTag = sender as LogixUDT; if (udtTag != null) { PrintStructure(udtTag); } }
static void TagValueUpdated(ICommon.ITag sender, ICommon.TagValueUpdateEventArgs e) { //Here we'll just display the name of the tag and that it was updated. If you //want to extract the value you'll have to cast it to the correct type. You //can do this by using a switch as shown below. Console.WriteLine("Tag " + e.Tag.Address + " Updated"); switch (((LogixTag)sender).LogixType) { case LogixTypes.Bool: Console.WriteLine("New value is: " + ((LogixBOOL)sender).Value.ToString()); break; case LogixTypes.Control: //The control tag is a lot more complicated, there is no way currently to know //which member was updated, so all you can do is say it was updated, we'll print //out one of the members though. Console.WriteLine("New value is: " + ((LogixCONTROL)sender).POS.ToString()); break; case LogixTypes.Counter: //Same as the counter above, we'll just print out the ACC value Console.WriteLine("New ACC value is: " + ((LogixCOUNTER)sender).ACC.ToString()); break; case LogixTypes.DInt: //Print out the value. DINT's are equivalent to int in .NET Console.WriteLine("New DINT value is: " + ((LogixDINT)sender).Value.ToString()); break; case LogixTypes.Int: //An INT in a logix processor is more like a short in .NET Console.WriteLine("New INT value is: " + ((LogixINT)sender).Value.ToString()); break; case LogixTypes.LInt: //LINT's are equivalent to long in .NET Console.WriteLine("New LINT value is: " + ((LogixLINT)sender).Value.ToString()); break; case LogixTypes.Real: //REALs are single precision floats Console.WriteLine("New REAL value is: " + ((LogixREAL)sender).Value.ToString()); break; case LogixTypes.SInt: //SINTs are signed bytes Console.WriteLine("New SINT value is: " + ((LogixSINT)sender).Value.ToString()); break; case LogixTypes.String: //Strings are just like .NET strings, so notice how we can skip the .StringValue //member, since the .ToString() will automatically be called, which returns the //same value as .StringValue Console.WriteLine("New STRING value is: " + ((LogixSTRING)sender)); break; case LogixTypes.Timer: //Timers again are like the CONTROL and COUNTER types Console.WriteLine("New Timer.ACC value is: " + ((LogixTIMER)sender).ACC.ToString()); break; case LogixTypes.User_Defined: //The only way to get the value out of a UDT, PDT, or MDT is to define the //structure or know the member name you wish to read. We'll just print that //we know its a UDT, MDT, or PDT that changed. Console.WriteLine("The user defined type has changed"); break; default: break; } }