public static void TreatTelegram(IMsgUart msg) { try { MsgTelegram100 tel = (MsgTelegram100)msg; LocalRepository localRepository = LocalRepository.GetInstance(); if (tel.StatusPump != (int)localRepository.Pump.Status) { if (tel.StatusPump == 1) { localRepository.Pump.TurnOnPump(); } else { localRepository.Pump.TurnOffPump(); } } if (tel.OperationMode == (int)OperationMode.Automatic) { localRepository.Pump.OperationMode = OperationMode.Automatic; } else { localRepository.Pump.OperationMode = OperationMode.Manual; } } catch (Exception e) { } }
private void Loop() { Task.Run(async delegate { try { while (true) { ushort[] registers = _Master.ReadHoldingRegisters(_SlaveId, _StartAddress, _NumberOfPoints); for (int i = 0; i < registers.Length; i++) { if (registers[i] != _Registers[i]) { IMsgUart msg = CreateMsg((RegisterTypeByPosition)i, registers); if (msg != null) { Program.UartService.TreatMessage(msg); } } } _Registers = registers; await Task.Delay(1000); } } catch (Exception e) { } }); }
private IMsgUart CreateMsg(RegisterTypeByPosition registerType, ushort[] registers) { IMsgUart msg = null; switch (registerType) { case RegisterTypeByPosition.PumpStatus: case RegisterTypeByPosition.OperationMode: int pumpStauts = registers[(int)RegisterTypeByPosition.PumpStatus]; int operationMode = registers[(int)RegisterTypeByPosition.OperationMode]; msg = new MsgTelegram100(pumpStauts, operationMode); break; case RegisterTypeByPosition.MinWaterTankLevel1: case RegisterTypeByPosition.MinWaterTankLevel2: int minWaterTankLevel1 = registers[(int)RegisterTypeByPosition.MinWaterTankLevel1]; int minWaterTankLevel2 = registers[(int)RegisterTypeByPosition.MinWaterTankLevel2]; msg = new MsgTelegram101(minWaterTankLevel1, minWaterTankLevel2); break; case RegisterTypeByPosition.WaterTankLevel1: case RegisterTypeByPosition.WaterTankLevel2: int waterTankLevel1 = registers[(int)RegisterTypeByPosition.WaterTankLevel1]; int waterTankLevel2 = registers[(int)RegisterTypeByPosition.WaterTankLevel2]; msg = new MsgTelegram102(waterTankLevel1, waterTankLevel2); break; } return(msg); }
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { try { SerialPort serialPort = (SerialPort)sender; string dataReceived = serialPort.ReadExisting(); string[] buffer = dataReceived?.Split(';'); if (buffer != null && buffer.Length > 0) { UartTelegram telegram = new UartTelegram(buffer); IMsgUart msg = MsgUartFactory.CreateMsg(telegram.Header.ID); PropertyInfo[] propsInfo = msg.GetType().GetProperties(); if ((propsInfo != null) && (propsInfo.Length == telegram.Data.Length)) { for (int i = 0; i < propsInfo.Length; i++) { var converter = TypeDescriptor.GetConverter(propsInfo[i].PropertyType); var result = converter.ConvertFrom(telegram.Data[i]); propsInfo[i].SetValue(msg, result); } Program.UartService.TreatMessage(msg); } } } catch (Exception exc) { } }
internal static int GetID(this IMsgUart self) { string className = self.GetType().Name; int firstDigitIndex = className.IndexOfAny("0123456789".ToCharArray()); if (firstDigitIndex < 0) { throw new IndexOutOfRangeException("Nome da classe com tamanho inválido."); } return(int.Parse(className.Substring(firstDigitIndex))); }
public void TreatMessage(IMsgUart msg) { if (m_Handlers.ContainsKey(msg.GetID())) { m_Handlers[msg.GetID()](msg); } else { throw new Exception(String.Format("Tratamento do telegrama {0} do PIC não foi inicializado", msg.GetID())); } }
private short GetStartAddress(IMsgUart msg) { switch (msg.GetID()) { case 200: return(0); case 201: return(2); default: return(-1); } }
public static void TreatTelegram(IMsgUart msg) { try { MsgTelegram102 tel = (MsgTelegram102)msg; LocalRepository localRepository = LocalRepository.GetInstance(); WaterTank[] waterTanks = localRepository.Tanks; waterTanks[(int)WaterTankPosition.Tank1].Level = tel.LevelTank1; waterTanks[(int)WaterTankPosition.Tank2].Level = tel.LevelTank2; } catch (Exception e) { } }
internal static string ToString(this IMsgUart self) { StringBuilder sb = new StringBuilder(); sb.AppendFormat("[{0}] ->", self.GetID()); PropertyInfo[] propsInfo = self.GetType().GetProperties(); if ((propsInfo != null) && (propsInfo.Length > 0)) { foreach (PropertyInfo prop in propsInfo) { sb.AppendFormat(" {0}:{1}", prop.Name, prop.GetValue(self, null)); } } return(sb.ToString()); }
public void WriteRegisters(IMsgUart msg) { try { short startAddress = GetStartAddress(msg); if (startAddress != -1) { var propsInfo = msg.GetType().GetProperties(); if ((propsInfo != null) && (propsInfo.Length > 0)) { for (int i = 0; i < propsInfo.Length; i++) { ushort data = Convert.ToUInt16(propsInfo[i].GetValue(msg, null)); _Master.WriteSingleRegister(_SlaveId, (ushort)(startAddress + i), data); } } } } catch (Exception e) { } }
public void SendDataHandler(IMsgUart msg) { try { UartHeader header = null; string[] data = null; PropertyInfo[] propsInfo = msg.GetType().GetProperties(); if ((propsInfo != null) && (propsInfo.Length > 0)) { header = new UartHeader { Size = propsInfo.Length, ID = msg.GetID() }; data = new string[propsInfo.Length]; for (int i = 0; i < propsInfo.Length; i++) { data[i] = propsInfo[i].GetValue(msg, null).ToString(); } } if (header != null) { UartTelegram telegram = new UartTelegram(header, data); _SerialPort.WriteLine(string.Join(";", telegram.Buffer)); } else { throw new Exception("Impossível criar telegrama sem cabeçalho."); } } catch (Exception exc) { } }
public void SendMessage(IMsgUart msg) { Program.DriverUart.SendDataHandler(msg); }
public void TreatMessage(IMsgUart msg) { m_Handlers.TreatMessage(msg); }
public void SendMessage(IMsgUart msg) { Program.ModbusSerialRTUMasterDriver.WriteRegisters(msg); }