Commit 4f98455d LN

入料口线体处理修改

1 个父辈 47821f09
...@@ -111,4 +111,7 @@ ...@@ -111,4 +111,7 @@
<startup> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup> </startup>
<runtime>
<gcConcurrent enabled="false"/>
</runtime>
</configuration> </configuration>
\ No newline at end of file \ No newline at end of file
20200417 
20200429:
入料口定位工位检测料架后延迟3秒
停止运行时需要给agv发none
needEnter和needLeave都延迟3秒再发。
入料缓冲阻挡修改。
20200428:
出大料时,横移气缸还未后退,叉子出料与横移气缸相撞
料仓出料到门口后,最好验证门口有料盘信号,否则报警。
20200417
进料阻挡只下降500ms。 进料阻挡只下降500ms。
入库未收到服务器反馈时,调用下取消入库任务。 入库未收到服务器反馈时,调用下取消入库任务。
放托盘放在前面. 放托盘放在前面.
......
...@@ -86,10 +86,10 @@ namespace OnlineStore.DeviceLibrary ...@@ -86,10 +86,10 @@ namespace OnlineStore.DeviceLibrary
// RFIDData data = new RFIDData(content); // RFIDData data = new RFIDData(content);
LogUtil.info("收到 AgvClient_CloseDoor [" + id + "] [" + rfid + "] "); LogUtil.info("收到 AgvClient_CloseDoor [" + id + "] [" + rfid + "] ");
} }
private static void AgvClient_Ready(string id, string rfid) private static void AgvClient_Ready(string id, string rfid)
{ {
UpdateAction(id, ClientAction.Ready); UpdateAction(id, ClientAction.Ready);
// RFIDData data = new RFIDData(content); // RFIDData data = new RFIDData(content);
LogUtil.info("收到 AgvClient_Ready [" + id + "] [" + rfid + "] "); LogUtil.info("收到 AgvClient_Ready [" + id + "] [" + rfid + "] ");
FeedingEquip equip = getFeedEquip(id); FeedingEquip equip = getFeedEquip(id);
......
...@@ -421,7 +421,12 @@ namespace OnlineStore.DeviceLibrary ...@@ -421,7 +421,12 @@ namespace OnlineStore.DeviceLibrary
wait.IsEnd = IOValue(wait.IoType).Equals(wait.IoValue); wait.IsEnd = IOValue(wait.IoType).Equals(wait.IoValue);
if (!wait.IsEnd) if (!wait.IsEnd)
{ {
if (wait.IoType.Equals(IO_Type.SL_Line_Run))
{
IOMove(wait.IoType, wait.IoValue);
LogInfo(" [" + moveInfo.MoveType + "][" + moveInfo.MoveStep + "]重写DO: " + wait.ToStr());
}
TimeSpan rwSpan = DateTime.Now - preRWTime; TimeSpan rwSpan = DateTime.Now - preRWTime;
//一分钟还未检测到 //一分钟还未检测到
if (span.TotalSeconds > LineManager.Config.IOSingle_TimerOut && alarmType <= LineAlarmType.IoSingleTimeOut) if (span.TotalSeconds > LineManager.Config.IOSingle_TimerOut && alarmType <= LineAlarmType.IoSingleTimeOut)
......
...@@ -4,6 +4,7 @@ using OnlineStore.LoadCSVLibrary; ...@@ -4,6 +4,7 @@ using OnlineStore.LoadCSVLibrary;
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
...@@ -298,8 +299,8 @@ namespace OnlineStore.DeviceLibrary ...@@ -298,8 +299,8 @@ namespace OnlineStore.DeviceLibrary
internal override void StopMove() internal override void StopMove()
{ {
//StopMove时设置状态为none //StopMove时设置状态为none
AgvClient.SetStatus(Config.AgvInName); AgvClient.SetStatus(Config.AgvInName,"",ClientAction.None,ClientLevel.Low,true);
AgvClient.SetStatus(Config.AgvOutName); AgvClient.SetStatus(Config.AgvOutName, "", ClientAction.None, ClientLevel.Low, true);
//MoveInfo.EndMove(); //MoveInfo.EndMove();
//SecondMoveInfo.EndMove(); //SecondMoveInfo.EndMove();
BatchAxisStopCheck(); BatchAxisStopCheck();
...@@ -337,7 +338,9 @@ namespace OnlineStore.DeviceLibrary ...@@ -337,7 +338,9 @@ namespace OnlineStore.DeviceLibrary
} }
StopMove(); StopMove();
MoveInfo.EndMove(); MoveInfo.EndMove();
SecondMoveInfo.EndMove(); SecondMoveInfo.EndMove();
AgvClient.SetStatus(Config.AgvInName, "", ClientAction.None, ClientLevel.Low, true);
AgvClient.SetStatus(Config.AgvOutName, "", ClientAction.None, ClientLevel.Low, true);
} }
...@@ -416,45 +419,54 @@ namespace OnlineStore.DeviceLibrary ...@@ -416,45 +419,54 @@ namespace OnlineStore.DeviceLibrary
{ {
if (IOValue(IO_Type.SL_Out_Check).Equals(IO_VALUE.HIGH)) if (IOValue(IO_Type.SL_Out_Check).Equals(IO_VALUE.HIGH))
{ {
ClientLevel level = ClientLevel.Low; if (TrayManager.checkWatch(needLeaveWatch, 3000))
if (IOValue(IO_Type.SL_Location_Check).Equals(IO_VALUE.HIGH) || (!MoveInfo.MoveType.Equals(LineMoveType.None)))
{ {
level = ClientLevel.Middle; ClientLevel level = ClientLevel.Low;
if (Config.IsCanOut.Equals(1)) if (IOValue(IO_Type.SL_Location_Check).Equals(IO_VALUE.HIGH) || (!MoveInfo.MoveType.Equals(LineMoveType.None)))
{ {
level = ClientLevel.High; level = ClientLevel.Middle;
if (Config.IsCanOut.Equals(1))
{
level = ClientLevel.High;
}
} }
//线体出口检测到料架,需要通知AGV小车
AgvClient.NeedLeave(Config.AgvOutName, LastOutShelfId, level);
// SendShelfToAGV();
} }
//线体出口检测到料架,需要通知AGV小车
AgvClient.NeedLeave(Config.AgvOutName, LastOutShelfId, level);
// SendShelfToAGV();
} }
else else
{ {
needLeaveWatch.Stop();
AgvClient.SetToNone(Config.AgvOutName); AgvClient.SetToNone(Config.AgvOutName);
} }
//入口无料架,mayEnter //入口无料架,mayEnter
if (IOValue(IO_Type.SL_Entry_Check).Equals(IO_VALUE.LOW)) if (IOValue(IO_Type.SL_Entry_Check).Equals(IO_VALUE.LOW))
{ {
ClientLevel level = ClientLevel.Low; if (TrayManager.checkWatch(needEnterWatch, 3000))
if (Config.IsCanOut.Equals(1))
{ {
//如果是出料模块且当前无料架 ClientLevel level = ClientLevel.Low;
if (IOValue(IO_Type.SL_Location_Check).Equals(IO_VALUE.LOW) && MoveInfo.MoveType.Equals(LineMoveType.None)) if (Config.IsCanOut.Equals(1))
{ {
level = ClientLevel.High; //如果是出料模块且当前无料架
if (IOValue(IO_Type.SL_Location_Check).Equals(IO_VALUE.LOW) && MoveInfo.MoveType.Equals(LineMoveType.None))
{
level = ClientLevel.High;
}
} }
AgvClient.NeedEnter(Config.AgvInName, "", level);
} }
AgvClient.NeedEnter(Config.AgvInName, "", level);
} }
else else
{ {
needEnterWatch.Stop();
AgvClient.SetToNone(Config.AgvInName); AgvClient.SetToNone(Config.AgvInName);
} }
} }
} }
private Stopwatch needEnterWatch = new Stopwatch();
private Stopwatch needLeaveWatch = new Stopwatch();
/// <summary> /// <summary>
/// 下降所有阻挡气缸 /// 下降所有阻挡气缸
/// </summary> /// </summary>
...@@ -749,7 +761,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -749,7 +761,7 @@ namespace OnlineStore.DeviceLibrary
AgvClient.SetStatus(Config.AgvOutName, LastOutShelfId, ClientAction.FinishLeave,ClientLevel.High,true); AgvClient.SetStatus(Config.AgvOutName, LastOutShelfId, ClientAction.FinishLeave,ClientLevel.High,true);
Task.Factory.StartNew(delegate Task.Factory.StartNew(delegate
{ {
Thread.Sleep(10000); Thread.Sleep(1000);
AgvClient.SetStatus(Config.AgvOutName, "", ClientAction.None, ClientLevel.High, true); AgvClient.SetStatus(Config.AgvOutName, "", ClientAction.None, ClientLevel.High, true);
}); });
ProcessShelfOut = false; ProcessShelfOut = false;
...@@ -812,24 +824,24 @@ namespace OnlineStore.DeviceLibrary ...@@ -812,24 +824,24 @@ namespace OnlineStore.DeviceLibrary
} }
else else
{ {
LogUtil.info(logName + "已收到 SL_Stop_Check=High ,等待3000后停止转动,发送 FinishEnter"); LogUtil.info(logName + "已收到 SL_Stop_Check=High ,等待5000后停止转动,发送 FinishEnter");
} }
//等待200毫秒后停止转动 //等待200毫秒后停止转动
Thread.Sleep(3000); Thread.Sleep(5000);
if (MoveInfo.MoveType.Equals(LineMoveStep.FI_03_LineStart)) if (MoveInfo.MoveType.Equals(LineMoveStep.FI_03_LineStart))
{ {
LogUtil.info(logName + " 等待3000后, MoveInfo.MoveType= FI_03_LineStart 不需要停止链条转动"); LogUtil.info(logName + " 等待5000后, MoveInfo.MoveType= FI_03_LineStart 不需要停止链条转动");
} }
else else
{ {
LogUtil.info(logName + "等待3000后,停止链条转动"); LogUtil.info(logName + "等待5000后,停止链条转动");
IOMove(IO_Type.SL_Line_Run, IO_VALUE.LOW); IOMove(IO_Type.SL_Line_Run, IO_VALUE.LOW);
} }
//料架可离开 //料架可离开
AgvClient.SetStatus(Config.AgvInName, "", ClientAction.FinishEnter, ClientLevel.High, true); AgvClient.SetStatus(Config.AgvInName, "", ClientAction.FinishEnter, ClientLevel.High, true);
Task.Factory.StartNew(delegate Task.Factory.StartNew(delegate
{ {
Thread.Sleep(10000); Thread.Sleep(1000);
AgvClient.SetStatus(Config.AgvInName, "", ClientAction.None, ClientLevel.High, true); AgvClient.SetStatus(Config.AgvInName, "", ClientAction.None, ClientLevel.High, true);
}); });
ProcessShelfEnter = false; ProcessShelfEnter = false;
......
...@@ -576,10 +576,11 @@ namespace OnlineStore.DeviceLibrary ...@@ -576,10 +576,11 @@ namespace OnlineStore.DeviceLibrary
{ {
//定位工位有料架,等待1秒后再次检测 //定位工位有料架,等待1秒后再次检测
MoveInfo.NextMoveStep(LineMoveStep.FI_04_WaitTime); MoveInfo.NextMoveStep(LineMoveStep.FI_04_WaitTime);
InLog("定位工位检测到料架: " + MoveInfo.SLog + ",进料阻挡上升,缓冲阻挡上升, 等待1秒再次检测"); InLog("定位工位检测到料架: " + MoveInfo.SLog + ",进料阻挡上升,缓冲阻挡上升, 等待3秒再次检测");
IOMove(IO_Type.SL_Entry_StopDown, IO_VALUE.LOW); IOMove(IO_Type.SL_Entry_StopDown, IO_VALUE.LOW);
IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.LOW); IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.LOW);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000)); MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SL_Buffer_StopDown, IO_VALUE.LOW));
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
} }
private void LineInStoreProcess() private void LineInStoreProcess()
...@@ -595,9 +596,10 @@ namespace OnlineStore.DeviceLibrary ...@@ -595,9 +596,10 @@ namespace OnlineStore.DeviceLibrary
else if (IOValue(IO_Type.SL_Stop_Check).Equals(IO_VALUE.HIGH)) else if (IOValue(IO_Type.SL_Stop_Check).Equals(IO_VALUE.HIGH))
{ {
MoveInfo.NextMoveStep(LineMoveStep.FI_03_LineStart); MoveInfo.NextMoveStep(LineMoveStep.FI_03_LineStart);
InLog("入料检测: " + MoveInfo.SLog + " 阻挡工位检测有料架,进料阻挡下降1000,流水线转动 1000"); InLog("入料检测: " + MoveInfo.SLog + " 阻挡工位检测有料架,进料阻挡下降500,缓冲阻挡前进1000,流水线转动 1000");
IOMove(IO_Type.SL_Entry_StopDown, IO_VALUE.HIGH, 500);//进料阻挡下降 IOMove(IO_Type.SL_Entry_StopDown, IO_VALUE.HIGH, 500);//进料阻挡下降
IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.LOW);//缓冲阻挡下降 IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.HIGH, 1000);//缓冲阻挡前进1000
// IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.LOW);//缓冲阻挡下降
IOMove(IO_Type.SL_Line_Run, IO_VALUE.HIGH); IOMove(IO_Type.SL_Line_Run, IO_VALUE.HIGH);
//等待指定时间 //等待指定时间
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000)); MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
...@@ -606,9 +608,9 @@ namespace OnlineStore.DeviceLibrary ...@@ -606,9 +608,9 @@ namespace OnlineStore.DeviceLibrary
} else if (IOValue(IO_Type.SL_Entry_Check).Equals(IO_VALUE.HIGH)) } else if (IOValue(IO_Type.SL_Entry_Check).Equals(IO_VALUE.HIGH))
{ {
MoveInfo.NextMoveStep(LineMoveStep.FI_03_LineStart); MoveInfo.NextMoveStep(LineMoveStep.FI_03_LineStart);
InLog("入料检测: " + MoveInfo.SLog + " 进料口检测有料架,进料阻挡上升,缓冲阻挡上升,流水线转动 1000"); InLog("入料检测: " + MoveInfo.SLog + " 进料口检测有料架,进料阻挡上升,缓冲阻挡前进1000,流水线转动 1000");
IOMove(IO_Type.SL_Entry_StopDown, IO_VALUE.LOW);//进料阻挡上升 IOMove(IO_Type.SL_Entry_StopDown, IO_VALUE.LOW);//进料阻挡上升
IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.HIGH);//缓冲阻挡上升 IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.HIGH, 1000);//缓冲阻挡前进1000
IOMove(IO_Type.SL_Line_Run, IO_VALUE.HIGH); IOMove(IO_Type.SL_Line_Run, IO_VALUE.HIGH);
//等待指定时间 //等待指定时间
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000)); MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
...@@ -672,7 +674,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -672,7 +674,7 @@ namespace OnlineStore.DeviceLibrary
//定位工位有料架,直接开始入料 //定位工位有料架,直接开始入料
MoveInfo.NextMoveStep(LineMoveStep.FI_07_LocationCylinder_Up); MoveInfo.NextMoveStep(LineMoveStep.FI_07_LocationCylinder_Up);
InLog("定位工位检测到料架: " + MoveInfo.SLog + " 缓冲阻挡上升, 定位气缸上升,读取料架号"); InLog("定位工位检测到料架: " + MoveInfo.SLog + " 缓冲阻挡上升, 定位气缸上升,读取料架号");
IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.LOW);//缓冲阻挡下降 // IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.LOW);//缓冲阻挡下降
CylinderMove(MoveInfo, IO_Type.SL_LocationCylinder_Down, IO_Type.SL_LocationCylinder_Up); CylinderMove(MoveInfo, IO_Type.SL_LocationCylinder_Down, IO_Type.SL_LocationCylinder_Up);
} }
} }
......
...@@ -201,11 +201,12 @@ namespace OnlineStore.DeviceLibrary ...@@ -201,11 +201,12 @@ namespace OnlineStore.DeviceLibrary
{ {
//定位工位有料架,等待1秒后再次检测 //定位工位有料架,等待1秒后再次检测
MoveInfo.NextMoveStep(LineMoveStep.FO_04_WaitTime); MoveInfo.NextMoveStep(LineMoveStep.FO_04_WaitTime);
OutLog("准备出库料架 " + MoveInfo.SLog + "定位工位检测到料架:进料阻挡上升, 等待1秒再次检测"); OutLog("准备出库料架 " + MoveInfo.SLog + "定位工位检测到料架:进料阻挡上升, 等待3秒再次检测");
IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.LOW); IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.LOW);
IOMove(IO_Type.SL_Entry_StopDown, IO_VALUE.LOW); IOMove(IO_Type.SL_Entry_StopDown, IO_VALUE.LOW);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000)); MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SL_Buffer_StopDown, IO_VALUE.LOW));
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
} }
...@@ -222,24 +223,26 @@ namespace OnlineStore.DeviceLibrary ...@@ -222,24 +223,26 @@ namespace OnlineStore.DeviceLibrary
else if (IOValue(IO_Type.SL_Stop_Check).Equals(IO_VALUE.HIGH)) else if (IOValue(IO_Type.SL_Stop_Check).Equals(IO_VALUE.HIGH))
{ {
MoveInfo.NextMoveStep(LineMoveStep.FO_03_LineStart); MoveInfo.NextMoveStep(LineMoveStep.FO_03_LineStart);
OutLog("准备出库料架: " + MoveInfo.SLog + " 阻挡工位检测有料架,进料阻挡下降500ms,缓冲阻挡下降,流水线转动 5000"); OutLog("准备出库料架: " + MoveInfo.SLog + " 阻挡工位检测有料架,进料阻挡下降500ms,缓冲阻挡前进1000,流水线转动 5000");
IOMove(IO_Type.SL_Entry_StopDown, IO_VALUE.HIGH,500); IOMove(IO_Type.SL_Entry_StopDown, IO_VALUE.HIGH,500);
IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.LOW); IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.HIGH, 1000);//缓冲阻挡前进1000
IOMove(IO_Type.SL_Line_Run, IO_VALUE.HIGH); IOMove(IO_Type.SL_Line_Run, IO_VALUE.HIGH);
//等待指定时间 //等待指定时间
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(6000)); MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(6000));
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SL_Location_Check, IO_VALUE.HIGH)); MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SL_Location_Check, IO_VALUE.HIGH));
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SL_Line_Run, IO_VALUE.HIGH));
} }
else if (IOValue(IO_Type.SL_Entry_Check).Equals(IO_VALUE.HIGH)) else if (IOValue(IO_Type.SL_Entry_Check).Equals(IO_VALUE.HIGH))
{ {
MoveInfo.NextMoveStep(LineMoveStep.FO_03_LineStart); MoveInfo.NextMoveStep(LineMoveStep.FO_03_LineStart);
OutLog("准备出库料架: " + MoveInfo.SLog + " 进料口检测有料架,进料阻挡上升,缓冲阻挡上升,流水线转动 1000"); OutLog("准备出库料架: " + MoveInfo.SLog + " 进料口检测有料架,进料阻挡上升,缓冲阻挡前进1000,流水线转动 1000");
IOMove(IO_Type.SL_Entry_StopDown, IO_VALUE.LOW);//进料阻挡上升 IOMove(IO_Type.SL_Entry_StopDown, IO_VALUE.LOW);//进料阻挡上升
IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.HIGH);//缓冲阻挡下降 IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.HIGH, 1000);//缓冲阻挡前进1000
IOMove(IO_Type.SL_Line_Run, IO_VALUE.HIGH); IOMove(IO_Type.SL_Line_Run, IO_VALUE.HIGH);
//等待指定时间 //等待指定时间
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000)); MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SL_Stop_Check, IO_VALUE.HIGH)); MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SL_Stop_Check, IO_VALUE.HIGH));
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.SL_Line_Run, IO_VALUE.HIGH));
} }
else else
{ {
...@@ -314,7 +317,7 @@ namespace OnlineStore.DeviceLibrary ...@@ -314,7 +317,7 @@ namespace OnlineStore.DeviceLibrary
//定位工位有料架,直接开始入料 //定位工位有料架,直接开始入料
MoveInfo.NextMoveStep(LineMoveStep.FO_05_LocationUp); MoveInfo.NextMoveStep(LineMoveStep.FO_05_LocationUp);
OutLog("定位工位检测到料架: " + MoveInfo.SLog + " 缓冲阻挡下降, 定位气缸上升,读取料架号"); OutLog("定位工位检测到料架: " + MoveInfo.SLog + " 缓冲阻挡下降, 定位气缸上升,读取料架号");
IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.LOW);//缓冲阻挡下降 //IOMove(IO_Type.SL_Buffer_StopDown, IO_VALUE.LOW);//缓冲阻挡下降
CylinderMove(MoveInfo, IO_Type.SL_LocationCylinder_Down, IO_Type.SW4_LocationCylinder_Up); CylinderMove(MoveInfo, IO_Type.SL_LocationCylinder_Down, IO_Type.SW4_LocationCylinder_Up);
} }
......
...@@ -1051,7 +1051,8 @@ namespace OnlineStore.DeviceLibrary ...@@ -1051,7 +1051,8 @@ namespace OnlineStore.DeviceLibrary
{ {
return true; return true;
} }
else if (move.MoveInfo.MoveStep.Equals(LineMoveStep.MO_56_CylinderAfter) && move.MoveInfo.IsInWait.Equals(false)) else if (move.MoveInfo.MoveStep.Equals(LineMoveStep.MO_56_CylinderAfter) && move.MoveInfo.IsInWait.Equals(false)
&&move.CylinderIsOk(IO_Type.BeforeAfterCylinder_Before, IO_Type.BeforeAfterCylinder_After))
{ {
return true; return true;
} }
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!