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 forwrite single register
4
is address5
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 sequence3
=> always 3 forread single register
4
is address5
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
?