如何在扑波中创建Modbus Master/Server TCP?

发布于 2025-02-11 04:01:45 字数 1909 浏览 1 评论 0原文

我想创建使用Modbus与PLC通信的桌面应用程序。我发现 modbus package,但我无法实现modbus服务器。只有客户实现。我已经阅读 modbus 源代码,发现modbus client是使用socket 来自飞镖:io。我们可以使用serversocket?创建modbus服务器。我尝试使用serversocket和modbus客户端创建TCP服务器,然后将其连接。 Modbus客户端可以连接到TCP服务器,而TCP服务器将接收uint8list数据,如果modbus client do writesingleregisterread> read> readholdingregisters

如果Modbus客户端确实写了单个寄存器,则服务器套接字将接收此

[0,1,0,0,0,6,10,6,0,4,0,5] 
  • 数据
  • 。始终为写单寄存器
  • 4是地址
  • 5 是Value

Server套接金额5

[0,1,0,0,0,6,10,3,0,4,0,5] 
  • 1是序列
  • 3 =>始终为始终3读取单寄存器
  • 4是地址
  • 5是量

创建服务器

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);
  }

问题

如果客户端readholdingRegisters,如何将数据发送到Modbus客户端 使用serversocket

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文