开发运动控制卡多线程获取轴状态刷新慢如何解决
用线程循环获取轴状态赋给全局变量,运动线程检测轴状态并发指令,但轴状态变量刷新不及时,轴在运动时,变量检查到停止发指令再运动就报错。
public bool[] blnIsMoving = new bool[8];//规划运动标志为true时正在运动
public void ReadCycle()
{
short i, j, k;
string strBuf, strBinBuf, strBitBuf;
ulong lngBuf = 0;
ushort nBuf = 0;
string csTemp;
short rtn;
int dAxisAccSmoothts = 0;
short count = 1;
uint pClock;
int gtsdi, gtsdo; //输入,输出读取
ushort gtsdoex, gtsdiex; //输出,输入扩展
int axis = 0;
int bit = 0;
////////////////////////////////////////////////////////////////////////
for (i = 0; i < CarTotal; i++)//CarTotal=1,可执行1次
{ //当通用输出循环完成,大循环语句执行一次,之后i+1,然后就i=1。
for (j = 1; j <= OneCard_AxisToatl; j++)
{
csTemp = "";
rtn = 0;
dAxisAccSmoothts = 0;
count = 1;
rtn = gts.mc.GT_ClrSts(i, j, 1); //清除报警
rtn &= gts.mc.GT_GetSts(i, j, out dAxisAccSmoothts, 1, out pClock);//读取轴状态,32位轴状态字 512
axis = i * OneCard_AxisToatl + j - 1;//axis从0开始的,此时j=1,axis=1时,j=2
if (0 == rtn)
{
strBuf = dAxisAccSmoothts.ToString("X4");// 转成16进制,并补成四位
//将lngBuf改成dAxisAccSmoothts
strBinBuf = CEncode.Hex4ToBin16(strBuf); // 返回结果为 strBinBuf="0000001000000000"从0开始数,第九位为一,电机使能标志
for (k = 0; k < 16; k++)//0至15
{
strBitBuf = strBinBuf.Substring(15 - k, 1);//strBitBuf="0"
if (strBitBuf == "1")
{
blnAxisSts[axis, k] = true; //
}
else
{
blnAxisSts[axis, k] = false;//运动控制器控制轴状态寄存器
}
if (k == 5)
{
blnPLmtSwt[axis] = blnAxisSts[axis, k]; //当K为5,正限位触发标志
// 正限位开关电平状态为限位触发电平时置 1
// 规划位置大于正向软限位时置 1
}
else if (k == 6) //只有当离开限位开关,或者规划位置在软限位行程以内时才能清除轴状态字的限位触发标志
{
blnNLmtSwt[axis] = blnAxisSts[axis, k];//负限位触发标志负限位开关电平状态为限位触发电平时置 1,规划位置小于负向软限位时置 1
//开关点评和,规划位置与软限位导致轴状态的正负限位置1.
}
else if (k == 10)
{
blnIsMoving[axis] = blnAxisSts[axis, k];//规划运动标志,规划器运动时置 1
}
else if (k == 11)
{
blnInPlaceSwt[axis] = blnAxisSts[axis, k];//电机到位标志,规划器静止
}
else if (k == 1)
{
blnAlarmSwt[axis] = blnAxisSts[axis, k];//驱动器报警标志,规划器静止
}
}
}
} //循环3层
rtn = gts.mc.GT_GetDi(i, gts.mc.MC_HOME, out gtsdi); //读取原点输入信号
if (rtn == 0)//gtsdi=?
{
strBuf = gtsdi.ToString("X4");//就在这里
strBinBuf = CEncode.Hex4ToBin16(strBuf);
for (j = 0; j < OneCard_AxisToatl; j++)
{
axis = i * OneCard_AxisToatl + j;
strBitBuf = strBinBuf.Substring(15 - j, 1);
if ("1" == strBitBuf)
{
blnHomeSwt[axis] = true;
}
else
{
blnHomeSwt[axis] = false;
}
}
}
public static bool MoveToTrackLoopLine2(double X, double Y, double Z, double X2, double Y2, double Z2, double X3, double Y3, double Z3, int W, int count, bool Useflg)//折返S形
{
if (!Useflg)//不启用直接跳过
{
K++;//加一
return true;
}
if (m_Motion.TrackLoopLine2(2, CProgram.Axis_X, CProgram.Axis_Y, CProgram.Axis_Z,
X, Y, Z,
X2, Y2, Z2,
X3, Y3, Z3,
20, CProgram.g_AxisRunSet[CProgram.Axis_X].fRunAcc, CProgram.g_AxisRunSet[CProgram.Axis_X].fRunAcc, count, 1) == true)
{
K++;//加一
eHandle.WaitOne((int)Waitime);//
return true;
}
else
{
// Form_Main.Alarmlight = 4;//自动运行中轴运动出错
return false;
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话: