信捷xdhc语言修改FP64SFD参数 点击:1342 | 回复:1



哈斯基

    
  • 精华:0帖
  • 求助:1帖
  • 帖子:8帖 | 8回
  • 年度积分:0
  • 历史总积分:149
  • 注册:2020年4月06日
发表于:2020-11-03 16:49:19
楼主

信捷XDH SFD参数是伺服参数,如果该值是FP64的,似乎不能直接用C语言模块改值,上网查了下C语言相关资料,总结下边两点:

  1. 如果是把一个FP64的D或者HD,一个个赋进去;

  2. 用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];

}


1分不嫌少!


楼主最近还看过



丁先

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 2回
  • 年度积分:0
  • 历史总积分:157
  • 注册:2020年12月11日
发表于:2021-03-27 15:37:22
1楼

先定义一个双进度浮点数就好了 

#define DFHD    *(FP64*)   &HD//定义DFHD表示双精度HD



热门招聘
相关主题

官方公众号

智造工程师