static void SendTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { lock (SendBufferQueue) { int bufferCount = SendBufferQueue.Count; if (0 != bufferCount) { try { string dataStr = string.Empty; for (int i = 0; i < bufferCount; i++) { dataStr = SendBufferQueue.Dequeue(); TcpSocketCommunicator reporter = new TcpSocketCommunicator(); reporter.Connect(RelayServerInfo.Host_name, RelayServerInfo.Port_num, 5000); reporter.Send(Encoding.UTF8.GetBytes(dataStr)); reporter.Close(); //LogOutput.LogAppend("SendTimer_Elapsed Send : " + dataStr); Thread.Sleep(10); } } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.ToString()); LogOutput.LogAppend(ex.ToString()); } } } SendTimer.Start(); }
/// <summary> /// 单个设备查询线程的执行过程 /// </summary> /// <param name="deviceInfo"></param> override protected void InquiryTask(ModbusDeviceInfo deviceInfo) { string dateTimeStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); TcpSocketCommunicator inquirer = new TcpSocketCommunicator(); try { // 与设备模块进行连接(Connect) // 设定Receive的接收超时时间为3000毫秒 AppendUITextBox(" 开始连接: "+ deviceInfo.DeviceName); inquirer.Connect(deviceInfo.HostName, deviceInfo.PortNum, 3000); AppendUITextBox(" "+ deviceInfo.DeviceName + "连接成功!"); System.Threading.Thread.Sleep(100); // 发送查询命令内容 // 目标设备地址 // 功能码: 0x03(读) // 寄存器地址: 0x0202 // 读长度: 0x0002 byte[] tmpBytes = { (byte)deviceInfo.DeviceAddr, 0x03, 0x02, 0x02, 0x00, 0x02 }; UInt16 crc16 = CRC16(tmpBytes, 6); byte crcLowByte = (byte)(crc16 & 0x00FF); byte crcHighByte = (byte)((crc16 & 0xFF00) >> 8); // 水表 byte[] sendBytes = { (byte)deviceInfo.DeviceAddr, 0x03, 0x02, 0x02, 0x00, 0x02, crcLowByte, crcHighByte }; // 向设备模块发送读数查询指令 AppendUITextBox(" 查询 "+ deviceInfo.DeviceName + " 指令发送!"); inquirer.Send(sendBytes); // 接收设备模块返回的读数查询结果 ReceiveData ir = inquirer.Receive(); AppendUITextBox(" 接收到 "+ deviceInfo.DeviceName + " 应答数据: " + ir.RcvLen.ToString() + " 字节."); if ((ir.RcvLen >= 1) && (deviceInfo.DeviceAddr != ir.RcvBytes[0])) { AppendUITextBox(" "+ "收到的应答设备地址不一致: " + ir.RcvBytes[0].ToString()); return; } if (ir.RcvLen < 3) { System.Diagnostics.Trace.WriteLine(@"收到数据不正确, 无长度位!"); return; } int data_len = ir.RcvBytes[2]; if (ir.RcvLen < data_len + 3) { System.Diagnostics.Trace.WriteLine(@"收到数据长度不正确!"); return; } string waterVolumeStr = ""; for (int i = 3; i < 3 + data_len; i++) { string valStr = string.Format("{0:X}", ir.RcvBytes[i]).PadLeft(2, '0'); waterVolumeStr += valStr; } int iWaterVolumeVal = Convert.ToInt32(waterVolumeStr, 16); // 首先读数要乘以放大倍率 float waterVolumeVal = iWaterVolumeVal * deviceInfo.Magnification; // 然后除以量纲得到实际小数值 float fValue = waterVolumeVal / deviceInfo.Magnitude; float fWaterVolumeVal = fValue + deviceInfo.Adjustment; // 上报给服务器 string insertStr = GetReportString(dateTimeStr, fWaterVolumeVal, deviceInfo); AppendUITextBox(" "+ deviceInfo.DeviceName + " : 读数值 = " + fValue.ToString() + " + " + deviceInfo.Adjustment.ToString() + " = " + fWaterVolumeVal.ToString()); ReportToDBServer(insertStr, deviceInfo.DeviceName); } catch (Exception ex) { AppendUITextBox(" "+ deviceInfo.DeviceName + ": 查询失败!"); System.Diagnostics.Trace.WriteLine(ex.ToString()); } finally { inquirer.Close(); } }