void timer_Elapsed(object sender, ElapsedEventArgs e) { int PortID = ((ExTimer)sender).TimerID; for (int i = 0; i < mPorts[PortID].mSlaves.Count(); i++) { RTUSlave slave = mPorts[PortID].mSlaves[i]; ExTimer timer = new ExTimer(); timer.TimerID = i; timer.AutoReset = false; timer.Interval = 1000; timer.Tag = new int[] { PortID, i }; timer.Elapsed += slave_timer_elapsed; timer.Start(); //Thread thread = new Thread(new ParameterizedThreadStart(thread_exec)); //thread.Start(new int[] { PortID, i }); } }
/*public void AddUnfinishedWork(ushort address, bool value) * { * lock (UnfinishedWorkLock) * { * if (!UnfinishedWork.ContainsKey(address)) * { * UnfinishedWork.Add(address, value); * } * } * } * * private void RemoveUnfinishedWork(ushort address) * { * lock (UnfinishedWorkLock) * { * if (UnfinishedWork.ContainsKey(address)) * { * UnfinishedWork.Remove(address); * } * } * }*/ /*public bool setValue(ushort address, bool value) * { * if (master != null) * { * try * { * //master.WriteSingleCoil(address, value); * return true; * } * catch (Exception ex) * { * AddUnfinishedWork(address, value); * Log.LogException(ex); * return false; * } * } * else * { * AddUnfinishedWork(address, value); * return false; * } * }*/ public bool Connect(int index = -1) { if (index == -1) { for (int i = 0; i < mPorts.Count(); i++) { try { clients[i] = new SerialPort(mPorts[i].mPortName, mBaudrate, mParity, mDataBits, mStopBits); clients[i].ErrorReceived += delegate(object sender, SerialErrorReceivedEventArgs e) { RtuConnected[i] = false; ExTimer reconnect_timer = new ExTimer(); reconnect_timer.AutoReset = true; reconnect_timer.Interval = 10 * 1000; reconnect_timer.Elapsed += delegate(object t_sender, ElapsedEventArgs t_e) { if (!RtuConnected[i]) { Connect(i); } }; }; clients[i].Open(); masters[i] = ModbusSerialMaster.CreateRtu(clients[i]); masters[i].Transport.ReadTimeout = 200; RtuConnected[i] = true; ValueUpdatedRequest(mPorts[i].mPortName + "连接成功", LogLevel.Event); } catch (Exception ex) { ExTimer reconnect_timer = new ExTimer(); reconnect_timer.Interval = 10000; reconnect_timer.AutoReset = false; reconnect_timer.TimerID = i; reconnect_timer.Elapsed += delegate(object sender, ElapsedEventArgs e) { RtuConnected[((ExTimer)sender).TimerID] = Connect(((ExTimer)sender).TimerID); }; reconnect_timer.Start(); RtuConnected[i] = false; Log.LogException(ex); ValueUpdatedRequest(mPorts[i].mPortName + "连接失败", LogLevel.Error); } ExTimer timer = new ExTimer(); timer.AutoReset = false; timer.Interval = 1000; timer.Elapsed += timer_Elapsed; timer.TimerID = i; timer.Start(); } return(true); } else { if (clients[index] != null) { clients[index].Close(); } if (masters[index] != null) { masters[index].Dispose(); } try { clients[index] = new SerialPort(mPorts[index].mPortName, mBaudrate, mParity, mDataBits, mStopBits); clients[index].Open(); masters[index] = ModbusSerialMaster.CreateRtu(clients[index]); masters[index].Transport.ReadTimeout = 300; RtuConnected[index] = true; ValueUpdatedRequest(mPorts[index].mPortName + "连接成功", LogLevel.Event); } catch (Exception ex) { ExTimer reconnect_timer = new ExTimer(); reconnect_timer.Interval = 10000; reconnect_timer.AutoReset = false; reconnect_timer.Elapsed += delegate { RtuConnected[index] = Connect(index); }; reconnect_timer.Start(); Log.LogException(ex); ValueUpdatedRequest(mPorts[index].mPortName + "连接失败", LogLevel.Error); return(false); } return(true); } }