private void AddBranchToModel(MPBranch branch, EPhaseCode?phasesToAdd = null)
        {
            long node1Lid, node2Lid;

            long[] node1Ind, node2Ind;

            phasesToAdd = phasesToAdd ?? branch.OriginalPhases & ~EPhaseCode.N;

            node1Lid = branch.EndNodes[(sbyte)EBranchEnd.END_1];
            node2Lid = branch.EndNodes[(sbyte)EBranchEnd.END_2];

            GetIndicesFromNode(node1Lid, out node1Ind);
            GetIndicesFromNode(node2Lid, out node2Ind);

            long branchLid = branch.Lid;

            //A FAZA
            if ((phasesToAdd & EPhaseCode.A) != 0)
            {
                AddBranchToMatrix(node1Ind[(long)EPhaseIndex.A], node2Ind[(long)EPhaseIndex.A], branchLid, node1Lid, node2Lid);
            }

            //B FAZA
            if ((phasesToAdd & EPhaseCode.B) != 0)
            {
                AddBranchToMatrix(node1Ind[(long)EPhaseIndex.B], node2Ind[(long)EPhaseIndex.B], branchLid, node1Lid, node2Lid);
            }

            //C FAZA
            if ((phasesToAdd & EPhaseCode.C) != 0)
            {
                AddBranchToMatrix(node1Ind[(long)EPhaseIndex.C], node2Ind[(long)EPhaseIndex.C], branchLid, node1Lid, node2Lid);
            }
        }
        private void RemoveBranchFromModel(MPBranch branch, EPhaseCode?phasesToRemove = null)
        {
            long node1, node2;

            long[] node1Ind, node2Ind;

            phasesToRemove = phasesToRemove ?? branch.OriginalPhases & ~EPhaseCode.N;

            node1 = branch.EndNodes[(sbyte)EBranchEnd.END_1];
            node2 = branch.EndNodes[(sbyte)EBranchEnd.END_2];

            GetIndicesFromNode(node1, out node1Ind);
            GetIndicesFromNode(node2, out node2Ind);

            //A FAZA
            if ((phasesToRemove & EPhaseCode.A) != 0)
            {
                RemoveBranchFromMatrix(node1Ind[(long)EPhaseIndex.A], node2Ind[(long)EPhaseIndex.A]);
            }

            //B FAZA
            if ((phasesToRemove & EPhaseCode.B) != 0)
            {
                RemoveBranchFromMatrix(node1Ind[(long)EPhaseIndex.B], node2Ind[(long)EPhaseIndex.B]);
            }

            //C FAZA
            if ((phasesToRemove & EPhaseCode.C) != 0)
            {
                RemoveBranchFromMatrix(node1Ind[(long)EPhaseIndex.C], node2Ind[(long)EPhaseIndex.C]);
            }
        }
示例#3
0
        public void UpdateTopologyAfterRemovingBranch(long branch)
        {
            MPBranch stateBranch = internalModel.Branches[branch];

            if (stateBranch.Marker != EEnergizationStatus.TA_UNENERGIZED)
            {
                FindRootsToUpdate(branch);

                bfScanner.Init();

                if ((stateBranch.OriginalPhases & EPhaseCode.A) != EPhaseCode.NONE)
                {
                    long nodeLid = stateBranch.DownNode[(long)EPhaseIndex.A];
                    bfScanner.Add(new ActiveNodeInfo(LIDtoIND[nodeLid] + (long)EPhaseIndex.A, (long)EPhaseIndex.A));
                }

                if ((stateBranch.OriginalPhases & EPhaseCode.B) != EPhaseCode.NONE)
                {
                    long nodeLid = stateBranch.DownNode[(long)EPhaseIndex.B];
                    bfScanner.Add(new ActiveNodeInfo(LIDtoIND[nodeLid] + (long)EPhaseIndex.B, (long)EPhaseIndex.B));
                }

                if ((stateBranch.OriginalPhases & EPhaseCode.C) != EPhaseCode.NONE)
                {
                    long nodeLid = stateBranch.DownNode[(long)EPhaseIndex.C];
                    bfScanner.Add(new ActiveNodeInfo(LIDtoIND[nodeLid] + (long)EPhaseIndex.C, (long)EPhaseIndex.C));
                }

                ProcessIsland();

                AnalyzeTopology(internalModel.Roots);
            }
        }
示例#4
0
 private void SaveBranchResultsForIsland(Dictionary <long, CVisitedBranch> visitedBranches)
 {
     foreach (CVisitedBranch visitedbranch in visitedBranches.Values)
     {
         MPBranch branch = internalModel.Branches[visitedbranch.Lid];
         branch.NextInRoot   = new long[3];
         branch.PrevInRoot   = new long[3];
         branch.UpNode       = new long[3];
         branch.DownNode     = new long[3];
         branch.OwnerCircuit = new long[3];
         branch.ActivePhases = EPhaseCode.NONE;
         branch.Marker       = EEnergizationStatus.TA_UNENERGIZED;
     }
 }
示例#5
0
        private void SaveBranchResultsForRoot(Dictionary <long, CVisitedBranch> visitedBranches, MPRoot root)
        {
            foreach (CVisitedBranch visitedbranch in visitedBranches.Values)
            {
                MPBranch branch = internalModel.Branches[visitedbranch.Lid];
                branch.NextInRoot   = visitedbranch.NextInRoot;
                branch.PrevInRoot   = visitedbranch.PrevInRoot;
                branch.UpNode       = visitedbranch.UpNode;
                branch.DownNode     = visitedbranch.DownNode;
                branch.OwnerCircuit = visitedbranch.OwnerCircuit;
                branch.ActivePhases = CalculateActivePhases(visitedbranch.Visited);
                branch.Marker       = CalculateEnergization(branch.OriginalPhases, branch.ActivePhases, visitedbranch.Loop);

                root.GraphElems.Add(visitedbranch.Lid);
            }
        }
示例#6
0
        public void UpdateTopologyAfterOpeningPhaseOfSwitch(long branch, EPhaseCode phaseToClose)
        {
            MPBranch stateBranch = internalModel.Branches[branch];

            if (stateBranch.Marker != EEnergizationStatus.TA_UNENERGIZED)
            {
                FindRootsToUpdate(branch);

                EPhaseIndex phaseIndex = PhaseHelper.PhaseCodeToIndex(phaseToClose);

                long nodeLid = stateBranch.DownNode[(long)phaseIndex];
                bfScanner.Init();
                bfScanner.Add(new ActiveNodeInfo(LIDtoIND[nodeLid] + (long)phaseIndex, (long)phaseIndex));

                ProcessIsland();

                AnalyzeTopology(internalModel.Roots);
            }
        }
        private void InsertSwitchDeviceInMatrixModel(MPSwitchDevice bay)
        {
            MPBranch oldBranch = internalModel.Branches[bay.EndBranch];

            // Krajevi grane na kojoj se nalazi prekidac
            long node2Lid = bay.EndNode;
            long node1Lid = oldBranch.EndNodes[0] == node2Lid ? oldBranch.EndNodes[1] : oldBranch.EndNodes[0];

            // Kreiranje novog cvora sa faznoscu stare grane
            long connNodeLid            = internalModel.LidManager.FindFreeTemporaryIndex("MPConnectivityNode");
            MPConnectivityNode connNode = new MPConnectivityNode(connNodeLid, oldBranch.OriginalPhases);

            AddNodeInModel(connNodeLid);
            internalModel.Nodes.Add(connNodeLid, connNode);

            // Kreiranje prve grane sa faznoscu stare grane
            long connBranch1Lid = internalModel.LidManager.FindFreeTemporaryIndex("MPConnectivityBranch");
            MPConnectivityBranch connBranch1 = new MPConnectivityBranch(connBranch1Lid, oldBranch.Lid, oldBranch.OriginalPhases, node1Lid, connNodeLid);

            AddBranchToModel(connBranch1);
            internalModel.Branches.Add(connBranch1Lid, connBranch1);

            // Kreiranje druge grane sa faznoscu i stanjem prekidaca
            long connBranch2Lid = internalModel.LidManager.FindFreeTemporaryIndex("MPConnectivityBranch");
            MPConnectivityBranch connBranch2 = new MPConnectivityBranch(connBranch2Lid, oldBranch.Lid, bay.OriginalPhases, connNodeLid, node2Lid);

            AddBranchToModel(connBranch2, bay.State);
            internalModel.Branches.Add(connBranch2Lid, connBranch2);

            // Povezivanje prekidaca sa granom koja modelira njegovo stanje
            bay.StateBranch = connBranch2Lid;

            // Brisanje stare grane
            RemoveBranchFromModel(oldBranch);
            internalModel.Branches.Remove(oldBranch.Lid);
        }