摘要
在synApps工具包中有很多电机驱动模板,位于motor-R7-1/modules文件夹下。
本文基于EPICS Model 3 驱动模板(MCB4BDriver.cpp)编写Huber SMC9300控制器驱动。
MCB4BDriver.cpp文件位于motor-R7-1/modules/motorAcs/acsApp/src文件夹下。
编写驱动
Step 1.
在motor-R7-1/modules目录下,复制motorAcs文件夹,命名为motorHuber;
Step 2.
根据Huber SMC软件手册修改motorHuber/ascApp/src/MCB4BDriver.cpp中的命令,保持代码的整体框架不变;
必要时,需要对输入和输出做相应的处理、增加或删减命令等操作;
例如:
我写驱动时出现一个错误:
从电机读回的位置是0.01,于是就是将position设置为0.01,这似乎是正确的。
然而,电机记录总是将position视为整数。
定义中将position作为一个双精度浮点数,是为了让这个数可以大于2的32次方,但是它被当作一个整数。
解决的办法是:
假设控制器使用mm单位,分辨率为0.0001mm(0.1um);
将电机记录中的MRES设置为0.0001;
把从控制器读回的position乘以10000,赋值给position;
发送move命令时,将position的值除以10000,然后并入move命令;
我的相关代码如下:
#define STEPS_PER_EGU 10000.
asynStatus MCB4BAxis::move(double position, int relative, double minVelocity, double maxVelocity, double acceleration)
{
asynStatus status;
// static const char *functionName = "MCB4BAxis::move";
status = sendAccelAndVelocity(acceleration, maxVelocity);
if (relative) {
sprintf(pC_->outString_, "move%d:%f", axisNo_, position / STEPS_PER_EGU);
} else {
sprintf(pC_->outString_, "goto%d:%f", axisNo_, position / STEPS_PER_EGU)