//传给Timer的数据用于分析用户选择的物理量 public void TimerShow(object sender, SJRControlCData data) { this.Invoke(new Action(() => { //线圈检测状态和测速通讯线连接状态同时满足 if (SJRControlC.ConnectState == true && SpeedLine == true) { //在用户设定的周期内 if (runNum <= runTime) { button1.Enabled = false; if (data.CarOrNot == 1 && inFlag == false) { //测交通量 carCount++; inFlag = true; } if (data.CarOrNot == 0) { inFlag = false;//还原车辆第一次进入线圈的标志,以便再次计数 } //测车速 speed += data.Speed; //测时间 timeTotal += data.Time; } } })); }
protected void OnTimerMsgRecieved(SJRControlCData data)//触发事件方法 { if (TimerMsgRevieced != null) { TimerMsgRevieced(this, data); } }
public void Show(object sender, SJRControlCData data) { this.Invoke(new Action(() => { int i; //输出车辆信号检测数据,不包含线圈编号 if (SJRControlC.Cardetect_ButtonState == true && SJRControlC.CardetectLine_ButtonState == true && frequency_CheckBox.Checked == false) { if (SJRControlC.CoilCheck_ButtonState == false || SJRControlC.CoilCheckLine_ButtonState == false) { i = dataGridView1.Rows.Add(); dataGridView1.Rows[i].Cells[0].Value = DateTime.Now.ToString("hh:mm:ss"); dataGridView1.Rows[i].Cells[2].Value = data.CarOrNot; } //输出车辆检测信号和线圈编号检测数据, else if (SJRControlC.CoilCheck_ButtonState == true && SJRControlC.CoilCheckLine_ButtonState == true && frequency_CheckBox.Checked == false) { i = dataGridView1.Rows.Add(); dataGridView1.Rows[i].Cells[0].Value = DateTime.Now.ToString("hh:mm:ss"); dataGridView1.Rows[i].Cells[1].Value = data.LoopNum; dataGridView1.Rows[i].Cells[2].Value = data.CarOrNot; } } //输出线圈编号检测数据, else if (SJRControlC.CoilCheck_ButtonState == true && SJRControlC.CoilCheckLine_ButtonState) { if (frequency_CheckBox.Checked == true) { i = dataGridView1.Rows.Add(); dataGridView1.Rows[i].Cells[0].Value = DateTime.Now.ToString("hh:mm:ss"); dataGridView1.Rows[i].Cells[1].Value = data.LoopNum; } else if (frequency_CheckBox.Checked == false) { if (SJRControlC.Cardetect_ButtonState == false || SJRControlC.CardetectLine_ButtonState == false) { i = dataGridView1.Rows.Add(); dataGridView1.Rows[i].Cells[0].Value = DateTime.Now.ToString("hh:mm:ss"); dataGridView1.Rows[i].Cells[1].Value = data.LoopNum; } } } dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows.Count - 1; })); }
//传给实时测速的数据 public void Show(object sender, SJRControlCData data) { this.Invoke(new Action(() => { int i; //输出速度 if (SJRControlC.ConnectState == true && SJRControlA.SpeedLine == true) { if (data.Speed != 0) { i = dataGridView1.Rows.Add(); dataGridView1.Rows[i].Cells[0].Value = DateTime.Now.ToString("hh:mm:ss"); dataGridView1.Rows[i].Cells[1].Value = data.Speed; } } dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows.Count - 1; })); }
//解析数据 private void GetMsg() { try { while (true) { //存储二进制数据的数组 int[] lAChannelbits = new int[8]; int[] tHBbits = new int[8]; int[] tLBbits = new int[8]; int[] timebits; //高低位结合,组成十六位,值范围 =0-65535ms int[] troubleStatebits = new int[8]; byte[] arrRecMsg = new byte[4]; //接收数据字节数组 //十进制 byte LAChannel = 0; //线圈编号和通道检测状态 byte THB = 0; //系统计时高位 byte TLB = 0; //系统计时低位 byte TroubleState = 0; //通道故障状态 int length = client.Receive(arrRecMsg); //接收数据 LAChannel = arrRecMsg[0]; THB = arrRecMsg[1]; TLB = arrRecMsg[2]; TroubleState = arrRecMsg[3]; GetBit(LAChannel, lAChannelbits); GetBit(THB, tHBbits); GetBit(TLB, tLBbits); GetBit(TroubleState, troubleStatebits); //计算线圈编号 loopNumber = lAChannelbits[4] + lAChannelbits[5] * 2 + lAChannelbits[6] * 4 + lAChannelbits[7] * 8; //有无车辆经过 carOrNot = lAChannelbits[0]; //线圈故障检测 if (loopNumber == 1) { troubleOrNot = troubleStatebits[0]; } else if (loopNumber == 2) { troubleOrNot = troubleStatebits[1]; } speed = 0; lastTime = 0; if (carOrNot == 1 && inFlag == false) { inTime = System.DateTime.Now.Second * 1000 + System.DateTime.Now.Millisecond;//以毫秒为单位 inFlag = true; } if (carOrNot == 0 && inFlag == true) { outTime = System.DateTime.Now.Second * 1000 + System.DateTime.Now.Millisecond; //以毫秒为单位 inFlag = false; //还原车辆第一次进入线圈的标志 //车辆离开线圈时计算时间和车速 lastTime = outTime - inTime; speed = Math.Round((0.3 * 1000 / lastTime), 2); } data = new SJRControlCData { Time = lastTime, LoopNum = loopNumber, CarOrNot = carOrNot, TroubleState = troubleOrNot, Speed = speed }; OnMsgRecieved(data); OnTimerMsgRecieved(data); } } catch (SocketException ex) { client.Close(); client.Dispose(); MessageBox.Show(ex.ToString()); } }