public override void Init() { //委托事件实现 var heater = new Heater(); heater.OnBoiled += new AlarmObserver().Alert; heater.OnBoiled += new ScreenObserver().Show; heater.BoilWater(); //IObservable<>和IObserver<>实现 var subject = new Ammeter(); var alarm = new MeterAlarm(); var sms = new MeterSMS(); alarm.Subscribe(subject); sms.Subscribe(subject); subject.Publish(); alarm.Unsubscribe(); subject.Publish(); alarm.Subscribe(subject); sms.Unsubscribe(); subject.Publish(); }
public void AddAmmeter() { var temp = new Ammeter(4); CreatePairForElement(temp); ContextMenuManager.Instance.ContextMenuActive = false; }
/// <summary> /// 1.0和0.1都用同一种协议解析 /// </summary> private void analysis1_0or0_1() { int alllength = (int)SystemCode.HexNumberToDenary(this.messageContent.Substring(2 * 2, 2 * 2), true, 32, 'u') * 2; if (this.messageContent.Length >= (istart + icount) && alllength == (this.messageContent.Length - 2 * 2)) { messageHeader = new TcpHeader(); messageHeader.analyze(this.messageContent.Substring(istart, icount)); istart = istart + icount; //循环解析多个设备 listTcpbody = new List<DeviceDataBase>(); for (int i = 0; i < this.messageHeader.DevicesNum; i++) { DeviceDataBase ddb = null; if (istart > messageContent.Length) break; int type = (int)SystemCode.HexNumberToDenary(this.messageContent.Substring(istart + 2 * 2, 1 * 2), true, 32, 'u'); switch (type) { case DeviceData.TYPE_MODBUS_BUSBAR://modbus协议汇流箱 icount = ProtocolConst.LENGTH_MODBUS_BUSBAR * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new ModbusBusbar(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_MODBUS15_BUSBAR://光伏阵列汇流箱通讯协议(Modbus)V1.1.1.0-2011.8.30.pdf add by qianhb in 20111220 icount = ProtocolConst.LENGTH_MODBUS15_BUSBAR * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new Modbus15Busbar(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_MODBUS_CABINET://modbus协议配电柜 icount = ProtocolConst.LENGTH_MODBUS_CABINET * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new ModbusCabinet(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_MODBUS16_CABINET://光伏直流配电柜通信协议(Modbus)V1.0-柴达木-2011.8.30.pdf add by qianhb in 20111220 icount = ProtocolConst.LENGTH_MODBUS16_CABINET * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new Modbus16Cabinet(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_MODBUS_DETECTOR://设备类型0x22对应的数据区格式,环境检测仪(MODBUS协议) add by qianhb in 20111220 icount = ProtocolConst.LENGTH_MODBUS_DETECTOR * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new ModbusDetector(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_MODBUS_DETECTOR_V1020://设备类型0x23对应的数据区格式,环境检测仪(MODBUS协议) add by qianhb in 20120314 icount = ProtocolConst.LENGTH_MODBUS_DETECTOR_1020 * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new ModbusDetector1020(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_MODBUS_INVERTER://modbus协议逆变器 icount = ProtocolConst.LENGTH_MODBUS_INVERTER * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new ModbusInverter(this.messageContent.Substring(istart, icount),this); istart = istart + icount; break; } case DeviceData.TYPE_SUNGROW_BUSBAR://sungrows协议汇流箱 icount = ProtocolConst.LENGTH_SUNGROW_BUSBAR * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new SungrowBusbar(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_SUNGROW_CABINET://sungrows协议配电柜 icount = ProtocolConst.LENGTH_SUNGROW_CABINET * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new SungrowCabinet(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_SUNGROW_DETECTOR://sungrow协议检测仪 icount = ProtocolConst.LENGTH_SUNGROW_DETECTOR * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new SungrowDetector(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_SUNGROW_INVERTER://sungrow协议逆变器 icount = ProtocolConst.LENGTH_SUNGROW_INVERTER * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new SungrowInverter(this.messageContent.Substring(istart, icount),this); istart = istart + icount; break; } case DeviceData.TYPE_AMMETER://电表协议 icount = ProtocolConst.LENGTH_AMMETER * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new Ammeter(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } default: istart = istart + this.messageContent.Length; break; } if (ddb != null) listTcpbody.Add(ddb); } //取得告警信息 listTcpbug = new List<Bug>(); if (this.messageContent.Length > (ProtocolConst.LENGTH_BUG + ProtocolConst.LENGTH_HEAD) * 2) { istart = this.messageContent.Length - ProtocolConst.LENGTH_BUG * 2 * (this.messageHeader.BugNum); for (int i = 0; i < this.messageHeader.BugNum; i++) { Bug tcpb = new TcpBug(this.messageContent.Substring(istart + i * ProtocolConst.LENGTH_BUG * 2, ProtocolConst.LENGTH_BUG * 2)); listTcpbug.Add(tcpb); } } } else { base.messageHeader = new TcpHeader(); listTcpbody = new List<DeviceDataBase>(); listTcpbug = new List<Bug>(); } }
/// <summary> /// 1.0和0.1都用同一种协议解析 /// </summary> private void analysis1_0or0_1() { int alllength = (int)SystemCode.HexNumberToDenary(this.messageContent.Substring(2 * 2, 2 * 2), true, 32, 'u') * 2; if (this.messageContent.Length >= (istart + icount) && alllength == (this.messageContent.Length - 2 * 2)) { messageHeader = new TcpHeader(); messageHeader.analyze(this.messageContent.Substring(istart, icount)); //add by hbqian int 20130418 for其实0。1分的发电量是昨天,按道理不应该发的,但是现在LOG有个换存,导致0:到15分的这个时间发的发电量可能还是上一天的 if (messageHeader.TimeNow.Hour == 0 && messageHeader.TimeNow.Minute < 15) { return; } istart = istart + icount; //循环解析多个设备 listTcpbody = new List <DeviceDataBase>(); for (int i = 0; i < this.messageHeader.DevicesNum; i++) { DeviceDataBase ddb = null; if (istart > messageContent.Length) { break; } int type = (int)SystemCode.HexNumberToDenary(this.messageContent.Substring(istart + 2 * 2, 1 * 2), true, 32, 'u'); switch (type) { case DeviceData.TYPE_MODBUS_BUSBAR: //modbus协议汇流箱 icount = ProtocolConst.LENGTH_MODBUS_BUSBAR * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new ModbusBusbar(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_MODBUS15_BUSBAR: //光伏阵列汇流箱通讯协议(Modbus)V1.1.1.0-2011.8.30.pdf add by qianhb in 20111220 icount = ProtocolConst.LENGTH_MODBUS15_BUSBAR * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new Modbus15Busbar(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_MODBUS17_BUSBAR: //光伏汇流箱通信协议(Modbus)V1.7设置定稿.doc add by ZHOUHUI in 20121118 icount = ProtocolConst.LENGTH_MODBUS17_BUSBAR * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new Modbus17Busbar(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_MODBUS_CABINET: //modbus协议配电柜 icount = ProtocolConst.LENGTH_MODBUS_CABINET * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new ModbusCabinet(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_MODBUS16_CABINET: //光伏直流配电柜通信协议(Modbus)V1.0-柴达木-2011.8.30.pdf add by qianhb in 20111220 icount = ProtocolConst.LENGTH_MODBUS16_CABINET * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new Modbus16Cabinet(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_MODBUS_DETECTOR: //设备类型0x22对应的数据区格式,环境检测仪(MODBUS协议) add by qianhb in 20111220 icount = ProtocolConst.LENGTH_MODBUS_DETECTOR * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new ModbusDetector(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_MODBUS_DETECTOR_V1020: //设备类型0x23对应的数据区格式,环境检测仪(MODBUS协议) add by qianhb in 20120314 icount = ProtocolConst.LENGTH_MODBUS_DETECTOR_1020 * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new ModbusDetector1020(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_MODBUS_INVERTER: //modbus协议逆变器 icount = ProtocolConst.LENGTH_MODBUS_INVERTER * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new ModbusInverter(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_MODBUS_INVERTER03: //modbus协议逆变器03,由于03协议只是在02基础上增加数据,前面完全一样,对于新增的数据不处理,所以暂用02协议解析类处理 icount = ProtocolConst.LENGTH_MODBUS_INVERTER03 * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new ModbusInverter03(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_SUNGROW_BUSBAR: //sungrows协议汇流箱 icount = ProtocolConst.LENGTH_SUNGROW_BUSBAR * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new SungrowBusbar(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_SUNGROW_CABINET: //sungrows协议配电柜 icount = ProtocolConst.LENGTH_SUNGROW_CABINET * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new SungrowCabinet(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_SUNGROW_DETECTOR: //sungrow协议检测仪 icount = ProtocolConst.LENGTH_SUNGROW_DETECTOR * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new SungrowDetector(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_SUNGROW_INVERTER: //sungrow协议逆变器 icount = ProtocolConst.LENGTH_SUNGROW_INVERTER * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new SungrowInverter(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_AMMETER: //电表协议 icount = ProtocolConst.LENGTH_AMMETER * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new Ammeter(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } case DeviceData.TYPE_AMMETER_11: //电表协议1.1 icount = ProtocolConst.LENGTH_AMMETER_11 * 2; if (istart + icount > this.messageContent.Length) { istart = istart + icount; break; } else { ddb = new Ammeter11(this.messageContent.Substring(istart, icount), this); istart = istart + icount; break; } default: istart = istart + this.messageContent.Length; break; } if (ddb != null) { listTcpbody.Add(ddb); } } //取得告警信息 listTcpbug = new List <Bug>(); int faultInfoLength = getFaultInfoLength(); if (this.messageContent.Length > (faultInfoLength + ProtocolConst.LENGTH_HEAD) * 2) { istart = this.messageContent.Length - faultInfoLength * 2 * (this.messageHeader.BugNum); for (int i = 0; i < this.messageHeader.BugNum; i++) { string bugmsg = this.messageContent.Substring(istart + i * faultInfoLength * 2, faultInfoLength * 2); try { Bug tcpb = parseBug(bugmsg); listTcpbug.Add(tcpb); } catch (Exception buge) { LogUtil.error("告警信息解析错误:" + bugmsg + ":" + buge.Message); } } } } else { base.messageHeader = new TcpHeader(); listTcpbody = new List <DeviceDataBase>(); listTcpbug = new List <Bug>(); } }
void Update() { #region cam control float rx, ry; rx = cam.transform.rotation.eulerAngles.x; ry = cam.transform.rotation.eulerAngles.y; if (Input.GetMouseButton(1)) { rx -= Input.GetAxis("Mouse Y") * rotateSpeed; ry += Input.GetAxis("Mouse X") * rotateSpeed; } cam.transform.rotation = Quaternion.Euler(rx, ry, 0); Vector3 camMove = new Vector3(Input.GetAxis("Horizontal") * moveSpeedXY - ((Input.GetMouseButton(2)) ? Input.GetAxis("Mouse X") : 0) * moveSpeedXMouse, -((Input.GetMouseButton(2)) ? Input.GetAxis("Mouse Y") : 0) * moveSpeedYMouse, Input.GetAxis("Vertical") * moveSpeedXY + Input.GetAxis("Mouse ScrollWheel") * moveSpeedZ); cam.transform.Translate(camMove); #endregion if (Input.GetMouseButtonDown(0))//select { mouseLastPos = Input.mousePosition; Ray ray = cam.GetComponent <Camera>().ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit, 500)) { electronicComponent curSelect = hit.collider.gameObject.GetComponent <electronicComponent>(); if (curSelect != null) { if (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl)) { if (selectedList.Contains(curSelect)) { curSelect.unselect(); selectedList.Remove(curSelect); } else { curSelect.select(); selectedList.Add(curSelect); } } else { foreach (electronicComponent c in selectedList) { c.unselect(); } selectedList.Clear(); //select a wireNet if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) { if (curSelect.GetType() == typeof(Wire)) { foreach (electronicComponent c in ((Wire)curSelect).wireNet.wires) { c.select(); selectedList.Add(c); } foreach (electronicComponent c in ((Wire)curSelect).wireNet.intersections) { c.select(); selectedList.Add(c); } } if (curSelect.GetType() == typeof(Intersection)) { foreach (electronicComponent c in ((Intersection)curSelect).wireNet.wires) { c.select(); selectedList.Add(c); } foreach (electronicComponent c in ((Intersection)curSelect).wireNet.intersections) { c.select(); selectedList.Add(c); } } } else { curSelect.select(); selectedList.Add(curSelect); } } } else { foreach (electronicComponent c in selectedList) { c.unselect(); } selectedList.Clear(); } } else { foreach (electronicComponent c in selectedList) { c.unselect(); } selectedList.Clear(); } } if (Input.GetMouseButton(0))//drag { foreach (electronicComponent c in selectedList) { c.move(mousePos(selectedList[selectedList.Count - 1].gameObject.transform.position.y, Input.mousePosition) - mousePos(selectedList[selectedList.Count - 1].gameObject.transform.position.y, mouseLastPos), Input.GetKey(KeyCode.LeftAlt)?0:snapGap); } } if (Input.GetMouseButtonUp(0))//drag { foreach (electronicComponent c in selectedList) { c.OnMouseRelease(); } } #region create/delete components if (Input.GetKeyDown(KeyCode.Delete)) { foreach (electronicComponent c in selectedList) { Data.Remove(c); c.delete(); } selectedList.Clear(); reArrangeWireNets(); } if (Input.GetKeyDown(KeyCode.P)) { InitializeComponent(Instantiate(power)); } if (Input.GetKeyDown(KeyCode.R)) { InitializeComponent(Instantiate(resistance)); } if (Input.GetKeyDown(KeyCode.C)) { InitializeComponent(Instantiate(capacitance)); } if (Input.GetKeyDown(KeyCode.L)) { InitializeComponent(Instantiate(inductor)); } if (Input.GetKeyDown(KeyCode.I)) { GameObject newObject = Instantiate(intersection); Intersection script = (Intersection)newObject.GetComponent <electronicComponent>(); newObject.transform.position = mousePos(0, Input.mousePosition); script.create(this); foreach (electronicComponent c in selectedList) { c.unselect(); } selectedList.Clear(); newObject.GetComponent <electronicComponent>().select(); selectedList.Add(newObject.GetComponent <electronicComponent>()); reArrangeWireNets(); } if (Input.GetKeyDown(KeyCode.X)) { if (selectedList.Count == 2) { bool t = true; foreach (electronicComponent c in selectedList) { if (c.n_emptyConnect() < 1) { t = false; } } if (t) { GameObject newObject = Instantiate(wire); newObject.GetComponent <electronicComponent>().create(this); Wire wireScript = newObject.GetComponent <Wire>(); wireScript.addConnection(selectedList[0]); wireScript.addConnection(selectedList[1]); selectedList[0].addConnection(wireScript); selectedList[1].addConnection(wireScript); foreach (electronicComponent c in selectedList) { c.unselect(); } selectedList.Clear(); newObject.GetComponent <electronicComponent>().select(); selectedList.Add(newObject.GetComponent <electronicComponent>()); reArrangeWireNets(); } } } if (Input.GetKeyDown(KeyCode.V)) { if (selectedList.Count == 2) { bool t = true; foreach (electronicComponent c in selectedList) { if (c.GetType() != typeof(Wire)) { t = false; } } if (t) { GameObject newObject = Instantiate(voltmeter); Voltmeter script = newObject.GetComponent <Voltmeter>(); script.create_(this, (Wire)selectedList[0], (Wire)selectedList[1]); } } } if (Input.GetKeyDown(KeyCode.A)) { if (selectedList.Count == 1) { if (selectedList[0].GetType() != typeof(Wire)) { GameObject newObject = Instantiate(ammeter); Ammeter script = newObject.GetComponent <Ammeter>(); script.create_(this, selectedList[0]); } } } if (Input.GetKey(KeyCode.Escape)) { foreach (WireNet c in FindObjectsOfType <WireNet>()) { c.Reset(); } foreach (Capacitance c in FindObjectsOfType <Capacitance>()) { c.Reset(); } } #endregion mouseLastPos = Input.mousePosition; }