1、 目前使用的MCU为TMS320F28069M,使用proj_lab13d.c自动售卖机例程,实现A、B、C三个预设位置控制。
状态、变量、条件、转换、操作等定义如下:
STPOSPLAN_setCfgArray(stObj->posPlanHandle, &stPosPlanCfgArray[0],sizeof(stPosPlanCfgArray), STATE_ACTS, STATE_CONDS, STATE_VARS, NUM_TRANS, NUM_STATES);
STPOSPLAN_setCfg(stObj->posPlanHandle, _IQ(ST_SAMPLE_TIME), false);
/* 停止状态,当前的状态认为是起始状态,之后的状态是相对这个状态的 */
STPOSPLAN_setCfgHaltState(stObj->posPlanHandle, 0, 0, velMax, accMax,jrkMax, 1000L);
/* 设置电机会发生的动作 */
STPOSPLAN_addCfgState(stObj->posPlanHandle, 0, 0, 00L);/* STATE INIT */
STPOSPLAN_addCfgState(stObj->posPlanHandle, 12, _IQ(0.5), 00L);/* STATE A->B */
STPOSPLAN_addCfgState(stObj->posPlanHandle, 12, _IQ(0.5), 00L);/* STATE B->C */
STPOSPLAN_addCfgState(stObj->posPlanHandle, -12, _IQ(-0.5), 00L);/* STATE C->B */
STPOSPLAN_addCfgState(stObj->posPlanHandle, -12, _IQ(-0.5), 00L);/* STATE B->A */
/* 设置变量 */
STPOSPLAN_addCfgVar(stObj->posPlanHandle, ST_VAR_INOUT, STATE_COND_VAR_INIT);/* Var to comp */
/* 添加条件与变量的关系
STPOSPLAN_addCfgCond(stObj->posPlanHandle, STATE_COND_VAR_COND, ST_COMP_EQ, COND_INIT_DB, 0);
STPOSPLAN_addCfgCond(stObj->posPlanHandle, STATE_COND_VAR_COND, ST_COMP_EQ, COND_BA_AB, 0);
STPOSPLAN_addCfgCond(stObj->posPlanHandle, STATE_COND_VAR_COND, ST_COMP_EQ, COND_AB_BC, 0);
STPOSPLAN_addCfgCond(stObj->posPlanHandle, STATE_COND_VAR_COND, ST_COMP_EQ, COND_CB_BC, 0);
STPOSPLAN_addCfgCond(stObj->posPlanHandle, STATE_COND_VAR_COND, ST_COMP_EQ, COND_BC_CB, 0);
STPOSPLAN_addCfgCond(stObj->posPlanHandle, STATE_COND_VAR_COND, ST_COMP_EQ, COND_CB_BA, 0);
STPOSPLAN_addCfgCond(stObj->posPlanHandle, STATE_COND_VAR_COND, ST_COMP_EQ, COND_AB_BA, 0);
/* 添加转换
STPOSPLAN_addCfgTran(stObj->posPlanHandle, STATE_INIT, STATE_A_B, ST_COND_NC, 0, 0, velLim, accLim, decLim, jrkLim);
STPOSPLAN_addCfgTran(stObj->posPlanHandle, STATE_B_A, STATE_A_B, ST_COND_FC, STATE_BA_AB, 0, velLim, accLim, decLim, jrkLim);
STPOSPLAN_addCfgTran(stObj->posPlanHandle, STATE_A_B, STATE_B_C, ST_COND_FC, STATE_AB_BC, 0, velLim, accLim, decLim, jrkLim);
STPOSPLAN_addCfgTran(stObj->posPlanHandle, STATE_C_B, STATE_B_C, ST_COND_FC, STATE_CB_BC, 0, velLim, accLim, decLim, jrkLim);
STPOSPLAN_addCfgTran(stObj->posPlanHandle, STATE_B_C, STATE_C_B, ST_COND_FC, STATE_BC_CB, 0, velLim, accLim, decLim, jrkLim);
STPOSPLAN_addCfgTran(stObj->posPlanHandle, STATE_C_B, STATE_B_A, ST_COND_FC, STATE_CB_BA, 0, velLim, accLim, decLim, jrkLim); Item0
STPOSPLAN_addCfgTran(stObj->posPlanHandle, STATE_A_B, STATE_B_A, ST_COND_FC, STATE_AB_BA, 0, velLim, accLim, decLim, jrkLim); Item0
/* 操作 */
STPOSPLAN_addCfgAct(stObj->posPlanHandle, STATE_A_B, ST_COND_NC, 0, 0, STATE_COND_VAR_STATES, ST_ACT_EQ, STATE_A_B,ST_ACT_ENTR);
STPOSPLAN_addCfgAct(stObj->posPlanHandle, STATE_B_C, ST_COND_NC, 0, 0, STATE_COND_VAR_STATES, ST_ACT_EQ, STATE_B_C,ST_ACT_ENTR);
STPOSPLAN_addCfgAct(stObj->posPlanHandle, STATE_C_B, ST_COND_NC, 0, 0, STATE_COND_VAR_STATES, ST_ACT_EQ, STATE_C_B,ST_ACT_ENTR);
STPOSPLAN_addCfgAct(stObj->posPlanHandle, STATE_B_A, ST_COND_NC, 0, 0, STATE_COND_VAR_STATES, ST_ACT_EQ, STATE_B_A,ST_ACT_ENTR);
以上定义可以实现A、B、C三个位置间的转换,但是目前有个需求即在A->B运动过程中任意位置停止,之后再按原序列运行。
例如:由A向B运动过程中下发停止命令gMotorVars.SpinTAC.PosPlanRun = ST_PLAN_PAUSE,停止位置设为D点,请问再次下发ST_PLAN_START命令是否支持D->B的运动?
2、 采用STPOSPLAN_setCfgState去在线修改状态间步数,修改时报错:1 SpinTAC Plan 正在运行 运行配置前让 SpinTAC Plan 进入空闲状态 。
根据位置规划转化条件:ST_PLAN_BUSY -> ST_PLAN_IDLE需满足转换条件:RES == false 并且 ENB ==True 并且 DON == true,
操作ENB==false即可,在满足条件的情况下我按上述操作后直接转化为ST_PLAN_HALT,进一步转化为ST_PLAN_WAIT状态了,
请问什么原因所致?
3、 if (STPOSMOVE_getStatus(stObj->posMoveHandle) == ST_MOVE_IDLE)
{ STPOSPLAN_setUnitProfDone(stObj->posPlanHandle, true);}
请问在满足RES == false 并且 ENB ==True的条件下执行上面条件语句后 位置规划状态是否应该有变化,还是就应该一直是ST_PLAN_BUSY状态?
4、请问是否有支持暂停位置计划的例程可供参考?谢谢!