private FunctionServiceResult ProcessWriteRegisters(Sample[] samples) { // http://www.simplymodbus.ca/FC16.htm //Get the raw bytes var messageBytes = samples .Select(s => s.Value) .ToArray(); var dataAddress = EndianBitConverter.Big.ToUInt16(messageBytes, 2); var numberOfRegisters = EndianBitConverter.Big.ToUInt16(messageBytes, 4); var bytesToFollow = messageBytes[6]; if (bytesToFollow != numberOfRegisters*2) { return new FunctionServiceResult( $"The bytes to follow {bytesToFollow} does not match the number of registers {numberOfRegisters}."); } var registers = GetRegisters(messageBytes, numberOfRegisters, 7); Func<Visual> visualFactory = () => { var viewModel = new RegistersViewModel(registers.ToArray(), dataAddress); return new RegistersView() { DataContext = viewModel }; }; var summary = $"Write {numberOfRegisters} registers starting at register {dataAddress}"; return new FunctionServiceResult(summary, visualFactory, PacketType.Request); }
protected FunctionServiceResult ProcessReadRegisters(Sample[] samples, PacketType? packetType) { //Get the raw bytes var messageBytes = samples .Select(s => s.Value) .ToArray(); //We'll assume that this is a response byte numberOfBytes = messageBytes[2]; //Get the number of registers var numberOfRegisters = numberOfBytes / 2; //Get the registers themselves var registers = GetRegisters(messageBytes, numberOfRegisters, 3); //Create the visual factory Func<Visual> visualFactory = () => { var viewModel = new RegistersViewModel(registers); return new RegistersView() { DataContext = viewModel }; }; var summary = $"{numberOfRegisters} registers."; return new FunctionServiceResult(summary, visualFactory, packetType); }