VStore.cs 6.5 KB
using OnlineStore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;

namespace DeviceLibrary
{
    public class VStore
    {
        VServerComm ServerCM;        
        public VLog VLog;
        VStoreCollection vc;
        MsgService Msg;
        /// <summary>
        /// 当前料仓终端口的物料reelid
        /// </summary>
        public string CurrentTerminalReelID
        {
            get => ConfigHelper.Config.Get("Runtime_Tower_" + CID + "_CurrentTerminalReelID");
            set => ConfigHelper.Config.Set("Runtime_Tower_" + CID + "_CurrentTerminalReelID", value);
        }
        public string CID;
        public string TowerName;
        public VStore(TowerInfo towerInfo, VStoreCollection storeCollection) {
            vc = storeCollection;
            CID = towerInfo.TowerID;
            TowerName = towerInfo.TowerName;
            VLog = new VLog(CID, CID);
            ServerCM = new VServerComm(CID,VLog);
            ServerCM.OutStoreEvent += ServerCM_OutStoreEvent;
            ServerCM.storeStatus = StoreStatus.None;
            Msg = new MsgService("RT-"+CID);
            OutStoreJobList = new StoreJobList(crc.GetString("Res0050","出库任务"));
        }
        
        public void ServerCM_OutStoreEvent(object sender, JobInfo e)
        {
            VLog.Info(sender+"出库指令信息:" + e.ToStr());
            OutStoreJobList.Enqueue(e.Clone());
            //MI.DeviceList[TowerList.List[CurrentOutJobInfo.CID].DeviceGroupName].EnqueueOutStore(CurrentOutJobInfo);
            vc.BeginOutStore(e.Clone(), VLog);
        }
        public RTStoreStatus RTStoreStatus = RTStoreStatus.Offline;
        internal void VTowerProcess() {
            var ti = vc.GetTowerDetailInformation(CID);
            if (ti != null)
            {
                ServerCM.Temperature = ti.Temperature;
                ServerCM.Humidity = ti.Humidity * 100;
                if (ti.StatusCode == 26)
                {                    
                    ServerCM.storeStatus = StoreStatus.StoreOnline;
                    if (RTStoreStatus != RTStoreStatus.LockToInStore)
                    {
                        if (RTStoreStatus != RTStoreStatus.Ready)
                            VLog.Info("料仓已空闲");
                        RTStoreStatus = RTStoreStatus.Ready;

                        if (InStoreJobInfo != null)
                        {
                            VLog.Info("入库成功:" + InStoreJobInfo.ToStr());
                            InStoreJobInfo = null;
                        }
                    }
                    else {
                        Msg.add("料仓为入库锁定状态,请检查舱门口料盘状态", MsgLevel.alarm);
                    }


                }
                else if (ti.StatusCode == 1031)
                {
                    ServerCM.storeStatus = StoreStatus.InStoreExecute;
                    if (RTStoreStatus != RTStoreStatus.InStoreExecute)
                        VLog.Info("入库执行中");
                    RTStoreStatus = RTStoreStatus.InStoreExecute;
                    InStoreJobInfo = null;


                }
                else if (ti.StatusCode == 1032)
                {
                    if (RTStoreStatus != RTStoreStatus.InStoreReady)
                        VLog.Info("物料已在舱口");
                    RTStoreStatus = RTStoreStatus.InStoreReady;
                    if (InStoreJobInfo != null)
                    {
                        if (!vc.BeginInStore(CID, InStoreJobInfo,VLog)) {
                            Msg.add(crc.GetString("Res0051","无法入库"), MsgLevel.alarm);
                        }
                        
                    }
                }
                else if (ti.StatusCode == 1040)
                {
                    ServerCM.storeStatus = StoreStatus.OutMoveExecute;
                    if (RTStoreStatus != RTStoreStatus.OutMoveExecute)
                        VLog.Info("出库执行中");
                    RTStoreStatus = RTStoreStatus.OutMoveExecute;
                }
                else if (ti.StatusCode == 1041)
                {
                    if (RTStoreStatus != RTStoreStatus.OutStoreReady)
                        VLog.Info("出库已完成");
                    RTStoreStatus = RTStoreStatus.OutStoreReady;
                    OutStoreJobList.ClearLastPosid();
                }
                else if (ti.StatusCode == 0)
                {
                    RTStoreStatus = RTStoreStatus.Offline;
                    //ServerCM.storeStatus = StoreStatus.InStoreExecute;
                }
                else if (ti.StatusCode< 10000)
                {
                    RTStoreStatus = RTStoreStatus.Busy;
                    VLog.Info($"StatusCode:{ti.StatusCode},StatusText:{ti.StatusText},OnlineStatus:{ti.OnlineStatus}");
                }
                else 
                {
                    VLog.Error($"StatusCode:{ti.StatusCode},StatusText:{ti.StatusText},OnlineStatus:{ti.OnlineStatus}");
                    ServerCM.storeStatus = StoreStatus.InTrouble;
                    RTStoreStatus = RTStoreStatus.Error;
                }
            }
            else {

                ServerCM.storeStatus = StoreStatus.None;
                RTStoreStatus = RTStoreStatus.Offline;
            }
            /*
            26 Ready/Idle
            1031 loading material
            1032 material put into Terminal from outside
            1040 出库执行中
            1041 unloading material 物料已到舱门口
            1042 material unloaded to Terminal from Tower 物料已取走
            3068 初始化中
            */
        }
        volatile JobInfo InStoreJobInfo;
        StoreJobList OutStoreJobList;
        public void RequestInStore(JobInfo jobInfo) {
            InStoreJobInfo = jobInfo.Clone();
           //return vc.BeginInStore(CID, jobInfo);
        }

        public bool OutStoreEnd(string reelid) {
            CurrentTerminalReelID = reelid;
           return ServerCM.SendStoreState(reelid, StoreStatus.OutStoreBoxEnd);
        }
        public bool InStoreEnd(string posid)
        {
            return ServerCM.SendStoreState(posid, StoreStatus.InStoreEnd);
        }
    }
    public enum RTStoreStatus {
        Offline,
        Ready,
        InStoreReady,
        InStoreExecute,
        OutStoreReady,
        OutMoveExecute,
        NGOutReady,
        LockToInStore,
        Busy,
        Error,
    }
}