⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plusecomm-cpp

📁 RS485通讯,用于PC机与C51单片机通讯,进行运动控制
💻
📖 第 1 页 / 共 2 页
字号:
	// 电机序号
	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 + -