信捷XDH SFD参数是伺服参数,如果该值是FP64的,似乎不能直接用C语言模块改值,上网查了下C语言相关资料,总结下边两点:
如果是把一个FP64的D或者HD,一个个赋进去;
用union的方法,把程序里运算得到的double型数据赋进去。
程序如下:
typedef union {//这里 sizeof(double)=8,sizeof(short)=2;对于一个FP64的寄存器,实际是由4个单字组成
double d;
short byte[4];
}KK;
void MECH_PARA( WORD W , BIT B )
{
#define SysRegAddr_HD_D_HM_M_SFD
KK u;
int i;
//以下是把double赋给 FP64 SFD[8008]
u.d = *(FP64*)&HD[8014];
HD[8012]=sizeof(short);
for(i=0;i<4;i++){
SFD[8008+i] = u.byte[i];
}
//以下是把 FP64 HD[3000]赋给FP64 SFD[9000],用for循环更方便
SFD[9000]=HD[3000];
SFD[9001]=HD[3001];
SFD[9002]=HD[3002];
SFD[9003]=HD[3003];
}
union使用参考了这里的做法
https://blog.csdn.net/qq_33061377/article/details/53526483
更新一下,整理成函数
#define SysRegAddr_HD_D_HM_M_SFD
typedef union {
//FP64转SFD参数的union
FP64 d;
INT16U byte[4];
}TRANS64;
typedef union {
//INT32U转SFD参数的union
INT32U d;
INT16U byte[2];
}TRANS32;
void trans_64(FP64 data,int start_index){
//将FP64修改到SFD参数
TRANS64 input;
input.d = data;
SFD[start_index]=input.byte[0];
SFD[start_index+1]=input.byte[1];
SFD[start_index+2]=input.byte[2];
SFD[start_index+3]=input.byte[3];
}
void trans_32(INT32U data,int start_index){
//将INT32U修改到SFD参数
TRANS32 input;
input.d = data;
SFD[start_index]=input.byte[0];
SFD[start_index+1]=input.byte[1];
}
楼主最近还看过