Commit d9847538 LN

上料机构修改

1 个父辈 f8dca7a7
......@@ -241,12 +241,16 @@ namespace OnlineStore.DeviceLibrary
int p = AxisManager.instance.GetActualtPosition(Config.DeviceName,Config.GetAxisValue());
return p;
}
public bool IsInPosition(int targetP)
public bool IsInPosition(int targetP,int canErrorMax=0)
{
if (canErrorMax <= 0)
{
canErrorMax = Config.CanErrorCountMax;
}
int currp = GetAclPosition();
int chaz = targetP - currp;
if (Math.Abs(chaz) < Config.CanErrorCountMax)
if (Math.Abs(chaz) < canErrorMax)
{
return true;
}
......
......@@ -149,6 +149,16 @@ namespace OnlineStore.DeviceLibrary
}
return configIo;
}
internal static ConfigIO GetIO(string ioType, int subType)
{
ConfigIO configIo = GetDI(ioType,subType);
if (configIo == null)
{
configIo = GetDO(ioType, subType);
}
return configIo;
}
private static ConfigIO GetDO(string ioType, int subType)
{
ConfigIO configIo = null;
......
......@@ -816,9 +816,14 @@ namespace OnlineStore.DeviceLibrary
IB02_BatchAxisToP1,
/// <summary>
/// 料串入料:链条开始转动
/// 料串入料:入口有料架,转动到料架到位
/// </summary>
IB04_LineStart,
IB03_LineStart,
/// <summary>
/// 料串入料:料架已到位,在转动3秒
/// </summary>
IB04_LineWait,
/// <summary>
/// 料串入料:阻挡气缸上升
......
......@@ -283,7 +283,7 @@ namespace OnlineStore.DeviceLibrary
}
else if (wait.WaitType.Equals(WaitEnum.W002_IOValue))
{
NotOkMsg = " [" + IOManager.GetDI(wait.IoType, DeviceID).DisplayStr + "=" + wait.IoValue + "]";
NotOkMsg = " [" + IOManager.GetIO(wait.IoType, DeviceID).DisplayStr + "=" + wait.IoValue + "]";
wait.IsEnd = IOValue(wait.IoType).Equals(wait.IoValue);
if (!wait.IsEnd)
......
......@@ -398,7 +398,7 @@ namespace OnlineStore.DeviceLibrary
NotOkMsg = " [" + wait.ToStr() + "] ";
if (wait.WaitType.Equals(WaitEnum.W002_IOValue))
{
NotOkMsg = " [" + IOManager.GetDI(wait.IoType, DeviceID).DisplayStr + "=" + wait.IoValue + "] ";
NotOkMsg = " [" + IOManager.GetIO(wait.IoType, DeviceID).DisplayStr + "=" + wait.IoValue + "] ";
wait.IsEnd = IOValue(wait.IoType).Equals(wait.IoValue);
if (!wait.IsEnd)
......
......@@ -57,7 +57,7 @@ namespace OnlineStore.DeviceLibrary
MoveInfo = new DeviceMoveInfo(Name);
}
internal void TimerProcess()
public void TimerProcess()
{
if (MoveInfo.MoveType.Equals(MoveType.None))
{
......@@ -70,6 +70,10 @@ namespace OnlineStore.DeviceLibrary
{
StartInstore(new InOutParam());
}
else if (Robot.AutoInput && Robot.IOValue(Config.IO_LineEnd_Check).Equals(IO_VALUE.HIGH))
{
StartInstore(new InOutParam());
}
}
}
else if (MoveInfo.MoveType.Equals(MoveType.Reset))
......@@ -115,6 +119,15 @@ namespace OnlineStore.DeviceLibrary
{
StopMove();
}
string msg = "";
if (!BatchAxis.Open(true, out msg))
{
BatchAxis.SuddenStop();
BatchAxis.ServoOff();
WarnMsg = Name + "复位失败:批量轴打开失败:"+msg;
return false;
}
WarnMsg = "";
alarmType = AlarmType.None;
MoveInfo.NewMove(MoveType.Reset);
......@@ -122,6 +135,7 @@ namespace OnlineStore.DeviceLibrary
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(100));
WorkLog("开始复位,定位气缸下降");
StopDown(MoveInfo);
return true;
}
else
{
......@@ -149,20 +163,20 @@ namespace OnlineStore.DeviceLibrary
if (MoveInfo.IsStep(StepEnum.IBR01_StopDown))
{
if (Robot.IOValue(Config.IO_LineIn_Check).Equals(Robot.IOValue(Config.IO_LineEnd_Check)))
{
LineStop();
MoveInfo.NextMoveStep(StepEnum.IBR04_BatchHome);
WorkLog("复位:批量轴开始回原点");
BatchAxis.HomeMove(MoveInfo);
}
else
{
//if (Robot.IOValue(Config.IO_LineIn_Check).Equals(Robot.IOValue(Config.IO_LineEnd_Check)))
//{
// LineStop();
// MoveInfo.NextMoveStep(StepEnum.IBR04_BatchHome);
// WorkLog("复位:批量轴开始回原点");
// BatchAxis.HomeMove(MoveInfo);
//}
//else
//{
MoveInfo.NextMoveStep(StepEnum.IBR02_LineRun);
WorkLog("复位:链条正转3秒");
LineRun(MoveInfo);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
}
//}
}
else if (MoveInfo.IsStep(StepEnum.IBR02_LineRun))
{
......@@ -327,6 +341,10 @@ namespace OnlineStore.DeviceLibrary
//当等待超过一分钟时,需要打印提示
TimeSpan span = DateTime.Now - moveInfo.LastSetpTime;
if (span.TotalMilliseconds < 300)
{
return;
}
string NotOkMsg = "";
bool isOk = !moveInfo.OneWaitCanEndStep;
foreach (WaitResultInfo wait in list)
......@@ -363,7 +381,7 @@ namespace OnlineStore.DeviceLibrary
}
else if (wait.WaitType.Equals(WaitEnum.W002_IOValue))
{
NotOkMsg = " [" + IOManager.GetDI(wait.IoType, Robot.DeviceID).DisplayStr + "=" + wait.IoValue + "]";
NotOkMsg = " [" + IOManager.GetIO(wait.IoType, Robot.DeviceID).DisplayStr + "=" + wait.IoValue + "]";
wait.IsEnd = Robot.IOValue(wait.IoType).Equals(wait.IoValue);
if (!wait.IsEnd && (!moveInfo.IsStep(StepEnum.IB23_ShelfOut)))
......
......@@ -40,19 +40,23 @@ namespace OnlineStore.DeviceLibrary
LogUtil.info(Name + "StartInstore 失败,料串" + CurrShelf.ToStr() + "需要离开,NeedLeave:" + Config.AgvName + "," + CurrShelf.ShelfRfid + ",agvcallresult:" + agvcallresult.ToString());
return false;
}
if (Robot.IOValue(Config.IO_LineEnd_Check).Equals(IO_VALUE.HIGH) && Robot.IOValue(Config.IO_LineIn_Check).Equals(IO_VALUE.HIGH))
//if (Robot.IOValue(Config.IO_LineEnd_Check).Equals(IO_VALUE.HIGH) && Robot.IOValue(Config.IO_LineIn_Check).Equals(IO_VALUE.HIGH))
//{
// MoveInfo.NewMove(MoveType.InStore);
// MoveInfo.MoveParam = new InOutParam();
// //判断是哪个工位有料串
// IB05_StopUp();
//}
else if (Robot.IOValue(Config.IO_LineIn_Check).Equals(IO_VALUE.HIGH) )
{
MoveInfo.NewMove(MoveType.InStore);
MoveInfo.MoveParam = new InOutParam();
//判断是哪个工位有料串
IB05_StopUp();
IB03_LineStart();
}
else if (Robot.IOValue(Config.IO_LineIn_Check).Equals(IO_VALUE.HIGH))
else if(Robot.IOValue(Config.IO_LineIn_Check).Equals(IO_VALUE.HIGH))
{
MoveInfo.NewMove(MoveType.InStore);
MoveInfo.NextMoveStep(StepEnum.IB04_LineStart);
IB02_BatchAxisToP1();
IB04_LineWait();
}
else
{
......@@ -90,6 +94,22 @@ namespace OnlineStore.DeviceLibrary
BatchAxis.AbsMove(MoveInfo, Config.BatchAxisP1, Robot.Config.BatchAxis_P1Speed);
StopDown();
}
private void IB03_LineStart()
{
WorkLog("料串入料 :入口有料串,转动料串到位");
MoveInfo.NextMoveStep(StepEnum.IB03_LineStart);
LineRun(MoveInfo);
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(Config.IO_LineIn_Check, IO_VALUE.LOW));
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(Config.IO_LineEnd_Check, IO_VALUE.HIGH));
}
private void IB04_LineWait()
{
WorkLog("料串入料 :料串已到位,在转动3秒");
MoveInfo.NextMoveStep(StepEnum.IB04_LineWait);
LineRun(MoveInfo);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(Config.IO_LineEnd_Check, IO_VALUE.HIGH));
}
private void IB07_AxisUpMove()
{
MoveInfo.ShelfNoTray = false;
......@@ -119,24 +139,31 @@ namespace OnlineStore.DeviceLibrary
}
if (MoveInfo.IsStep(StepEnum.IB02_BatchAxisToP1))
{
MoveInfo.NextMoveStep(StepEnum.IB04_LineStart);
WorkLog("料串入料 :开始转动链条");
LineRun(MoveInfo);
//等待指定时间
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
//MoveInfo.NextMoveStep(StepEnum.IB03_LineStart);
//WorkLog("料串入料 :开始转动链条");
//LineRun(MoveInfo);
////等待指定时间
//MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
IB03_LineStart();
}
else if (MoveInfo.IsStep(StepEnum.IB04_LineStart))
else if (MoveInfo.IsStep(StepEnum.IB03_LineStart))
{
if (Robot.IOValue(Config.IO_LineIn_Check).Equals(IO_VALUE.HIGH) && Robot.IOValue(Config.IO_LineEnd_Check).Equals(IO_VALUE.HIGH))
//if (Robot.IOValue(Config.IO_LineIn_Check).Equals(IO_VALUE.HIGH) && Robot.IOValue(Config.IO_LineEnd_Check).Equals(IO_VALUE.HIGH))
//{
// IB05_StopUp();
//}
//else
if (Robot.IOValue(Config.IO_LineIn_Check).Equals(IO_VALUE.HIGH))
{
IB05_StopUp();
//MoveInfo.NextMoveStep(StepEnum.IB03_LineStart);
//WorkLog(" 入口检测到料串,流水线转动 6000,等待料串完全进入轨道");
//LineRun(MoveInfo);
//MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(6000));
IB03_LineStart();
}
else if (Robot.IOValue(Config.IO_LineIn_Check).Equals(IO_VALUE.HIGH))
{
MoveInfo.NextMoveStep(StepEnum.IB04_LineStart);
WorkLog(" 入口检测到料串,流水线转动 6000,等待料串完全进入轨道");
LineRun(MoveInfo);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(6000));
IB04_LineWait();
}
else
{
......@@ -144,6 +171,9 @@ namespace OnlineStore.DeviceLibrary
MoveInfo.EndMove();
LogUtil.info(" 未检测到料串,入料结束");
}
}else if (MoveInfo.IsStep(StepEnum.IB04_LineWait))
{
IB05_StopUp();
}
else if (MoveInfo.IsStep(StepEnum.IB06_WaitTime))
{
......
......@@ -40,8 +40,8 @@ namespace OnlineStore.DeviceLibrary
ledProcessTimer.Elapsed += LedProcess;
IoCheckTimer.Elapsed += IoCheckTimerProcess;
MiddleAxis = new AxisBean(config.TakeAxis_Middle, Name,true);
UpdownAxis = new AxisBean(config.TakeAxis_Updown, Name,true);
MiddleAxis = new AxisBean(config.TakeAxis_Middle, Name, false);
UpdownAxis = new AxisBean(config.TakeAxis_Updown, Name, false);
BatchAxis_A = new AxisBean(config.BatchAxis_A, Name,true);
BatchAxis_B = new AxisBean(config.BatchAxis_B, Name,true);
......@@ -78,6 +78,22 @@ namespace OnlineStore.DeviceLibrary
runStatus = RunStatus.HomeMoving;
MoveInfo.NewMove(MoveType.RHome);
if (!BatchMove_A.Reset())
{
runStatus = RunStatus.Wait;
MoveInfo.EndMove();
SetWarnMsg("启动失败:A料口启动失败");
LogUtil.error("复位失败:A料口启动失败");
return false;
}
if (!BatchMove_B.Reset())
{
runStatus = RunStatus.Wait;
MoveInfo.EndMove();
SetWarnMsg("启动失败:A料口启动失败");
LogUtil.error("复位失败:B料口启动失败");
return false;
}
StartReset();
SetAllTimer(true);
......@@ -98,6 +114,20 @@ namespace OnlineStore.DeviceLibrary
LogInfo("Reset 开始重置 ");
runStatus = RunStatus.Reset;
MoveInfo.NewMove(MoveType.Reset);
if (!BatchMove_A.Reset())
{
SetWarnMsg("复位失败:A料口复位失败");
MoveInfo.EndMove();
LogUtil.error("复位失败:A料口复位失败");
return false;
}
if (!BatchMove_B.Reset())
{
SetWarnMsg("复位失败:B料口复位失败");
MoveInfo.EndMove();
LogUtil.error("复位失败:B料口复位失败");
return false;
}
StartReset();
SetAllTimer(true);
return true;
......@@ -116,8 +146,6 @@ namespace OnlineStore.DeviceLibrary
isNoAirpressure_Check = false;
MoveInfo.NextMoveStep(StepEnum.IR01_Wait);
BatchMove_A.Reset();
BatchMove_B.Reset();
LogInfo($"复位 {MoveInfo.SLog} :批量轴开始复位");
}
......@@ -138,69 +166,116 @@ namespace OnlineStore.DeviceLibrary
// 1,处于A,B,NG料口是,可以直接回取料升降轴。
// 2,处于A, B两个暂存区时,升降轴先运动到该暂存区的取放料高点,旋转轴再回原点或待机点。
//验证旋转轴位置 TODO
if (MiddleAxis.IsInPosition(Config.Middle_P4_AUpper))
int updownP = UpdownAxis.GetAclPosition();
int middleP = MiddleAxis.GetAclPosition();
// if (UpdownAxis.IsInPosition(Config.Updown_P5_AUpperL))
//{
// MoveInfo.NextMoveStep(StepEnum.IR02_UpdownUpMove);
// LogInfo($"复位 {MoveInfo.SLog}:当前升降轴在 A上暂存区低点 {Config.Updown_P5_AUpperL},升降轴先到P4:{Config.Updown_P4_AUpperH}");
// UpdownAxis.AbsMove(MoveInfo, Config.Updown_P4_AUpperH, Config.Updown_P4_Speed);
//}
//else if (UpdownAxis.IsInPosition(Config.Updown_P7_AUnderL))
//{
// MoveInfo.NextMoveStep(StepEnum.IR02_UpdownUpMove);
// LogInfo($"复位{MoveInfo.SLog}:当前升降轴在 A下暂存区低点 {Config.Updown_P7_AUnderL},升降轴先到P6:{Config.Updown_P6_AUnderH}");
// UpdownAxis.AbsMove(MoveInfo, Config.Updown_P6_AUnderH, Config.Updown_P6_Speed);
//}
//else if (UpdownAxis.IsInPosition(Config.Updown_P11_BUpperL))
//{
// MoveInfo.NextMoveStep(StepEnum.IR02_UpdownUpMove);
// LogInfo($"复位{MoveInfo.SLog}:当前升降轴在 B上暂存区低点{Config.Updown_P11_BUpperL},升降轴先到P10:{Config.Updown_P10_BUpperH}");
// UpdownAxis.AbsMove(MoveInfo, Config.Updown_P10_BUpperH, Config.Updown_P10_Speed);
//}
//else if (UpdownAxis.IsInPosition(Config.Updown_P13_BUnderL))
//{
// MoveInfo.NextMoveStep(StepEnum.IR02_UpdownUpMove);
// LogInfo($"复位{MoveInfo.SLog}:当前升降轴在 B下暂存区低点 {Config.Updown_P13_BUnderL},升降轴先到P12{Config.Updown_P12_BUnderH}");
// UpdownAxis.AbsMove(MoveInfo, Config.Updown_P12_BUnderH, Config.Updown_P12_Speed);
//}
//旋转轴在A暂存区
if (MiddleAxis.IsInPosition(Config.Middle_P4_AUpper) || MiddleAxis.IsInPosition(Config.Middle_P7_AUnder))
{
//如果升降轴<下方高点
if(updownP< Config.Updown_P6_AUnderH+10000)
{
MoveInfo.NextMoveStep(StepEnum.IR02_UpdownUpMove);
LogInfo($"复位 {MoveInfo.SLog}:当前旋转轴在 A上暂存区 {Config.Middle_P4_AUpper},升降轴先到P4:{Config.Updown_P4_AUpperH}");
UpdownAxis.AbsMove(MoveInfo, Config.Updown_P4_AUpperH, Config.Updown_P4_Speed);
LogInfo($"复位 {MoveInfo.SLog}:当前旋转轴在 A侧暂存区{middleP},升降轴当前位置{updownP},低于下方高点,升降轴先到P4:{Config.Updown_P6_AUnderH}");
UpdownAxis.AbsMove(MoveInfo, Config.Updown_P6_AUnderH, Config.Updown_P6_Speed);
}
else if (MiddleAxis.IsInPosition(Config.Middle_P7_AUnder))
else
{
MoveInfo.NextMoveStep(StepEnum.IR02_UpdownUpMove);
LogInfo($"复位{MoveInfo.SLog}:当前旋转轴在 A下暂存区 {Config.Middle_P7_AUnder},升降轴先到P6:{Config.Updown_P6_AUnderH}");
UpdownAxis.AbsMove(MoveInfo, Config.Updown_P6_AUnderH, Config.Updown_P6_Speed);
LogInfo($"复位 {MoveInfo.SLog}:当前旋转轴在 A侧暂存区{middleP},升降轴当前位置{updownP},在上方暂存区,升降轴先回待机点:{Config.Updown_P1}");
UpdownAxis.AbsMove(MoveInfo, Config.Updown_P1, Config.Updown_P1_Speed);
}
}
else if (MiddleAxis.IsInPosition(Config.Middle_P5_BUpper))
else if (MiddleAxis.IsInPosition(Config.Middle_P5_BUpper)|| MiddleAxis.IsInPosition(Config.Middle_P8_BUnder))
{
if (updownP < Config.Updown_P12_BUnderH + 10000)
{
MoveInfo.NextMoveStep(StepEnum.IR02_UpdownUpMove);
LogInfo($"复位{MoveInfo.SLog}:当前旋转轴在 B上暂存区 {Config.Middle_P5_BUpper},升降轴先到P10:{Config.Updown_P10_BUpperH}");
UpdownAxis.AbsMove(MoveInfo, Config.Updown_P10_BUpperH, Config.Updown_P10_Speed);
LogInfo($"复位 {MoveInfo.SLog}:当前旋转轴在 B侧暂存区{middleP},升降轴当前位置{updownP},低于下方高点,升降轴先到P4:{Config.Updown_P12_BUnderH}");
UpdownAxis.AbsMove(MoveInfo, Config.Updown_P12_BUnderH, Config.Updown_P12_BUnderH);
}
else if (MiddleAxis.IsInPosition(Config.Middle_P8_BUnder))
else
{
MoveInfo.NextMoveStep(StepEnum.IR02_UpdownUpMove);
LogInfo($"复位{MoveInfo.SLog}:当前旋转轴在 B下暂存区 {Config.Middle_P8_BUnder},升降轴先到P12{Config.Updown_P12_BUnderH}");
UpdownAxis.AbsMove(MoveInfo, Config.Updown_P12_BUnderH, Config.Updown_P12_Speed);
LogInfo($"复位 {MoveInfo.SLog}:当前旋转轴在 B侧暂存区{middleP},升降轴当前位置{updownP},在上方暂存区,升降轴先回待机点:{Config.Updown_P1}");
UpdownAxis.AbsMove(MoveInfo, Config.Updown_P1, Config.Updown_P1_Speed);
}
}
else
{
if (MiddleAxis.IsNeedHome)
{
MoveInfo.NextMoveStep(StepEnum.IR03_MiddleHome);
LogInfo("复位{MoveInfo.SLog}:旋转轴回原点");
LogInfo($"复位{MoveInfo.SLog}:旋转轴回原点");
MiddleAxis.HomeMove(MoveInfo);
}
else
{
IR04_MiddleToP1();
}
}
}
else if (MoveInfo.IsStep(StepEnum.IR02_UpdownUpMove))
{
if (MiddleAxis.IsNeedHome)
{
MoveInfo.NextMoveStep(StepEnum.IR03_MiddleHome);
LogInfo($"复位{MoveInfo.SLog}:旋转轴回原点");
MiddleAxis.HomeMove(MoveInfo);
}
else
{
IR04_MiddleToP1();
}
}
else if (MoveInfo.IsStep(StepEnum.IR03_MiddleHome))
{
MoveInfo.NextMoveStep(StepEnum.IR04_MiddleToP1);
LogInfo($"复位{MoveInfo.SLog}:旋转轴到待机点:" + Config.Middle_P1);
MiddleAxis.AbsMove(MoveInfo, Config.Middle_P1, Config.Middle_P1_Speed);
IR04_MiddleToP1();
}
else if (MoveInfo.IsStep(StepEnum.IR04_MiddleToP1))
{
if (UpdownAxis.IsNeedHome)
{
MoveInfo.NextMoveStep(StepEnum.IR05_UpdownHome);
LogInfo($"复位{MoveInfo.SLog}:升降轴原点返回");
UpdownAxis.HomeMove(MoveInfo);
}
else
{
IR06_UpdownToP1();
}
}
else if (MoveInfo.IsStep(StepEnum.IR05_UpdownHome))
{
MoveInfo.NextMoveStep(StepEnum.IR06_UpdownToP1);
LogInfo($"复位{MoveInfo.SLog}:升降轴到P1:" + Config.Updown_P1 + ",夹爪原点返回");
UpdownAxis.AbsMove(MoveInfo, Config.Updown_P1, Config.Updown_P1_Speed);
if (Config.UseClampJaw.Equals(1))
{
ClampJaw.GoHome(MoveInfo);
}
IR06_UpdownToP1();
}
else if (MoveInfo.IsStep(StepEnum.IR06_UpdownToP1))
{
......@@ -242,6 +317,24 @@ namespace OnlineStore.DeviceLibrary
}
}
private void IR06_UpdownToP1()
{
MoveInfo.NextMoveStep(StepEnum.IR06_UpdownToP1);
LogInfo($"复位{MoveInfo.SLog}:升降轴到P1:" + Config.Updown_P1 + ",夹爪原点返回");
UpdownAxis.AbsMove(MoveInfo, Config.Updown_P1, Config.Updown_P1_Speed);
if (Config.UseClampJaw.Equals(1))
{
ClampJaw.GoHome(MoveInfo);
}
}
private void IR04_MiddleToP1()
{
MoveInfo.NextMoveStep(StepEnum.IR04_MiddleToP1);
LogInfo($"复位{MoveInfo.SLog}:旋转轴到待机点:" + Config.Middle_P1);
MiddleAxis.AbsMove(MoveInfo, Config.Middle_P1, Config.Middle_P1_Speed);
}
internal override void StopMove()
{
//StopMove时设置状态为none
......
......@@ -49,7 +49,7 @@ namespace OnlineStore.XLRStore
}
else
{
btnReset.Enabled = false;
btnReset.Enabled = true;
}
}
catch (Exception ex)
......@@ -97,7 +97,7 @@ namespace OnlineStore.XLRStore
private void btnStart_Click(object sender, EventArgs e)
{
moveBean.Reset();
moveBean.Reset(true);
LogUtil.info(moveBean.Name + "点击:" + btnReset.Text);
}
......
......@@ -6,3 +6,12 @@ AA:第3和第4位存储机构A面或B面,AA或者BB
04:第7和第8位表示抽屉在第几列
01:第9和第10位表示在抽屉中的第几行
02:第11和第12位表示在抽屉中的第几列
批量轴回原点
如果旋转轴在暂存区,且在下暂存区,升降轴先到高位
旋转轴回待机点P1
升降轴回P1
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!