Commit 4d385d15 张东亮

已修改,待测试

1 个父辈 1991b45f
......@@ -142,6 +142,7 @@ namespace OnlineStore.Common
system_running_cantmove,
before_FrmPositionTool_stopmuchine,
temp,
outstore_abnormal_reel
outstore_abnormal_reel,
instore_abnormal_reel
}
}
此文件类型无法预览
......@@ -684,6 +684,12 @@ namespace DeviceLibrary
}
private static string Addr_cancelPutInTask = "/service/store/cancelPutInTask";
/// <summary>
/// 取消入库任务
/// </summary>
/// <param name="deviceName"></param>
/// <param name="barcode"></param>
/// <returns></returns>
public string cancelPutInTask(string deviceName, string barcode)
{
string msg = "";
......@@ -733,6 +739,63 @@ namespace DeviceLibrary
return path;
}
/// <summary>
/// 屏蔽库位接口
/// </summary>
private static string Addr_disabledPos = "/service/store/disabledPos";
/// <summary>
/// 屏蔽库位
/// </summary>
/// <param name="deviceName"></param>
/// <param name="barcode"></param>
/// <param name="poid"></param>
/// <returns></returns>
public static string DisablePos(string deviceName, string barcode, string poid, string reason = "")
{
string msg = "";
try
{
if (String.IsNullOrEmpty(barcode))
{
return msg;
}
//if (string.IsNullOrEmpty(serverAddr))
//{
// LogUtil.error(deviceName + "DisablePos [" + barcode + "] [" + poid + "] :未找到服务器地址");
// return msg;
//}
Dictionary<string, string> paramMap = new Dictionary<string, string>();
paramMap.Add("posId", poid);//posId:库位号
paramMap.Add("barcode", barcode); // barcode = 料盘的条码
paramMap.Add("msg", reason);
string server = GetAddr(Addr_disabledPos, paramMap);
DateTime startTime = DateTime.Now;
string resultStr = HttpHelper.Post(server, "");
LogUtil.info("DisablePos " + FormUtil.GetSpanStr(DateTime.Now - startTime) + " 【" + server + "】【" + resultStr + "】");
// 返回: { "code": 0, "msg":"ok", "data":""}
ResultData serverResult = JsonHelper.DeserializeJsonToObject<ResultData>(resultStr);
if (serverResult == null)
{
msg = deviceName + "DisablePos【 " + barcode + "】【" + poid + "】没有收到服务器反馈";
}
else if (serverResult.code.Equals(0).Equals(false))
{
// code: 0为正常,其他为异常, msg: 消息, data: 为空
msg = deviceName + " DisablePos【 " + barcode + "】【" + poid + "】:" + "[" + serverResult.code + "]" + serverResult.msg;
}
if (!msg.Equals(""))
{
LogUtil.error(msg);
}
}
catch (Exception ex)
{
LogUtil.error(deviceName + " ", ex);
}
return msg;
}
}
public class ResultData
......
......@@ -31,7 +31,10 @@ namespace DeviceLibrary
public bool IsComplateOrFree { get => MoveInfo.MoveStep == MoveStep.Wait; }
public bool IsTakedReel { get => MoveInfo.MoveStep >= MoveStep.StoreTS10; }
public bool IsPutOnOut { get => MoveInfo.MoveStep >= MoveStep.StoreTS16; }
/// <summary>
/// 是否是NG料
/// </summary>
public bool IsNGReel = false;
public ReelTransport(Robot_Config _Config, MainMachine _mainMachine)
{
Config = _Config;
......@@ -64,7 +67,7 @@ namespace DeviceLibrary
if (MoveInfo.MoveStep != MoveStep.Wait)
return false;
IsNGReel = false;
storeMoveType = _storeMoveType;
PreMove = premove;
if (from == null)
......@@ -97,7 +100,6 @@ namespace DeviceLibrary
//thread = new Thread(new ThreadStart(Run));
//thread.Start();
}
public bool ReadyToTakeBox()
{
if (MoveInfo.MoveStep != MoveStep.StoreTS05)
......@@ -118,23 +120,30 @@ namespace DeviceLibrary
case MoveStep.StoreTS01:
if (!IgnoreX09 && IOManager.IOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.HIGH))
{
// if (!IgnoreX09 && IOMonitor.IODebound(IO_Type.TrayCheck_Fixture, Config, IO_VALUE.HIGH, 5000))
if (Common.IsManualHandleReelInFix()&&Common.IsInstore(storeMoveType))
{
IsNGReel = true;
MoveInfo.log($"{storeMoveType}:取料前料叉机构料盘检测X30亮,去单料口");
MoveInfo.EndMove();
ErrMsgTxt = "";
}
else
Msg.add(crc.GetString(L.out_store_detect_material, "取料前料叉X30检测到有物料无法继续,请检查."), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
//RobotManage.UserPause("出库时料叉X30检测到有物料无法继续,请检查");
}
else
{
Msg.add("", MsgLevel.info, ErrInfo.X09_Clear);
IgnoreX09 = false;
MoveInfo.NextMoveStep(MoveStep.StoreTS02);
MoveInfo.log($"{storeMoveType}:检查安全状态");
MoveInfo.log($"{storeMoveType}:检查料叉安全状态");
}
break;
case MoveStep.StoreTS02:
MoveInfo.NextMoveStep(MoveStep.StoreTS04);
InOut_Axis.AbsMove(MoveInfo, Config.InOut_P1, Config.InOut_P1_speed);
MoveInfo.log($"{storeMoveType}:进出轴去待机点P1[{Config.InOut_P1}]");
Comp_Axis.AbsMove(MoveInfo, From.Comp_PH, Config.Comp_P2_speed);
MoveInfo.log($"{storeMoveType}:进出轴返回待机点P1");
MoveInfo.log($"{storeMoveType}:压紧轴去压紧前点[{From.Comp_PH}]");
break;
case MoveStep.StoreTS03:
MoveInfo.NextMoveStep(MoveStep.StoreTS04);
......@@ -148,9 +157,9 @@ namespace DeviceLibrary
case MoveStep.StoreTS04:
MoveInfo.NextMoveStep(MoveStep.StoreTS06);
UpDown_Axis.AbsMove(MoveInfo, From.UpDown_PL, Config.UpDown_P1_speed);
MoveInfo.log($"{storeMoveType}:上下轴到达取料低点{From.UpDown_PL}");
MoveInfo.log($"{storeMoveType}:上下轴去取料低点[{From.UpDown_PL}]");
Middle_Axis.AbsMove(MoveInfo, From.Middle_P2, Config.Middle_P2_speed);
MoveInfo.log($"{storeMoveType}:行走机构到达取料点{From.Middle_P2}");
MoveInfo.log($"{storeMoveType}:旋转轴去取料点P2[{From.Middle_P2}]");
break;
case MoveStep.StoreTS05:
if (!PreMove)
......@@ -160,27 +169,40 @@ namespace DeviceLibrary
MoveInfo.NextMoveStep(MoveStep.StoreTS07);
InOut_Axis.AbsMove(MoveInfo, From.InOut_P2, Config.InOut_P2_speed);
InOut_Axis.MonitorAxisLoadRate();
MoveInfo.log($"{storeMoveType}:进出轴到达取料点{From.InOut_P2}");
MoveInfo.log($"{storeMoveType}:进出轴去取料点P2[{From.InOut_P2}]");
break;
case MoveStep.StoreTS07:
RobotManage.CameraA.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(From.posid, WareCode, storeMoveType, FixtureState.FromIn));
MoveInfo.NextMoveStep(MoveStep.StoreTS08);
UpDown_Axis.AbsMove(MoveInfo, From.UpDown_PH, Config.UpDown_P4_speed);
MoveInfo.log($"{storeMoveType}:上下轴去取料高点[{From.UpDown_PH}");
Comp_Axis.AbsMove(MoveInfo, From.Comp_PL, Config.Comp_P2_speed);
MoveInfo.log($"{storeMoveType}:上下轴到达取料高点");
MoveInfo.log($"{storeMoveType}:压紧轴去压紧点[{From.Comp_PL}]");
break;
case MoveStep.StoreTS08:
MoveInfo.NextMoveStep(MoveStep.StoreTS09);
InOut_Axis.AbsMove(MoveInfo, Config.InOut_P1, Config.InOut_P1_speed);
IgnoreX09 = false;
MoveInfo.log($"{storeMoveType}:进出轴到达待机点");
MoveInfo.log($"{storeMoveType}:进出轴去待机点P1[{Config.InOut_P1}]");
break;
case MoveStep.StoreTS09:
RobotManage.CameraA.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(From.posid, WareCode, storeMoveType, FixtureState.FromOut));
if (!IgnoreX09 && IOManager.IOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.LOW))
{
if (Common.IsManualHandleReelInFix() && Common.IsInstore(storeMoveType))
{
IsNGReel = true;
MoveInfo.log($"{storeMoveType}:取完料后料叉机构料盘检测X30灭,去单料口");
MoveInfo.EndMove();
ErrMsgTxt = "";
}
else
Msg.add(crc.GetString(L.out_store_not_detect_material, "取料后料叉X30没有检测到有物料无法继续,请检查."), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
//RobotManage.UserPause(crc.GetString(L.out_store_not_detect_material, "取料前料叉X30没有检测到有物料无法继续,请检查."));
if (Common.IsOutStore(storeMoveType))
{
//出库异常,屏蔽库位
ServerCommunication.DisablePos(mainMachine.Name, From?.Reel?.WareCode, From?.Reel?.PosID, "出库时从库位取出料盘,料叉未检测到信号");
}
}
else
{
......@@ -190,7 +212,7 @@ namespace DeviceLibrary
MoveInfo.NextMoveStep(MoveStep.StoreFIX01);
else
MoveInfo.NextMoveStep(MoveStep.StoreTS10);
MoveInfo.log($"{storeMoveType}:X30取到料");
MoveInfo.log($"{storeMoveType}:料叉取到料");
InOutEndProcess(StoreMoveType.OutStore, From.posid);
}
break;
......@@ -198,23 +220,23 @@ namespace DeviceLibrary
MoveInfo.NextMoveStep(MoveStep.StoreFIX02);
RobotManage.PutReelInFixPos(MoveInfo.MoveParam);
Middle_Axis.AbsMove(MoveInfo, Fix.Middle_P2, Config.Middle_P2_speed);
MoveInfo.log($"{storeMoveType}:行走机构到达目的地:{Fix.Middle_P2}");
MoveInfo.log($"{storeMoveType}:旋转轴去取料点P2[{Fix.Middle_P2}]");
UpDown_Axis.AbsMove(MoveInfo, Fix.UpDown_PH, Config.UpDown_P1_speed);
MoveInfo.log($"{storeMoveType}:上下轴到达目的地高点:{Fix.UpDown_PH}");
MoveInfo.log($"{storeMoveType}:上下轴去取料高点[{Fix.UpDown_PH}]");
break;
case MoveStep.StoreFIX02:
MoveInfo.NextMoveStep(MoveStep.StoreFIX03);
MoveInfo.log($"{storeMoveType}:进出轴到达目的地");
InOut_Axis.AbsMove(MoveInfo, Fix.InOut_P2, Config.InOut_P2_speed);
MoveInfo.log($"{storeMoveType}:进出轴去取料点P2");
InOut_Axis.MonitorAxisLoadRate();
break;
case MoveStep.StoreFIX03:
RobotManage.CameraA.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(To.posid, WareCode, storeMoveType, FixtureState.ToFix));
MoveInfo.NextMoveStep(MoveStep.StoreFIX04);
Comp_Axis.AbsMove(MoveInfo, Fix.Comp_PH, Config.Comp_P2_speed);
MoveInfo.log($"{storeMoveType}:压紧轴去压紧前点:{Fix.Comp_PH}");
UpDown_Axis.AbsMove(MoveInfo, Fix.UpDown_PL, Config.UpDown_P3_speed / 2);
MoveInfo.log($"{storeMoveType}:压紧轴高点:{Fix.Comp_PH}");
MoveInfo.log($"{storeMoveType}:上下轴到达目的地低点:{Fix.UpDown_PL}");
MoveInfo.log($"{storeMoveType}:上下轴去取料低点[{Fix.UpDown_PL}]");
break;
case MoveStep.StoreFIX04:
......@@ -222,7 +244,7 @@ namespace DeviceLibrary
{
MoveInfo.NextMoveStep(MoveStep.StoreFIX04_01_InoutBackToP1);
InOut_Axis.AbsMove(MoveInfo, Config.InOut_P1, Config.InOut_P1_speed);
MoveInfo.log($"{storeMoveType}:进出轴回到待机点");
MoveInfo.log($"{storeMoveType}:进出轴去待机点P1[{Config.InOut_P1}]");
}
else
{
......@@ -237,9 +259,9 @@ namespace DeviceLibrary
var fixpos = "fix#" + To.Reel.PlateW.ToString();
int camPos = ConfigHelper.Config.Get($"CamPos_{fixpos}", Fix.UpDown_PL);
Comp_Axis.AbsMove(MoveInfo, 0, Config.Comp_P1_speed);
MoveInfo.log($"{storeMoveType}:压紧轴到待机点[{0}]");
UpDown_Axis.AbsMove(MoveInfo, camPos, Config.UpDown_P3_speed / 2);
MoveInfo.log($"{storeMoveType}:压紧轴回到待机点");
MoveInfo.log($"{storeMoveType}:升降轴到拍照点");
MoveInfo.log($"{storeMoveType}:升降轴到拍照点[{camPos}]");
break;
case MoveStep.StoreFIX04_02_UpToCamLoc:
MoveInfo.NextMoveStep(MoveStep.StoreFIX04_03_CheckLocation);
......@@ -251,7 +273,7 @@ namespace DeviceLibrary
{
MoveInfo.NextMoveStep(MoveStep.StoreFIX04_05_DownToFixLow);
UpDown_Axis.AbsMove(MoveInfo, Fix.UpDown_PL, Config.UpDown_P3_speed / 2);
MoveInfo.log($"{storeMoveType}:料盘放置正常,升降轴到库位低点");
MoveInfo.log($"{storeMoveType}:料盘放置正常,升降轴到库位低点[{Fix.UpDown_PL}]");
}
else
{
......@@ -268,13 +290,16 @@ namespace DeviceLibrary
case MoveStep.StoreFIX04_04_ReloadPos:
MoveInfo.NextMoveStep(MoveStep.StoreFIX04_05_DownToFixLow);
mainMachine.CloseFlipDoor(MoveInfo);
MoveInfo.log($"{storeMoveType}:翻板关闭");
Comp_Axis.AbsMove(MoveInfo, 0, Config.Comp_P1_speed);
MoveInfo.log($"{storeMoveType}:压紧轴到待机点{0}");
UpDown_Axis.AbsMove(MoveInfo, Fix.UpDown_PL, Config.UpDown_P3_speed / 2);
MoveInfo.log($"{storeMoveType}:翻板关闭,压紧轴到待机点,升降轴到库位低点,准备送到NG口");
MoveInfo.log($"{storeMoveType}:升降轴到库位低点,准备送到NG口");
break;
case MoveStep.StoreFIX04_05_DownToFixLow:
MoveInfo.NextMoveStep(MoveStep.StoreFIX04_06_InoutToPos);
InOut_Axis.AbsMove(MoveInfo, Fix.InOut_P2, Config.InOut_P2_speed);
MoveInfo.log($"{storeMoveType}:进出轴到取料点[{Fix.InOut_P2}]");
InOut_Axis.MonitorAxisLoadRate();
break;
case MoveStep.StoreFIX04_06_InoutToPos:
......@@ -285,15 +310,15 @@ namespace DeviceLibrary
case MoveStep.StoreFIX05:
MoveInfo.NextMoveStep(MoveStep.StoreFIX06);
Comp_Axis.AbsMove(MoveInfo, Fix.Comp_PL, Config.Comp_P2_speed);
MoveInfo.log($"{storeMoveType}:压紧轴去压紧点[{Fix.Comp_PL}]");
UpDown_Axis.AbsMove(MoveInfo, Fix.UpDown_PH, Config.UpDown_P3_speed);
MoveInfo.log($"{storeMoveType}:压紧轴压紧点:{Fix.Comp_PL}");
MoveInfo.log($"{storeMoveType}:上下轴到达目的高点:{Fix.UpDown_PH}");
MoveInfo.log($"{storeMoveType}:上下轴去取料高点[{Fix.UpDown_PH}]");
break;
case MoveStep.StoreFIX06:
MoveInfo.NextMoveStep(MoveStep.StoreFIX07);
InOut_Axis.AbsMove(MoveInfo, Config.InOut_P1, Config.InOut_P1_speed);
IgnoreX09 = false;
MoveInfo.log($"{storeMoveType}:进出轴到达待机点");
MoveInfo.log($"{storeMoveType}:进出轴去待机点P1[{Config.InOut_P1}]");
break;
case MoveStep.StoreFIX07:
if (!IgnoreX09 && IOManager.IOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.LOW))
......@@ -306,16 +331,16 @@ namespace DeviceLibrary
Msg.add("", MsgLevel.info, ErrInfo.X09_Clear);
IgnoreX09 = false;
MoveInfo.NextMoveStep(MoveStep.StoreTS10);
MoveInfo.log($"{storeMoveType}:X30取到料");
MoveInfo.log($"{storeMoveType}:料叉取到料");
}
break;
case MoveStep.StoreTS10:
MoveInfo.NextMoveStep(MoveStep.StoreTS11);
RobotManage.ClearReelInFixPos();
Middle_Axis.AbsMove(MoveInfo, To.Middle_P2, Config.Middle_P2_speed);
MoveInfo.log($"{storeMoveType}:行走机构到达目的地:{To.Middle_P2}");
MoveInfo.log($"{storeMoveType}:旋转轴去取料点P2[{To.Middle_P2}]");
UpDown_Axis.AbsMove(MoveInfo, To.UpDown_PH, Config.UpDown_P1_speed);
MoveInfo.log($"{storeMoveType}:上下轴到达目的地高点:{To.UpDown_PH}");
MoveInfo.log($"{storeMoveType}:上下轴去取料高点[{To.UpDown_PH}]");
break;
case MoveStep.StoreTS11:
......@@ -347,28 +372,36 @@ namespace DeviceLibrary
break;
case MoveStep.StoreTS12:
MoveInfo.NextMoveStep(MoveStep.StoreTS13);
MoveInfo.log($"{storeMoveType}:进出轴到达目的地");
InOut_Axis.AbsMove(MoveInfo, To.InOut_P2, Config.InOut_P2_speed);
InOut_Axis.MonitorAxisLoadRate();
MoveInfo.log($"{storeMoveType}:进出轴去取料点P2[{To.InOut_P2}]");
break;
case MoveStep.StoreTS13:
RobotManage.CameraA.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(To.posid, WareCode, storeMoveType, FixtureState.ToIn));
MoveInfo.NextMoveStep(MoveStep.StoreTS14);
Comp_Axis.AbsMove(MoveInfo, To.Comp_PH, Config.Comp_P2_speed);
MoveInfo.log($"{storeMoveType}:压紧轴去压紧前点[{To.Comp_PH}]");
UpDown_Axis.AbsMove(MoveInfo, To.UpDown_PL, Config.UpDown_P3_speed);
MoveInfo.log($"{storeMoveType}:压紧轴压紧点:{To.Comp_PH}");
MoveInfo.log($"{storeMoveType}:上下轴到达目的地低点:{To.UpDown_PL}");
MoveInfo.log($"{storeMoveType}:上下轴去取料低点[{To.UpDown_PL}]");
break;
case MoveStep.StoreTS14:
MoveInfo.NextMoveStep(MoveStep.StoreTS15);
InOut_Axis.AbsMove(MoveInfo, Config.InOut_P1, Config.InOut_P1_speed);
MoveInfo.log($"{storeMoveType}:进出轴到达待机点");
MoveInfo.log($"{storeMoveType}:进出轴去待机点P1[{Config.InOut_P1}]");
break;
case MoveStep.StoreTS15:
RobotManage.CameraA.CameraGrabOne(RobotManage.CameraA.GetFixtureStateFilename(To.posid, WareCode, storeMoveType, FixtureState.ToOut));
if (!IgnoreX09 && IOManager.IOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.HIGH))
{
Msg.add(crc.GetString(L.in_store_detect_material, "放料后料叉X30上任然检测到物料,请检查."), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
if (Common.IsManualHandleReelInFix() && Common.IsInstore(storeMoveType))
{
IsNGReel = true;
MoveInfo.log($"{storeMoveType}:放完料后料叉机构料盘检测X30亮,去单料口");
MoveInfo.EndMove();
ErrMsgTxt = "";
}
else
Msg.add(crc.GetString(L.in_store_detect_material, "放料后料叉X30上仍然检测到物料,请检查."), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
//RobotManage.UserPause("入库后料叉X30上任然检测到物料,请检查");
}
else
......@@ -391,10 +424,18 @@ namespace DeviceLibrary
}
if (To.posid == BoxStorePosition.strings)
{
UpDown_Axis.AbsMove(MoveInfo, Config.UpDown_P5, Config.UpDown_P1_speed);
MoveInfo.log($"{storeMoveType}:上下轴去料串放料低点P5[{Config.UpDown_P5}]");
}
else
{
UpDown_Axis.AbsMove(MoveInfo, Config.UpDown_P3, Config.UpDown_P1_speed);
MoveInfo.log($"{storeMoveType}:上下轴去NG料口低点P3[{Config.UpDown_P3}]");
}
Middle_Axis.AbsMove(MoveInfo, Config.Middle_P1, Config.Middle_P1_speed);
MoveInfo.log($"{storeMoveType}:旋转轴去待机点P1[{Config.Middle_P1}]");
if (Comp_Axis_HomeResetTimes <= 0)
{
Comp_Axis_HomeResetTimes = ConfigHelper.Config.Get<int>("Comp_Axis_HomeResetTimes");
......@@ -402,7 +443,7 @@ namespace DeviceLibrary
MoveInfo.log($"{storeMoveType}:Comp_Axis到达最大次数开始回原");
}
Comp_Axis_HomeResetTimes--;
MoveInfo.log($"{storeMoveType}:上下轴,旋转返回待机点P1,comrest:{Comp_Axis_HomeResetTimes}");
MoveInfo.log($"{storeMoveType}:comrest:{Comp_Axis_HomeResetTimes}");
ErrMsgTxt = "";
break;
case MoveStep.StoreTS17:
......
......@@ -15,282 +15,301 @@ namespace DeviceLibrary
{
public class Common
{
/**获取角度*/
// 求3点形成的夹角
public static float getAngle2(Point pt1, Point pt2, Point pt0)
{
double ma_x = pt1.X - pt0.X;
double ma_y = pt1.Y - pt0.Y;
double mb_x = pt2.X - pt0.X;
double mb_y = pt2.Y - pt0.Y;
double k = (ma_x * mb_y - mb_x * ma_y);
if (k != 0)
{
k = (k / Math.Sqrt(k * k));
}
else
{
k = 1;
}
#region 贴标计算
///**获取角度*/
//// 求3点形成的夹角
//public static float getAngle2(Point pt1, Point pt2, Point pt0)
//{
// double ma_x = pt1.X - pt0.X;
// double ma_y = pt1.Y - pt0.Y;
// double mb_x = pt2.X - pt0.X;
// double mb_y = pt2.Y - pt0.Y;
// double k = (ma_x * mb_y - mb_x * ma_y);
// if (k != 0)
// {
// k = (k / Math.Sqrt(k * k));
// }
// else
// {
// k = 1;
// }
// double v1 = (ma_x * mb_x) + (ma_y * mb_y);
// double ma_val = Math.Sqrt(ma_x * ma_x + ma_y * ma_y);
// double mb_val = Math.Sqrt(mb_x * mb_x + mb_y * mb_y);
// double cosM = v1 / (ma_val * mb_val);
// return (float)(Math.Acos(cosM) * 180 / Math.PI * k);
//}
//public static double getAngle(Point pt1, Point pt2)
//{
// double mb_x = pt2.X - pt1.X;
// double mb_y = pt2.Y - pt1.Y;
// double rotation = Math.Atan2(mb_y, mb_x);
double v1 = (ma_x * mb_x) + (ma_y * mb_y);
double ma_val = Math.Sqrt(ma_x * ma_x + ma_y * ma_y);
double mb_val = Math.Sqrt(mb_x * mb_x + mb_y * mb_y);
double cosM = v1 / (ma_val * mb_val);
return (float)(Math.Acos(cosM) * 180 / Math.PI * k);
}
public static double getAngle(Point pt1, Point pt2)
{
double mb_x = pt2.X - pt1.X;
double mb_y = pt2.Y - pt1.Y;
double rotation = Math.Atan2(mb_y, mb_x);
// rotation = rotation / Math.PI * 180;
// return rotation;
// //double angle = 360 - rotation + 90;
// //angle = angle < 0 ? 360 + angle : angle;
// //angle = angle % 360;
// //return Math.Floor(angle / 360 * 24);
//}
rotation = rotation / Math.PI * 180;
return rotation;
//double angle = 360 - rotation + 90;
//public static double distance(Point p1, Point p2)
//{
// double result;
// result = Math.Sqrt((p1.X - p2.X) * (p1.X - p2.X) + (p1.Y - p2.Y) * (p1.Y - p2.Y));
// return result;
//}
//angle = angle < 0 ? 360 + angle : angle;
//angle = angle % 360;
//return Math.Floor(angle / 360 * 24);
}
///// <summary>
///// 以中心点旋转Angle角度
///// </summary>
///// <param name="origin">中心点</param>
///// <param name="reRotate">待旋转的点</param>
///// <param name="angle">旋转角度, 逆时针</param>
//public static Point PointRotate(Point origin, Point rePoint, double angle)
//{
// double x = (rePoint.X - origin.X) * Math.Cos(angle) - (rePoint.Y - origin.Y) * Math.Sin(angle) + origin.X;
// double y = (rePoint.X - origin.X) * Math.Sin(angle) + (rePoint.Y - origin.Y) * Math.Cos(angle) + origin.Y;
// //rePoint.X = x;
// //rePoint.Y = y;
// return new Point((int)x, (int)y);
//}
///// <summary>
///// 以指定点为中心,测算指定角度,指定长度位置的点
///// </summary>
///// <param name="p1">原点</param>
///// <param name="angle">角度</param>
///// <param name="distance">距离</param>
///// <returns></returns>
//public static Point PointWithAngle(Point p1, double angle, double distance) {
// var x2 = p1.X + distance * Math.Cos(angle / 180 * Math.PI);
// var y2 = p1.Y + distance * Math.Sin(angle / 180 * Math.PI);
// return new Point((int)x2, (int)y2);
//}
///// <summary>
/////
///// </summary>
///// <param name="labelParam"></param>
///// <param name="org">中心点坐标</param>
///// <param name="Label_R_Offset">贴标臂偏移</param>
///// <param name="labelAngle">贴标角度</param>
///// <returns></returns>
//public static Point CalcLabelPoint(ReelParam labelParam, Point org,int Label_R_Offset, int Label_R_Angle_Diff, out int labelAngle) {
// SolidBrush blue = new SolidBrush(Color.BlueViolet);
// SolidBrush red = new SolidBrush(Color.Red);
// SolidBrush yeelow = new SolidBrush(Color.Yellow);
// SolidBrush AliceBlue = new SolidBrush(Color.AliceBlue);
// Font font = new Font(FontFamily.GenericSansSerif, 60);
// Pen Greenpen = new Pen(Color.Green, 10);
// Bitmap srcbitmap;
// if (File.Exists(labelParam.bitmapfilename))
// {
// srcbitmap = new Bitmap(labelParam.bitmapfilename);
// }
// else {
// srcbitmap = new Bitmap(3648, 3648);
// }
// Bitmap bitmap = new Bitmap(srcbitmap.Width, srcbitmap.Height, PixelFormat.Format32bppArgb);
// Graphics g = Graphics.FromImage(bitmap);
// g.DrawImage(srcbitmap, 0, 0);
// int srcbitmap_Width = srcbitmap.Width;
// srcbitmap.Dispose();
// bitmap.RotateFlip(RotateFlipType.Rotate270FlipNone);
// Size pointsize = new Size(30, 30);
// int widthOffset = 0;
// //Point Right_Batch_Point = new Point(RobotManage.Config.Right_Batch_X, RobotManage.Config.Right_Batch_Y);
// Point Right_Batch_Point = org;
// g.FillEllipse(blue, new Rectangle(Right_Batch_Point, pointsize));
// List<int> angles = new List<int>();
// labelParam.codeInfos.ForEach((c) => {
// //Point op = Common.PointRotate(Right_Batch_Point, new Point(c.X, c.Y), 83d / 180 * Math.PI);
// //c.X = op.X;
// //c.Y = op.Y;
// var x = c.Y;
// var y = srcbitmap_Width - c.X;
// c.X = x;
// c.Y = y;
// Point op = new Point(c.X, c.Y);
// g.FillEllipse(blue, new Rectangle(op, pointsize));
// var a = (int)getAngle(Right_Batch_Point, op);
// //a += ConfigHelper.Config.Get<int>("AngleChange");
// a = a < 0 ? 360 + a : a;
// //g.FillEllipse(red, new Rectangle(PointRotate(org, op, a), pointsize));
// if (c.CodeStr.Contains(labelParam.PN))
// angles.Add(a);
// widthOffset = (int)Common.distance(org, op);
// });
// angles.Sort();
// //if (angles.Count > 1) {
// angles.Add(360 + angles[0]);
// //}
// int biglen = 0;
// int bigangles = 0;
// for (int i = 0; i < angles.Count; i++) {
// if (angles.Count() - i < 2)
// break;
// var x = angles[i+1] - angles[i];
// if (x > biglen)
// {
// biglen = x;
// bigangles = angles[i];
// }
// }
// if (labelParam.PlateW > 7)
// {// && angles.Count==2) {
// labelAngle = angles[0] + 120;
// }
// else
// {
// //labelAngle = bigangles + biglen / 2;
// labelAngle = angles[0]+180;
// }
// //匹配照片角度与贴标旋转轴的角度差
// labelAngle += Label_R_Angle_Diff;
// labelAngle = labelAngle > 360 ? labelAngle- 360 : labelAngle;
// labelAngle = labelAngle > 360 ? labelAngle- 360 : labelAngle;
// //g.FillEllipse(red, new Rectangle(PointRotate(org, op, labelAngle), pointsize));
// //贴标坐标
// var p2 = PointWithAngle(org, labelAngle, widthOffset);
// //贴标偏移
// var p3 = PointWithAngle(p2, labelAngle+180, Label_R_Offset);
// //贴标角度,右侧为0度,+180转换到左侧为0度
// labelAngle += 180;
// labelAngle = labelAngle > 360 ? labelAngle - 360 : labelAngle;
// g.FillEllipse(yeelow, new Rectangle(p2, pointsize));
// g.FillEllipse(red, new Rectangle(p3, pointsize));
// g.Save();
// g.Dispose();
// string dir = "/image/labeldebug/";
// Directory.CreateDirectory(dir);
// bitmap.Save(dir+DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") +".jpg",ImageFormat.Jpeg);
// bitmap.Dispose();
// return p3;
//}
//static IdWorker id = new IdWorker(1, 1);
//static string[] pnreglist;
//static string[] qtyreglist;
//public static void LoadMatchList() {
// pnreglist = File.ReadAllLines("config\\pn.list").ToList().FindAll((s) => { return !string.IsNullOrWhiteSpace(s); }).ToArray();
// qtyreglist = File.ReadAllLines("config\\qty.list").ToList().FindAll((s) => { return !string.IsNullOrWhiteSpace(s); }).ToArray();
//}
//public static bool codeProcess(ReelParam labelParam,out string debugmsg) {
// if (pnreglist == null)
// LoadMatchList();
// debugmsg = "";
// List<CodeInfo> newcodeInfos = new List<CodeInfo>();
// labelParam.PN = "";
// foreach (var ci in labelParam.codeInfos.ToArray())
// {
// //string[] pnreglist = new string[] {
// // @"^P([1-9]\d+)$",
// // @"^(\d+)$%Code 128",
// // @"^([1-9]\d{7,9})$"
// //};
// foreach (var qtyreg in pnreglist)
// {
// var partrules = qtyreg.Split('%');
// if (partrules.Length == 2) {
// if (ci.CodeType != partrules[1])
// break;
// }
// var m = Regex.Match(ci.CodeStr, partrules[0]);
// if (m.Success)
// {
// newcodeInfos.Add(ci);
// //labelParam.codeInfos.Remove(ci);
// labelParam.PN = m.Groups[1].Value;
// debugmsg += $"匹配到PN:{labelParam.PN}\r\n命中规则:{qtyreg}\r\n";
// break;
// }
// }
// if (!string.IsNullOrEmpty(labelParam.PN))
// break;
// }
// labelParam.QTY = 0;
// foreach (var ci in labelParam.codeInfos.ToArray())
// {
// //string[] qtyreglist = new string[] {
// // @"Q(\d{3,5})[^\d]",
// // @"^Q(\d{3,5})$",
// // @"^\w+\.\d([1-9]+0+)[1-9]+\d*$",
// // @"^.+?;.+?;.+?;(\d{3,5}?);.+?;.+?$",
// // @"^QUANTITY:(\d*)",
// // @"^(\d{6})\s",
// // @"\(\w*\s+(\d+)[a-zA-Z]",
// //};
// foreach (var qtyreg in qtyreglist)
// {
// var m = Regex.Match(ci.CodeStr, qtyreg);
// if (m.Success)
// {
// newcodeInfos.Add(ci);
// //labelParam.codeInfos.Remove(ci);
// labelParam.QTY = int.Parse(m.Groups[1].Value);
// debugmsg += $"匹配到QTY:{labelParam.QTY}\r\n命中规则:{qtyreg}\r\n";
// break;
// }
// }
// if (labelParam.QTY > 0)
// break;
// }
// if (string.IsNullOrEmpty(labelParam.PN) || labelParam.QTY == 0)
// return false;
// //labelParam.codeInfos = newcodeInfos;
// labelParam.FC = "985022";
// labelParam.RI = "AL"+DateTime.Now.ToString("yyMMddHHmmssf");
// labelParam.Batch = DateTime.Now.ToString("MMdd");
// labelParam.WareCode = labelParam.RI;
// LogUtil.info($"匹配成功:{labelParam.PN},{labelParam.QTY},{labelParam.RI}");
// return true;
//}
#endregion
public static double distance(Point p1, Point p2)
public static bool IsInstore(StoreMoveType moveType)
{
double result;
result = Math.Sqrt((p1.X - p2.X) * (p1.X - p2.X) + (p1.Y - p2.Y) * (p1.Y - p2.Y));
return result;
return moveType.Equals(StoreMoveType.InStore);
}
/// <summary>
/// 以中心点旋转Angle角度
/// </summary>
/// <param name="origin">中心点</param>
/// <param name="reRotate">待旋转的点</param>
/// <param name="angle">旋转角度, 逆时针</param>
public static Point PointRotate(Point origin, Point rePoint, double angle)
public static bool IsOutStore(StoreMoveType moveType)
{
double x = (rePoint.X - origin.X) * Math.Cos(angle) - (rePoint.Y - origin.Y) * Math.Sin(angle) + origin.X;
double y = (rePoint.X - origin.X) * Math.Sin(angle) + (rePoint.Y - origin.Y) * Math.Cos(angle) + origin.Y;
//rePoint.X = x;
//rePoint.Y = y;
return new Point((int)x, (int)y);
}
/// <summary>
/// 以指定点为中心,测算指定角度,指定长度位置的点
/// </summary>
/// <param name="p1">原点</param>
/// <param name="angle">角度</param>
/// <param name="distance">距离</param>
/// <returns></returns>
public static Point PointWithAngle(Point p1, double angle, double distance) {
var x2 = p1.X + distance * Math.Cos(angle / 180 * Math.PI);
var y2 = p1.Y + distance * Math.Sin(angle / 180 * Math.PI);
return new Point((int)x2, (int)y2);
return moveType.Equals(StoreMoveType.OutStore);
}
/// <summary>
///
/// 料叉上检测到的料盘是否到单料口手动处理
/// </summary>
/// <param name="labelParam"></param>
/// <param name="org">中心点坐标</param>
/// <param name="Label_R_Offset">贴标臂偏移</param>
/// <param name="labelAngle">贴标角度</param>
/// <returns></returns>
public static Point CalcLabelPoint(ReelParam labelParam, Point org,int Label_R_Offset, int Label_R_Angle_Diff, out int labelAngle) {
SolidBrush blue = new SolidBrush(Color.BlueViolet);
SolidBrush red = new SolidBrush(Color.Red);
SolidBrush yeelow = new SolidBrush(Color.Yellow);
SolidBrush AliceBlue = new SolidBrush(Color.AliceBlue);
Font font = new Font(FontFamily.GenericSansSerif, 60);
Pen Greenpen = new Pen(Color.Green, 10);
Bitmap srcbitmap;
if (File.Exists(labelParam.bitmapfilename))
public static bool IsManualHandleReelInFix()
{
srcbitmap = new Bitmap(labelParam.bitmapfilename);
}
else {
srcbitmap = new Bitmap(3648, 3648);
}
Bitmap bitmap = new Bitmap(srcbitmap.Width, srcbitmap.Height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bitmap);
g.DrawImage(srcbitmap, 0, 0);
int srcbitmap_Width = srcbitmap.Width;
srcbitmap.Dispose();
bitmap.RotateFlip(RotateFlipType.Rotate270FlipNone);
Size pointsize = new Size(30, 30);
int widthOffset = 0;
//Point Right_Batch_Point = new Point(RobotManage.Config.Right_Batch_X, RobotManage.Config.Right_Batch_Y);
Point Right_Batch_Point = org;
g.FillEllipse(blue, new Rectangle(Right_Batch_Point, pointsize));
List<int> angles = new List<int>();
labelParam.codeInfos.ForEach((c) => {
//Point op = Common.PointRotate(Right_Batch_Point, new Point(c.X, c.Y), 83d / 180 * Math.PI);
//c.X = op.X;
//c.Y = op.Y;
var x = c.Y;
var y = srcbitmap_Width - c.X;
c.X = x;
c.Y = y;
Point op = new Point(c.X, c.Y);
g.FillEllipse(blue, new Rectangle(op, pointsize));
var a = (int)getAngle(Right_Batch_Point, op);
//a += ConfigHelper.Config.Get<int>("AngleChange");
a = a < 0 ? 360 + a : a;
//g.FillEllipse(red, new Rectangle(PointRotate(org, op, a), pointsize));
if (c.CodeStr.Contains(labelParam.PN))
angles.Add(a);
widthOffset = (int)Common.distance(org, op);
});
angles.Sort();
//if (angles.Count > 1) {
angles.Add(360 + angles[0]);
//}
int biglen = 0;
int bigangles = 0;
for (int i = 0; i < angles.Count; i++) {
if (angles.Count() - i < 2)
break;
var x = angles[i+1] - angles[i];
if (x > biglen)
{
biglen = x;
bigangles = angles[i];
}
}
if (labelParam.PlateW > 7)
{// && angles.Count==2) {
labelAngle = angles[0] + 120;
}
else
{
//labelAngle = bigangles + biglen / 2;
labelAngle = angles[0]+180;
}
//匹配照片角度与贴标旋转轴的角度差
labelAngle += Label_R_Angle_Diff;
labelAngle = labelAngle > 360 ? labelAngle- 360 : labelAngle;
labelAngle = labelAngle > 360 ? labelAngle- 360 : labelAngle;
//g.FillEllipse(red, new Rectangle(PointRotate(org, op, labelAngle), pointsize));
//贴标坐标
var p2 = PointWithAngle(org, labelAngle, widthOffset);
//贴标偏移
var p3 = PointWithAngle(p2, labelAngle+180, Label_R_Offset);
//贴标角度,右侧为0度,+180转换到左侧为0度
labelAngle += 180;
labelAngle = labelAngle > 360 ? labelAngle - 360 : labelAngle;
g.FillEllipse(yeelow, new Rectangle(p2, pointsize));
g.FillEllipse(red, new Rectangle(p3, pointsize));
g.Save();
g.Dispose();
string dir = "/image/labeldebug/";
Directory.CreateDirectory(dir);
bitmap.Save(dir+DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") +".jpg",ImageFormat.Jpeg);
bitmap.Dispose();
return p3;
}
static IdWorker id = new IdWorker(1, 1);
static string[] pnreglist;
static string[] qtyreglist;
public static void LoadMatchList() {
pnreglist = File.ReadAllLines("config\\pn.list").ToList().FindAll((s) => { return !string.IsNullOrWhiteSpace(s); }).ToArray();
qtyreglist = File.ReadAllLines("config\\qty.list").ToList().FindAll((s) => { return !string.IsNullOrWhiteSpace(s); }).ToArray();
}
public static bool codeProcess(ReelParam labelParam,out string debugmsg) {
if (pnreglist == null)
LoadMatchList();
debugmsg = "";
List<CodeInfo> newcodeInfos = new List<CodeInfo>();
labelParam.PN = "";
foreach (var ci in labelParam.codeInfos.ToArray())
{
//string[] pnreglist = new string[] {
// @"^P([1-9]\d+)$",
// @"^(\d+)$%Code 128",
// @"^([1-9]\d{7,9})$"
//};
foreach (var qtyreg in pnreglist)
{
var partrules = qtyreg.Split('%');
if (partrules.Length == 2) {
if (ci.CodeType != partrules[1])
break;
}
var m = Regex.Match(ci.CodeStr, partrules[0]);
if (m.Success)
{
newcodeInfos.Add(ci);
//labelParam.codeInfos.Remove(ci);
labelParam.PN = m.Groups[1].Value;
debugmsg += $"匹配到PN:{labelParam.PN}\r\n命中规则:{qtyreg}\r\n";
break;
}
}
if (!string.IsNullOrEmpty(labelParam.PN))
break;
}
labelParam.QTY = 0;
foreach (var ci in labelParam.codeInfos.ToArray())
{
//string[] qtyreglist = new string[] {
// @"Q(\d{3,5})[^\d]",
// @"^Q(\d{3,5})$",
// @"^\w+\.\d([1-9]+0+)[1-9]+\d*$",
// @"^.+?;.+?;.+?;(\d{3,5}?);.+?;.+?$",
// @"^QUANTITY:(\d*)",
// @"^(\d{6})\s",
// @"\(\w*\s+(\d+)[a-zA-Z]",
//};
foreach (var qtyreg in qtyreglist)
{
var m = Regex.Match(ci.CodeStr, qtyreg);
if (m.Success)
{
newcodeInfos.Add(ci);
//labelParam.codeInfos.Remove(ci);
labelParam.QTY = int.Parse(m.Groups[1].Value);
debugmsg += $"匹配到QTY:{labelParam.QTY}\r\n命中规则:{qtyreg}\r\n";
break;
}
}
if (labelParam.QTY > 0)
break;
}
if (string.IsNullOrEmpty(labelParam.PN) || labelParam.QTY == 0)
return false;
//labelParam.codeInfos = newcodeInfos;
labelParam.FC = "985022";
labelParam.RI = "AL"+DateTime.Now.ToString("yyMMddHHmmssf");
labelParam.Batch = DateTime.Now.ToString("MMdd");
labelParam.WareCode = labelParam.RI;
LogUtil.info($"匹配成功:{labelParam.PN},{labelParam.QTY},{labelParam.RI}");
return true;
return ConfigAppSettings.GetValue("IsManualHandleReelInFix", false, "料叉上检测到的料盘是否到单料口手动处理");
}
public T DeepClone<T>(T _object)
{
......@@ -314,8 +333,10 @@ namespace DeviceLibrary
public ErrInfo errInfo;
public DateTime datetime;
public static List<Msg> get() {
if (_setlogones) {
public static List<Msg> get()
{
if (_setlogones)
{
_setlogones = false;
foreach (var m in msg)
LogUtil.info(m.msgtxt);
......@@ -323,12 +344,12 @@ namespace DeviceLibrary
List<Msg> mm = new List<Msg>(msg);
return mm;
}
public static void add(string m, MsgLevel ml, ErrInfo errInfo= ErrInfo.Empty)
public static void add(string m, MsgLevel ml, ErrInfo errInfo = ErrInfo.Empty)
{
lock (msg)
{
var fm = msg.Find((x) => x.msgtxt == m);
if (fm==null)
if (fm == null)
msg.Add(new Msg { msgtxt = m, msgLevel = ml, datetime = DateTime.Now, errInfo = errInfo });
}
}
......@@ -343,13 +364,15 @@ namespace DeviceLibrary
msg.Clear();
}
}
public enum MsgLevel {
public enum MsgLevel
{
warning,
info,
alarm
}
public enum ErrInfo {
public enum ErrInfo
{
Empty,
X09_BoxNotDetect,
ResetBtn,
......
......@@ -16,24 +16,26 @@ namespace DeviceLibrary
public StoreJobList(string jn) {
jobname = jn;
}
public void Enqueue(JobInfo jobInfo)
public bool Enqueue(JobInfo jobInfo)
{
lock (jobInfos)
{
if (lastoutpos == jobInfo.PosId)
{
LogUtil.info($"[{jobname}] 出库任务正在执行:" + jobInfo.ToStr());
return;
return false;
}
var l = jobInfos.ToList().Find((x) => { return x.PosId == jobInfo.PosId; });
if (l == null)
{
jobInfos.Enqueue(jobInfo);
LogUtil.info($"[{jobname}] 出库任务加入队列:" + jobInfo.ToStr());
return true;
}
else
LogUtil.info($"[{jobname}] 出库任务已存在队列中:" + jobInfo.ToStr());
}
return false;
}
public bool Dequeue(out JobInfo jobInfo)
{
......
......@@ -330,6 +330,7 @@ namespace DeviceLibrary
}
}
LogUtil.info("主线程已退出.");
RobotManage.isRunning = false;
}
public void Start()
{
......
......@@ -81,11 +81,22 @@ namespace DeviceLibrary
switch (ClampMoveInfo.MoveStep)
{
case MoveStep.Wait:
if (Common.IsManualHandleReelInFix())
{
if (IsGetReelReady && StoreMoveInfo.MoveStep == MoveStep.Wait && OutSingleJobList.Count == 0)
{
ClampMoveInfo.NewMove(MoveStep.ReelClamp_01);
OpenFlipDoor(ClampMoveInfo);
}
}
else
{
if (IsGetReelReady && StoreMoveInfo.MoveStep < MoveStep.StoreOut10 && OutSingleJobList.Count == 0)
{
ClampMoveInfo.NewMove(MoveStep.ReelClamp_01);
OpenFlipDoor(ClampMoveInfo);
}
}
break;
case MoveStep.ReelClamp_01:
ClampMoveInfo.NextMoveStep(MoveStep.ReelClamp_02);
......@@ -280,7 +291,7 @@ namespace DeviceLibrary
{
Msg.add(crc.GetString(L.x29_low_no_reel, "传感器X29未检测到单料口料盘."), MsgLevel.alarm);
Msg.add(ClampMoveInfo.MoveParam.NgMsg, MsgLevel.warning);
RobotManage.UserPause(crc.GetString("Res0005", "传感器X29未检测到单料口料盘"));
//RobotManage.UserPause(crc.GetString("Res0005", "传感器X29未检测到单料口料盘"));
}
}
SingleDoor.ToHigh(ClampMoveInfo);
......@@ -394,7 +405,7 @@ namespace DeviceLibrary
get
{
if (ConfigHelper.Config.Get("CamTestReel_Ability", false))
return CodeManager.TestHasReel(CodeManager.hikNameList[0],out _,out _);
return CodeManager.TestHasReel(CodeManager.hikNameList[0], out _, out _);
else
return IOValue(IO_Type.NGDoor_Tray_Check).Equals(IO_VALUE.HIGH);
}
......@@ -465,7 +476,7 @@ namespace DeviceLibrary
List<CodeInfo> LastCodeList;
LastCodeList = CodeManager.CameraScan(CodeManager.hikNameList);
if (LastCodeList.Count==0)
if (LastCodeList.Count == 0)
LastCodeList = CodeManager.CameraScan(CodeManager.hikNameList);
//BoxParam labelParam = new BoxParam();
//labelParam.codeInfos = new List<CodeInfo>(LastCodeList);
......
......@@ -19,14 +19,14 @@ namespace DeviceLibrary
public void AddOutStoreTask(string posId, int plateW, int plateH)
{
JobInfo jobInfo = new JobInfo("", posId, plateW, plateH);
OutStoreJobList.Enqueue(jobInfo);
LogUtil.info($"添加出库任务队列: {posId},当前任务数量: {OutStoreJobList.Count}");
if (OutStoreJobList.Enqueue(jobInfo))
LogUtil.info($"批量出库任务当前任务数量: {OutStoreJobList.Count}");
}
public void AddSingleStoreTask(string posId, int plateW, int plateH)
{
JobInfo jobInfo = new JobInfo("", posId, plateW, plateH);
OutSingleJobList.Enqueue(jobInfo);
LogUtil.info($"添加单盘出库任务队列: {posId},当前任务数量: {OutSingleJobList.Count}");
if (OutSingleJobList.Enqueue(jobInfo))
LogUtil.info($"单盘出库任务队列任务数量: {OutSingleJobList.Count}");
}
void StoreProcess()
{
......@@ -62,15 +62,7 @@ namespace DeviceLibrary
{
if (!boxTransport.IgnoreX09 && IOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.HIGH))
{
//if (!boxTransport.IgnoreX09 && IOMonitor.IODebound(IO_Type.TrayCheck_Fixture, Config, IO_VALUE.HIGH, 1000))
//{
// Msg.add(crc.GetString("Res0004", "收到出库任务,但料叉上有料,无法启动,请检查"), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
// //RobotManage.UserPause(crc.GetString("Res0004", "收到出库任务,但料叉上有料,无法启动,请检查"));
//}
//else
Msg.add(crc.GetString("Res0004", "收到出库任务,但料叉上有料,无法启动,请检查"), MsgLevel.alarm);
RobotManage.UserPause(crc.GetString("Res0004", "收到出库任务,但料叉上有料,无法启动,请检查"));
Msg.add(crc.GetString("Res0004", "收到出库任务,但料叉上有料,无法启动,请检查"), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
return;
}
else
......@@ -94,15 +86,9 @@ namespace DeviceLibrary
{
if (!boxTransport.IgnoreX09 && IOValue(IO_Type.TrayCheck_Fixture).Equals(IO_VALUE.HIGH))
{
//if (!boxTransport.IgnoreX09 && IOMonitor.IODebound(IO_Type.TrayCheck_Fixture, Config, IO_VALUE.HIGH, 1000))
//{
// Msg.add(crc.GetString("Res0004", "收到出库任务,但料叉上有料,无法启动,请检查"), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
// //RobotManage.UserPause("收到出库任务,但料叉上有料,无法启动,请检查");
//}
//else
Msg.add(crc.GetString("Res0004", "收到出库任务,但料叉上有料,无法启动,请检查"), MsgLevel.alarm);
RobotManage.UserPause(crc.GetString("Res0004", "收到出库任务,但料叉上有料,无法启动,请检查"));
//Msg.add(crc.GetString("Res0004", "收到出库任务,但料叉上有料,无法启动,请检查"), MsgLevel.alarm);
//RobotManage.UserPause(crc.GetString("Res0004", "收到出库任务,但料叉上有料,无法启动,请检查"));
Msg.add(crc.GetString("Res0004", "收到出库任务,但料叉上有料,无法启动,请检查"), MsgLevel.alarm, ErrInfo.X09_BoxNotDetect);
return;
}
else
......@@ -133,8 +119,15 @@ namespace DeviceLibrary
case MoveStep.StoreIn02:
break;
case MoveStep.StoreIn03:
if (boxTransport.IsTakedReel)
if (boxTransport.IsNGReel)
{
StoreMoveInfo.NextMoveStep(MoveStep.StoreInNG_01);
boxTransport.IsNGReel = false;
StoreMoveInfo.log($"入库料盘被判定为NG,准备送往单料口");
}
else if (boxTransport.IsTakedReel)
{
boxTransport.IsNGReel = false;
ReelTaked();
StoreMoveInfo.NextMoveStep(MoveStep.StoreIn04);
StoreMoveInfo.log($"料盘已取走");
......@@ -145,7 +138,13 @@ namespace DeviceLibrary
}
break;
case MoveStep.StoreIn04:
if (boxTransport.IsComplateOrFree)
if (boxTransport.IsNGReel)
{
StoreMoveInfo.NextMoveStep(MoveStep.StoreInNG_01);
boxTransport.IsNGReel = false;
StoreMoveInfo.log($"入库料盘被判定为NG,准备送往单料口");
}
else if (boxTransport.IsComplateOrFree)
{
if (!ServerCM.SendStoreState(StoreMoveInfo.MoveParam.PosID, StoreStatus.InStoreEnd))
{
......@@ -157,6 +156,35 @@ namespace DeviceLibrary
}
break;
case MoveStep.StoreInNG_01:
string msg = ServerCM.cancelPutInTask(Name, StoreMoveInfo.MoveParam.WareCode);
if (string.IsNullOrEmpty(msg))
{
StoreMoveInfo.NextMoveStep(MoveStep.StoreInNG_02);
StoreMoveInfo.log($"取消[{StoreMoveInfo.MoveParam.WareCode}]入库任务");
}
break;
case MoveStep.StoreInNG_02:
StoreMoveInfo.NextMoveStep(MoveStep.StoreInNG_03);
// var outFrom = CSVPositionReader<ACStorePosition>.GetPositon(StoreMoveInfo.MoveParam.PosID);
BoxStorePosition tar = new BoxStorePosition(Config, StoreSide.NGDoor, StoreMoveInfo.MoveParam);
boxTransport.Start(null, tar, StoreMoveType.InStore);
StoreMoveInfo.log($"开始转运料盘到单料口");
break;
case MoveStep.StoreInNG_03:
if (boxTransport.IsPutOnOut)
{
StoreMoveInfo.log($"料盘已到达单料口");
NGPuted(crc.GetString(L.instore_abnormal_reel, "入库过程中料叉检测料盘异常"));
StoreMoveInfo.EndMove();
}
break;
case MoveStep.StoreInNG_04:
break;
case MoveStep.StoreInNG_05:
break;
case MoveStep.StoreOut_NGPre:
StoreMoveInfo.NextMoveStep(MoveStep.StoreOut10);
break;
......
......@@ -115,6 +115,12 @@ namespace DeviceLibrary
StoreIn07,
StoreIn08,
StoreIn09,
StoreInNG_01,
StoreInNG_02,
StoreInNG_03,
StoreInNG_04,
StoreInNG_05,
StoreOut10, //出库
StoreOut_NGPre,
StoreOut11,
......
......@@ -148,7 +148,6 @@ namespace DeviceLibrary
mainMachine.Stop();
mainMachine.UserPause = false;
}
isRunning = false;
}
public static void ShutDown()
{
......
......@@ -402,3 +402,4 @@ r_flipDoor_no_work 右侧翻板水平信号未亮 The right flap horizontal sign
reel_not_in_right_status 料盘放置异常 The reel is placed abnormally
confirm_no_reel_in_com 请确保料盘已从库位中取出 Make sure that the reel has been removed from the location
outstore_abnormal_reel The material tray is not successfully put into the string, please check
instore_abnormal_reel During the warehousing process, the fork detects the abnormality of the tray
\ No newline at end of file
......@@ -404,3 +404,4 @@ r_flipDoor_no_work 右侧翻板水平信号未亮 右フラップ水平信号が
reel_not_in_right_status 料盘放置异常 リールが異常に配置されている
confirm_no_reel_in_com 请确保料盘已从库位中取出 リールがその場所から取り外されていることを確認してください
outstore_abnormal_reel 倉庫を出るとき、材料トレイがひもにうまく入れられていません、確認してください
instore_abnormal_reel 倉庫プロセス中に、フォークはトレイの異常を検出します
\ No newline at end of file
......@@ -377,9 +377,9 @@ tray_detect_reel_01 料叉传感器X30感应到有料,请人工确认 料叉传
system_running_cantmove 系统正在运行,不能手动控制伺服
before_FrmPositionTool_stopmuchine 运行库位校准程序前,需要先停止料仓的运行
outstore_abnormal_reel 出库时料盘未成功放入料串,请检查
instore_abnormal_reel 入库过程中料叉检测料盘异常
Res0004 收到出库任务,但料叉上有料,无法启动,请检查 收到出库任务,但料叉上有料,无法启动,请检查
selCamera 请先选择相机 请先选择相机
selImage 请先选择图片 请先选择图片
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!