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