Example #1
0
 /// <summary>
 ///  发送请求
 /// </summary>
 /// <param name="ip">目标设备</param>
 /// <param name="port">端口</param>
 /// <param name="req"></param>
 /// <param name="timeout"></param>
 /// <returns></returns>
 public JDQResponse Request(string ip, JDQRequest req, ushort port = 50000, uint timeout = 2000)
 {
     lock (this)
     {
         SocketClient conn = TryConnect(ip, port);
         JDQResponse resp;
         if (conn != null && conn.IsConnected)
         {
             SocketError error;
             byte[] recv = conn.SSend(req.Encode(), out error);
             resp = new JDQResponse(req.Type,recv);
             resp.Error = error;
             resp.ExtError = error.ToString();
         }
         else
         {
             // ERROR response
             log.ErrorFormat("Connection null or Not Ready.");
             resp = new JDQResponse(req.Type, new byte[0]);
             resp.Error = SocketError.NotConnected;
             resp.ExtError = "连接未就绪";
         }
         return resp;
     }
 }
Example #2
0
 public void TestIsReadOutputOK()
 {
     byte[] resp = new byte[] { 0xaa, 0xbb, 0xb0, 0x01, 0x00, 0x11, 0x0d, 0xcf };
     JDQResponse r = new JDQResponse(JDQRequestType.ReadOutput, resp);
     Assert.IsTrue(r.IsOK);
 }
Example #3
0
 private void OnTimerCallback(object state)
 {
     if (_running)
     {
         if (_ccs == null)
         {
             return;
         }
         lock (_ccs)
         {
             try
             {
                 JDQRequest req1 = new JDQRequest(1, JDQRequestType.ReadInput); // Read FAS/IBP
                 SocketError err;
                 byte[] recv = _ccs.SSend(req1.Encode(), out err);
                 OnOff ibp, fas;
                 if (SocketError.Success == err)
                 {
                     // IN1	IBP触发信号	信号有效:IBP被触发
                     // IN2	FAS触发信号	信号有效:FAS被触发
                     JDQResponse resp = new JDQResponse(JDQRequestType.ReadInput, recv);
                     if (resp.GetLength() == 0) return;
                     ibp = resp.GetInputState(0);
                     fas = resp.GetInputState(1);
                 }
                 else
                 {
                     ibp = OnOff.UNKNOWN;
                     fas = OnOff.UNKNOWN;
                 }
                 TryNotifyIpbFas(err, ibp, fas);
                 Thread.Sleep(10);
             }
             catch (Exception) { }
         }
     }
 }
Example #4
0
 public void TestIsReadInputOK()
 {
     byte[] resp = new byte[] { 0xee, 0xff, 0xc0, 0x01, 0x00, 0x00, 0x00, 0xc1, 0x82 };
     JDQResponse r = new JDQResponse(JDQRequestType.ReadInput, resp);
     Assert.IsTrue(r.IsOK);
 }
Example #5
0
        private void UpdateDoorState(Door d, JDQResponse input, JDQResponse output)
        {
            /* in
            1	左扇开门到位信号
            2	左扇关门到位信号
            3	右扇开门到位信号
            4	右扇关门到位信号
            5	LCB状态信号
            OUT:
            1	左扇门开关门信号	继电器吸合:触发开左扇门,反之触发关左扇门
            3	右扇门开关门信号	继电器吸合:触发开右扇门,反之触发关右扇门
            5	绿灯控制信号	继电器吸合:绿灯亮,反之绿灯灭
            6	红灯控制信号	继电器吸合:红灯亮,反之红灯灭
            7	蜂鸣器控制信号	继电器吸合:蜂鸣器开始叫,蜂鸣器停止叫
            */
            DoorState ds;
            if (d.State == null)
                d.State = ds = new DoorState();
            else
                ds = d.State;
            if (!input.IsOK || !output.IsOK)
            {
                ds.Reset();
                ds.Error = DoorError.SocketError;
                ds.ExtError = input.ExtError;
                return;
            }
            /// ==== OUTPUT State (继电器) ============
            ds.LeftAction  = output.GetRelayState(0);
            ds.RightAction = output.GetRelayState(2);
            // Lamp
            ds.GreenLamp = output.GetRelayState(4);
            ds.RedLamp = output.GetRelayState(5);
            // Beep
            ds.Beep = output.GetRelayState(6);
            /// ==== INPUT State (开关量) ============
            ds.LeftOpenState  = input.GetInputState(0);  // 左打开
            ds.LeftCloseState = input.GetInputState(1); // 左关闭
            ds.RightOpenState = input.GetInputState(2);  // 右打开
            ds.RightCloseState = input.GetInputState(3); // 右关闭
            // LCB
            ds.LCB = input.GetInputState(4);

            // 开关
            if (ds.LeftAction == RelayState.ACTION && ds.RightAction == RelayState.ACTION) {
                ds.DoorAction = RelayState.ACTION;
            }else if (ds.LeftAction == RelayState.RESET && ds.RightAction == RelayState.RESET) {
                ds.DoorAction = RelayState.RESET;
            }else {
                ds.DoorAction = RelayState.UNKNOWN; // 不一致.
            }

            // 错误判定.
            DoorError lerror = DoorError.UNKNOWN, rerror = DoorError.UNKNOWN;
            bool lOpenOk = false, lCloseOk = false, rOpenOk = false, rCloseOk = false;
            if (RelayState.ACTION == ds.LeftAction)
            { // 下达了左开门指令
                if (OnOff.ON == ds.LeftOpenState)
                    lOpenOk = true;
                else
                    lerror = DoorError.LeftOpenError; // 开左门未到位错误
            }
            else if (RelayState.RESET == ds.LeftAction)
            { // 下达了左关门指令.
                if (OnOff.ON == ds.LeftCloseState)
                    lCloseOk = true;
                else
                    lerror = DoorError.LeftCloseError; //关左门未到位错误
            }
            if (RelayState.ACTION == ds.RightAction)
            { // 下达了右开门指令
                if (OnOff.ON == ds.RightOpenState)
                    rOpenOk = true;
                else
                    rerror = DoorError.RightOpenError; // 右左门未到位错误
            }
            else if (RelayState.RESET == ds.RightAction)
            { // 下达了右关门指令.
                if (OnOff.ON == ds.RightCloseState)
                    rCloseOk = true;
                else
                    rerror = DoorError.RightCloseError; //关右门未到位错误
            }

            // 状态
            ds.Error = DoorError.Success;
            if (lOpenOk && rOpenOk)
            {
                ds.OpenState = OnOff.ON;
            }
            else if (lCloseOk && rCloseOk)
            {
                ds.CloseState = OnOff.ON;
            }

            // 错误
            if (lerror != DoorError.UNKNOWN || rerror != DoorError.UNKNOWN)
            {
                if (rerror == DoorError.UNKNOWN)
                { // 仅左门
                    ds.Error = lerror;
                }
                else if (lerror == DoorError.UNKNOWN)
                {
                    ds.Error = rerror;
                }
                else
                {
                    // 双门错误
                    if (DoorError.LeftOpenError == lerror)
                        ds.Error = DoorError.OpenError;
                    else
                        ds.Error = DoorError.CloseError;
                }
            }
            else
            {
                // none error?
                ds.Error = DoorError.Success;
            }
            return;
        }