private void Polling() { DateTime AnalogUpdateTime = DateTime.Now; while (true) { try { if (_Cfg.Digital) { bool[] Response = new bool[0]; try { lock (Master) { Response = Master.ReadInputs(_Cfg.slaveID, 0, Convert.ToUInt16(_Cfg.DigitalInputQuantity)); } } catch (Exception e) { _Report.On_Connection_Error(_Cfg.DeviceName, "Disconnect"); Master.Dispose(); break; } for (int i = 0; i < _Cfg.DigitalInputQuantity; i++) { if (DIN.ContainsKey(i)) { bool org; DIN.TryGetValue(i, out org); if (!org.Equals(Response[i])) { DIN.TryUpdate(i, Response[i], org); _Report.On_Data_Chnaged(_Cfg.DeviceName, "DIN", i.ToString(), org.ToString(), Response[i].ToString()); } } else { DIN.TryAdd(i, Response[i]); _Report.On_Data_Chnaged(_Cfg.DeviceName, "DIN", i.ToString(), "False", Response[i].ToString()); } } } if (_Cfg.Analog) { TimeSpan timeDiff = DateTime.Now - AnalogUpdateTime; if (timeDiff.TotalMilliseconds > 400) { ushort[] Response2 = new ushort[0]; try { lock (Master) { Response2 = Master.ReadInputRegisters(_Cfg.slaveID, 0, Convert.ToUInt16(_Cfg.DigitalInputQuantity)); AnalogUpdateTime = DateTime.Now; } } catch (Exception e) { _Report.On_Connection_Error(_Cfg.DeviceName, "Disconnect"); Master.Dispose(); break; } for (int i = 0; i < _Cfg.DigitalInputQuantity; i++) { if (AIN.ContainsKey(i)) { ushort org; AIN.TryGetValue(i, out org); if (!org.Equals(Response2[i].ToString())) { AIN.TryUpdate(i, Response2[i], org); } _Report.On_Data_Chnaged(_Cfg.DeviceName, "AIN", i.ToString(), ((Convert.ToDouble(org) * 10.0 / 32767.0 - 1.0) / 4.0 * 50.0).ToString(), ((Convert.ToDouble(Response2[i]) * 10.0 / 32767.0 - 1.0) / 4.0 * 50.0).ToString().Substring(0, ((Convert.ToDouble(Response2[i]) * 10.0 / 32767.0 - 1.0) / 4.0 * 50.0).ToString().IndexOf(".") + 2)); //_Report.On_Data_Chnaged(_Cfg.DeviceName, "AIN", i.ToString(), ((Convert.ToDouble(org) * 10.0 / 32767.0 ) ).ToString(), ((Convert.ToDouble(Response2[i]) * 10.0 / 32767.0 ) ).ToString().Substring(0, ((Convert.ToDouble(Response2[i]) * 10.0 / 32767.0 )).ToString().IndexOf(".") + 2)); } else { AIN.TryAdd(i, Response2[i]); _Report.On_Data_Chnaged(_Cfg.DeviceName, "AIN", i.ToString(), "0", ((Convert.ToDouble(Response2[i]) * 10.0 / 32767.0 - 1.0) / 4.0 * 50.0).ToString().Substring(0, ((Convert.ToDouble(Response2[i]) * 10.0 / 32767.0 - 1.0) / 4.0 * 50.0).ToString().IndexOf(".") + 2)); } } } } SpinWait.SpinUntil(() => false, _Cfg.Delay); } catch (Exception e) { logger.Error(e.StackTrace); } } }
/// <summary> /// /// </summary> private void ProcessRead() { mComm.Take(); try { foreach (var vv in mInputStatusPackage) { var result = mMaster.ReadInputs((byte)mData.Id, vv.Key, vv.Value); if (result != null && result.Length == vv.Value) { for (ushort i = 0; i < vv.Value; i++) { ushort addr = (ushort)(vv.Key + i); if (this.mInputStatusTags.ContainsKey(addr)) { UpdateValue(mInputStatusTags[addr], result[i]); } } } } foreach (var vv in mCoilStatusPackage) { var result = mMaster.ReadCoils((byte)mData.Id, vv.Key, vv.Value); if (result != null && result.Length == vv.Value) { for (ushort i = 0; i < vv.Value; i++) { ushort addr = (ushort)(vv.Key + i); if (this.mCoilStatusTags.ContainsKey(addr)) { UpdateValue(mCoilStatusTags[addr], result[i]); } } } } foreach (var vv in mInputRegistorPackage) { var result = mMaster.ReadInputRegisters((byte)mData.Id, vv.Key, vv.Value); if (result != null && result.Length == vv.Value) { for (ushort i = 0; i < vv.Value; i++) { ushort addr = (ushort)(vv.Key + i); UpdateRegistor(addr, i, result, mInputRegistorTags); } } } foreach (var vv in mHoldtRegistorPackage) { var result = mMaster.ReadHoldingRegisters((byte)mData.Id, vv.Key, vv.Value); if (result != null && result.Length == vv.Value) { for (ushort i = 0; i < vv.Value; i++) { ushort addr = (ushort)(vv.Key + i); UpdateRegistor(addr, i, result, mHoldRegistorTags); } } } } catch (Exception ex) { LoggerService.Service.Warn("Modbus ip Driver", ex.Message); } mComm.Release(); }