Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        /// <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();
            }
        }
Ejemplo n.º 3
0
        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();
        }