Exemplo n.º 1
0
 /// <summary>
 /// 主机操作复位
 /// </summary>
 private void ResetMain()
 {
     if (currentGUID != "")
     {
         Queue.Remove(currentGUID);
         currentGUID = "";
         if (currentGetStatue != GetStatueList.无请求 && NeedMainReset != null)
         {
             NeedMainReset(this, new EventArgs());
         }
         currentGetStatue = GetStatueList.无请求;
     }
 }
Exemplo n.º 2
0
        private bool Loop()
        {
            try
            {
                lock (lockObject)
                {
                    Dictionary <string, string> buff = new Dictionary <string, string>();
                    buff.Add("Code", string.Format("{0}", (int)currentSetStatue));
                    buff.Add("GUID", clientGuid);
                    SSMeter.SSReadMeter.ReadDataStyle rd = new SSMeter.SSReadMeter.ReadDataStyle(Class.TypeUse.TypeList.Int, buff);
                    byte[] readBuff;
                    if (WriteAndRead <byte[], byte[]>(rd.GetBytes(), 7, out readBuff))
                    {
                        SSMeter.SSReadMeter.ReadResultStyle rs = SSMeter.SSReadMeter.ReadResultStyle.Parse(readBuff);
                        if (rs == null || rs.Random != rd.Random || !rs.Result)
                        {
                            All.Class.Error.Add("SSLockClient.Loop无校验或校验不通过");
                            return(false);
                        }
                        List <int> result = (List <int>)rs.Value;
                        if (result[0] < 0 || result[0] >= Enum.GetNames(typeof(GetStatueList)).Length)
                        {
                            All.Class.Error.Add("SSLockClient.Loop无效的命令");
                            return(false);
                        }
                        switch ((SSLockMain.ReturnStatueList)result[0])
                        {
                        case SSLockMain.ReturnStatueList.无请求:
                            if ((int)currentGetStatue != (int)GetStatueList.无状态)
                            {
                                currentGetStatue = GetStatueList.无状态;
                                All.Class.Log.Add("SSLockClient.状态->无状态/无请求");
                                if (NeedClientReset != null)
                                {
                                    NeedClientReset(this, new EventArgs());
                                }
                            }
                            break;

                        case SSLockMain.ReturnStatueList.允许:
                            if ((int)currentGetStatue != (int)GetStatueList.允许执行)
                            {
                                currentGetStatue = GetStatueList.允许执行;
                                All.Class.Log.Add("SSLockClient.状态->允许执行");
                                if (NeedClientSwitch != null)
                                {
                                    NeedClientSwitch(this, new EventArgs());
                                }
                            }
                            break;

                        case SSLockMain.ReturnStatueList.等待:
                            if ((int)currentGetStatue != (int)GetStatueList.等待执行)
                            {
                                currentGetStatue = GetStatueList.等待执行;
                                All.Class.Log.Add("SSLockClient.状态->等待执行");
                            }
                            break;
                        }
                    }
                    else
                    {
                        return(false);
                    }
                }
            }
            catch (Exception e)
            {
                All.Class.Error.Add(e);
                return(false);
            }
            return(true);
        }
Exemplo n.º 3
0
        private void lockUpd_GetStringArgs(Udp sender, ReciveString reciveArgs)
        {
            string value = reciveArgs.Value;

            string[] buff  = value.Split(new string[] { "~~~" }, StringSplitOptions.None);
            T        index = (T)(Object)(buff[0]);

            LockClient <T> .SetStatueList statue = (LockClient <T> .SetStatueList)Num.ToInt(buff[1]);
            switch (statue)
            {
            case LockClient <T> .SetStatueList.连接测试:
                lockUdp.Write(string.Format("{0}", (int)GetStatueList.收到请求), reciveArgs.RemoteHost, reciveArgs.RemotePort);
                break;

            case LockClient <T> .SetStatueList.请求:
                if (!lockList.Contains(index))
                {
                    lockList.Add(index);
                }
                if (lockList.Count > 0)
                {
                    if ((string)(object)lockList[0] == (string)(object)index)
                    {
                        lockUdp.Write(string.Format("{0}", (int)GetStatueList.允许执行互锁要求), reciveArgs.RemoteHost, reciveArgs.RemotePort);
                    }
                    else
                    {
                        lockUdp.Write(string.Format("{0}", (int)GetStatueList.等待), reciveArgs.RemoteHost, reciveArgs.RemotePort);
                    }
                }
                else
                {
                    Error.Add("有添加的请求,但数组列为0", Environment.StackTrace);
                }
                break;

            case LockClient <T> .SetStatueList.执行要求完毕:
                if (lockList.Count > 0)
                {
                    if ((string)(object)lockList[0] != (string)(object)index)
                    {
                        Error.Add(string.Format("动作完成的工位和允许执行的工位不是同一个,大问题。允许工位为:{0},执行工位为:{1}", lockList[0], index), Environment.StackTrace);
                        return;
                    }
                    switch (nowStatueList)
                    {
                    case GetStatueList.收到请求:
                        if (AllTestNeedOk != null)
                        {
                            AllTestNeedOk();
                        }
                        nowStatueList = GetStatueList.正在执行互锁动作;
                        lockUdp.Write(string.Format("{0}", (int)GetStatueList.正在执行互锁动作), reciveArgs.RemoteHost, reciveArgs.RemotePort);
                        break;

                    case GetStatueList.正在执行互锁动作:
                        lockUdp.Write(string.Format("{0}~~~{1}", (int)GetStatueList.正在执行互锁动作, testingValue), reciveArgs.RemoteHost, reciveArgs.RemotePort);
                        break;

                    case GetStatueList.互锁动作执行完毕:
                        lockUdp.Write(string.Format("{0}~~~{1}", (int)GetStatueList.互锁动作执行完毕, testValue), reciveArgs.RemoteHost, reciveArgs.RemotePort);
                        break;
                    }
                }
                else
                {
                    Error.Add("有返回执行的工位请求,但数组列为0", Environment.StackTrace);
                }
                break;

            case LockClient <T> .SetStatueList.动作完毕取消请求:
                lockUdp.Write(string.Format("{0}", (int)GetStatueList.互锁请求正常结束), reciveArgs.RemoteHost, reciveArgs.RemotePort);
                if (lockList.Count > 0)
                {
                    if ((string)(object)lockList[0] == (string)(object)index)
                    {
                        nowStatueList = GetStatueList.收到请求;
                        testValue     = "";
                        testingValue  = "";
                        lockList.Remove(index);
                    }
                    else
                    {
                        Error.Add(string.Format("动作完成的工位和完成请求的工位不是同一个,大问题。允许工位为:{0},执行完成工位为:{1}", lockList[0], index), Environment.StackTrace);
                        return;
                    }
                }
                else
                {
                    Error.Add("有返回完毕的工位请求,但数组列为0", Environment.StackTrace);
                }
                break;

            case LockClient <T> .SetStatueList.除:

                if (lockList.Count > 0)
                {
                    if ((string)(object)lockList[0] == (string)(object)index)
                    {
                        nowStatueList = GetStatueList.收到请求;
                        testValue     = "";
                        testingValue  = "";
                        if (AllTestCancel != null)
                        {
                            AllTestCancel();
                        }
                    }
                }
                if (lockList.Contains(index))
                {
                    lockList.Remove(index);
                }
                lockUdp.Write(string.Format("{0}", (int)GetStatueList.除请求成功), reciveArgs.RemoteHost, reciveArgs.RemotePort);
                break;
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// 处理各种请求
        /// </summary>
        private void Loop()
        {
            lock (lockObject)
            {
                //检测分站状态的合法性
                allClientRequestStatue.Keys.ToList().ForEach(key =>
                {
                    switch (allClientRequestStatue[key])
                    {
                    case SSLockClient.SetStatueList.开始测试:
                        if (Queue.GetCount(0) > 0 && Queue[0] != key)                     //如果分站不是第一个的话,状态不能为开始测试,
                        {
                            allClientRequestStatue[key] = SSLockClient.SetStatueList.除请求; //错误状态的请求,直接删除
                        }
                        break;
                    }
                });
                //确定返回分站的状态
                allClientRequestStatue.Keys.ToList().ForEach(key =>
                {
                    switch (allClientRequestStatue[key])
                    {
                    case SSLockClient.SetStatueList.无动作:
                        if (Queue.GetCurrent(key) != key)        //排在后面的可以先删除掉
                        {
                            Queue.Remove(key);
                        }
                        allClientReturnStatue[key] = ReturnStatueList.无请求;
                        break;

                    case SSLockClient.SetStatueList.请求测试:
                        Queue.Request(key);
                        if (allClientReturnStatue[key] == ReturnStatueList.无请求)
                        {
                            allClientReturnStatue[key] = ReturnStatueList.等待;
                        }
                        break;

                    case SSLockClient.SetStatueList.开始测试:
                        break;
                    }
                });
                //确定主机应该如何动作
                if (Queue.GetCount(0) > 0)
                {
                    currentGUID = Queue[0];
                    if ((int)allClientRequestStatue[currentGUID] == (int)SSLockClient.SetStatueList.无动作)
                    {
                        ResetMain();
                        return;
                    }
                    switch (currentGetStatue)//主机当前状态
                    {
                    case GetStatueList.无请求:
                        switch (allClientRequestStatue[currentGUID])    //分机请求状态
                        {
                        case SSLockClient.SetStatueList.请求测试:
                            if ((int)currentGetStatue != (int)GetStatueList.等待主机执行互锁前切换动作)
                            {
                                All.Class.Log.Add("SSLockMain.状态->等待主机执行互锁前切换动作");
                            }
                            currentGetStatue = GetStatueList.等待主机执行互锁前切换动作;
                            if (NeedMainSwitch != null)
                            {
                                NeedMainSwitch(this, new EventArgs());
                            }
                            break;

                        default:
                            All.Class.Error.Add(string.Format("动作不能跳跃式完成,当前主机状态只能接收[请求测试]状态,实际接收[{0}]状态,请检查客户端发送状态逻辑", allClientRequestStatue[currentGUID]));
                            break;
                        }
                        break;

                    case GetStatueList.等待主机执行互锁前切换动作:
                        switch (allClientRequestStatue[currentGUID])
                        {
                        case SSLockClient.SetStatueList.开始测试:
                            if ((int)currentGetStatue != (int)GetStatueList.等待执行互锁动作)
                            {
                                All.Class.Log.Add("SSLockMain.状态->等待执行互锁动作");
                            }
                            currentGetStatue = GetStatueList.等待执行互锁动作;
                            if (NeedMainStart != null)
                            {
                                NeedMainStart(this, new EventArgs());
                            }
                            break;

                        case SSLockClient.SetStatueList.请求测试:
                            break;

                        default:
                            All.Class.Error.Add(string.Format("动作不能跳跃式完成,当前主机状态只能接收[开始测试]状态,实际接收[{0}]状态,请检查客户端发送状态逻辑", allClientRequestStatue[currentGUID]));
                            break;
                        }
                        break;

                    case GetStatueList.等待执行互锁动作:
                        break;
                    }
                }
                else
                {
                    ResetMain();
                }
            }
        }
Exemplo n.º 5
0
 public void AllTestOver(string value)
 {
     testValue     = value;
     nowStatueList = GetStatueList.互锁动作执行完毕;
 }