更新记录

1.1.1(2024-03-28)

修复bug:写单个保持寄存器,设置成了0x10指令,现改为0x06指令。

1.1.0(2022-11-29)

支持ASCII编码

1.0.0(2022-11-25)

  1. 支持Android系统与外部硬件(如单片机、智能家居等支持Modbus串口的硬件)数据通信,目前仅支持RTU,暂不支持ASCII
  2. 支持Modbus通讯协议定义的四种常用的寄存器:线圈状态(coil)、离散输入状态(discrete)、保持寄存器(holding)、输入寄存器(input)
查看更多

平台兼容性

Android Android CPU类型 iOS
适用版本区间:4.4 - 10.0 armeabi-v7a:支持,arm64-v8a:支持,x86:支持 ×

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


Modbus 串口(支持RTU和ASCII)通讯插件

介绍

本插件支持Modbus通讯协议定义的四种常用的寄存器,分别为:

  1. 线圈状态(coil) 对应的方法为readCoil、readCoils、writeCoil和writeCoils
  2. 离散输入状态(discrete) 对应的方法为readInputDiscrete和readInputDiscretes
  3. 保持寄存器(holding) 对应的方法为readRegister、readRegisters、writeRegister和writeRegisters
  4. 输入寄存器(input) 对应的方法为readInputRegister和readInputRegisters

注意

串口通讯需要使用root权限,本插件已经加了获取系统权限的代码,在Android 5 以下的模拟器上测试通过,Android 6 以上系统需要root。 具体机型请根据实际情况,配置supath参数,确认是否可以打开串口,如果不行,只能进行root了。

使用说明

  1. 引用插件
    const testModbus = uni.requireNativePlugin("firefly-modbus-sp")
  2. 打开串口

    const device = '/dev/ttyS1';         // 串口名称
    const baudrate = 9600;               // 比特率,默认9600
    const databits = 8;                  // 数据位,默认8
    const parity = 0;                    // 校验位,默认0
    const stopbits = 1;                  // 停止位,默认1
    const timeout = 500;                 // 超时时间,默认500毫秒
    const supath = '/system/bin/su'      // 获取root权限的路径,/system/bin/su或者/system/xbin/su
    const encoding = 'rtu'               // 编码,'rtu'或者'ascii',默认rtu
    const unitId = 1                     // 从机地址,1-255,默认1
    
    testModbus.open(
        {
            'device' : this.device,
            'baudrate': this.baudrate,
            'databits' : this.databits,
            'parity' : this.parity,
            'stopbits' : this.stopbits,
            'timeout' : this.timeout,
            'supath' : this.supath,
            'encoding' : this.encoding,
            'unitId' : this.unitId,
        }, 
        (result) => {
            modal.toast({
                message: result.msg,
                duration: 2
            });
        }
    );
  3. 读数据
    // 线圈状态地址
    var coilAddr = 1;
    testModbus.readCoil(coilAddr, (result) => {
        if (result.code == 0) {
            modal.toast({
                message: '获取成功,数据为' + result.data,
                duration: 2
            });
        } else {
            modal.toast({
                message: result.msg,
                duration: 2
            });
        }
    });
  4. 写数据
    // 线圈状态地址
    var coilAddr = 1;
    // 往线圈状态地址中写入的值
    var coilVal = 1;
    testModbus.writeCoil(coilAddr, coilVal, (result) => {
        if (result.code == 0) {
            modal.toast({
                message: "写入成功",
                duration: 2
            });
        } else {
            modal.toast({
                message: result.msg,
                duration: 2
            });
        }
    });
  5. 关闭串口
    testModbus.close();

方法说明

  1. readCoil(addr, callback):读取单个线圈状态

    参数名 说明 示例
    addr 线圈状态地址 101
    callback 回调方法,(result) => {} result格式: {"code": 0, data: 1}
  2. writeCoil(addr, val, callback):写入单个线圈状态

    参数名 说明 示例
    addr 线圈状态地址 101
    val 要写入线圈状态的值 1或者0
    callback 回调方法,(result) => {} result格式: {"code": 0, "msg": "写入成功"
  3. readCoils(addr, count, callback):读取多个线圈状态

    参数名 说明 示例
    addr 线圈状态地址 101
    count 从addr开始,线圈状态地址的偏移个数 2
    callback 回调方法,(result) => {} result格式: {"code": 0, data: [0,1]}
  4. writeCoils(addr, vals, callback):写入多个线圈状态

    参数名 说明 示例
    addr 线圈状态地址 101
    vals 要写入线圈状态的值,数组格式 [1,0]
    callback 回调方法,(result) => {} result格式: {"code": 0, "msg": "写入成功"
  5. readRegister(addr, callback):读取单个保持寄存器中的数据

    参数名 说明 示例
    addr 保持寄存器地址 400007
    callback 回调方法,(result) => {} result格式: {"code": 0, data: 128}
  6. writeRegister(addr, val, callback):写入单个保持寄存器中的数据

    参数名 说明 示例
    addr 保持寄存器地址 101
    val 要写入保持寄存器的值 122
    callback 回调方法,(result) => {} result格式: {"code": 0, "msg": "写入成功"
  7. readRegisters(addr, count, callback):读取多个保持寄存器中的数据

    参数名 说明 示例
    addr 保持寄存器地址 400007
    count 从addr开始,保持寄存器地址的偏移个数 2
    callback 回调方法,(result) => {} result格式: {"code": 0, data: [21,16]}
  8. writeRegisters(addr, vals, callback):写入多个保持寄存器中的数据

    参数名 说明 示例
    addr 保持寄存器地址 101
    vals 要写入保持寄存器的值,数组格式 [112,123]
    callback 回调方法,(result) => {} result格式: {"code": 0, "msg": "写入成功"
  9. readInputRegister(addr, callback):读取单个输入寄存器中的数据

    参数名 说明 示例
    addr 输入寄存器地址 300007
    callback 回调方法,(result) => {} result格式: {"code": 0, data: 128}
  10. readInputRegisters(addr, count, callback):读取多个输入寄存器中的数据

    参数名 说明 示例
    addr 输入寄存器地址 300007
    count 从addr开始,输入寄存器地址的偏移个数 2
    callback 回调方法,(result) => {} result格式: {"code": 0, data: [121,116]}
  11. readInputDiscrete(addr, callback):读取单个离散输入状态

    参数名 说明 示例
    addr 离散输入状态地址 100001
    callback 回调方法,(result) => {} result格式: {"code": 0, data: 1}
  12. readInputDiscretes(addr, count, callback):读取多个离散输入状态

    参数名 说明 示例
    addr 离散输入状态地址 100001
    count 从addr开始,离散输入状态地址的偏移个数 2
    callback 回调方法,(result) => {} result格式: {"code": 0, data: [0,1]}

隐私、权限声明

1. 本插件需要申请的系统权限列表:

root权限

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问