public bool PanelAvailable(string realloc) { #if DEBUG // 用于测试 return(true); #endif try { var s = ""; var canput = false; lock (client) { s = client.TryReadString(param.BAreaPanelState[realloc]); canput = !client.TryReadBool(param.BadShapeLocations[realloc]); } if (!canput) { onerror?.Invoke(false, $"{realloc}形状坏"); } var layershape = canput ? "正常" : "坏型"; if (s != "3") { log($"实际交地: {realloc}, 可放料信号板状态: {s}, 层形状状态: {layershape}", LogType.ROBOT_STACK); } return(s == "2" && canput); } catch (Exception ex) { log($"!来源: {nameof(PanelAvailable)}, 实际交地: {realloc}, 读可放料信号异常: {ex}", LogType.ROBOT_STACK); return(false);//临时 } }
public static bool IsPushedAside(IOpcClient client, OPCParam param, Action onResetError = null) { var slot = param.ScanParam.PlcPushAside; if (client.TryReadBool(slot)) { var resetok = client.TryWrite(slot, 0); if (!resetok) { onResetError?.Invoke(); // 复位失败 } return(true); } else { return(false); } }
/// <summary> /// 抓料处来料信号。 /// </summary> /// <param name="client"></param> /// <param name="pos">抓料处位置编号。</param> /// <param name="param"></param> /// <returns></returns> public static bool ReadItemCatchSignal(IOpcClient client, OPCParam param, int pos) { var slot = ""; if (pos == 1) { slot = param.RobotCarryParam.RobotCarryA; } if (pos == 2) { slot = param.RobotCarryParam.RobotCarryB; } if (slot == "") { throw new Exception("error pos."); } return(client.TryReadBool(slot)); }
/// <summary> /// 读扫描状态信号。 /// </summary> /// <param name="client">opc client.</param> /// <param name="param">opc param.</param> /// <returns></returns> public static bool ReadScanState(IOpcClient client, OPCParam param) { return(client.TryReadBool(param.ScanParam.ScanState)); }
/// <summary> /// 读布卷到达缓冲信号。 /// </summary> /// <param name="client">opc client</param> /// <param name="param">opc param</param> /// <returns></returns> public static bool ReadBeforeCacheSignal(IOpcClient client, OPCParam param) { return(client.TryReadBool(param.CacheParam.BeforCacheStatus)); }
public bool JobTask(ref bool isrun, bool isSideA, Queue <RollPosition> robotRollQ, RollPosition roll, ListView lv) { // 等待板可放料 if (!PanelAvailable(roll.RealLocation)) { FrmMain.logOpt.Write($"!{roll.RealLocation}未收到可放料信号,请检查板状态和是否有形状不规则报警。", LogType.ROBOT_STACK); return(false); } // 机器人正忙,等待。 while (isrun) { if (IsBusy()) { FrmMain.logOpt.Write($"!机器人正忙", LogType.ROBOT_STACK); #if DEBUG Thread.Sleep(FakeOpcClient.DELAY * 10); #endif } else { break; } } if (!TryWritePositionPro(roll)) { return(false); } if (TryRunJob(JOB_NAME)) { log($"发出机器人示教器动作{JOB_NAME}命令成功。", LogType.ROBOT_STACK); client.TryWrite(param.RobotParam.RobotJobStart, true); } else { log($"!机器人示教器动作{JOB_NAME}发送失败。", LogType.ROBOT_STACK); return(false); } Thread.Sleep(RobotHelper.DELAY * 200); //删除对列布卷 while (isrun) { var leaving = client.TryReadBool(isSideA ? param.RobotParam.RobotStartA : param.RobotParam.RobotStartB); if (leaving) { log($"roll is leaving: {roll.LabelCode}.", LogType.ROBOT_STACK, LogViewType.OnlyFile); DequeueRoll(robotRollQ, roll, lv); client.TryWrite(isSideA ? param.RobotParam.RobotStartA : param.RobotParam.RobotStartB, false); break; } Thread.Sleep(RobotHelper.DELAY); } // 等待布卷上垛信号 while (isrun) { if (IsRollOnPanel()) { // 写数据库。 LableCode.SetOnPanelState(roll.LabelCode); // 告知OPC NotifyOpcJobFinished(roll); log("布卷已上垛。", LogType.ROBOT_STACK, LogViewType.Both); break; } Thread.Sleep(RobotHelper.DELAY * 20); } // 等待机器人结束码垛。 while (isrun && IsBusy()) { Thread.Sleep(RobotHelper.DELAY * 20); } DequeueRoll(robotRollQ, roll, lv); if (!isrun) //解决压布,布卷未上垛问题 // 写数据库。 { LableCode.SetOnPanelState(roll.LabelCode); // 告知OPC NotifyOpcJobFinished(roll); log($"{roll.LabelCode}布卷已上垛。", LogType.ROBOT_STACK, LogViewType.Both); } log($"robot job done: {roll.LabelCode}.", LogType.ROBOT_STACK); return(true); }