void ReceiveMsg() { while (true) { loop_cnt_test++; //if ((DateTime.Now - ModbusCmdTime).Seconds > 2) // ModbusMaster.Reset(); try { //byte[] buffer = new byte[1024 * 1024]; //int n = socketControl.Available; if (socketControl.Available > 0) { byte[] buffer = new byte[1]; socketControl.Receive(buffer, 1, 0); ModbusRespeonseResult responseResult = ModbusMaster.Response(buffer); ReciveHandler(buffer, responseResult); } } catch (ThreadAbortException ex) { toolStripStatusLabel1.Text = ""; MessageBox.Show("成功终止监听进程"); } catch (Exception ex) { MessageBox.Show("错误\r\n\r\n" + ex.Message); //th.Join(); break; } } }
private void timerSerialPort_Tick(object sender, EventArgs e) { if (this.CommClosing) //如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环 { return; //【防止关闭串口时卡死在close()时用到】 } try { this.CommListening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。 if (comm.BytesToRead > 0) { byte[] buffer = new byte[comm.BytesToRead]; comm.Read(buffer, 0, comm.BytesToRead); ModbusRespeonseResult responseResult = ModbusMaster.Response(buffer); ReciveHandler(buffer, responseResult); } } catch (Exception ex) { MessageBox.Show("接受数据处理程序异常\r\n\r\n" + ex.ToString()); } finally { this.CommListening = false; } }
public ModbusRespeonseResult Response(byte[] buf) { ModbusRespeonseResult result = ModbusRespeonseResult.None; for (int i = 0; i < buf.Length; i++) { PortBufQueue.Enqueue(buf[i]); } recieved = false; if (CmdRecord.Enable) { if (PortBufQueue.Count < 3) { return(ModbusRespeonseResult.None); } if (PortBufQueue.Dequeue() != this.deviceAddress) //设备地址 { return(ModbusRespeonseResult.None); } byte tmp_cmd = PortBufQueue.Dequeue(); if (tmp_cmd != CmdRecord.FunctionCode) //功能码 { return(ModbusRespeonseResult.FunctionCodeError); } switch (tmp_cmd) { case 03: case 04: int len = PortBufQueue.Dequeue(); if ((CmdRecord.Length << 1) != len) //字节长度 { return(ModbusRespeonseResult.LenghInconsisten); } CMD_LastLoop = tmp_cmd; break; case 05: CMD_LastLoop = tmp_cmd; break; case 16: CMD_LastLoop = tmp_cmd; break; default: break; } CmdRecord.Enable = false; } if (CMD_LastLoop != 0xff) { byte[] bytetmp = new byte[2]; switch (CMD_LastLoop) { case 03: case 04: if (PortBufQueue.Count < (CmdRecord.Length << 1)) { return(ModbusRespeonseResult.None); } recieved = true; ushort[] buffer = new ushort[CmdRecord.Length]; ushort tmp; for (int i = 0; i < buffer.Length; i++) { bytetmp[0] = PortBufQueue.Dequeue(); bytetmp[1] = PortBufQueue.Dequeue(); tmp = BitConverter.ToUInt16(bytetmp, 0); buffer[i] = (ushort)IPAddress.NetworkToHostOrder((short)tmp); } this.Buffer.Clear(); this.Buffer.AddRange(buffer); recieved = true; result = ModbusRespeonseResult.Recieved; CMD_LastLoop = 0xff; break; case 05: if (4 > PortBufQueue.Count) { return(ModbusRespeonseResult.None); } bytetmp[0] = PortBufQueue.Dequeue(); bytetmp[1] = PortBufQueue.Dequeue(); tmp = BitConverter.ToUInt16(bytetmp, 0); tmp = (ushort)IPAddress.NetworkToHostOrder((short)tmp); if (tmp != CmdRecord.Address) { return(ModbusRespeonseResult.RegisterAddressError); } bytetmp[0] = PortBufQueue.Dequeue(); bytetmp[1] = PortBufQueue.Dequeue(); tmp = BitConverter.ToUInt16(bytetmp, 0); tmp = (ushort)IPAddress.NetworkToHostOrder((short)tmp); if (tmp != CmdRecord.WriteValue[0]) { return(ModbusRespeonseResult.DataWritenError); } result = ModbusRespeonseResult.Recieved; CMD_LastLoop = 0xff; break; case 06: tmp = BitConverter.ToUInt16(PortBuf, 2); //Register Address tmp = (ushort)IPAddress.NetworkToHostOrder((short)tmp); if (tmp != CmdRecord.Address - 40000) { return(ModbusRespeonseResult.RegisterAddressError); } tmp = BitConverter.ToUInt16(PortBuf, 4); //Register Value tmp = (ushort)IPAddress.NetworkToHostOrder((short)tmp); if (tmp != CmdRecord.WriteValue[0]) { return(ModbusRespeonseResult.DataWritenError); } result = ModbusRespeonseResult.Writen; break; case 16: if (PortBufQueue.Count < 4) { return(ModbusRespeonseResult.None); } CMD_LastLoop = 0xff; bytetmp[0] = PortBufQueue.Dequeue(); bytetmp[1] = PortBufQueue.Dequeue(); tmp = BitConverter.ToUInt16(bytetmp, 0); //Register Address tmp = (ushort)IPAddress.NetworkToHostOrder((short)tmp); if (tmp != CmdRecord.Address - 4000) { result = ModbusRespeonseResult.RegisterAddressError; } bytetmp[0] = PortBufQueue.Dequeue(); bytetmp[1] = PortBufQueue.Dequeue(); tmp = BitConverter.ToUInt16(bytetmp, 0); //Register Address tmp = (ushort)IPAddress.NetworkToHostOrder((short)tmp); if (tmp != CmdRecord.Length) { result = ModbusRespeonseResult.LenghInconsisten; } result = ModbusRespeonseResult.Writen; break; default: result = ModbusRespeonseResult.FunctionCodeError; break; } } return(result); }
public ModbusRespeonseResult Response() { ModbusRespeonseResult result = ModbusRespeonseResult.None; this.PortBufcount = this.Port.BytesToRead; this.PortBuf = new byte[this.PortBufcount]; Port.Read(PortBuf, 0, PortBufcount); recieved = false; if (CmdRecord.Enable) { if (PortBuf.Length < 3) { return(ModbusRespeonseResult.None); } if (PortBuf[0] != this.deviceAddress) //设备地址 { return(ModbusRespeonseResult.None); } if (PortBuf[1] != CmdRecord.FunctionCode) //功能码 { return(ModbusRespeonseResult.FunctionCodeError); } switch (PortBuf[1]) { case 03: case 04: int len = PortBuf[2]; if ((CmdRecord.Length << 1) != len) //字节长度 { return(ModbusRespeonseResult.LenghInconsisten); } if (len + 3 > PortBuf.Length) { return(ModbusRespeonseResult.LengthError); } recieved = true; ushort[] buffer = new ushort[len >> 1]; ushort tmp; for (int i = 0; i < buffer.Length; i++) { tmp = BitConverter.ToUInt16(PortBuf, 3 + i * 2); buffer[i] = (ushort)IPAddress.NetworkToHostOrder((short)tmp); } this.Buffer.Clear(); this.Buffer.AddRange(buffer); recieved = true; result = ModbusRespeonseResult.Recieved; break; case 06: tmp = BitConverter.ToUInt16(PortBuf, 2); //Register Address tmp = (ushort)IPAddress.NetworkToHostOrder((short)tmp); if (tmp != CmdRecord.Address) { return(ModbusRespeonseResult.RegisterAddressError); } tmp = BitConverter.ToUInt16(PortBuf, 4); //Register Value tmp = (ushort)IPAddress.NetworkToHostOrder((short)tmp); if (tmp != CmdRecord.WriteValue[0]) { return(ModbusRespeonseResult.DataWritenError); } result = ModbusRespeonseResult.Writen; break; default: result = ModbusRespeonseResult.FunctionCodeError; break; } CmdRecord.Enable = false; } return(result); }
void ReciveHandler(byte[] buffer, ModbusRespeonseResult responseResult) { //因为要访问ui资源,所以需要使用invoke方式同步ui。 this.Invoke((EventHandler)(delegate { builder.Clear(); //判断是否是显示为16禁止 /*if (checkBoxHexViewR.Checked) * { * //依次的拼接出16进制字符串 * foreach (byte b in comt_buf) * { * builder.Append(b.ToString("X2") + " "); * } * } * else * { * builder.Append(Encoding.ASCII.GetString(comt_buf));//直接按ASCII规则转换成字符串 * }*/ builder.Append(buffer[0].ToString("X2") + " "); //依次的拼接出16进制字符串 //foreach (byte b in buffer) //{ //builder.Append(b.ToString("X2") + " "); //} //追加的形式添加到文本框末端,并滚动到最后。 this.textBoxRec.AppendText(builder.ToString()); builder.Clear(); //修改接收计数 RecCnt += 1; this.labelRecCnt.Text = RecCnt.ToString(); //string s2 = Encoding.UTF8.GetString(buffer, 0, 1); //ShowMsg(s2); if (responseResult == ModbusRespeonseResult.Recieved) { if ((ModbusMaster.CmdRecord.Address >= RelayConfig.RegHeadAddress) && (ModbusMaster.CmdRecord.Address <= RelayConfig.RegTailAddress)) { if (formRelayConfiguration != null) { if (!formRelayConfiguration.IsDisposed) { formRelayConfiguration.ShowRelayData(ModbusMaster.CmdRecord.Address, ModbusMaster.Buffer.ToArray()); } } } else if ((ModbusMaster.CmdRecord.Address >= RelayConfig.CeilHeadAddress) && (ModbusMaster.CmdRecord.Address <= RelayConfig.CeilTailAddress)) { if (formRelayConfiguration != null) { if (!formRelayConfiguration.IsDisposed) { formRelayConfiguration.buttonRead_Click(formRelayConfiguration.buttonRead, new EventArgs()); } } } else if ((ModbusMaster.CmdRecord.Address >= SensorConfig.RWHeadAddress) && (ModbusMaster.CmdRecord.Address <= SensorConfig.RWTailAddress)) { if (formSensorConfiguration != null) { if (!formSensorConfiguration.IsDisposed) { formSensorConfiguration.ShowSensorRWdata(ModbusMaster.CmdRecord.Address, ModbusMaster.Buffer.ToArray()); } } } else if ((ModbusMaster.CmdRecord.Address >= SensorConfig.ROHeadAddress) && (ModbusMaster.CmdRecord.Address <= SensorConfig.ROTailAddress)) { if (formSensorConfiguration != null) { if (!formSensorConfiguration.IsDisposed) { formSensorConfiguration.ShowSensorROdata(ModbusMaster.Buffer.ToArray()); } } } else if ((ModbusMaster.CmdRecord.Address >= SystemConfig.HeadAddress) && (ModbusMaster.CmdRecord.Address <= SystemConfig.TailAddress)) { SystemConfig1.SetValue(ModbusMaster.Buffer.ToArray()); this.textBoxAddressACU.Text = SystemConfig1.AddressACU.ToString(); this.textBoxSensorTotalNum.Text = SystemConfig1.SensorTotalNum.ToString(); this.comboBoxWorkMode.SelectedIndex = SystemConfig1.WorkMode; this.textBoxUpLoadPeriod.Text = SystemConfig1.UploadPeriod.ToString(); this.comboBoxRS485SensorBaud.SelectedIndex = SystemConfig1.RS485SensorBaud; this.comboBoxRS485ExtendBaud.SelectedIndex = SystemConfig1.RS485ExtendBaud; this.textBoxRS485ExtendAddress.Text = SystemConfig1.RS485ExtendAddress.ToString(); this.comboBoxRS485_4GBaud.SelectedIndex = SystemConfig1.Rs485_4GBaud; toolStripStatusLabel1.Text = "读取成功"; } } else if (responseResult == ModbusRespeonseResult.Writen) { if ((ModbusMaster.CmdRecord.Address >= RelayConfig.RegHeadAddress) && (ModbusMaster.CmdRecord.Address <= RelayConfig.RegTailAddress)) { if (formRelayConfiguration != null) { if (!formRelayConfiguration.IsDisposed) { formRelayConfiguration.timer1.Stop(); formRelayConfiguration.toolStripStatusLabel1.Text = "写入成功"; } } } else if ((ModbusMaster.CmdRecord.Address >= SensorConfig.RWHeadAddress) && (ModbusMaster.CmdRecord.Address <= SensorConfig.RWTailAddress)) { if (formSensorConfiguration != null) { if (!formSensorConfiguration.IsDisposed) { formSensorConfiguration.timer1.Stop(); formSensorConfiguration.toolStripStatusLabel1.Text = "写入成功"; } } } else if ((ModbusMaster.CmdRecord.Address >= SystemConfig.HeadAddress) && (ModbusMaster.CmdRecord.Address <= SystemConfig.TailAddress)) { toolStripStatusLabel1.Text = "写入成功"; } } if (ModbusCmdTime.CompareTo(new DateTime(2000, 1, 1, 0, 0, 0)) != 0) { TimeSpan ts = DateTime.Now - ModbusCmdTime; if (ts.Milliseconds > MODBUS_RESPONSE_TIME_MAX_MM) { ModbusCmdTime = new DateTime(2000, 1, 1, 0, 0, 0); toolStripStatusLabel1.Text = "响应超时"; } } })); }