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); } } }
private void Polling() { while (true) { try { if (_Cfg.Digital) { bool[] Response = new bool[0]; string[] valAry; lock (conn) { Waiting = true; conn.Send("$1GET:BRDIO:17,1,3\r"); SpinWait.SpinUntil(() => !Waiting, 50000); if (Waiting && !status.Equals("Timeout")) { logger.Error("DIO polling error: Timeout"); _Report.On_Connection_Status_Report(_Cfg.DeviceName, "Timeout"); status = "Timeout"; continue; } string orgAry = ReturnMsg.Split(':')[2]; valAry = orgAry.Split(','); } int Count = Convert.ToInt32(valAry[2]); int idx = 3; int StartNo = Convert.ToInt32(valAry[0]); for (int x = 0; x < Count; x++) { string hexStr = valAry[idx]; string binary = String.Join(String.Empty, hexStr.Select(c => Convert.ToString(Convert.ToInt32(c.ToString(), 16), 2).PadLeft(4, '0'))); Response = new bool[binary.Length]; int orgIdx = binary.Length - 1; for (int i = 0; i < binary.Length; i++) { Response[orgIdx] = binary[i] == '1' ? true : false; orgIdx--; } for (int i = 0; i < _Cfg.DigitalInputQuantity; i++) { string addr = StartNo.ToString("00") + "," + (i + 1).ToString(); if (DIN.ContainsKey(addr)) { bool org; DIN.TryGetValue(addr, out org); if (!org.Equals(Response[i])) { DIN.TryUpdate(addr, Response[i], org); _Report.On_Data_Chnaged(_Cfg.DeviceName, "DIN", addr, org.ToString(), Response[i].ToString()); } } else { DIN.TryAdd(addr, Response[i]); _Report.On_Data_Chnaged(_Cfg.DeviceName, "DIN", addr, "False", Response[i].ToString()); } } idx++; StartNo++; } } SpinWait.SpinUntil(() => false, _Cfg.Delay); } catch (Exception e) { logger.Error(e.StackTrace); } } }