Ejemplo n.º 1
0
        /// <summary>
        /// 检查是否断路,可以直接检查梯形图的所有元件
        /// </summary>
        public bool checkOpenCircuit()
        {
            // 直接检查梯形图
            return(lchart.checkOpenCircuit());

            /*
             * foreach (LGEdge lge in edges)
             * {
             *  LCNode lcnode = lge.PLCInfo;
             *  // 左断路,右断路,下断路
             *  if (lcnode.X > 0 && lcnode.Left == null)
             *      return true;
             *  if (lcnode.X < 9 && lcnode.Right == null)
             *      return true;
             *  if (lcnode.HAccess && lcnode.Down == null)
             *      return true;
             * }
             * return false;
             */
        }
        public void Update()
        {
            int           rowid = 0;
            RowDefinition rdef;

            NetworkHeader.Text = String.Format("Network {0:d}", lnvmodel?.NetworkNumber);
            insts = new List <PLCOriginInst>();
            G_Inst.RowDefinitions.Clear();
            G_Inst.Children.Clear();
            rdef        = new RowDefinition();
            rdef.Height = new GridLength(20);
            TextBlock tberr = new TextBlock();

            tberr.Background = Brushes.Red;
            Grid.SetRow(tberr, 0);
            Grid.SetColumn(tberr, 0);
            Grid.SetColumnSpan(tberr, 6);
            G_Inst.RowDefinitions.Add(rdef);
            G_Inst.Children.Add(tberr);
            if (lnvmodel == null)
            {
                Status     = STATUS_ERROR;
                tberr.Text = App.CultureIsZH_CN()
                    ? "找不到 Network。"
                    : "Cannot found network.";
                return;
            }
            if (IsMasked)
            {
                tberr.Background = Brushes.Gray;
                tberr.Text       = String.Format(
                    App.CultureIsZH_CN() ? "Network {0:d} 已被屏蔽!" : "Network {0:d} has been masked!",
                    lnvmodel.NetworkNumber);
                return;
            }
            ismodified  = false;
            this.lchart = GenerateHelper.CreateLadderChart(lnvmodel.GetElements().Union(lnvmodel.GetVerticalLines()));
            if (lchart.checkOpenCircuit())
            {
                Status     = STATUS_OPEN;
                tberr.Text = String.Format(
                    App.CultureIsZH_CN() ? "Network {0:d} 的梯形图存在断路错误!" : "There have broken circuit in ladder of Network {0:d}.",
                    lnvmodel.NetworkNumber);
                return;
            }
            this.lgraph = lchart.Generate();
            if (lgraph.checkShortCircuit())
            {
                Status     = STATUS_SHORT;
                tberr.Text = String.Format(
                    App.CultureIsZH_CN() ? "Network {0:d} 的梯形图存在短路错误!" : "There have short circuit in ladder of Network {0:d}.",
                    lnvmodel.NetworkNumber);
                return;
            }
            if (lgraph.CheckFusionCircuit())
            {
                Status     = STATUS_FUSION;
                tberr.Text = String.Format(
                    App.CultureIsZH_CN() ? "Network {0:d} 的梯形图存在混连错误!" : "There have fusion circuit in ladder of Network {0:d}.",
                    lnvmodel.NetworkNumber);
                return;
            }
            Status = STATUS_ACCEPT;
            List <PLCInstruction> _insts       = lgraph.GenInst();
            SortedSet <int>       prototypeids = new SortedSet <int>();

            foreach (PLCInstruction inst in _insts)
            {
                insts.Add(inst.ToOrigin());
                if (inst.PrototypeID != -1)
                {
                    if (prototypeids.Contains(inst.PrototypeID))
                    {
                        Status     = STATUS_FUSION;
                        tberr.Text = String.Format(
                            App.CultureIsZH_CN() ? "Network {0:d} 的梯形图存在混连错误!" : "There have fusion circuit in ladder of Network {0:d}.",
                            lnvmodel.NetworkNumber);
                        return;
                    }
                    prototypeids.Add(inst.PrototypeID);
                }
            }
            G_Inst.RowDefinitions.Clear();
            G_Inst.Children.Clear();
            foreach (PLCOriginInst inst in insts)
            {
                rdef        = new RowDefinition();
                rdef.Height = new GridLength(20);
                G_Inst.RowDefinitions.Add(rdef);
                TextBlock tb = new TextBlock();
                tb.Text       = rowid.ToString();
                tb.Foreground = inst.ProtoType != null ? Brushes.Black : Brushes.Gray;
                tb.Background = (rowid & 1) == 0 ? Brushes.AliceBlue : Brushes.LightCyan;
                Grid.SetRow(tb, rowid);
                Grid.SetColumn(tb, 0);
                G_Inst.Children.Add(tb);
                for (int colid = 1; colid <= 6; colid++)
                {
                    tb            = new TextBlock();
                    tb.Text       = inst[colid - 1];
                    tb.Foreground = inst.ProtoType != null ? Brushes.Black : Brushes.Gray;
                    tb.Background = (rowid & 1) == 0 ? Brushes.AliceBlue : Brushes.LightCyan;
                    Grid.SetRow(tb, rowid);
                    Grid.SetColumn(tb, colid);
                    G_Inst.Children.Add(tb);
                }
                rowid++;
            }
            rdef        = new RowDefinition();
            rdef.Height = new GridLength(1, GridUnitType.Star);
            G_Inst.RowDefinitions.Add(rdef);
            G_Inst.Children.Add(Cursor);
            UpdateComment();
        }