首先,我错误地看到串口上输出的数据不好。我看到了糟糕的数据,但实际上是来自INTEGER,而不是双打。然后,在做了一些测试之后,我注意到整数中的坏数据实际上并不是随机的,但实际上是科学记数法中的正确数据。
回到xAxis的课堂,并意识到我没有一个整数类型的重载方法,所以我试图通过一个圆孔推一个方形钉。
这一天一直让我发疯。基本上,我有一组静态双精度值,它们在传递给特定方法时会发生变化。
有问题的方法
long DriveController::GoToPositionX(
int pos, double accel, double decel, double velocity)
{
xAxis.ClearQue();
xAxis.AppendCmd(xAxisDriveId, "RS");
xAxis.AppendCmd(xAxisDriveId, "SP");
xAxis.AppendCmd(xAxisDriveId, "AC", accel);
xAxis.AppendCmd(xAxisDriveId, "DE", decel);
xAxis.AppendCmd(xAxisDriveId, "VE", velocity);
xAxis.AppendCmd(xAxisDriveId, "FP", pos);
xAxis.AppendCmd(xAxisDriveId, "IP");
xAxis.AppendCmd(xAxisDriveId, "IP");
return xAxis.ContinueQue();
}
变量声明:
long lLastError = ERROR_SUCCESS;
static double accel, decel, velocity, jogAccel, jogDecel, jogVelocity;
static int absPosMAHI, absPosSAGNAC, absPosSutter, absPosHICO;
char portNum[16] = {NULL};
static DriveController driveController;
static INIReadWrite configIni;
调用该函数:
case IDB_FP_MAHI:
driveController.GoToPositionX(absPosMAHI, accel, decel, velocity);
SetFocus(hwnd); //Return focus to the parent window. Without this, focus will be stuck on the button
return 0;
所以基本上,我在方法调用中设置断点,在方法的另一个内部,在第二个断点处,值是一些荒谬的数字,通常是非规范化数字。但是,如果我传递一个常量(goToPositionX(var,5.0,3.0等)),一切都很顺利。作为参考传递也没有帮助。
我也可以确认一下,因为代码是与步进电机驱动器通信,如果我看串口,我会看到未定义的值。
我觉得这是微不足道的事情,但我很难过。
编辑:我也应该指出,整数都很好。只有双打才会变得古怪。
编辑:变量定义:
int InitCfgParams(
INIReadWrite * configIni,
double * jogAccel, double * jogDecel, double * jogVelocity,
double * accel, double * decel, double * velocity,
char portNum[],
int * preset1, int * preset2, int * preset3, int * preset4)
{
char absPos[] = "ABS_POS";
char moveParam[] = "MOVE_PARAMS";
//...
//a bunch of things are defined in here that don't pertain to this question
//...
*accel = configIni->LoadDouble(moveParam, "accel");
if(accel == NULL){
return 1;
}
*decel = configIni->LoadDouble(moveParam, "decel");
if(decel == NULL){
return 1;
}
*velocity = configIni->LoadDouble(moveParam, "velocity");
if(velocity == NULL){
return 1;
}
configIni->LoadChar("SETUP", "com", portNum);
if(portNum == NULL){
return 1;
}
return 0;
}