代码
设计思想:
问题1、当有两个线程同时判断状态时,会出现同时满足条件的情况,设备会出现撞机。
解决办法:增加一个线程锁来限制多线程判断;同时在满足运动条件时,提前设置目标位置后释放线程锁。
问题2、如何提高效率,在一个轴运动时,另外一个轴也可以运动
解决办法:将另一个工位的状态分为 运动中 ,停止,准备运动 分别判断,当另一个工位在运动时,当前工位满足条件也能运动
public class Tool
{
// 使用前提 左右X轴的速度参数必须一致,目标位置必须使用前更新
//MoveState 直接读取轴的运动状态
//NowPos 直接读取轴当前指令或反馈位置
bool LeftXMoveState = false;//左X轴运动状态 false-停止,true-运动中
double LeftNowPos = 0;//左X轴当前位置
double LeftTargetPos = 0;//左X轴目标位置
bool RightXMoveState = false;//右X轴运动状态 false-停止,true-运动中
double RightNowPos = 0;//右X轴运动状态 false-停止,true-运动中
double RightTargetPos = 0;//右X轴运动状态 false-停止,true-运动中
double TotalLenght = 300;//模组总长度
object AxisXCheckLockObj = new object();//线程锁
public bool CanMove(string station, ref double targetPos, double pos)
{
bool GetLock = Monitor.TryEnter(AxisXCheckLockObj);
if (GetLock == false)
{
return false;
}
bool ret = false;
if (station == "左工位")
{
if (RightNowPos == RightTargetPos)//停止状态
{
if (pos + RightTargetPos <= TotalLenght)
{
targetPos = pos;
ret = true;
}
}
else if (RightXMoveState)//运动状态
{
if (pos + RightTargetPos <= TotalLenght)
{
targetPos = pos;
ret = true;
}
}
else//准备运动状态 停止->运动
{
if (pos + RightNowPos <= TotalLenght && pos + RightTargetPos <= TotalLenght)
{
targetPos = pos;
ret = true;
}
}
}
else
{
if (LeftNowPos == LeftTargetPos)
{
if (pos + LeftTargetPos <= TotalLenght)
{
targetPos = pos;
ret = true;
}
}
else if (LeftXMoveState)
{
if (pos + LeftTargetPos <= TotalLenght)
{
targetPos = pos;
ret = true;
}
}
else
{
if (pos + LeftNowPos <= TotalLenght && pos + LeftTargetPos <= TotalLenght)
{
targetPos = pos;
ret = true;
}
}
}
Monitor.Exit(AxisXCheckLockObj);
return ret;
}
}