06-16-2014 02:19 AM
Bonjour,
Je vous expose mon probleme.
J'ai developpe une application sous Win7 et VS2010 environnement C# et wpf.
Je dois afficher une courbe en temps réel sur une periode d'une heure avec un nouveau point toutes les 100ms (soit max 36000).
J'utilise l'objet graph NI et je dois également afficher le temps sur l'axe des abcisses. les graph sont "databinder"
1er methode : J'ai utilser un analogWaveform mais au bout de 20000 points le rafraichissement commence a ralentir.
2eme methode : J'ai vu sur le site la page optimisation des graph donc je passe par un objet ChartCollectionAnalogWaveform. Je le dimensionne a 36000 et effectue un append toutes les 100ms
//ChartcollectionAnalogWaveform[] LengthCurveChart ; //toutes les 100 ms NationalInstruments.AnalogWaveform<double> __waveLength = new AnalogWaveform<double>(1); DateTime[] __time =new DateTime[1]; __waveLength.Timing = WaveformTiming.CreateWithRegularInterval(new TimeSpan(0, 0, 0, 0, 100), new DateTime(2000, 1, 1, 0, 0, 0)); LengthCurveChart[0].Append(__waveLength);
Mais sur cette derniere methode j'ai un plantage au bout de quelques minutes ("Tha data store was modified ... Buffer<DateTime>".
Je n'ai pas trouver d'exemple sur le net avec des chartCollectionAnalogWaveform et/ou des affichage avec l'horodatage en abcisses.
J'aimerais savoir comment faire quel objet ou quellle methode utiliser ?
Merci
Johan
06-16-2014 04:16 AM
Hello,
Tu es sur le forum "Discussions au sujet de NI LabVIEW". A priori, ton problème n'est pas lié à LabVIEW...
Donc je t'invite à poster ton problème sur ce forum, où tu trouveras surement plus d'aide:
http://forums.ni.com/t5/Discussions-au-sujet-des-autres/bd-p/4170
Ou alors l'un de ces forum, mais c'est en anglais:
http://forums.ni.com/t5/LabWindows-CVI/bd-p/180
http://forums.ni.com/t5/Measurement-Studio-for-VC/bd-p/231
06-16-2014 04:38 AM
Merci,
Je n'avais pas regardé c'est ca d'utiliser les favoris...
06-18-2014 06:23 AM
Hello,
Est-ce qu'il est possible d'avoir le message d'exception complet ainsi que le Call Stack ? 🙂
Au mieux, le code en l'état (le plus simple possible) ?
Sinon : la taille des données dans wavelength est-elle fixe ? Quel est le mode de rafraichissement du graphe (les échelles notamment) ?
Cdt
--Eric
Eric M. - Senior Software Engineer
Certified LabVIEW Architect - Certified LabVIEW Embedded Systems Developer - Certified LabWindows™/CVI Developer
Neosoft Technologies inc.
06-18-2014 07:21 AM
Bonjour;
Voici mon code au plus simple
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using AE3465_LO01.Class; using AE3465_LO01.View; namespace AE3465_LO01 { /// <summary> /// Logique d'interaction pour MainWindow.xaml /// </summary> public partial class MainWindow : Window { #region delegate delegate void _SetDateTimeHandler(); #endregion #region Privees private NationalInstruments.Controls.ChartCollectionAnalogWaveform<double>[] _CurvesTest; #endregion #region Contructeur public MainWindow() { InitializeComponent(); _CurvesTest = new NationalInstruments.Controls.ChartCollectionAnalogWaveform<double>[1]; _CurvesTest[0] = new NationalInstruments.Controls.ChartCollectionAnalogWaveform<double>(36000); graph1.DataSource = _CurvesTest; } #endregion #region Callback private void _TimerDateTime_Tick(Object stateInfo) { try { NationalInstruments.AnalogWaveform<double> __wave = new NationalInstruments.AnalogWaveform<double>(1); __wave.Timing = NationalInstruments.WaveformTiming.CreateWithRegularInterval(new TimeSpan(0, 0, 0, 0, 100), new DateTime(2000, 1, 1, 0, 0, 0).AddMilliseconds(_CurvesTest[0].Count * 100)); __wave.Samples[0].Value = new Random().NextDouble(); _CurvesTest[0].Append(__wave); } catch { } } #endregion #region Evenements Windows private void Window_Loaded(object sender, RoutedEventArgs e) { try { //Abonnements _TimerDateTime = new System.Threading.Timer(_TimerDateTime_Tick, null, 0, 100); } catch(Exception err) { MessageBox.Show(err.Message); } } #endregion } }
Voici l'exception que j'ai
Dans mon programme "reel", ce n'est pas un timer qui me permet le rafraichissement du graph mais un evenement sur nouvelle valeur SVE (cadence de la carte 1point /100ms).
Je viens juste constaté dans ce petit exemple que si j'augmente la periode de rafraichissement ca marche (pour le moment....).
J'ai effectué egalement un test avec la solution charting dans les exemples NI (Examples\WPF\Standard\charting), en mettant copiant 4 graphs et des chartcollectionanalogWaveform de (36000) pour avoir un temps reel sur la dernier heure au bout de 5h j'ai un plantage (plus de rafraichissement).
J'aimerais savoir quel sont les limites, sachant que je dois afficher 4 graphes qui contiennent chacun 3 courbes avec des points toutes les 100ms, et viusaliser la derniere heure (l'essai dur 24/48 h).
N'hesiter pas si vous voulez d'autres renseignements.
Cordialement,
Johan
06-18-2014 08:57 AM
En fait, je pensais à un zip contenant le code et capture d'écran...
Eric M. - Senior Software Engineer
Certified LabVIEW Architect - Certified LabVIEW Embedded Systems Developer - Certified LabWindows™/CVI Developer
Neosoft Technologies inc.
06-18-2014 09:42 AM
Voici,
Ci joint les sources epurées.
Cordialement
Johan