09-19-2011 06:30 AM
Hi,
I am trying to trasfer AnalogWaveform<double> via network variable. But i could not understand the timestamp behavior.
On server side i do follow.
for (inti = 0; i < data.Length; i++)
{
data[i] = amplitude * (Math.Sin(2 * i * Math.PI * frequency / 1000)) + rnd.NextDouble() * 0.1;
}
AnalogWaveform<double> waveform = AnalogWaveform<double>.FromArray1D(data);
waveform.Timing =WaveformTiming.CreateWithRegularInterval(newTimeSpan(10000000), newDateTime(0), newTimeSpan(0));
waveform.UnitDescription ="dBm";
_val_write.WriteValue(waveform);
waveformGraph2.PlotWaveform(waveform); //plot for test
I see on graph correct plot (what I expected). Plot with some noise and time from 0 to 1000.
But on client side I got the plot with time started from 1 hour (3600 sec) but not from 0. Why?
void val_subscriber_DataUpdated(object sender, DataUpdatedEventArgs<AnalogWaveform<double>> e)
{
AnalogWaveform<double> waveform;
if(e.Data.HasValue)
{
waveform = e.Data.GetValue();
waveformGraph1.PlotWaveform(waveform);
Debug.WriteLine("waveform StartTime = "+ waveform.Timing.StartTime.ToString());
Debug.WriteLine("waveform TimeStamp = "+ waveform.Timing.TimeStamp.ToString());
Debug.WriteLine("waveform TimeOffset = "+ waveform.Timing.TimeOffset.ToString());
}
}
What I'd like to have.
On server side, data from ADC comes with some sampling rate. The server make some calculation with this array of data and sends to client. The client only shows this data via time, nothing more. Time starts every time from 0 with regular interval (sampling rate) is defined by server.
Thanks.
09-27-2011 12:59 PM
The code you have looks odd to me because my solution was to use an external database as a data repository and published current data as single points to network variables. When I went to plot I wrote a query to SQL Server for the data points on the plot that was ordered by channel and datetime. Data in the table consisted of channel name, a Datetime value and a Double (as float).
10-06-2011 06:08 AM
Dear people,
Some test of Network Shared Variables.
Time zone of computer GMT+1.
Part of code for test:
void val_subscriber_DataUpdated(object sender, DataUpdatedEventArgs<AnalogWaveform<double>> e)
{
AnalogWaveform<double> waveform;
if (e.Data.HasValue)
{
waveform = e.Data.GetValue();
Debug.WriteLine("waveform StartTime = " + waveform.Timing.StartTime.ToString());
Debug.WriteLine("waveform TimeStamp = " + waveform.Timing.TimeStamp.ToString());
Debug.WriteLine("waveform TimeOffset = " + waveform.Timing.TimeOffset.ToString());
}
}
private void timer1_Tick(object sender, EventArgs e)
{
double frequency = 2;
double amplitude = 1;
double[] data = new double[1000];
Random rnd = new Random();
for (int i = 0; i < data.Length; ++i)
{
data[i] = amplitude * (Math.Sin(2 * i * Math.PI * frequency / 1000)) + rnd.NextDouble() * 0.1;
}
AnalogWaveform<double> waveform = AnalogWaveform<double>.FromArray1D(data);
waveform.Timing = WaveformTiming.CreateWithRegularInterval(new TimeSpan(10000000), new DateTime(0, DateTimeKind.Local), new TimeSpan(0));
Debug.WriteLine("Time local = " + waveform.Timing.StartTime.ToString());
val_writer.WriteValue(waveform);
}
Results:
1.
waveform.Timing = WaveformTiming.CreateWithRegularInterval(new TimeSpan(10000000), new DateTime(0, DateTimeKind.Local), new TimeSpan(0)); // 0 -> 0sec
Set StartTime = 01.01.0001 0:00:00
waveform StartTime = 01.01.0001 1:00:00
waveform TimeStamp = 01.01.0001 1:00:00
waveform TimeOffset = 00:00:00
2.
waveform.Timing = WaveformTiming.CreateWithRegularInterval(new TimeSpan(10000000), new DateTime(10000000, DateTimeKind.Local), new TimeSpan(0)); //10000000 -> 1sec
Set StartTime = 01.01.0001 0:00:01
waveform StartTime = 01.01.0001 1:00:00
waveform TimeStamp = 01.01.0001 1:00:00
waveform TimeOffset = 00:00:00
3.
waveform.Timing = WaveformTiming.CreateWithRegularInterval(new TimeSpan(10000000), new DateTime(36010000000, DateTimeKind.Local), new TimeSpan(0)); //36010000000 -> 1h and 1sec
Set StartTime = 01.01.0001 1:00:01
waveform StartTime = 01.01.0001 1:00:01
waveform TimeStamp = 01.01.0001 1:00:01
waveform TimeOffset = 00:00:00
4. Time zone of computer GMT.
waveform.Timing = WaveformTiming.CreateWithRegularInterval(new TimeSpan(10000000), new DateTime(0, DateTimeKind.Local), new TimeSpan(0));
Set StartTime = 01.01.0001 0:00:00
waveform StartTime = 01.01.0001 0:00:00
waveform TimeStamp = 01.01.0001 0:00:00
waveform TimeOffset = 00:00:00
How and where switch off the automatic convertation?
Or there is another way to transmit via network shared variables 0 datetime.