以下代码展示核心功能,完整例程目录:安装目录\doc\example\notime\UserBuffer
例程规划的运动为简单的线性增量运动,完整的运动需要实现加减速过程。
double[] axisCMDPos = new double[32];
int nAxisNum = 3;
int nBufferDepth = 128;
RetCode retCode = RetCode.RET_OK;
double dbPosTemp = 0;
for (int i = 0; i < 32; i++)
{
ProCon.YKM_ReadCommandPosition((uint)i, out dbPosTemp);
axisCMDPos[i] = dbPosTemp;
}
YKM_AxisBufferStatus axisBufferStatus = new YKM_AxisBufferStatus();
while (!mCancel)
{
NoSys.NOS_SleepUs(250);
nAxisNum = MemOper.pConfig->nAxisNum;
nAxisNum = nAxisNum > 32 ? 32 : nAxisNum;
nBufferDepth = MemOper.pConfig->BufferDepth;
if (0 != MemOper.GetExit())
break;
//启用缓冲区运动,Active信号=0x8000
if (MemOper.pConfig->EnableBuffer == 1)
{
for (int i = 0; i < nAxisNum; i++)
{
retCode = ProCon.YKM_EnableAxisBuffer((uint)i, (uint)nBufferDepth);
ShowMessage(retCode);
}
MemOper.pConfig->EnableBuffer = 0;
}
//禁用缓冲区运动
if (MemOper.pConfig->DisableBuffer == 1)
{
for (int i = 0; i < nAxisNum; i++)
{
ProCon.YKM_GetAxisBufferStatus((uint)i, out axisBufferStatus);
if (axisBufferStatus.Done != 0)
{
retCode = ProCon.YKM_DisableAxisBuffer((uint)i);
}
}
MemOper.pConfig->DisableBuffer = 0;
}
//停止缓冲区运动
if (MemOper.pConfig->StopBufferMotion == 1)
bool bIsStop = true;
MemOper.pConfig->WriteAxisBuffer = 0;
for (int i = 0; i < nAxisNum; i++)
{
ProCon.YKM_ReadAxisStatus((uint)i, out axisStatus);
if (axisStatus.Done == 0)
{
bIsStop = false;
}
}
if (bIsStop)
{
MemOper.pConfig->StopBufferMotion = 0;
}
}
//分轴启动缓冲区运动,先写数据,再启动
if (MemOper.pConfig->StartAxisBuffer == 1)
{
for (int i = 0; i < nAxisNum; i++)
{
ProCon.YKM_GetAxisBufferStatus((uint)i, out axisBufferStatus);
retCode = ProCon.YKM_StartAxisBuffer((uint)i);
MemOper.pConfig->StartAxisBuffer = 0;
ShowMessage(retCode);
}
}
//同步启动多轴缓冲区运动,先写数据,再启动
if (MemOper.pConfig->StartAllAxisBuffer == 1)
{
UInt32[] axisList = new uint[nAxisNum];
for (int i = 0; i < nAxisNum; i++)
{
ProCon.YKM_GetAxisBufferStatus((uint)i, out axisBufferStatus);
axisList[i] = (UInt32)i;
}
retCode = ProCon.YKM_StartMultiAxisBuffer((uint)nAxisNum, axisList);
MemOper.pConfig->StartAllAxisBuffer = 0;
}
//缓冲区运动指令位置更新,当发送完成,轴Done信号为非0,继续写数据,Done信号会OFF
if (MemOper.pConfig->WriteAxisBuffer == 1)
{
for (int i = 0; i < nAxisNum; i++)
{
ProCon.YKM_GetAxisBufferStatus((uint)i, out axisBufferStatus);
if (axisBufferStatus.idel > 64)
{
for (int j = 0; j < 64; j++)
{
retCode = ProCon.YKM_WriteAxisBufferData((uint)i, axisCMDPos[i]);
if (retCode == RetCode.RET_OK)
{
axisCMDPos[i] += MemOper.pConfig->Increment;
}
}
}
}
}
}
|