Esempio n. 1
0
        //读取4号位所有数据
        public Result PLC04ReadInfoEvent(ActionArgs actionArgs)
        {
            //获取4号位所有信息;更新料箱明细表
            byte[] P4PlcInfo = (byte[])actionArgs.StepResult.Data;
            //对比物料号数据,得出是否需要更新
            bool isUpdate = CompareP4PlcInfo(P4PlcInfo);
            var  eng      = ModBusDataFactory.workFlowEngines.FirstOrDefault(x => x.ModuleName == "WFE");

            if (!isUpdate)
            {
                //4号位需要更新
                FlowBlock blocku = eng._workFlow.Blocks.FirstOrDefault(v => v.Name == "PLC04UpdateB");
                eng.EnqueueBlock(blocku);
                //更新具体信息
                //TODO 获取更新的内容
                string    content = "";
                FlowBlock blockci = eng._workFlow.Blocks.FirstOrDefault(v => v.Name == "PLC04UpdateCppInfoB");
                blockci.Steps[0].Value = content;
                eng.EnqueueBlock(blockci);
            }
            else
            {
                //4号位不需要更新
                FlowBlock block = eng._workFlow.Blocks.FirstOrDefault(v => v.Name == "PLC04NoUpdateB");
                eng.EnqueueBlock(block);
            }
            Logger.Device.Info($" invoke PLC04NoUpdateB 读取4号位所有数据");
            return(Result.Success());
        }
    /// <summary>
    /// Should called only From RobotSystem
    /// </summary>
    /// <param name="deltaTime"></param>
    public void ExecuteWaitingBlock(float deltaTime)
    {
        if (this.installedRobotSourceCode == null)
        {
            Debug.Log("Please add RobotSourceCode");
            return;
        }

        this.WaitingTime += deltaTime; // Add WaitingTime


        if (this.BlockCallStack.Count == 0)
        {
            //Still WaitingBlock is null, Set Top Of LoopedBlock To WaitingBlock
            this.PushToBlockCallStack(this.installedRobotSourceCode.LoopedBlock);
        }

        if (this.BlockCallStack.Count == 0)
        {
            return;
        }

        FlowBlock topBlock     = this.BlockCallStack.Peek();
        bool      isOperatable = topBlock.IsOperatable(this);

        if (isOperatable == true)
        {
            this.BlockCallStack.Pop();                           //remove top block

            FlowBlock nextBlock = topBlock.StartFlowBlock(this); // Start WaitingBlock
            this.PushToBlockCallStack(nextBlock);
        }
    }
Esempio n. 3
0
        //读取2号位取到第几片
        public Result PLC02ReadNumDoneEvent(ActionArgs actionArgs)
        {
            //TODO 1.读取2号位取到第几片
            int p2Num = (int)actionArgs.StepResult.Data;
            //TODO 2.更新2号料表信息
            int    btsIndex = p2Num / 8 - 1;
            int    btIndex  = p2Num % 8 - 1;
            string btstr    = Convert.ToString(curentRfidStation.LocaNumbInfo[btsIndex], 2);

            char[] chars = btstr.ToCharArray();
            for (int i = 0; i < 8; i++)
            {
                chars[btIndex] = '0';
            }
            btstr = chars.ToString();
            byte tarbt = Convert.ToByte(btstr, 2);

            curentRfidStation.LocaNumbInfo[btsIndex] = tarbt;
            var       eng   = ModBusDataFactory.workFlowEngines.FirstOrDefault(x => x.ModuleName == "WFE");
            FlowBlock block = eng._workFlow.Blocks.FirstOrDefault(v => v.Name == "PLC02UpdateInfoB");

            block.Steps[0].Value = curentRfidStation.ToJsonStr();
            eng.EnqueueBlock(block);
            //存放当前取第几片料
            actionArgs.RedisClientLocal.Set($"LD:{Constant.OrderLine}:APCM:P2NUM", p2Num);
            Constant.p2Num = p2Num;
            Logger.Device.Info($" invoke PLC02ReadInfoEvent 2号位读取数据初始化");
            return(Result.Success());
        }
    public void PushToBlockCallStack(FlowBlock addedBlock)
    {
        if (addedBlock == null)
        {
            return;
        }

        this.BlockCallStack.Push(addedBlock);
    }
Esempio n. 5
0
        //写入批次号成功
        public Result PLC05WriteBatchEvent(ActionArgs actionArgs)
        {
            //生成批次号
            string    batch  = CreateBatch(actionArgs.StepResult);
            var       eng    = ModBusDataFactory.workFlowEngines.FirstOrDefault(x => x.ModuleName == "WFE");
            FlowBlock blocku = eng._workFlow.Blocks.FirstOrDefault(v => v.Name == "PLC05WriteBatchB");

            blocku.Steps[0].Value = batch;
            eng.EnqueueBlock(blocku);
            Logger.Device.Info($" invoke PLC05WriteBatchEvent 写入批次号成功");
            return(Result.Success());
        }
Esempio n. 6
0
        private void UpdateP1Info(RfidStationInfo rfidStationInfo)
        {
            if (Plc01Action.curentRsInfoList.RfidStationInfos.Contains(rfidStationInfo))
            {
                Plc01Action.curentRsInfoList.RfidStationInfos.Remove(rfidStationInfo);
            }
            var       eng   = ModBusDataFactory.workFlowEngines.FirstOrDefault(x => x.ModuleName == "WFE");
            FlowBlock block = eng?._workFlow.Blocks.FirstOrDefault(v => v.Name == "PLC01UpdateInfoB");

            block.Steps[0].Value = Plc01Action.curentRsInfoList.ToJsonStr();
            eng.EnqueueBlock(block);
        }
Esempio n. 7
0
        //请求产生抽检料
        public Result SpotReqCheckTaskEvent(ActionArgs actionArgs)
        {
            //查找当前工作流引擎
            var       eng   = ModBusDataFactory.workFlowEngines.FirstOrDefault(x => x.ModuleName == "WFE");
            FlowBlock block = eng?._workFlow.Blocks.FirstOrDefault(v => v.Name == "PLC00SpotReqCheckTaskB");

            if (block != null)
            {
                eng?.EnqueueBlock(block);
            }
            Logger.Device.Info($" invoke SpotReqCheckTaskEvent 请求产生抽检料执行完毕");
            return(Result.Success());
        }
Esempio n. 8
0
        //料箱转移到2号位
        public Result PLC02WorkbinInEvent(ActionArgs actionArgs)
        {
            //模拟触发2号位RFIDReadInfo
            var       eng   = ModBusDataFactory.workFlowEngines.FirstOrDefault(x => x.ModuleName == "WFE");
            FlowBlock block = eng._workFlow.Blocks.FirstOrDefault(v => v.Name == "PLC02UpdateInfoB");

            //模拟料箱信息初始化写入RFID
            byte[] bts = InitStationInfo(actionArgs);
            block.Steps[0].Value = Encoding.ASCII.GetString(bts);
            eng.EnqueueBlock(block);
            Logger.Device.Info($" invoke PLC02WorkbinInEvent 料箱转移到2号位成功");
            return(Result.Success());
        }
Esempio n. 9
0
        //读取NgNum来判断是否需要NG空箱呼叫
        public Result PLC03NgNumReadEvent(ActionArgs actionArgs)
        {
            //查找当前工作流引擎
            var eng   = ModBusDataFactory.workFlowEngines.FirstOrDefault(x => x.ModuleName == "WFE");
            int NgNum = (int)actionArgs.StepResult.Data;

            if (NgNum >= Constant.Package)
            {
                //触发设置空箱任务呼叫信号
                FlowBlock block = eng?._workFlow.Blocks.FirstOrDefault(v => v.Name == "PLC03Setp3NgNullAgvCallB");
                eng?.EnqueueBlock(block);
            }
            Logger.Device.Info($" invoke PLC03WorkbinInEvent 料箱转移到3号位成功");
            return(Result.Success());
        }
    private void DebugBlockFlowRecursive(FlowBlock flowBlock, ref StringBuilder stringBuilder)
    {
        if (flowBlock != null)
        {
            if (flowBlock != null)
            {
                stringBuilder.Append(flowBlock.GetType().Name);
            }

            stringBuilder.Append("\n|\n|\n");


            this.DebugBlockFlowRecursive(flowBlock.NextBlock, ref stringBuilder);
        }
    }
Esempio n. 11
0
        //记录AGV到达1号位信号
        public Result AgvArriviedEvent(ActionArgs actionArgs)
        {
            var       eng   = ModBusDataFactory.workFlowEngines.FirstOrDefault(x => x.ModuleName == "WFE");
            FlowBlock block = eng?._workFlow.Blocks.FirstOrDefault(v => v.Name == "PLC01UpdateInfoB");

            //模拟3个料箱信息写入RFID
            byte[] bts = InitRfidStationInfos(actionArgs);
            if (block == null)
            {
                return(Result.Fail());
            }
            block.Steps[0].Value = Encoding.Unicode.GetString(bts);
            eng.EnqueueBlock(block);
            Logger.Device.Info($" invoke AgvArriviedEvent 记录AGV到达1号位信号");
            return(Result.Success());
        }
Esempio n. 12
0
        private void SynCncOpInfo()
        {
            List <Tuple <string, string, OpInfo> > opInfos  = new List <Tuple <string, string, OpInfo> >();
            List <Tuple <string, string, NcInfo> > cncInfos = new List <Tuple <string, string, NcInfo> >();

            foreach (RMesDispatch dispatch in ModBusDataFactory.dispatrchs.OrderBy(v => v.OP_CODE))
            {
                _mesRepository = new Repository(SysConf.Main.DbMES);
                TB_ROUTE_OP rOuteOp = _mesRepository.Single <TB_ROUTE_OP>(v => v.OP_CODE == dispatch.OP_CODE);
                OpInfo      opInfo  = new OpInfo()
                {
                    OpSeq     = rOuteOp.OP_SEQ,
                    OpCode    = rOuteOp.OP_CODE,
                    OpDoc     = dispatch.OP_DOC,
                    OpDocPath = dispatch.OP_DOC_PATH,
                    OpDocVer  = dispatch.OP_DOC_VER
                };
                NcInfo ncInfo = new NcInfo()
                {
                    NcId   = dispatch.NC_ID,
                    NcPath = dispatch.NC_PATH,
                    NcVer  = dispatch.NC_VER
                };
                opInfos.Add(new Tuple <string, string, OpInfo>(dispatch.LINE, dispatch.EQUIP_CODE, opInfo));
                cncInfos.Add(new Tuple <string, string, NcInfo>(dispatch.LINE, dispatch.EQUIP_CODE, ncInfo));
            }
            //按设备编号正向排序,得出工序
            opInfos = opInfos.OrderBy(v => v.Item2).ToList();
            byte[] cncOp = new byte[12];
            int    i     = 0;

            foreach (Tuple <string, string, OpInfo> tuple in opInfos)
            {
                i++;
                cncOp[i] = Convert.ToByte(tuple.Item3.OpSeq);
            }
            var eng = ModBusDataFactory.workFlowEngines.FirstOrDefault(x => x.ModuleName == "WFE");
            //触发更新CnCOp模块
            FlowBlock block = eng?._workFlow.Blocks.FirstOrDefault(v => v.Name == "PLC00CncOpB");

            block.Steps[0].Value = Encoding.ASCII.GetString(cncOp);
            eng?.EnqueueBlock(block);
        }
Esempio n. 13
0
        //获取派工单信息;做线体准备工作
        public Result GetOrderEvent(ActionArgs actionArgs)
        {
            //下发工序,CNC程序等给线体机台
            SynCncOpInfo();
            Constant.OrderLine = ModBusDataFactory.OrderLine;
            if (Constant.Package == -1)
            {
                int package = int.Parse(actionArgs.RedisClientLocal.Get($"LD:{Constant.OrderLine}:APCM:PACKAGE"));
                Constant.Package = package;
            }
            //获取2号位置数量
            if (Constant.p2Num == -1)
            {
                Constant.p2Num = int.Parse(actionArgs.RedisClientLocal.Get($"LD:{Constant.OrderLine}:APCM:P2NUM"));
            }
            //获取4号位置数量
            if (Constant.p4Num == -1)
            {
                Constant.p4Num = int.Parse(actionArgs.RedisClientLocal.Get($"LD:{Constant.OrderLine}:APCM:P4NUM"));
            }
            //查找当前工作流引擎
            var eng = ModBusDataFactory.workFlowEngines.FirstOrDefault(x => x.ModuleName == "WFE");

            if (Constant.Package > 25)
            {
                //触发空箱任务模块
                FlowBlock block = eng?._workFlow.Blocks.FirstOrDefault(v => v.Name == "PLC01SetNullTaskB");
                eng?.EnqueueBlock(block);
            }
            else
            {
                //触发正常上料模块
                FlowBlock block = eng?._workFlow.Blocks.FirstOrDefault(v => v.Name == "PLC01SetAvgCallB");
                eng?.EnqueueBlock(block);
            }
            Logger.Device.Info($" invoke EmptyAgvCallEvent 获取派工单成功,并判断下发什么任务");
            return(Result.Success());
        }
Esempio n. 14
0
    /// <summary>
    /// Spawn Flow Block Recursivly
    /// Spawned Block create child block again,
    /// and spawned child block create child of block of that ..........
    /// </summary>
    /// <param name="flowBlock"></param>
    public FlowBlockEditorUnit SpawnFlowBlockEditorUnit(FlowBlock createdNewFlowBlock, FlowBlockEditorUnit parentBlockEditorUnit, BlockEditorWindow blockEditorWindow, Transform parent)
    {
        if (createdNewFlowBlock == null)
        {
            return(null);
        }

        FlowBlockEditorUnit blockEditorUnit = this.CreateBlockEditorUnit(createdNewFlowBlock, blockEditorWindow, parent) as FlowBlockEditorUnit;

        if (parentBlockEditorUnit != null)
        {
            FlowBlockEditorUnit.ConnectFlowBlockEditorUnit(parentBlockEditorUnit, blockEditorUnit);
        }

        if (createdNewFlowBlock.NextBlock != null)
        {
            this.SpawnFlowBlockEditorUnit(createdNewFlowBlock.NextBlock, blockEditorUnit, blockEditorWindow, parent);
        }



        return(blockEditorUnit);
    }
Esempio n. 15
0
    private void AddFlowBlockRecursively(ref FlowBlock[] flowBlockContainer, ref int flowBlockIndex, FlowBlock flowBlock)
    {
        if (flowBlock == null)
        {
            return;
        }

        flowBlock.IndexInRobotSourceCode = flowBlockIndex;

        if (flowBlockContainer.Length == flowBlockIndex)
        {//when flowBlockIndex meet flowBlockContainer size
            //expand flowBlockContainer array
            //this is little bit slow, so set large number to default capacity
            int         originalSize = flowBlockContainer.Length;
            FlowBlock[] newArray     = new FlowBlock[originalSize * 2];
            System.Array.Copy(flowBlockContainer, 0, newArray, 0, originalSize); // copy original array to new expanded array

            flowBlockContainer = newArray;                                       // set new
        }

        flowBlockContainer[flowBlockIndex] = flowBlock;
        flowBlockIndex++;
        this.AddFlowBlockRecursively(ref flowBlockContainer, ref flowBlockIndex, flowBlock.NextBlock);
    }