Commit 6811af88 LN

逻辑优化。

1 个父辈 5cda5bea
...@@ -194,7 +194,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -194,7 +194,7 @@ namespace OnlineStore.DeviceLibrary
if (!LeftBatchMove.MoveInfo.MoveType.Equals(RobotMoveType.None) && (!LeftBatchMove.MoveInfo.MoveType.Equals(RobotMoveType.Working))) if (!LeftBatchMove.MoveInfo.MoveType.Equals(RobotMoveType.None) && (!LeftBatchMove.MoveInfo.MoveType.Equals(RobotMoveType.Working)))
{ {
WarnMsg = Name + "等待" + LeftBatchMove.Name + "复位完成超时[" + MoveInfo.TimeOutSeconds + "]秒"; WarnMsg = Name + "等待" + LeftBatchMove.Name + "复位完成超时[" + MoveInfo.TimeOutSeconds + "]秒";
LogUtil.error(WarnMsg, MoveInfo.ErrorLogType); LogUtil.error(WarnMsg, MoveInfo.ErrorLogType,MoveInfo.logSeconds());
Alarm(AlarmType.IoSingleTimeOut); Alarm(AlarmType.IoSingleTimeOut);
} }
else else
......
...@@ -183,7 +183,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -183,7 +183,7 @@ namespace OnlineStore.DeviceLibrary
else if (MoveInfo.IsTimeOut(60)) else if (MoveInfo.IsTimeOut(60))
{ {
WarnMsg = Name + "等待" + moveBean.Name + "测高结束超时[" + MoveInfo.TimeOutSeconds + "]秒"; WarnMsg = Name + "等待" + moveBean.Name + "测高结束超时[" + MoveInfo.TimeOutSeconds + "]秒";
LogUtil.error(WarnMsg, MoveInfo.ErrorLogType); LogUtil.error(WarnMsg, MoveInfo.ErrorLogType,MoveInfo.logSeconds());
Alarm(AlarmType.IoSingleTimeOut); Alarm(AlarmType.IoSingleTimeOut);
} }
} }
...@@ -249,7 +249,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -249,7 +249,7 @@ namespace OnlineStore.DeviceLibrary
if (MoveInfo.IsTimeOut(120)) if (MoveInfo.IsTimeOut(120))
{ {
WarnMsg = Name + "等待" + MoveInfo.MoveParam.WareCode + "验证是否测值 超时[" + MoveInfo.TimeOutSeconds + "]秒"; WarnMsg = Name + "等待" + MoveInfo.MoveParam.WareCode + "验证是否测值 超时[" + MoveInfo.TimeOutSeconds + "]秒";
LogUtil.error(WarnMsg, MoveInfo.ErrorLogType); LogUtil.error(WarnMsg, MoveInfo.ErrorLogType,MoveInfo.logSeconds());
Alarm(AlarmType.IoSingleTimeOut); Alarm(AlarmType.IoSingleTimeOut);
} }
} }
...@@ -344,8 +344,9 @@ namespace OnlineStore.DeviceLibrary ...@@ -344,8 +344,9 @@ namespace OnlineStore.DeviceLibrary
} }
else if (MoveInfo.IsStep(StepEnum.IW44_MiddleToP2)) else if (MoveInfo.IsStep(StepEnum.IW44_MiddleToP2))
{ {
TimeSpan span = DateTime.Now - MoveInfo.MoveStartTime;
MoveInfo.EndMove(); MoveInfo.EndMove();
WorkLog("放料完成"); WorkLog("放料完成,耗时(" + FormUtil.GetSpanStr(span) + ")");
} }
} }
......
...@@ -205,7 +205,8 @@ namespace OnlineStore.DeviceLibrary ...@@ -205,7 +205,8 @@ namespace OnlineStore.DeviceLibrary
} }
else if (MoveInfo.IsStep(StepEnum.OMR05_TakeT_Clamping_Relax)) else if (MoveInfo.IsStep(StepEnum.OMR05_TakeT_Clamping_Relax))
{ {
WorkLog(" 取料模块复位完成"); TimeSpan span = DateTime.Now - MoveInfo.MoveStartTime;
WorkLog(" 取料模块复位完成,耗时(" + FormUtil.GetSpanStr(span) + ")");
MoveInfo.EndMove(); MoveInfo.EndMove();
ResetStatusPro(); ResetStatusPro();
} }
...@@ -268,7 +269,8 @@ namespace OnlineStore.DeviceLibrary ...@@ -268,7 +269,8 @@ namespace OnlineStore.DeviceLibrary
} }
else if (SecMoveInfo.IsStep(StepEnum.OLR08_LabelRToP1)) else if (SecMoveInfo.IsStep(StepEnum.OLR08_LabelRToP1))
{ {
SecWorkLog(" 贴标模块复位完成"); TimeSpan span = DateTime.Now - SecMoveInfo.MoveStartTime;
SecWorkLog(" 贴标模块复位完成, 耗时(" + FormUtil.GetSpanStr(span) + ")");
SecMoveInfo.EndMove(); SecMoveInfo.EndMove();
ResetStatusPro(); ResetStatusPro();
} }
...@@ -360,15 +362,17 @@ namespace OnlineStore.DeviceLibrary ...@@ -360,15 +362,17 @@ namespace OnlineStore.DeviceLibrary
} }
else else
{ {
TimeSpan span = DateTime.Now - ShelfMoveInfo.MoveStartTime;
ShelfMoveInfo.EndMove(); ShelfMoveInfo.EndMove();
ShelfWorkLog("批量轴模块复位完成"); ShelfWorkLog("批量轴模块复位完成,耗时(" + FormUtil.GetSpanStr(span) + ")");
ResetStatusPro(); ResetStatusPro();
} }
} }
else if (ShelfMoveInfo.IsStep(StepEnum.OBR08_BatchAxisToP1)) else if (ShelfMoveInfo.IsStep(StepEnum.OBR08_BatchAxisToP1))
{ {
TimeSpan span = DateTime.Now - ShelfMoveInfo.MoveStartTime;
ShelfMoveInfo.EndMove(); ShelfMoveInfo.EndMove();
ShelfWorkLog("批量轴模块复位完成"); ShelfWorkLog("批量轴模块复位完成,耗时(" + FormUtil.GetSpanStr(span) + ")");
ResetStatusPro(); ResetStatusPro();
} }
} }
......
...@@ -258,7 +258,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -258,7 +258,7 @@ namespace OnlineStore.DeviceLibrary
else if (SecMoveInfo.IsTimeOut(120)) else if (SecMoveInfo.IsTimeOut(120))
{ {
WarnMsg = SecMoveInfo.Name + "[" + SecMoveInfo.MoveStep + "]" + "等待 贴标结束 超时[" + FormUtil.GetSpanStr(SecMoveInfo.StepSpan()) + "]"; WarnMsg = SecMoveInfo.Name + "[" + SecMoveInfo.MoveStep + "]" + "等待 贴标结束 超时[" + FormUtil.GetSpanStr(SecMoveInfo.StepSpan()) + "]";
LogUtil.error(WarnMsg, SecMoveInfo.ErrorLogType); LogUtil.error(WarnMsg, SecMoveInfo.ErrorLogType, SecMoveInfo.logSeconds());
Alarm(AlarmType.IoSingleTimeOut); Alarm(AlarmType.IoSingleTimeOut);
} }
} }
...@@ -325,10 +325,11 @@ namespace OnlineStore.DeviceLibrary ...@@ -325,10 +325,11 @@ namespace OnlineStore.DeviceLibrary
} }
else if (ShelfMoveInfo.IsStep(StepEnum.OS_38_LineRun)) else if (ShelfMoveInfo.IsStep(StepEnum.OS_38_LineRun))
{ {
TimeSpan span = DateTime.Now - ShelfMoveInfo.MoveStartTime;
ShelfMoveInfo.EndMove(); ShelfMoveInfo.EndMove();
IOMove(IO_Type.O_WLine_Run, IO_VALUE.LOW); IOMove(IO_Type.O_WLine_Run, IO_VALUE.LOW);
IOMove(IO_Type.O_WLine_WorkStop, IO_VALUE.LOW); IOMove(IO_Type.O_WLine_WorkStop, IO_VALUE.LOW);
ShelfWorkLog("送出料串完成,链条停止转动,阻挡上升 "); ShelfWorkLog("送出料串完成,链条停止转动,阻挡上升, 耗时(" + FormUtil.GetSpanStr(span) + ") ");
} }
#endregion #endregion
......
...@@ -241,7 +241,8 @@ namespace OnlineStore.DeviceLibrary ...@@ -241,7 +241,8 @@ namespace OnlineStore.DeviceLibrary
} }
else if (MoveInfo.IsStep(StepEnum.XR05_DoorClose)) else if (MoveInfo.IsStep(StepEnum.XR05_DoorClose))
{ {
WorkLog(" XRay复位 :完成!"); TimeSpan span = DateTime.Now - MoveInfo.MoveStartTime;
WorkLog(" XRay复位 :完成,耗时(" + FormUtil.GetSpanStr(span) + ")");
MoveInfo.EndMove(); MoveInfo.EndMove();
runStatus = RobotRunStatus.Runing; runStatus = RobotRunStatus.Runing;
} }
......
...@@ -96,21 +96,21 @@ namespace OnlineStore.DeviceLibrary ...@@ -96,21 +96,21 @@ namespace OnlineStore.DeviceLibrary
if (MoveInfo.IsStep(StepEnum.XW01_WaitInReel)) if (MoveInfo.IsStep(StepEnum.XW01_WaitInReel))
{ {
MoveInfo.NextMoveStep(StepEnum.XW02_InDoorOpen); MoveInfo.NextMoveStep(StepEnum.XW02_InDoorOpen);
WorkLog("料盘处理:左侧门打开,挡停下降"); WorkLog("料盘处理:左侧门打开,挡停下降",0);
CylinderMove(MoveInfo, IO_Type.X_InDoor_Up, IO_Type.X_InDoor_Down); CylinderMove(MoveInfo, IO_Type.X_InDoor_Up, IO_Type.X_InDoor_Down);
CylinderMove(MoveInfo, IO_Type.X_StopCylinder_Up, IO_Type.X_StopCylinder_Down); CylinderMove(MoveInfo, IO_Type.X_StopCylinder_Up, IO_Type.X_StopCylinder_Down);
} }
else if (MoveInfo.IsStep(StepEnum.XW02_InDoorOpen)) else if (MoveInfo.IsStep(StepEnum.XW02_InDoorOpen))
{ {
MoveInfo.NextMoveStep(StepEnum.XW04_InLineRun); MoveInfo.NextMoveStep(StepEnum.XW04_InLineRun);
WorkLog("料盘处理:入口和中间皮带线转动,"); WorkLog("料盘处理:入口和中间皮带线转动,",0);
IOMove(IO_Type.X_InLine_Run, IO_VALUE.HIGH); IOMove(IO_Type.X_InLine_Run, IO_VALUE.HIGH);
IOMove(IO_Type.X_MLine_Run, IO_VALUE.HIGH); IOMove(IO_Type.X_MLine_Run, IO_VALUE.HIGH);
} }
else if (MoveInfo.IsStep(StepEnum.XW04_InLineRun)) else if (MoveInfo.IsStep(StepEnum.XW04_InLineRun))
{ {
MoveInfo.NextMoveStep(StepEnum.XW05_WaitMCheck); MoveInfo.NextMoveStep(StepEnum.XW05_WaitMCheck);
WorkLog("料盘处理:等待扫描区域信号检测"); WorkLog("料盘处理:等待扫描区域信号检测",0);
IOMove(IO_Type.X_InLine_Run, IO_VALUE.HIGH); IOMove(IO_Type.X_InLine_Run, IO_VALUE.HIGH);
IOMove(IO_Type.X_MLine_Run, IO_VALUE.HIGH); IOMove(IO_Type.X_MLine_Run, IO_VALUE.HIGH);
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.X_ReelCheck, IO_VALUE.HIGH)); MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.X_ReelCheck, IO_VALUE.HIGH));
...@@ -147,7 +147,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -147,7 +147,7 @@ namespace OnlineStore.DeviceLibrary
Work_ReelInfo.IsNgReel = true; Work_ReelInfo.IsNgReel = true;
Work_ReelInfo.NgMsg = "无有效条码"; Work_ReelInfo.NgMsg = "无有效条码";
} }
MoveInfo.MoveParam.SetReelInfo(In_ReelInfo); //MoveInfo.MoveParam.SetReelInfo(In_ReelInfo);
//判断是否需要点料 //判断是否需要点料
if (Work_ReelInfo.IsNgReel) if (Work_ReelInfo.IsNgReel)
{ {
...@@ -196,7 +196,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -196,7 +196,7 @@ namespace OnlineStore.DeviceLibrary
else if (MoveInfo.IsTimeOut(120)) else if (MoveInfo.IsTimeOut(120))
{ {
WarnMsg = MoveInfo.Name + "[" + MoveInfo.MoveStep + "]" + "等待 X互锁信号打开 超时[" + FormUtil.GetSpanStr(MoveInfo.StepSpan()) + "]"; WarnMsg = MoveInfo.Name + "[" + MoveInfo.MoveStep + "]" + "等待 X互锁信号打开 超时[" + FormUtil.GetSpanStr(MoveInfo.StepSpan()) + "]";
LogUtil.error(WarnMsg, SecMoveInfo.ErrorLogType); LogUtil.error(WarnMsg, SecMoveInfo.ErrorLogType,SecMoveInfo.logSeconds());
Alarm(AlarmType.IoSingleTimeOut); Alarm(AlarmType.IoSingleTimeOut);
} }
} }
...@@ -216,7 +216,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -216,7 +216,7 @@ namespace OnlineStore.DeviceLibrary
{ {
WarnMsg = MoveInfo.Name + "[" + MoveInfo.MoveStep + "]" + "等待 X互锁信号打开 超时[" + FormUtil.GetSpanStr(MoveInfo.StepSpan()) + "]"; WarnMsg = MoveInfo.Name + "[" + MoveInfo.MoveStep + "]" + "等待 X互锁信号打开 超时[" + FormUtil.GetSpanStr(MoveInfo.StepSpan()) + "]";
} }
LogUtil.error(WarnMsg, SecMoveInfo.ErrorLogType); LogUtil.error(WarnMsg, SecMoveInfo.ErrorLogType, SecMoveInfo.logSeconds());
Alarm(AlarmType.IoSingleTimeOut); Alarm(AlarmType.IoSingleTimeOut);
} }
} }
...@@ -246,27 +246,27 @@ namespace OnlineStore.DeviceLibrary ...@@ -246,27 +246,27 @@ namespace OnlineStore.DeviceLibrary
{ {
MoveInfo.NextMoveStep(StepEnum.XW21_WaitOutNoReel); MoveInfo.NextMoveStep(StepEnum.XW21_WaitOutNoReel);
MoveInfo.TimeOutSeconds = 120; MoveInfo.TimeOutSeconds = 120;
WorkLog("料盘处理:等待出口无料盘"); WorkLog("料盘处理:等待出口无料盘",0);
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Out_TrayCheck, IO_VALUE.LOW)); MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Out_TrayCheck, IO_VALUE.LOW));
} }
else if (MoveInfo.IsStep(StepEnum.XW21_WaitOutNoReel)) else if (MoveInfo.IsStep(StepEnum.XW21_WaitOutNoReel))
{ {
MoveInfo.NextMoveStep(StepEnum.XW22_OutDoorOpen); MoveInfo.NextMoveStep(StepEnum.XW22_OutDoorOpen);
WorkLog("料盘处理:右侧门打开,挡停放行"); WorkLog("料盘处理:右侧门打开,挡停放行",0);
CylinderMove(MoveInfo, IO_Type.X_OutDoor_Up, IO_Type.X_OutDoor_Down); CylinderMove(MoveInfo, IO_Type.X_OutDoor_Up, IO_Type.X_OutDoor_Down);
CylinderMove(MoveInfo, IO_Type.X_StopCylinder_Down, IO_Type.X_StopCylinder_Up); CylinderMove(MoveInfo, IO_Type.X_StopCylinder_Down, IO_Type.X_StopCylinder_Up);
} }
else if (MoveInfo.IsStep(StepEnum.XW22_OutDoorOpen)) else if (MoveInfo.IsStep(StepEnum.XW22_OutDoorOpen))
{ {
MoveInfo.NextMoveStep(StepEnum.XW23_OutLineRun); MoveInfo.NextMoveStep(StepEnum.XW23_OutLineRun);
WorkLog("料盘处理:中间皮带线,出口皮带线转动"); WorkLog("料盘处理:中间皮带线,出口皮带线转动",0);
IOMove(IO_Type.X_MLine_Run, IO_VALUE.HIGH); IOMove(IO_Type.X_MLine_Run, IO_VALUE.HIGH);
IOMove(IO_Type.X_OLine_Run, IO_VALUE.HIGH); IOMove(IO_Type.X_OLine_Run, IO_VALUE.HIGH);
} }
else if (MoveInfo.IsStep(StepEnum.XW23_OutLineRun)) else if (MoveInfo.IsStep(StepEnum.XW23_OutLineRun))
{ {
MoveInfo.NextMoveStep(StepEnum.XW24_WaitOutCheck); MoveInfo.NextMoveStep(StepEnum.XW24_WaitOutCheck);
WorkLog("料盘处理:等待出口皮带线检测到料盘"); WorkLog("料盘处理:等待出口皮带线检测到料盘",0);
IOMove(IO_Type.X_MLine_Run, IO_VALUE.HIGH); IOMove(IO_Type.X_MLine_Run, IO_VALUE.HIGH);
IOMove(IO_Type.X_OLine_Run, IO_VALUE.HIGH); IOMove(IO_Type.X_OLine_Run, IO_VALUE.HIGH);
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Out_TrayCheck, IO_VALUE.HIGH)); MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Out_TrayCheck, IO_VALUE.HIGH));
...@@ -300,17 +300,11 @@ namespace OnlineStore.DeviceLibrary ...@@ -300,17 +300,11 @@ namespace OnlineStore.DeviceLibrary
} }
else if (MoveInfo.IsStep(StepEnum.XW27_OutDoorClose)) else if (MoveInfo.IsStep(StepEnum.XW27_OutDoorClose))
{ {
TimeSpan span = DateTime.Now - MoveInfo.MoveStartTime;
runStatus = RobotRunStatus.Runing; runStatus = RobotRunStatus.Runing;
MoveInfo.EndMove(); MoveInfo.EndMove();
WorkLog("料盘处理:料盘处理结束"); WorkLog("料盘处理:料盘处理结束,耗时(" + FormUtil.GetSpanStr(span) + ")");
// MoveInfo.NextMoveStep(StepEnum.XW28_EndPro); }
}
else if (MoveInfo.IsStep(StepEnum.XW28_EndPro))
{
MoveInfo.EndMove();
runStatus = RobotRunStatus.Runing;
}
} }
private void XW12_XRayStart() private void XW12_XRayStart()
......
...@@ -11,14 +11,15 @@ namespace OnlineStore.DeviceLibrary ...@@ -11,14 +11,15 @@ namespace OnlineStore.DeviceLibrary
{ {
public class RobotMoveInfo public class RobotMoveInfo
{ {
internal DateTime MoveStartTime = DateTime.Now;
private static int MaxMoveId=1; private static int MaxMoveId=1;
/// <summary> /// <summary>
/// 超时时间 /// 超时时间
/// </summary> /// </summary>
public int TimeOutSeconds = 60; internal int TimeOutSeconds = 60;
public string Name = ""; internal string Name = "";
public bool ShelfNoTray = false; internal bool ShelfNoTray = false;
public int MoveID = 0; internal int MoveID = 0;
public RobotMoveInfo(string name) public RobotMoveInfo(string name)
{ {
this.Name = name; this.Name = name;
...@@ -40,7 +41,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -40,7 +41,7 @@ namespace OnlineStore.DeviceLibrary
/// <summary> /// <summary>
/// =true表示满足一个等待条件,就可以完成此步骤的等待 /// =true表示满足一个等待条件,就可以完成此步骤的等待
/// </summary> /// </summary>
public bool OneWaitCanEndStep = false; internal bool OneWaitCanEndStep = false;
private RobotMoveType moveType; private RobotMoveType moveType;
...@@ -51,29 +52,29 @@ namespace OnlineStore.DeviceLibrary ...@@ -51,29 +52,29 @@ namespace OnlineStore.DeviceLibrary
} }
public WorkParam MoveParam { get; set; } public WorkParam MoveParam { get; set; }
/// <summary> /// <summary>
/// 是否再当前步骤等待中 /// 是否再当前步骤等待中
/// </summary> /// </summary>
public bool IsInWait { get; set; } internal bool IsInWait { get; set; }
/// <summary> /// <summary>
/// 可以循环运动的次数(轴卡运动才需要) /// 可以循环运动的次数(轴卡运动才需要)
/// </summary> /// </summary>
public int CanWhileCount = 0; internal int CanWhileCount = 0;
private StepEnum moveStep; private StepEnum moveStep;
public StepEnum MoveStep internal StepEnum MoveStep
{ {
get { return moveStep; } get { return moveStep; }
} }
public bool IsStep(StepEnum step) internal bool IsStep(StepEnum step)
{ {
return MoveStep.Equals(step); return MoveStep.Equals(step);
} }
public bool IsTimeOut(int timeOutSeconds = 60) internal bool IsTimeOut(int timeOutSeconds = 60)
{ {
TimeSpan span = DateTime.Now - LastSetpTime; TimeSpan span = DateTime.Now - LastSetpTime;
if (span.TotalSeconds > timeOutSeconds) if (span.TotalSeconds > timeOutSeconds)
...@@ -82,12 +83,27 @@ namespace OnlineStore.DeviceLibrary ...@@ -82,12 +83,27 @@ namespace OnlineStore.DeviceLibrary
} }
return false; return false;
} }
public TimeSpan StepSpan() internal int logSeconds()
{
TimeSpan span = DateTime.Now - LastSetpTime;
int second = 10;
second = (int)(TimeOutSeconds / span.TotalSeconds) * 10;
if (second > 120)
{
second = 120;
}
else if (second < 10)
{
second = 10;
}
return second;
}
internal TimeSpan StepSpan()
{ {
TimeSpan span = DateTime.Now - LastSetpTime; TimeSpan span = DateTime.Now - LastSetpTime;
return span; return span;
} }
public void NextMoveStep(StepEnum step) internal void NextMoveStep(StepEnum step)
{ {
moveStep = step; moveStep = step;
LastSetpTime = DateTime.Now; LastSetpTime = DateTime.Now;
...@@ -99,7 +115,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -99,7 +115,7 @@ namespace OnlineStore.DeviceLibrary
/// <summary> /// <summary>
/// 当前步骤执行完成 /// 当前步骤执行完成
/// </summary> /// </summary>
public void EndStepWait() internal void EndStepWait()
{ {
IsInWait = false; IsInWait = false;
WaitList = new List<WaitResultInfo>(); WaitList = new List<WaitResultInfo>();
...@@ -112,15 +128,8 @@ namespace OnlineStore.DeviceLibrary ...@@ -112,15 +128,8 @@ namespace OnlineStore.DeviceLibrary
LastSetpTime = DateTime.Now; LastSetpTime = DateTime.Now;
WaitList = new List<WaitResultInfo>(); WaitList = new List<WaitResultInfo>();
MoveNum++; MoveNum++;
MoveStartTime = DateTime.Now;
} }
//public void NewMove(RobotMoveType type, WorkParam param, StepEnum step= StepEnum.Wait)
//{
// moveStep = step;
// this.moveType = type;
// this.MoveParam = param;
// LastSetpTime = DateTime.Now;
// WaitList = new List<WaitResultInfo>();
//}
public void EndMove() public void EndMove()
{ {
this.moveType = RobotMoveType.None; this.moveType = RobotMoveType.None;
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!