📄 plusecomm-cpp
字号:
// 电机序号
szbuf[idx++] = DecToHexChar( motoridx + 1 );
szbuf[idx++] = 'R';
// 命令
szbuf[idx++] = DecToHexChar( (cmd >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( cmd & 0x0f );
sum = PluseMotorCalCheckSum( (u_char*)szbuf, idx );
szbuf[idx++] = DecToHexChar( (sum >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( sum & 0x0f );
szbuf[idx++] = END_CHAR;
PutDataToBuf( &PlusePortParam.PollCmd, szbuf, idx );
}
void PluseMotorMakeWriteStatus( int devidx, int motoridx, int dir, int rate, int pluse, int quick )
{
int sum, idx;
char szbuf[256];
if ( (devidx >= PlusePortParam.DevNum) || (motoridx < 0) || (motoridx >= MAX_PLUSE_MOTOR_NUM) )
return;
if ( !dir || (rate < 1) || (rate > 100) )
return;
idx = 0;
szbuf[idx++] = START_CHAR;
// 板地址
szbuf[idx++] = DecToHexChar( ((PlusePortParam.StartDevNo + devidx) >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( (PlusePortParam.StartDevNo + devidx) & 0x0f );
// 电机序号
szbuf[idx++] = DecToHexChar( motoridx + 1 );
szbuf[idx++] = 'W';
// 命令
szbuf[idx++] = DecToHexChar( (PLUSE_WRITE_ONE_STATUS >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( PLUSE_WRITE_ONE_STATUS & 0x0f );
// 方向
szbuf[idx++] = DecToHexChar( (dir >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( dir & 0x0f );
// 速度
szbuf[idx++] = DecToHexChar( (rate >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( rate & 0x0f );
// 脉冲数量
szbuf[idx++] = DecToHexChar( (pluse >> 28) & 0x0f );
szbuf[idx++] = DecToHexChar( (pluse >> 24) & 0x0f );
szbuf[idx++] = DecToHexChar( (pluse >> 20) & 0x0f );
szbuf[idx++] = DecToHexChar( (pluse >> 16) & 0x0f );
szbuf[idx++] = DecToHexChar( (pluse >> 12) & 0x0f );
szbuf[idx++] = DecToHexChar( (pluse >> 8) & 0x0f );
szbuf[idx++] = DecToHexChar( (pluse >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( pluse & 0x0f );
sum = PluseMotorCalCheckSum( (u_char*)szbuf, idx );
szbuf[idx++] = DecToHexChar( (sum >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( sum & 0x0f );
szbuf[idx++] = END_CHAR;
if ( quick )
{
PlusePortParam.PollCmd.MsgCnt = 0;
PutDataToBuf( &PlusePortParam.PollCmd, szbuf, idx );
PluseMotorSendCmd( );
}
else
{
PutDataToBuf( &PlusePortParam.PollCmd, szbuf, idx );
}
}
void PluseMotorMakeGroupWriteStatus( int devidx, int motoridx, STATUS_DEF *buf )
{
int sum, idx, i;
char szbuf[256];
if ( (devidx >= PlusePortParam.DevNum) || (motoridx < 0) || (motoridx >= MAX_PLUSE_MOTOR_NUM) )
return;
idx = 0;
szbuf[idx++] = START_CHAR;
// 板地址
szbuf[idx++] = DecToHexChar( ((PlusePortParam.StartDevNo + devidx) >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( (PlusePortParam.StartDevNo + devidx) & 0x0f );
// 电机序号
szbuf[idx++] = DecToHexChar( motoridx + 1 );
szbuf[idx++] = 'W';
// 命令
szbuf[idx++] = DecToHexChar( (PLUSE_WRITE_ONE_STATUS >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( PLUSE_WRITE_ONE_STATUS & 0x0f );
for( i = 0; i < min( MAX_STATUS_ITEM_NUM, buf->Cnt); i++ )
{
if ( !buf->DirCtrl[i] )
continue;
// 方向
szbuf[idx++] = DecToHexChar( (buf->DirCtrl[i] >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( buf->DirCtrl[i] & 0x0f );
// 速度
if ( buf->Rate[i] < 1 )
buf->Rate[i] = 1;
if ( buf->Rate[i] > 100 )
buf->Rate[i] = 100;
szbuf[idx++] = DecToHexChar( (buf->Rate[i] >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( buf->Rate[i] & 0x0f );
// 脉冲数量
szbuf[idx++] = DecToHexChar( (u_char)(buf->Pluse[i] >> 28) & 0x0f );
szbuf[idx++] = DecToHexChar( (u_char)(buf->Pluse[i] >> 24) & 0x0f );
szbuf[idx++] = DecToHexChar( (u_char)(buf->Pluse[i] >> 20) & 0x0f );
szbuf[idx++] = DecToHexChar( (u_char)(buf->Pluse[i] >> 16) & 0x0f );
szbuf[idx++] = DecToHexChar( (u_char)(buf->Pluse[i] >> 12) & 0x0f );
szbuf[idx++] = DecToHexChar( (u_char)(buf->Pluse[i] >> 8) & 0x0f );
szbuf[idx++] = DecToHexChar( (u_char)(buf->Pluse[i] >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( (u_char)buf->Pluse[i] & 0x0f );
}
sum = PluseMotorCalCheckSum( (u_char*)szbuf, idx );
szbuf[idx++] = DecToHexChar( (sum >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( sum & 0x0f );
szbuf[idx++] = END_CHAR;
}
void PluseMotorMakeWriteCtrl( int devidx, int motoridx )
{
int sum, idx;
char szbuf[256];
if ( devidx >= PlusePortParam.DevNum )
return;
idx = 0;
szbuf[idx++] = START_CHAR;
// 板地址
szbuf[idx++] = DecToHexChar( ((PlusePortParam.StartDevNo + devidx) >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( (PlusePortParam.StartDevNo + devidx) & 0x0f );
// 电机序号
szbuf[idx++] = DecToHexChar( motoridx + 1 );
szbuf[idx++] = 'W';
// 命令
szbuf[idx++] = DecToHexChar( (PLUSE_WRITE_CTRL_BYTE >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( PLUSE_WRITE_CTRL_BYTE & 0x0f );
// 方向求反标志
sum = PlusePortParam.Motor[devidx][motoridx].DirCpl << motoridx;
szbuf[idx++] = DecToHexChar( (sum >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( sum & 0x0f );
// 双向使能标志
sum = PlusePortParam.Motor[devidx][motoridx].DdirEnable << motoridx;
szbuf[idx++] = DecToHexChar( (sum >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( sum & 0x0f );
// 指示位
sum = (1 << motoridx);
szbuf[idx++] = DecToHexChar( (sum >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( sum & 0x0f );
sum = PluseMotorCalCheckSum( (u_char*)szbuf, idx );
szbuf[idx++] = DecToHexChar( (sum >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( sum & 0x0f );
szbuf[idx++] = END_CHAR;
PutDataToBuf( &PlusePortParam.PollCmd, szbuf, idx );
}
void PluseMotorMakeWriteLowestRate( int devidx, int motoridx )
{
int sum, idx;
char szbuf[256];
if ( devidx >= PlusePortParam.DevNum )
return;
idx = 0;
szbuf[idx++] = START_CHAR;
// 板地址
szbuf[idx++] = DecToHexChar( ((PlusePortParam.StartDevNo + devidx) >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( (PlusePortParam.StartDevNo + devidx) & 0x0f );
// 电机序号
szbuf[idx++] = DecToHexChar( motoridx + 1 );
szbuf[idx++] = 'W';
// 命令
szbuf[idx++] = DecToHexChar( (PUSE_WRITE_LOWEST_RATE >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( PUSE_WRITE_LOWEST_RATE & 0x0f );
// 方向求反标志
sum = PlusePortParam.Motor[devidx][motoridx].LowestRate;
szbuf[idx++] = DecToHexChar( (sum >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( sum & 0x0f );
sum = PluseMotorCalCheckSum( (u_char*)szbuf, idx );
szbuf[idx++] = DecToHexChar( (sum >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( sum & 0x0f );
szbuf[idx++] = END_CHAR;
PutDataToBuf( &PlusePortParam.PollCmd, szbuf, idx );
}
void PluseMotorMakeWriteStop( int devidx, int motoridx, int all )
{
int sum, idx;
char szbuf[256];
if ( devidx >= PlusePortParam.DevNum )
return;
idx = 0;
szbuf[idx++] = START_CHAR;
// 板地址
szbuf[idx++] = DecToHexChar( ((PlusePortParam.StartDevNo + devidx) >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( (PlusePortParam.StartDevNo + devidx) & 0x0f );
// 电机序号
szbuf[idx++] = DecToHexChar( motoridx + 1 );
szbuf[idx++] = 'W';
// 命令
szbuf[idx++] = DecToHexChar( (PUSE_WRITE_STOP_BYTE >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( PUSE_WRITE_STOP_BYTE & 0x0f );
if ( all )
sum = 0xff;
else
sum = (1 << motoridx);
// 停止标志
szbuf[idx++] = DecToHexChar( (sum >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( sum & 0x0f );
// 指示位
szbuf[idx++] = DecToHexChar( (sum >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( sum & 0x0f );
sum = PluseMotorCalCheckSum( (u_char*)szbuf, idx );
szbuf[idx++] = DecToHexChar( (sum >> 4) & 0x0f );
szbuf[idx++] = DecToHexChar( sum & 0x0f );
szbuf[idx++] = END_CHAR;
PlusePortParam.PollCmd.MsgCnt = 0;
PutDataToBuf( &PlusePortParam.PollCmd, szbuf, idx );
PluseMotorSendCmd( );
}
void PluseMotorSendCmd( void )
{
int len;
char szbuf[256];
if ( PlusePortParam.SendCmdFlag )
{
PlusePortParam.SendTimeCnt++;
if ( PlusePortParam.SendTimeCnt < PlusePortParam.SendTimeConst )
return;
PlusePortParam.SendCmdFlag = 0;
PlusePortParam.LastCmdAckFlag = TIME_OVER_CHAR;
}
if ( PlusePortParam.PollCmd.MsgCnt == 0 )
return;
len = GetDataFormBuf( &PlusePortParam.PollCmd, szbuf, 256 );
if ( len == 0 )
return;
PluseMotorWriteCommPort( szbuf, len );
PlusePortParam.SendCmdFlag = 1;
PlusePortParam.SendTimeCnt = 0;
}
void PluseMotorTimer( void )
{
int i, j;
PluseMotorReadConfig( );
PluseMotorInitCommPort( );
// 定时读当前控制字节
if ( PlusePortParam.InitOk )
{
if ( !PlusePortParam.PollCmd.MsgCnt )
{
for( i = 0; i < PlusePortParam.DevNum; i++ )
{
for( j = 0; j < MAX_PLUSE_MOTOR_NUM; j++ )
{
if ( !PlusePortParam.Motor[i][j].WriteCtrlFlag )
{
PluseMotorMakeWriteCtrl( i, j );
PluseMotorMakeWriteLowestRate( i, j );
PlusePortParam.Motor[i][j].WriteCtrlFlag = 1;
i = PlusePortParam.DevNum;
j = MAX_PLUSE_MOTOR_NUM;
}
}
}
}
}
if ( !PlusePortParam.PollCmd.MsgCnt )
{
if ( !PlusePortParam.ReadStatusCnt )
{
for( i = 0; i < PlusePortParam.DevNum; i++ )
PluseMotorMakeReadStatus( i, 0, PLUSE_READ_ALL_MOTOR_STATUS );
}
PlusePortParam.ReadStatusCnt++;
//if ( (PlusePortParam.ReadStatusCnt * MAIN_TIMER_CONST) > 100 )
PlusePortParam.ReadStatusCnt = 0;
}
PluseMotorSendCmd( );
PluseMotorReadCommData( );
}
u_char GetPluseMotorCurStatusByte( int devidx, int motoridx )
{
return PlusePortParam.Motor[devidx][motoridx].CurCtrl;
}
long GetPluseMotorCurPos( int devidx, int motoridx )
{
return PlusePortParam.Motor[devidx][motoridx].CurPos;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -