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);//临时
            }
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        /// <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));
        }
Esempio n. 4
0
 /// <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));
 }
Esempio n. 5
0
 /// <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));
 }
Esempio n. 6
0
        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);
        }