//读取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); } }
//读取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); }
//写入批次号成功 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()); }
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); }
//请求产生抽检料 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()); }
//料箱转移到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()); }
//读取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); } }
//记录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()); }
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); }
//获取派工单信息;做线体准备工作 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()); }
/// <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); }
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); }