2

I want to create desktop app to communicate with PLC using modbus. I found modbus package, but I can not implement modbus server. There is only client implementation. I've read modbus source code and found that modbus client was created using Socket from dart:io. Can we create modbus server using ServerSocket?. I've tried to create tcp server using ServerSocket and modbus client then connect it. Modbus client can connect to tcp server and tcp server will receive Uint8List data if modbus client do writeSingleRegister or readHoldingRegisters.

Server socket will receive this data if modbus client do write single register with address 4 and value 5

[0,1,0,0,0,6,10,6,0,4,0,5] 
  • 1 is sequence
  • The second 6 => always 6 for write single register
  • 4 is address
  • 5 is value

Server socket wil receive this data if modbus client do read single register with address 4 and amount 5

[0,1,0,0,0,6,10,3,0,4,0,5] 
  • 1 is sequence
  • 3 => always 3 for read single register
  • 4 is address
  • 5 is amount

Create server

void createServer(){
    ServerSocket.bind("127.0.0.1", 4000)
        .then((server) {
      server.listen((socket) {
        socket.listen((event) {
          print(event);
          // how to send data result to client?
          // socket.write() and socket.add() give errors
          socket.write(Uint16List.view(event.buffer,0,1));
          // error => Unhandled Exception: RangeError (byteOffset): Invalid value: Not in inclusive range 0..3: 4
        });
      });
    });
}
Future<void>read(modbus.ModbusClient client,int address, int amount)async{
    Uint16List data = await client.readHoldingRegisters(address, amount);
    print(data);
  }

Problem

How to send data to modbus client if client do readHoldingRegisters using ServerSocket?

Miftakhul Arzak
  • 1,166
  • 1
  • 12
  • 31

0 Answers0