public ZoneScanner(Zone z, JDQVisitor visitor) { this._zone = z; this._visitor = visitor; int dueTime = 1000;//Timeout.Infinite; _timer = new Timer(new TimerCallback(OnTimerCallback), null, dueTime, DEV_SCAN_INTERVAL); }
private void _OnZoneStateChanged(Zone _z, bool allOn) { bool isTotalOpen = UpdateFunctionTableByZone(_z); // 设置 中控 输出. lock (_ccs) { try { JDQRequest req1 = new JDQRequest(1, JDQRequestType.SetOutput); // Read FAS/IBP req1.SetOutput(_z.Reg.ZoneCoil, _z.IsZoneOpen()); req1.SetOutput(6, isTotalOpen); // 全区域. SocketError err; byte[] recv = _ccs.SSend(req1.Encode(), out err, 500); } catch (Exception) { } } if (this.OnZoneStateChanged != null) { OnZoneStateChanged.Invoke(_z, isTotalOpen); // 发出通知. } }
private void _OnDoorStateChanged(Zone _z, Door _d) { this.CloseAlarmAsNecessary(_d); UpdateFunctionTableByDoor(_z, _d); if (this.OnDoorStateChanged != null) { OnDoorStateChanged.Invoke(_z, _d); } // log.DebugFormat("Zone: {0}, Door {0} changed: ", _z.Name, ValueHelper.GetIpLastAddr(d.IpAddr)); }
/// 更新点表, 用于读取返回. bool UpdateFunctionTableByZone(Zone _z) { // 更新 区域信息. // 0x01 0~6 通讯故障 // 更新 主控. int totalOpened = 0, totalCnt = 0, errorCnt = 0; foreach (Zone z in _zones) { totalOpened += z.OpenCnt; totalCnt += z.TotalCnt; errorCnt += z.HasException? 1:0; } bool isTotalOpen = totalOpened >= totalCnt / 2; // 全区域异常: _ptable.SetValueAt(REG_SUMMARY, 0, errorCnt > 0); // 当前区域异常. _ptable.SetValueAt(REG_SUMMARY, _z.Reg.ZoneCoil, _z.HasException); // 当前区域状态 _ptable.SetValueAt(REG_ZONE_SUMMARY, _z.Reg.ZoneCoil, _z.IsZoneOpen()); // 全区域开? _ptable.SetValueAt(REG_ZONE_SUMMARY, 6, isTotalOpen); return isTotalOpen; }
// 更新点表 - 门 void UpdateFunctionTableByDoor(Zone _z, Door _d) { DoorState ds = _d.State; // 开门/关门 _ptable.SetValueAt(_z.Reg.SetDoor, _d.Coil, ds.DoorAction == RelayState.ACTION); // 开门到位 _ptable.SetValueAt(_z.Reg.GetOpenState, _d.Coil, ds.OpenState == OnOff.ON); // 关门到位 _ptable.SetValueAt(_z.Reg.GetCloseState, _d.Coil, ds.CloseState == OnOff.ON); // 异常 _ptable.SetValueAt(_z.Reg.GetErrorState, _d.Coil, ds.Error != DoorError.Success); // LCB _ptable.SetValueAt(_z.Reg.GetLCB, _d.Coil, ds.LCB == OnOff.ON); // 绿灯 _ptable.SetValueAt(_z.Reg.SetGreen, _d.Coil, ds.GreenLamp == RelayState.ACTION); // 红灯 _ptable.SetValueAt(_z.Reg.SetRed, _d.Coil, ds.RedLamp == RelayState.ACTION); // 按需关闭蜂鸣器. }
/// 控制某区域. void ControllOneZone(Zone z, OnOff to) { foreach (Door d in z.Doors) { if (d.Enabled) { ControlDoor(d, to); } } }
private void UpdateZoneState(Zone z) { }
// 区域状态变化回调 private void OnZoneStateChanged(Zone z, bool totalOn) { DataGridViewRow zi = _zoneRows[z.Name]; if (zi != null) { UpdateRowImg(zi, Properties.Resources.green_24); UpdateRowText(zi, ViewColumns.NAME, z.Name + "(" + z.Statistics + ")"); Label li; if (z.Reg.ZoneCoil == 0) li = lb_z1; else if (z.Reg.ZoneCoil == 1) li = lb_z2; else if (z.Reg.ZoneCoil == 2) li = lb_z3; else if (z.Reg.ZoneCoil == 3) li = lb_z4; else if (z.Reg.ZoneCoil == 4) li = lb_z5; else li = lb_z6; this.UpdateLabelImg(li, z.IsZoneOpen() ? OnOff.ON : OnOff.OFF); this.UpdateLabelImg(lb_z_all, totalOn ? OnOff.ON : OnOff.OFF); } }
// 门状态变化回调 private void OnDoorStateChanged(Zone z, Door d) { DataGridViewRow di = _doorRows[d.IpAddr]; if (di != null) { UpdateRowText(di, ViewColumns.ACTION, EnumHelper.ToString(d.State.DoorAction)); UpdateRowText(di, ViewColumns.OPEN_STATE, EnumHelper.ToString(d.State.OpenState)); UpdateRowText(di, ViewColumns.CLOSE_STATE, EnumHelper.ToString(d.State.CloseState)); UpdateRowText(di, ViewColumns.GREEN_LAMP, EnumHelper.ToString(d.State.GreenLamp)); UpdateRowText(di, ViewColumns.RED_LAMP, EnumHelper.ToString(d.State.RedLamp)); UpdateRowText(di, ViewColumns.LCB, EnumHelper.ToString(d.State.LCB)); UpdateRowText(di, ViewColumns.BEEP, EnumHelper.ToString(d.State.Beep)); UpdateRowText(di, ViewColumns.ERROR, EnumHelper.ToString(d.State.Error, d.State.ExtError)); if (DoorError.Success != d.State.Error) { UpdateRowImg(di, Properties.Resources.yellow_24); } else { UpdateRowImg(di, Properties.Resources.green_24); } } }
public IList<Zone> LoadConfig() { IList<Zone> _zones = new List<Zone>(); log.InfoFormat("解析文件: '{0}' ...", CFG_FILE); var doorCount = 0; try { XDocument doc = XDocument.Load(CFG_FILE); var root = doc.Root; var ccse = root.Element("ccs"); _ccsip = GetValue(ccse, "ip", "192.168.31.254"); string ipPrefix = GetValue(root, "ipp", "192.168.31"); byte zcnt = Convert.ToByte(GetValue(root, "zones")); _regMin = REG_START; _regMax = (byte)(REG_START + zcnt * REG_CMD_CNT); //共 7 组命令. byte _funcOffset = 0; foreach (var ze in root.Elements("zone")) { byte zoneCoil = Convert.ToByte(GetValue(ze, "zreg")); //1~6 byte regStart = (byte)(_funcOffset + REG_START); _funcOffset++; Zone z = new Zone() { Name = GetValue(ze, "name"), Reg = new RegInfo() { ZoneCoil = zoneCoil, SetDoor = regStart, GetOpenState = (byte)(regStart + zcnt * REG_GET_DOOR_OPEN), GetCloseState = (byte)(regStart + zcnt * REG_GET_DOOR_CLOSE), GetErrorState = (byte)(regStart + zcnt * REG_GET_DOOR_ERROR), GetLCB = (byte)(regStart + zcnt * REG_GET_LCB), SetGreen = (byte)(regStart + zcnt * REG_SET_GREEN), //5=开绿灯 SetRed = (byte)(regStart + zcnt * REG_SET_RED), // 6=开红灯 }, }; _zones.Add(z); // 该区域的门配置. foreach (var de in ze.Elements("d")) { Door d = new Door(); string ip = GetValue(de, "ip", ""); if (ip.Length <= 3) { ip = ipPrefix + "." + ip; } d.DevId = Convert.ToByte(GetValue(de, "id", "1")); d.Coil = Convert.ToByte(GetValue(de, "c")); //Coil/Bit d.IpAddr = ip; d.Enabled = GetValue(de, "enable", "1") == "1"; z.AddDoor(d); UpdateDoorMap(z, d); } doorCount += z.TotalCnt; log.DebugFormat("区域: {0}, doors={1}", z.Name, z.TotalCnt); } } catch (Exception e) { throw new Exception(string.Format("读取配置文件 {0} 异常:{1}", CFG_FILE, e.Message)); } _zoneCnt = _zones.Count; log.InfoFormat("配置已读取, 共 {0} 个区域, {1} 樘门.", _zoneCnt, doorCount); return _zones; }
// Reg.Bit => Door void UpdateDoorMap(Zone z, Door d) { _doorMap[string.Format("{0}.{1}", z.Reg.SetDoor, d.Coil)] = d; _doorMap[string.Format("{0}.{1}", z.Reg.SetGreen, d.Coil)] = d; _doorMap[string.Format("{0}.{1}", z.Reg.SetRed, d.Coil)] = d; _doorMap[string.Format("{0}.{1}", z.Reg.GetCloseState, d.Coil)] = d; _doorMap[string.Format("{0}.{1}", z.Reg.GetOpenState, d.Coil)] = d; _doorMap[string.Format("{0}.{1}", z.Reg.GetErrorState, d.Coil)] = d; _doorMap[string.Format("{0}.{1}", z.Reg.GetLCB, d.Coil)] = d; }