2015-02-08 3 views
2

Я использую C++ dll в моем проекте C# для управления линейной осью для научного проекта. Я должен за короткое время нарисовать положение оси и моторного тока. Ось подключается к компьютеру по локальной сети. Это DllImport для функции отправки команды на ось.C# Хотя цикл с разными временами выполнения

 [DllImport("Axis3.dll", EntryPoint = "sendCommand", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl, SetLastError = true)] 
     protected static extern int m_pSendCommand(StringBuilder pcStr, StringBuilder pcRet, bool bReadLine, int iTimeOut, int iConnectionNumber); 

Во время перемещения оси я использую время цикла для считывания положения и motorcurrent и записать их в список для графа.

private void CollectCurrentAndPositionContinous() 
     { 
      bool boolAxisIsMoving; 
      if (AxisIsMoving(out boolAxisIsMoving, numberofController) == 0) 
      { 
       while (boolAxisIsMoving == true) 
       { 
        if (AxisIsMoving(out boolAxisIsMoving, numberofController) != 0) 
        { 
         break; 
        } 
        CollectCurrentAndPosition(); 
       } 
      } 
     } 

     private void CollectCurrentAndPosition() 
     { 
      string returnText; 
      int errorNumber = GetPositionandCurrent(out returnText); 
      if (errorNumber == 0) 
      { 
       if (zedDiagram.GraphPane.CurveList.Count <= 0) //make sure that the curvelist has at least one curve 
        return; 

       LineItem curveCurrent = zedDiagram.GraphPane.CurveList[0] as LineItem; //Get the first CurveItem in the graph 
       if (curveCurrent == null) 
       { return; } 


       IPointListEdit list = curveCurrent.Points as IPointListEdit; // Get the PointPairList 

       if (list == null)// If this is null, it means the reference at curve.Points does not support IPointListEdit, so we won't be able to modify it 
       { return; } 

       string[] returnTextSplit = returnText.Split(new Char[] { ' ' }); //splits the returntext at space char 
       double position = ConvertStringToDouble(returnTextSplit[0]); 
       double currentA = ConvertStringToDouble(returnTextSplit[1]); 
       double currentB = ConvertStringToDouble(returnTextSplit[2]); 
       list.Add(position, currentA); 
      } 
      else 
      {DisplayText(ErrorText(errorNumber));} 
     } 

     private int GetPositionandCurrent(out string o_returnText) 
     { 
      double position = 0.0; 
      Venus3Wrapper.GetPosition(1, ref position, numberofController); 
      int errorNumber = SendCommand("1 gc" + System.Environment.NewLine, out o_returnText, true, 50, numberofController); 
      o_returnText = position.ToString(en.NumberFormat) + " " + o_returnText; 
      return errorNumber; 
     } 

Моя проблема в том, что между сохраненными данными существуют большие разницы во времени. Две точки сохраняются в 5 мс, а затем между соседними двумя точками пробел составляет 100 мс. Я даже запускаю эту функцию в своем потоке и перерисовываю диаграмму только каждую секунду, но разрыв остается. Может кто-нибудь, пожалуйста, дайте мне подсказку, как я могу получить более регулярное решение?

+0

Если вы только регистрируетесь, вы можете отправлять временные метки вместе с данными о оси и не использовать время вашего ПК. – BitTickler

+0

Я отредактировал свою программу, чтобы использовать errornumber. И благодаря подсказке с буфером TCP/IP я обнаружил ошибку. Возникла проблема с сообщениями ACK с моего ПК. Они не отправлялись за каждое второе сообщение от моего контроллера. Как я протестировал свою скомпилированную программу на втором ПК, она отлично работала. Поэтому я снова тестировал его на своем ПК, и он тоже работал. Оказалось, что я использовал опцию release в Visual Studio, которую загружала программа debug. По-видимому, проблема связана с TCP/IP.Но, как работает релиз, это меня не беспокоит. Спасибо за быструю помощь. – Crimper

ответ

0

m_pSendCommand(), кажется, возвращает код ошибки, вы получите этот код ошибки и идти через проблему на самом деле возвращения его из GetPositionandCurrent(), а затем перейти к полностью игнорировать его, лишь выполняя тело вашего основного if заявления, если код ошибки равен 0 и игнорирует его в противном случае.

Это рецепт катастрофы. Если что-то в сообщении между вашим кодом и устройством выходит из строя, m_pSendCommand() может пытаться вас рассказать, но вы не обращаете на него внимания. Это может объяснить пробелы.

+0

Вы правы. Я создам рабочую проверку на наличие ошибки и посмотрю, есть ли проблема. – Crimper

1

Моей рекомендацией было бы пересмотреть протокол между вашим устройством и ПК. Хотя мне не удалось найти аспект времени в любом месте кода в OP, мне кажется, что способ, описанный ниже, может решить проблемы.

ПК-> Прибор: начните отслеживать двигатель/ось (независимо) данные.
Устройство-> ПК: пакеты с накопленными измерениями, каждый из которых выглядит примерно так ...
{TimeStamp, Values ​​[]}.

Здесь 2 случая использования. 1. Сохраните данные для последующего анализа. 2. Настройте данные. Если у вас есть высокочастотные данные, никто не заметит разницы, если вы отправляете одно значение на пакет (неэффективно), или если вы собираете кучу точек данных и отправляете их в пакет с достаточно большим размером.

Ось x для вашей графики не будет иметь связи и сбора мусора, а также джиттера общего доступа к компьютеру, а не в реальном времени, и вы можете позже сделать больше с данными на этапах анализа, поскольку метка времени, отправленная с устройства более надежна, чем временные метки, производимые на стороне ПК.

«Разрывы» в ваших данных могут, на боковой ноте, также вытекать из алгоритма nagle, если вы используете TCP/IP для своих коммуникаций, и вы пишете одиночные значения на стороне устройства. Если я правильно помню, nagle имеет тайм-аут 100 мс ... собирать данные для следующего пакета на некоторое время перед отправкой. Это также может объяснить то, что вы видите.

+0

dll от производителя оси. Я не знаю, как это работает внутри страны. Но подсказка с таймаутом TCP/IP может быть чем-то – Crimper

+0

На самом деле, да, инструкция «Ось подключается к моему компьютеру через локальную сеть» - очень хороший совет, что проблема может быть именно такой: TCP/IP на ожидании устройства для сбора большего количества байтов перед отправкой пакета. –

Смежные вопросы