MainMachine _LedProcess.cs 3.9 KB
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Threading;

namespace DeviceLibrary
{
    partial class MainMachine
    {
        Led AlarmLed;
        Led StandbyLed;
        Led RunningLed;
        Led RightLed;
        Led LeftLed;

        System.Threading.Timer ledtimer;
        void LedProcessInit()
        {
            ledtimer = new System.Threading.Timer(new TimerCallback(LedProcess), null, 0, 1000);
            GC.KeepAlive(ledtimer);
        }

        void LedProcess(object o)
        {
            StandbyLed.LedState = LedState.off;
            AlarmLed.LedState = LedState.off;
            RunningLed.LedState = LedState.off;
            RightLed.LedState = LedState.off;
            LeftLed.LedState = LedState.off;
            //无法运行,量报警灯
            if (!canRunning)
            {
                AlarmLed.LedState = LedState.on;
                
            }
            //所有过程都在运动,闪烁运行中灯
            //if (!RightMoveInfo.IsStep(MoveStep.Wait)
            //    || !LeftMoveInfo.IsStep(MoveStep.Wait)
            //    || !MiddleMoveInfo.IsStep(MoveStep.M_Standby)
            //    || LabelMoveInfo.IsStep(MoveStep.Lbl_WaitPrint))
            //{
            //    RunningLed.LedState = LedState.on;
            //}

            if (alarmType != AlarmType.None || IsAlarm)
            {
                AlarmLed.LedState = LedState.on;
                AlarmBuzzer.ON();
            }
            else {
                AlarmBuzzer.OFF();
            }
            if (runStatus == RunStatus.HomeReset)
            {
                StandbyLed.LedState = LedState.blink;
            }
            if (runStatus == RunStatus.Running)
            {
                RunningLed.LedState = LedState.on;
                //右侧料串已空
                if (RightMoveInfo.IsStep(MoveStep.Wait) && IOValue(IO_Type.RightEnd_Check).Equals(IO_VALUE.HIGH) && RightShelfNoTray)
                {
                    //Msg.add("右侧料串已空,等待取走料串",MsgLevel.warning);
                    if (IOValue(IO_Type.RightCar_Check).Equals(IO_VALUE.HIGH))
                        RightLed.LedState = LedState.on;
                    else
                        RightLed.LedState = LedState.blink;
                }
                //左侧料串已满
                if (LeftMoveInfo.IsStep(MoveStep.Wait) && IOValue(IO_Type.LeftEnd_Check).Equals(IO_VALUE.HIGH) && LeftShelfNoTray)
                {
                    //Msg.add("作侧料串已满,等待取走料串", MsgLevel.warning);
                    if (IOValue(IO_Type.LeftCar_Check).Equals(IO_VALUE.HIGH))
                        LeftLed.LedState = LedState.blink;
                    else
                        LeftLed.LedState = LedState.blink;
                }
            }
            Led.LedGroup.ForEach((x) => { x.run(); });
        }
    }
    public class Led {
        public static List<Led> LedGroup = new List<Led>();
        public LedState LedState = LedState.off;
        ushort ledio;
        public Led(ushort io) {            
            ledio = io;
            LedGroup.Add(this);
        }
        IO_VALUE iovalue;
        IO_VALUE lastiovalue;
        public void run() {
            if (this.LedState == LedState.on) {
                iovalue = IO_VALUE.HIGH;
            }
            if (this.LedState == LedState.off)
            {
                iovalue = IO_VALUE.LOW;
            }
            if (this.LedState == LedState.blink)
            {
                if (iovalue == IO_VALUE.LOW)
                {
                    iovalue = IO_VALUE.HIGH;
                }
                else {
                    iovalue = IO_VALUE.LOW;
                }
            }
            if (iovalue != lastiovalue) {
                lastiovalue = iovalue;
                IOManager.WriteSingleDO("", 0x00, ledio, iovalue);
            }
        }
    }
    public enum LedState { 
        off,
        on,
        blink
    }
}