Beispiel #1
0
        public bool GetInfo()
        {
            lock (this)
            {
                if (!this.Plc.IsPingSuccess)
                {
                    this.Plc.IsAlive = false;
                    LogHelper.WriteError("无法连接到 " + this.Plc.IP);
                    return(false);
                }

                string msg = string.Empty;
                try
                {
                    var bOutputs0 = new ushort[] { };
                    if (!this.Plc.GetInfo(true, "D3000", (ushort)999, out bOutputs0, out msg))
                    {
                        Error.Alert(msg);
                        this.Plc.IsAlive = false;
                        return(false);
                    }

                    for (int j = 0; j < this.Floors.Count; j++)
                    {
                        switch (bOutputs0[209 - j * 104])
                        {
                        case 1: this.Floors[j].DoorStatusNotFinal = DoorStatus.关闭; this.Floors[j].DoorIsClosing = false; break;

                        case 2: this.Floors[j].DoorStatusNotFinal = DoorStatus.打开; this.Floors[j].DoorIsOpenning = false; break;

                        default: this.Floors[j].DoorStatusNotFinal = DoorStatus.异常; break;
                        }

                        for (int k = 0; k < this.Floors[j].Stations.Count; k++)
                        {
                            if (bOutputs0[210 - j * 104 + k] == 1)
                            {
                                if (this.Floors[j].Stations[k].Id == Current.Task.FromStationId && Current.Task.Status == TaskStatus.正取)
                                {
                                }
                                else
                                {
                                    this.Floors[j].Stations[k].ClampStatus = this.Floors[j].Stations[k].ClampStatus == ClampStatus.空夹具 ? ClampStatus.空夹具 : ClampStatus.满夹具;
                                }
                            }
                            else
                            {
                                this.Floors[j].Stations[k].ClampStatus = ClampStatus.无夹具;
                            }
                        }

                        this.Floors[j].IsNetControlOpen = bOutputs0[692 - 44 * j] == 0;

                        this.Floors[j].ProcessTemperSet  = bOutputs0[463 - 36 * j] / 10;
                        this.Floors[j].PreheatTimeSet    = bOutputs0[465 - 36 * j];
                        this.Floors[j].BakingTimeSet     = bOutputs0[466 - 36 * j];
                        this.Floors[j].BreathingCycleSet = bOutputs0[474 - 36 * j];

                        this.Floors[j].RunMinutes = bOutputs0[687 - 44 * j];
                        this.Floors[j].Vacuum     = bOutputs0[689 - 44 * j] + bOutputs0[690 - 44 * j] * 65535;
                        this.Floors[j].IsVacuum   = this.Floors[j].Vacuum < Current.option.VacuumStandard;

                        if (j == 0)
                        {
                            switch (bOutputs0[693])
                            {
                            case 1: this.TriLamp = TriLamp.Red; break;

                            case 2: this.TriLamp = TriLamp.Yellow; break;

                            case 3: this.TriLamp = TriLamp.Green; break;

                            default: this.TriLamp = TriLamp.Unknown; break;
                            }
                        }

                        var output = OmronPLC.GetBitStr(bOutputs0[250 - 104 * j], 8);
                        this.Floors[j].IsBaking = bOutputs0[688 - 44 * j] == 1 || output.Substring(2, 1) == "1" && output.Substring(3, 1) == "1";
                    }


                    var bOutputs1 = new ushort[] { };
                    if (!this.Plc.GetInfo(true, "D3500", (ushort)999, out bOutputs1, out msg))
                    {
                        Error.Alert(msg);
                        this.Plc.IsAlive = false;
                        return(false);
                    }

                    for (int j = 0; j < this.Floors.Count; j++)
                    {
                        for (int n = 0; n < Option.TemperaturePointCount; n++)
                        {
                            this.Floors[j].Stations[0].Temperatures[n] = bOutputs1[587 - 128 * j + n] / 10f;
                        }
                        for (int n = 0; n < Option.TemperaturePointCount; n++)
                        {
                            this.Floors[j].Stations[1].Temperatures[n] = bOutputs1[651 - 128 * j + n] / 10f;
                        }
                    }

                    #region 报警信息


                    if (this.TriLamp == TriLamp.Red)
                    {
                        var bOutputs2 = new ushort[] { };
                        if (!this.Plc.GetInfo(true, "D4600", (ushort)400, out bOutputs2, out msg))
                        {
                            Error.Alert(msg);
                            this.Plc.IsAlive = false;
                            return(false);
                        }

                        StringBuilder sb = new StringBuilder();
                        for (int n = 0; n < bOutputs2.Length; n++)
                        {
                            sb.Append(_Convert.Revert(OmronPLC.GetBitStr(bOutputs2[n], 16)));
                        }

                        this.Alarm2BinString = sb.ToString();
                    }
                    else
                    {
                        this.Alarm2BinString = new String('0', 6400);
                    }


                    if (this.Alarm2BinString != this.PreAlarm2BinString)
                    {
                        this.AlarmStr = string.Empty;
                        for (int j = 0; j < this.Floors.Count; j++)
                        {
                            this.Floors[j].AlarmStr = string.Empty;
                        }

                        List <AlarmLog> alarmLogs = new List <AlarmLog>();

                        for (int x = 0; x < this.Alarm2BinString.Length; x++)
                        {
                            if (x > Alarm.Alarms.Count - 1)
                            {
                                break;
                            }
                            char c    = this.Alarm2BinString[x];
                            char cPre = this.PreAlarm2BinString.Length < this.Alarm2BinString.Length ? '0' : this.PreAlarm2BinString[x];
                            if (c == '1')
                            {
                                Alarm alarm = (from a in Alarm.Alarms where a.Id == x + 1 select a).ToList()[0];
                                if (alarm.FloorNum == 0)
                                {
                                    if (cPre == '0')
                                    {
                                        AlarmLog.Stop(AlarmType.Oven, x + 1, this.Id, out msg);
                                    }
                                }
                                else if (alarm.FloorNum > 0 && alarm.FloorNum <= this.Floors.Count)
                                {
                                    this.Floors[alarm.FloorNum - 1].AlarmStr += alarm.AlarmStr + ",";

                                    if (cPre == '0')
                                    {
                                        AlarmLog alarmLog = new AlarmLog();
                                        alarmLog.AlarmId   = x + 1;
                                        alarmLog.AlarmType = AlarmType.Floor;
                                        alarmLog.TypeId    = this.Floors[alarm.FloorNum - 1].Id;
                                        alarmLog.Clamp1Id  = this.Floors[alarm.FloorNum - 1].Stations[0].ClampId > 0 ? this.Floors[alarm.FloorNum - 1].Stations[0].ClampId : 60;
                                        alarmLog.Clamp2Id  = this.Floors[alarm.FloorNum - 1].Stations[1].ClampId > 0 ? this.Floors[alarm.FloorNum - 1].Stations[1].ClampId : 60;
                                        alarmLogs.Add(alarmLog);
                                    }
                                }
                            }
                            else if (c == '0')
                            {
                                Alarm alarm = (from a in Alarm.Alarms where a.Id == x + 1 select a).ToList()[0];
                                if (alarm.FloorNum == 0)
                                {
                                    this.AlarmStr += alarm.AlarmStr + ",";
                                    if (cPre == '1')
                                    {
                                        AlarmLog alarmLog = new AlarmLog();
                                        alarmLog.AlarmId   = x + 1;
                                        alarmLog.AlarmType = AlarmType.Oven;
                                        alarmLog.TypeId    = this.Id;
                                        alarmLogs.Add(alarmLog);
                                    }
                                }
                                else if (alarm.FloorNum > 0 && alarm.FloorNum <= this.Floors.Count)
                                {
                                    if (cPre == '1')
                                    {
                                        AlarmLog.Stop(AlarmType.Floor, x + 1, this.Floors[alarm.FloorNum - 1].Id, out msg);
                                    }
                                }
                            }
                        }

                        if (!AlarmLog.Add(alarmLogs, out msg))
                        {
                            Error.Alert(msg);
                        }
                    }

                    this.PreAlarm2BinString = this.Alarm2BinString;

                    #endregion

                    #region 写指令 控制开关门、启动运行、抽破真空
                    for (int j = 0; j < this.Floors.Count; j++)
                    {
                        if (this.Floors[j].DoorIsOpenning && this.Floors[j].DoorStatusNotFinal != DoorStatus.打开)
                        {
                            this.Floors[j].DoorStatus = DoorStatus.正在打开;
                        }
                        else if (this.Floors[j].DoorIsClosing && this.Floors[j].DoorStatusNotFinal != DoorStatus.关闭)
                        {
                            this.Floors[j].DoorStatus = DoorStatus.正在关闭;
                        }
                        else
                        {
                            this.Floors[j].DoorStatus = this.Floors[j].DoorStatusNotFinal;
                        }

                        #region 控制开门
                        if (this.Floors[j].DoorStatus == DoorStatus.打开)
                        {
                            this.Floors[j].toOpenDoor = false;
                        }

                        if (this.Floors[j].toOpenDoor)
                        {
                            var addr = Current.option.OvenOpenDoorAddrVals.Split(',')[j].Split(':')[0];
                            var val  = Convert.ToUInt16(Current.option.OvenOpenDoorAddrVals.Split(',')[j].Split(':')[1]);

                            if (!this.Plc.SetInfo(addr, val, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }
                            LogHelper.WriteInfo(string.Format("成功发送开门指令到{0}:{1}", this.Floors[j].Name, Current.option.OvenOpenDoorAddrVals.Split(',')[j]));
                            this.Floors[j].toOpenDoor     = false;
                            this.Floors[j].DoorIsOpenning = true;
                        }
                        #endregion

                        #region 控制关门
                        if (this.Floors[j].DoorStatus == DoorStatus.关闭)
                        {
                            this.Floors[j].toCloseDoor = false;
                        }

                        if (this.Floors[j].toCloseDoor)
                        {
                            //关门前判断该处有无任务

                            // cannotClose : 不能关门
                            bool cannotClose = false;
                            if (this.Floors[j].Stations.Count(s => s.Id == Current.Task.FromStationId) > 0 && (Current.Task.Status == TaskStatus.就绪 || Current.Task.Status == TaskStatus.可取 || Current.Task.Status == TaskStatus.正取))
                            {
                                Tip.Alert(Current.Task.FromStationName + "正在取盘,无法关门!");
                                cannotClose = true;
                            }

                            if (!cannotClose)
                            {
                                if (this.Floors[j].Stations.Count(s => s.Id == Current.Task.ToStationId) > 0 && (Current.Task.Status == TaskStatus.可放 || Current.Task.Status == TaskStatus.正放))
                                {
                                    Tip.Alert(Current.Task.FromStationName + "正在放盘,无法关门!");
                                    cannotClose = true;
                                }
                            }

                            if (cannotClose)
                            {
                                this.Floors[j].toCloseDoor = false;
                            }
                            else
                            {
                                var addr = Current.option.OvenCloseDoorAddrVals.Split(',')[j].Split(':')[0];
                                var val  = Convert.ToUInt16(Current.option.OvenCloseDoorAddrVals.Split(',')[j].Split(':')[1]);

                                if (!this.Plc.SetInfo(addr, val, out msg))
                                {
                                    Error.Alert(msg);
                                    this.Plc.IsAlive = false;
                                    return(false);
                                }

                                LogHelper.WriteInfo(string.Format("成功发送关门指令到{0}:{1}", this.Floors[j].Name, Current.option.OvenCloseDoorAddrVals.Split(',')[j]));
                                this.Floors[j].toCloseDoor        = false;
                                this.Floors[j].DoorIsClosing      = true;
                                this.Floors[j].DoorStatusNotFinal = DoorStatus.正在关闭;
                                this.Floors[j].DoorStatus         = DoorStatus.正在关闭;
                            }
                        }
                        #endregion

                        #region 启动运行
                        if (this.Floors[j].toStartBaking)
                        {
                            var addr = Current.option.OvenStartBakingAddrVals.Split(',')[j].Split(':')[0];
                            var val  = Convert.ToUInt16(Current.option.OvenStartBakingAddrVals.Split(',')[j].Split(':')[1]);

                            if (!this.Plc.SetInfo(addr, val, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }

                            LogHelper.WriteInfo(string.Format("成功发送启动运行指令到{0}:{1}", this.Floors[j].Name, Current.option.OvenStartBakingAddrVals.Split(',')[j]));
                            this.Floors[j].toStartBaking = false;
                        }
                        #endregion

                        #region 结束运行
                        if (this.Floors[j].toStopBaking)
                        {
                            var addr = Current.option.OvenStopBakingAddrVals.Split(',')[j].Split(':')[0];
                            var val  = Convert.ToUInt16(Current.option.OvenStopBakingAddrVals.Split(',')[j].Split(':')[1]);

                            if (!this.Plc.SetInfo(addr, val, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }

                            LogHelper.WriteInfo(string.Format("成功发送停止运行指令到{0}:{1}", this.Floors[j].Name, Current.option.OvenStopBakingAddrVals.Split(',')[j]));
                            this.Floors[j].toStopBaking = false;
                        }
                        #endregion

                        #region 开启网控

                        #endregion

                        #region 报警复位
                        if (this.Floors[j].toAlarmReset)
                        {
                            if (!this.Plc.SetInfo("D5303", (ushort)1, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }

                            LogHelper.WriteInfo(string.Format("成功发送报警复位指令到{0}:{1}", this.Name, "D5303"));
                            this.Floors[j].toAlarmReset = false;
                        }
                        #endregion

                        #region 抽真空
                        if (this.Floors[j].toLoadVacuum)
                        {
                            var addr = Current.option.OvenLoadVacuumAddrVals.Split(',')[j].Split(':')[0];
                            var val  = Convert.ToUInt16(Current.option.OvenLoadVacuumAddrVals.Split(',')[j].Split(':')[1]);

                            if (!this.Plc.SetInfo(addr, val, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }

                            LogHelper.WriteInfo(string.Format("成功发送抽真空指令到{0}:{1}", this.Floors[j].Name, Current.option.OvenLoadVacuumAddrVals.Split(',')[j]));
                            this.Floors[j].toLoadVacuum = false;
                        }
                        #endregion

                        #region 停止抽真空
                        if (this.Floors[j].toCancelLoadVacuum)
                        {
                            var addr = Current.option.OvenStopLoadVacuumAddrVals.Split(',')[j].Split(':')[0];
                            var val  = Convert.ToUInt16(Current.option.OvenStopLoadVacuumAddrVals.Split(',')[j].Split(':')[1]);

                            if (!this.Plc.SetInfo(addr, val, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }

                            LogHelper.WriteInfo(string.Format("成功发送取消抽真空指令到{0}:{1}", this.Floors[j].Name, Current.option.OvenStopLoadVacuumAddrVals.Split(',')[j]));
                            this.Floors[j].toCancelLoadVacuum = false;
                        }
                        #endregion

                        #region 破真空
                        if (this.Floors[j].toUploadVacuum)
                        {
                            var addr = Current.option.OvenUploadVacuumAddrVals.Split(',')[j].Split(':')[0];
                            var val  = Convert.ToUInt16(Current.option.OvenUploadVacuumAddrVals.Split(',')[j].Split(':')[1]);

                            if (!this.Plc.SetInfo(addr, val, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }
                            LogHelper.WriteInfo(string.Format("成功发送破真空指令到{0}:{1}", this.Floors[j].Name, Current.option.OvenUploadVacuumAddrVals.Split(',')[j]));
                            this.Floors[j].toUploadVacuum = false;
                        }
                        #endregion

                        #region 停止破真空
                        if (this.Floors[j].toCancelUploadVacuum)
                        {
                            var addr = Current.option.OvenStopUploadVacuumAddrVals.Split(',')[j].Split(':')[0];
                            var val  = Convert.ToUInt16(Current.option.OvenStopUploadVacuumAddrVals.Split(',')[j].Split(':')[1]);

                            if (!this.Plc.SetInfo(addr, val, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }
                            LogHelper.WriteInfo(string.Format("成功发送取消破真空指令到{0}:{1}", this.Floors[j].Name, Current.option.OvenStopUploadVacuumAddrVals.Split(',')[j]));
                            this.Floors[j].toCancelUploadVacuum = false;
                        }
                        #endregion

                        #region 运行时间清零

                        #endregion
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    Error.Alert(ex);
                }

                this.Plc.IsAlive = true;

                this.getInfoNum++;
                if (getInfoNum >= 2)
                {
                    this.AlreadyGetAllInfo = true;
                }
                this.getInfoNum %= 2;
            }
            return(true);
        }
Beispiel #2
0
        public bool GetInfo()
        {
            if (!this.Plc.IsPingSuccess)
            {
                this.Plc.IsAlive = false;
                LogHelper.WriteError("无法连接到 " + this.Plc.IP);
                return(false);
            }

            var bOutputs = new ushort[] { };

            if (!this.Plc.GetInfo("D1000", (ushort)100, out bOutputs, out string msg))
            {
                Error.Alert(msg);
                this.Plc.IsAlive = false;
                return(false);
            }

            //心跳
            if (bOutputs[0] == 0)
            {
                this.Plc.SetInfo("D1000", (ushort)1, out msg);
            }

            //手动自动信号
            this.IsAuto = bOutputs[6] == 1;

            this.IsAlreadyHasTask = bOutputs[8] > 0 || bOutputs[9] > 0;

            //报警
            this.IsAlarming = bOutputs[11] == 1 || bOutputs[60] == 4;
            //this.AlarmStr = this.IsAlarming ? this.name + "异常中" : "";

            //有无料
            //switch (bOutputs[12])
            //{
            //    case 1: this.ClampStatus = this.ClampStatus == ClampStatus.空夹具 ? ClampStatus.空夹具 : ClampStatus.满夹具; break;
            //    case 0: this.ClampStatus = ClampStatus.无夹具; break;
            //    case 3: this.ClampStatus = ClampStatus.异常; break;
            //    default: this.ClampStatus = ClampStatus.未知; break;
            //}

            //调度有效
            this.IsDispatchEnabled = bOutputs[13] == 1;

            //任务完成
            var isTaskFinished = bOutputs[15] == 1;

            if (isTaskFinished && !this.IsTaskFinished)
            {
                LogHelper.WriteInfo(string.Format("收到{0}取盘/放盘完成信号,{1}:{2}", this.Plc.Name, "D1015", 1));
            }
            this.IsTaskFinished = isTaskFinished;

            //货叉原点
            var isForkAtOriginalPoint = bOutputs[22] == 1;

            if (isForkAtOriginalPoint && !this.IsForkAtOriginalPoint)
            {
                LogHelper.WriteInfo(string.Format("收到{0}货叉回到原点信号,{1}:{2}", this.Plc.Name, "D1021", 1));
            }
            this.IsForkAtOriginalPoint = isForkAtOriginalPoint;

            //X轴位置
            this.CoordinateValue = bOutputs[20];
            if (this.CoordinateValue > 0)
            {
                if (this.CoordinateValue < this.PreCoordinateValue)
                {
                    this.MovingDirection = MovingDirection.前进; this.IsMoving = true;
                }
                else if (this.CoordinateValue > this.PreCoordinateValue)
                {
                    this.MovingDirection = MovingDirection.后退; this.IsMoving = true;
                }
                else
                {
                    this.MovingDirection = MovingDirection.停止; this.IsMoving = false;
                }
                this.PreCoordinateValue = this.CoordinateValue;
            }

            //rgv状态
            this.Status = bOutputs[60];

            this.IsReady = this.Status == 2 && this.IsDispatchEnabled && this.IsAuto;

            if (this.IsAlarming)
            {
                StringBuilder sb = new StringBuilder();
                for (int n = 30; n < 33; n++)
                {
                    sb.Append(_Convert.Revert(OmronPLC.GetBitStr(bOutputs[n], 16)));
                }

                this.Alarm2BinString = sb.ToString();

                var alarmStr = "";

                for (int x = 0; x < this.Alarms.Length; x++)
                {
                    if (this.Alarm2BinString[x] == '1')
                    {
                        alarmStr += this.Alarms[x] + ",";
                    }
                }
                this.AlarmStr = alarmStr;
            }
            else
            {
                this.AlarmStr = "";
            }

            //D1030.01    PLC异常状态异常
            //D1030.02    EtherNet / IP异常状态异常
            //D1030.03    EthenCAT状态异常
            //D1030.04    PLC总线状态异常
            //D1030.05    行走电机报警
            //D1030.06    升降电机报警
            //D1030.07    货叉电机报警
            //D1030.08    调度心跳报警
            //D1030.09    门号错误
            //D1030.10    行走.货叉同时动作
            //D1030.11    行走电机限位报警
            //D1030.12    升降电机限位报警
            //D1030.13    货叉电机限位报警
            //D1030.14    升降下降超过保护限位
            //D1030.15    货叉不在原点
            //D1031.00    行走安全位.取门号.放门号不能同时给
            //D1031.01    行走位置方向错误
            //D1031.02    升降位置方向错误
            //D1031.03    行走位置错误
            //D1031.04    升降位置错误
            //D1031.05    货叉位置错误

            this.AlreadyGetAllInfo = true;
            this.Plc.IsAlive       = true;
            return(true);
        }
Beispiel #3
0
        public bool GetInfo()
        {
            lock (this)
            {
                if (!this.Plc.IsPingSuccess)
                {
                    this.Plc.IsAlive = false;
                    LogHelper.WriteError("无法连接到 " + this.Plc.IP);
                    return(false);
                }

                string msg = string.Empty;
                try
                {
                    var bOutputs0 = new ushort[] { };
                    if (!this.Plc.GetInfo(true, "D4000", (ushort)99, out bOutputs0, out msg))
                    {
                        Error.Alert(msg);
                        this.Plc.IsAlive = false;
                        return(false);
                    }

                    for (int j = 0; j < this.Floors.Count; j++)
                    {
                        switch (bOutputs0[60 + j])
                        {
                        case 0: this.Floors[j].DoorStatusNotFinal = DoorStatus.关闭; this.Floors[j].DoorIsClosing = false; break;

                        case 1: this.Floors[j].DoorStatusNotFinal = DoorStatus.打开; this.Floors[j].DoorIsOpenning = false; break;

                        case 2: this.Floors[j].DoorStatusNotFinal = DoorStatus.异常; break;

                        default: this.Floors[j].DoorStatusNotFinal = DoorStatus.未知; break;
                        }

                        //for (int k = 0; k < this.Floors[j].Stations.Count; k++)
                        //{
                        //    if (bOutputs0[210 - j * 104 + k] == 1)
                        //    {
                        //        if (this.Floors[j].Stations[k].Id == Current.Task.FromStationId && Current.Task.Status == TaskStatus.取放中)
                        //        {

                        //        }
                        //        else
                        //        {
                        //            this.Floors[j].Stations[k].ClampStatus = this.Floors[j].Stations[k].ClampStatus == ClampStatus.空夹具 ? ClampStatus.空夹具 : ClampStatus.满夹具;
                        //        }
                        //    }
                        //    else
                        //    {
                        //        this.Floors[j].Stations[k].ClampStatus = ClampStatus.无夹具;
                        //    }

                        //}

                        //this.Floors[j].IsNetControlOpen = bOutputs0[692 - 44 * j] == 0;

                        //this.Floors[j].ProcessTemperSet = bOutputs0[463 - 36 * j] / 10;
                        //this.Floors[j].PreheatTimeSet = bOutputs0[465 - 36 * j];
                        //this.Floors[j].BakingTimeSet = bOutputs0[466 - 36 * j];
                        //this.Floors[j].BreathingCycleSet = bOutputs0[474 - 36 * j];

                        //this.Floors[j].RunMinutes = bOutputs0[687 - 44 * j];
                        //this.Floors[j].Vacuum = bOutputs0[689 - 44 * j] + bOutputs0[690 - 44 * j] * 65535;
                        //this.Floors[j].IsVacuum = this.Floors[j].Vacuum < Current.option.VacuumStandard;

                        //if (j == 0)
                        //{
                        //    switch (bOutputs0[693])
                        //    {
                        //        case 1: this.TriLamp = TriLamp.Red; break;
                        //        case 2: this.TriLamp = TriLamp.Yellow; break;
                        //        case 3: this.TriLamp = TriLamp.Green; break;
                        //        default: this.TriLamp = TriLamp.Unknown; break;
                        //    }
                        //}

                        //var output = OmronPLC.GetBitStr(bOutputs0[250 - 104 * j], 8);
                        //this.Floors[j].IsBaking = bOutputs0[688 - 44 * j] == 1 || output.Substring(2, 1) == "1" && output.Substring(3, 1) == "1";
                    }

                    this.TriLamp =
                        bOutputs0[70] == 1 ? TriLamp.Green :
                        bOutputs0[70] == 2 ? TriLamp.Yellow :
                        bOutputs0[70] == 3 ? TriLamp.Red : this.TriLamp;

                    var bOutputs1 = new ushort[] { };
                    if (!this.Plc.GetInfo(true, "D0", (ushort)200, out bOutputs1, out msg))
                    {
                        Error.Alert(msg);
                        this.Plc.IsAlive = false;
                        return(false);
                    }

                    for (int j = 0; j < this.Floors.Count; j++)
                    {
                        for (int n = 0; n < Option.TemperaturePointCount; n++)
                        {
                            this.Floors[j].Temperatures[n] = bOutputs1[temperAddrMatrix[j, n]] / 10f;
                        }
                        this.Floors[j].RunMinutesSet           = bOutputs1[10 + 2 * j];
                        this.Floors[j].RunMinutes              = bOutputs1[20 + 2 * j];
                        this.Floors[j].TemperSetting           = bOutputs1[30 + j] / 10;
                        this.Floors[j].PreHeatTimeSetting      = bOutputs1[100];
                        this.Floors[j].TemperOverOffsetSetting = bOutputs1[102];
                        this.Floors[j].IsAerating              = bOutputs1[81 + j] == 1;
                    }

                    #region 报警信息

                    var bOutputs2 = new ushort[] { };
                    if (!this.Plc.GetInfo(true, "C1000", (ushort)99, out bOutputs2, out msg))
                    {
                        Error.Alert(msg);
                        this.Plc.IsAlive = false;
                        return(false);
                    }

                    var isFinishBinString = _Convert.Revert(OmronPLC.GetBitStr(bOutputs2[21], 16));
                    for (int j = 0; j < this.Floors.Count; j++)
                    {
                        this.Floors[j].IsBakeFinished = isFinishBinString[j] == '1';
                        this.Floors[j].IsBaking       = isFinishBinString[j + 6] == '1';
                    }


                    //if (this.TriLamp == TriLamp.Red || this.Floors.Count(o => o.IsAerating) > 0)
                    //{
                    var bOutputs3 = new ushort[] { };
                    if (!this.Plc.GetInfo(true, "C1000", (ushort)11, out bOutputs3, out msg))
                    {
                        Error.Alert(msg);
                        this.Plc.IsAlive = false;
                        return(false);
                    }

                    StringBuilder sb = new StringBuilder();
                    for (int n = 0; n < bOutputs3.Length; n++)
                    {
                        sb.Append(_Convert.Revert(OmronPLC.GetBitStr(bOutputs3[n], 16)));
                    }
                    var alarm2BinString = sb.ToString();

                    char[] chars = alarm2BinString.ToCharArray();
                    for (int j = 0; j < 5; j++)
                    {
                        chars[8 + 32 * j] = this.Floors[j].IsAerating ? '1' : '0';
                    }

                    this.Alarm2BinString = new String(chars);
                    //}
                    //else
                    //{
                    //    this.Alarm2BinString = new String('0', 176);
                    //}


                    if (this.Alarm2BinString != this.PreAlarm2BinString)
                    {
                        this.AlarmStr = string.Empty;
                        for (int j = 0; j < this.Floors.Count; j++)
                        {
                            this.Floors[j].AlarmStr = string.Empty;
                        }

                        List <AlarmLog> alarmLogs = new List <AlarmLog>();

                        for (int x = 0; x < this.Alarm2BinString.Length; x++)
                        {
                            if (x > Alarm.Alarms.Count - 1)
                            {
                                break;
                            }
                            char c    = this.Alarm2BinString[x];
                            char cPre = this.PreAlarm2BinString.Length < this.Alarm2BinString.Length ? '0' : this.PreAlarm2BinString[x];
                            if (c == '1')
                            {
                                Alarm alarm = (from a in Alarm.Alarms where a.Id == x + 1 select a).ToList()[0];
                                if (alarm.FloorNum == 0)
                                {
                                    this.AlarmStr += alarm.AlarmStr + ",";
                                    if (cPre == '0')
                                    {
                                        AlarmLog alarmLog = new AlarmLog();
                                        alarmLog.AlarmId   = x + 1;
                                        alarmLog.AlarmType = AlarmType.Oven;
                                        alarmLog.TypeId    = this.Id;
                                        alarmLogs.Add(alarmLog);
                                    }
                                }
                                else if (alarm.FloorNum > 0 && alarm.FloorNum <= this.Floors.Count)
                                {
                                    this.Floors[alarm.FloorNum - 1].AlarmStr += alarm.AlarmStr + ",";

                                    if (cPre == '0')
                                    {
                                        AlarmLog alarmLog = new AlarmLog();
                                        alarmLog.AlarmId   = x + 1;
                                        alarmLog.AlarmType = AlarmType.Floor;
                                        alarmLog.TypeId    = this.Floors[alarm.FloorNum - 1].Id;
                                        alarmLog.Clamp1Id  = this.Floors[alarm.FloorNum - 1].Stations[0].ClampId > 0 ? this.Floors[alarm.FloorNum - 1].Stations[0].ClampId : 60;
                                        alarmLog.Clamp2Id  = this.Floors[alarm.FloorNum - 1].Stations[1].ClampId > 0 ? this.Floors[alarm.FloorNum - 1].Stations[1].ClampId : 60;
                                        alarmLogs.Add(alarmLog);
                                    }
                                }
                            }
                            else if (c == '0')
                            {
                                Alarm alarm = (from a in Alarm.Alarms where a.Id == x + 1 select a).ToList()[0];
                                if (alarm.FloorNum == 0)
                                {
                                    if (cPre == '1')
                                    {
                                        AlarmLog.Stop(AlarmType.Oven, x + 1, this.Id, out msg);
                                    }
                                }
                                else if (alarm.FloorNum > 0 && alarm.FloorNum <= this.Floors.Count)
                                {
                                    if (cPre == '1')
                                    {
                                        AlarmLog.Stop(AlarmType.Floor, x + 1, this.Floors[alarm.FloorNum - 1].Id, out msg);
                                    }
                                }
                            }
                        }

                        if (!AlarmLog.Add(alarmLogs, out msg))
                        {
                            Error.Alert(msg);
                        }
                    }

                    this.PreAlarm2BinString = this.Alarm2BinString;

                    #endregion

                    var bOutputs4 = new ushort[] { };
                    if (!this.Plc.GetInfo(true, "H0", (ushort)1, out bOutputs4, out msg))
                    {
                        Error.Alert(msg);
                        this.Plc.IsAlive = false;
                        return(false);
                    }

                    var isNetControlBinString = _Convert.Revert(OmronPLC.GetBitStr(bOutputs4[0], 16));
                    for (int j = 0; j < this.Floors.Count; j++)
                    {
                        this.Floors[j].IsNetControlOpen = isNetControlBinString[j + 1] == '0' && isNetControlBinString[0] == '0';
                    }

                    #region 写指令 控制开关门、启动运行、抽破真空
                    for (int j = 0; j < this.Floors.Count; j++)
                    {
                        if (this.Floors[j].DoorIsOpenning && this.Floors[j].DoorStatusNotFinal != DoorStatus.打开)
                        {
                            this.Floors[j].DoorStatus = DoorStatus.正在打开;
                        }
                        else if (this.Floors[j].DoorIsClosing && this.Floors[j].DoorStatusNotFinal != DoorStatus.关闭)
                        {
                            this.Floors[j].DoorStatus = DoorStatus.正在关闭;
                        }
                        else
                        {
                            this.Floors[j].DoorStatus = this.Floors[j].DoorStatusNotFinal;
                        }

                        #region 控制开门
                        if (this.Floors[j].DoorStatus == DoorStatus.打开)
                        {
                            this.Floors[j].toOpenDoor = false;
                        }

                        if (this.Floors[j].toOpenDoor)
                        {
                            var addr = "D0";
                            var val  = Convert.ToUInt16(2 * (j + 1));

                            if (!this.Plc.SetInfo(addr, val, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }
                            LogHelper.WriteInfo(string.Format("成功发送开门指令到{0}, {1}:{2}", this.Floors[j].Name, addr, val));
                            this.Floors[j].toOpenDoor     = false;
                            this.Floors[j].DoorIsOpenning = true;
                        }
                        #endregion

                        #region 控制关门
                        if (this.Floors[j].DoorStatus == DoorStatus.关闭)
                        {
                            this.Floors[j].toCloseDoor = false;
                        }

                        if (this.Floors[j].toCloseDoor)
                        {
                            var addr = "D0";
                            var val  = Convert.ToUInt16(2 * (j + 1) - 1);

                            if (!this.Plc.SetInfo(addr, val, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }

                            LogHelper.WriteInfo(string.Format("成功发送关门指令到{0}, {1}:{2}", this.Floors[j].Name, addr, val));
                            this.Floors[j].toCloseDoor   = false;
                            this.Floors[j].DoorIsClosing = true;
                        }
                        #endregion

                        #region 启动运行
                        if (this.Floors[j].toStartBaking)
                        {
                            var addr = "D" + (j + 1);
                            var val  = Convert.ToUInt16(1);

                            if (!this.Plc.SetInfo(addr, val, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }

                            LogHelper.WriteInfo(string.Format("成功发送启动运行指令到{0}, {1}:{2}", this.Floors[j].Name, addr, val));
                            this.Floors[j].toStartBaking = false;
                        }
                        #endregion

                        #region 结束运行
                        if (this.Floors[j].toStopBaking)
                        {
                            var addr = "D" + (j + 1);
                            var val  = Convert.ToUInt16(0);

                            if (!this.Plc.SetInfo(addr, val, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }

                            LogHelper.WriteInfo(string.Format("成功发送结束运行指令到{0}, {1}:{2}", this.Floors[j].Name, addr, val));
                            this.Floors[j].toStopBaking = false;
                        }
                        #endregion

                        //    #region 开启网控

                        //    #endregion

                        #region 报警复位
                        if (this.Floors[j].toAlarmReset)
                        {
                            if (!this.Plc.SetInfo("D4071", (ushort)1, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }

                            LogHelper.WriteInfo(string.Format("成功发送报警复位指令到{0}:{1}", this.Name, "D4071"));
                            this.Floors[j].toAlarmReset = false;
                        }
                        #endregion

                        //    #region 抽真空
                        //    if (this.Floors[j].toLoadVacuum)
                        //    {
                        //        var addr = Current.option.OvenLoadVacuumAddrVals.Split(',')[j].Split(':')[0];
                        //        var val = Convert.ToUInt16(Current.option.OvenLoadVacuumAddrVals.Split(',')[j].Split(':')[1]);

                        //        if (!this.Plc.SetInfo(addr, val, out msg))
                        //        {
                        //            Error.Alert(msg);
                        //            this.Plc.IsAlive = false;
                        //            return false;
                        //        }

                        //        LogHelper.WriteInfo(string.Format("成功发送抽真空指令到{0}:{1}", this.Floors[j].Name, Current.option.OvenLoadVacuumAddrVals.Split(',')[j]));
                        //        this.Floors[j].toLoadVacuum = false;
                        //    }
                        //    #endregion

                        //    #region 停止抽真空
                        //    if (this.Floors[j].toCancelLoadVacuum)
                        //    {
                        //        var addr = Current.option.OvenStopLoadVacuumAddrVals.Split(',')[j].Split(':')[0];
                        //        var val = Convert.ToUInt16(Current.option.OvenStopLoadVacuumAddrVals.Split(',')[j].Split(':')[1]);

                        //        if (!this.Plc.SetInfo(addr, val, out msg))
                        //        {
                        //            Error.Alert(msg);
                        //            this.Plc.IsAlive = false;
                        //            return false;
                        //        }

                        //        LogHelper.WriteInfo(string.Format("成功发送取消抽真空指令到{0}:{1}", this.Floors[j].Name, Current.option.OvenStopLoadVacuumAddrVals.Split(',')[j]));
                        //        this.Floors[j].toCancelLoadVacuum = false;
                        //    }
                        //    #endregion

                        //    #region 破真空
                        //    if (this.Floors[j].toUploadVacuum)
                        //    {
                        //        var addr = Current.option.OvenUploadVacuumAddrVals.Split(',')[j].Split(':')[0];
                        //        var val = Convert.ToUInt16(Current.option.OvenUploadVacuumAddrVals.Split(',')[j].Split(':')[1]);

                        //        if (!this.Plc.SetInfo(addr, val, out msg))
                        //        {
                        //            Error.Alert(msg);
                        //            this.Plc.IsAlive = false;
                        //            return false;
                        //        }
                        //        LogHelper.WriteInfo(string.Format("成功发送破真空指令到{0}:{1}", this.Floors[j].Name, Current.option.OvenUploadVacuumAddrVals.Split(',')[j]));
                        //        this.Floors[j].toUploadVacuum = false;
                        //    }
                        //    #endregion

                        //    #region 停止破真空
                        //    if (this.Floors[j].toCancelUploadVacuum)
                        //    {
                        //        var addr = Current.option.OvenStopUploadVacuumAddrVals.Split(',')[j].Split(':')[0];
                        //        var val = Convert.ToUInt16(Current.option.OvenStopUploadVacuumAddrVals.Split(',')[j].Split(':')[1]);

                        //        if (!this.Plc.SetInfo(addr, val, out msg))
                        //        {
                        //            Error.Alert(msg);
                        //            this.Plc.IsAlive = false;
                        //            return false;
                        //        }
                        //        LogHelper.WriteInfo(string.Format("成功发送取消破真空指令到{0}:{1}", this.Floors[j].Name, Current.option.OvenStopUploadVacuumAddrVals.Split(',')[j]));
                        //        this.Floors[j].toCancelUploadVacuum = false;
                        //    }
                        //    #endregion

                        #region 运行时间清零
                        if (this.Floors[j].toClearRunTime)
                        {
                            var addr = "D" + (20 + 2 * j);

                            if (!this.Plc.SetInfo(addr, (ushort)0, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }

                            LogHelper.WriteInfo(string.Format("成功发送运行时间清零指令到{0}:{1}", this.Name, addr));
                            this.Floors[j].toClearRunTime = false;
                        }
                        #endregion

                        #region 开始充氮气
                        if (this.Floors[j].toAerating)
                        {
                            var addr = "D" + (81 + j);
                            if (!this.Plc.SetInfo(addr, (ushort)1, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }
                            LogHelper.WriteInfo(string.Format("成功发送充氮气指令到{0}:{1}", this.Name, addr));
                            this.Floors[j].toAerating = false;
                            this.Floors[j].IsAerating = true;
                        }
                        #endregion

                        #region 取消充氮气
                        if (this.Floors[j].toCancelAerating)
                        {
                            var addr = "D" + (81 + j);
                            if (!this.Plc.SetInfo(addr, (ushort)0, out msg))
                            {
                                Error.Alert(msg);
                                this.Plc.IsAlive = false;
                                return(false);
                            }
                            LogHelper.WriteInfo(string.Format("成功发送取消充氮气指令到{0}:{1}", this.Name, addr));
                            this.Floors[j].toCancelAerating = false;
                            this.Floors[j].IsAerating       = false;
                        }
                        #endregion
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    Error.Alert(ex);
                }

                this.Plc.IsAlive = true;

                this.getInfoNum++;
                if (getInfoNum >= 4)
                {
                    this.AlreadyGetAllInfo = true;
                }
                this.getInfoNum %= 4;
            }
            return(true);
        }