/// <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; } }
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); }
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) { } } } }
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); }
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; }