Flutter Modbus通信插件modbus的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter Modbus通信插件modbus的使用

modbus-dart

modbus-dart 是一个简单的 Dart Modbus 客户端库,目前仅支持 TCP 连接。

pub package

使用方法

单个从机 (Modbus RTU)

import 'package:modbus/modbus.dart' as modbus;

void main(List<String> arguments) async {
  var client = modbus.createTcpClient(
    '10.170.1.20',
    port: 1001,
    mode: modbus.ModbusMode.rtu,
  );

  try {
    await client.connect();

    var slaveIdResponse = await client.reportSlaveId();

    print("Slave ID: " + slaveIdResponse);
  } finally {
    client.close();
  }
}

多个从机共用一个连接 (Modbus RTU)

import 'package:modbus/modbus.dart' as modbus;

void main(List<String> arguments) async {
  var client = modbus.createTcpClient(
    '10.170.1.20',
    port: 1001,
    mode: modbus.ModbusMode.rtu,
  );

  try {
    await client.connect();

    client.setUnitId(100);
    var slaveIdResponse = await client.reportSlaveId();

    print("Slave ID: " + slaveIdResponse);

    client.setUnitId(150);
    slaveIdResponse = await client.reportSlaveId();

    print("Slave ID: " + slaveIdResponse);
  } finally {
    client.close();
  }
}

限制

  • SerialConnector 尚未实现。

示例代码

以下是一个更详细的示例代码,展示了如何使用 modbus-dart 进行 Modbus 通信:

import 'package:modbus/modbus.dart' as modbus;
import 'package:logging/logging.dart';

void main(List<String> arguments) async {
  Logger.root.level = Level.ALL;
  Logger.root.onRecord.listen((LogRecord rec) {
    print('${rec.level.name}: ${rec.time} [${rec.loggerName}]: ${rec.message}');
  });

  var client = modbus.createTcpClient(
    '10.170.1.20',
    port: 1001,
    mode: modbus.ModbusMode.rtu,
    timeout: Duration(seconds: 5),
  );

  try {
    await client.connect();

    var slaveIdResponse = await client.reportSlaveId();

    StringBuffer sb = StringBuffer();
    slaveIdResponse.forEach((f) {
      sb.write(f.toRadixString(16).padLeft(2, '0'));
      sb.write(" ");
    });
    print("Slave ID: " + sb.toString());

    var exceptions = await client.readExceptionStatus();

    print("Exceptions: " + exceptions.toRadixString(2));

    {
      var registers = await client.readInputRegisters(0x0002, 6);
      for (int i = 0; i < registers.length; i++) {
        print("REG_I[${i}]: " + registers.elementAt(i).toString());
      }
    }
  } finally {
    client.close();
  }
}

代码说明

  1. 日志记录

    • 使用 logging 包来记录日志,方便调试。
  2. 创建客户端

    • 使用 modbus.createTcpClient 创建一个 Modbus TCP 客户端,指定 IP 地址、端口、模式和超时时间。
  3. 连接到服务器

    • 使用 await client.connect() 连接到 Modbus 服务器。
  4. 读取从机 ID

    • 使用 await client.reportSlaveId() 读取从机 ID,并将其转换为十六进制字符串格式。
  5. 读取异常状态

    • 使用 await client.readExceptionStatus() 读取异常状态,并将其转换为二进制字符串格式。
  6. 读取输入寄存器

    • 使用 await client.readInputRegisters(0x0002, 6) 读取从地址 0x0002 开始的 6 个输入寄存器,并打印每个寄存器的值。
  7. 关闭连接

    • 使用 client.close() 关闭连接。

希望这些示例能帮助你更好地理解和使用 modbus-dart 插件进行 Modbus 通信。如果你有任何问题或需要进一步的帮助,请随时提问!


更多关于Flutter Modbus通信插件modbus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Modbus通信插件modbus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个使用Flutter进行Modbus通信的示例代码,其中展示了如何使用一个常见的Modbus插件(如flutter_modbus)来实现基本的Modbus功能。请注意,实际使用时需要确保插件已正确安装并配置在pubspec.yaml文件中。

首先,确保你的pubspec.yaml文件中包含flutter_modbus依赖项:

dependencies:
  flutter:
    sdk: flutter
  flutter_modbus: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来是一个简单的Flutter应用示例,展示了如何使用flutter_modbus插件进行Modbus通信:

import 'package:flutter/material.dart';
import 'package:flutter_modbus/flutter_modbus.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  ModbusClient? modbusClient;
  String result = "";

  @override
  void initState() {
    super.initState();
    // 初始化Modbus客户端
    initModbusClient();
  }

  void initModbusClient() async {
    // 替换为你的Modbus服务器IP地址和端口
    String ip = "192.168.1.100";
    int port = 502;
    modbusClient = ModbusClient(ip, port);

    // 打开连接
    await modbusClient?.connect();

    // 读取保持寄存器示例(功能码03)
    Uint8List slaveId = Uint8List.fromList([1]); // 从站ID
    Uint16List startAddress = Uint16List.fromList([0]); // 起始地址
    Uint16List quantityOfRegisters = Uint16List.fromList([10]); // 寄存器数量

    try {
      Uint16List? registers = await modbusClient?.readHoldingRegisters(slaveId, startAddress, quantityOfRegisters);
      if (registers != null) {
        setState(() {
          result = "Registers: ${registers.join(", ")}";
        });
      }
    } catch (e) {
      setState(() {
        result = "Error: $e";
      });
    } finally {
      // 关闭连接
      await modbusClient?.disconnect();
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Modbus Communication'),
        ),
        body: Center(
          child: Text(result),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它连接到指定的Modbus服务器,读取从站ID为1的保持寄存器(功能码03),并显示读取到的寄存器值。

注意

  1. 你需要根据你的Modbus服务器配置来修改IP地址、端口、从站ID、起始地址和寄存器数量。
  2. 这是一个基本示例,实际项目中可能需要更复杂的错误处理和资源管理。
  3. flutter_modbus插件的API可能会随着版本更新而变化,请参考插件的官方文档获取最新的API信息和示例。

希望这个示例能帮到你!如果有其他问题,欢迎继续提问。

回到顶部