Skip to main content

控制末端夹爪

该示例会完成一个吸盘插件的开发,用于吸盘末端的吸取和释放工件。

插件初始化

插件的初始化工作可以参考 IO 控制案例 的初始化过程。

插件工作流程

该插件的工作流程如下:

吸取功能

  • 编写 userAPI.lua

    require("utils.util")

    -- 定义函数grip用于控制吸取操作
    function userApiModule.grip(params)
    local gripCmd = tonumber('00000000'..'00001001', 2)
    local gripParams = tonumber('1600', 16)
    HandleByModbus(function (modbusID)
    WriteBy485(modbusID, WRITE_ADDRESS, { gripCmd, gripParams })
    end, params.id)
    end
  • 编写 httpAPI.lua

    local userAPI = require("userAPI")

    -- 定义函数grip用于控制吸取操作
    function httpModule.grip(params)
    userAPI.grip(params)
    return {
    --- Your responce data
    --- example: status = true
    }
    end

释放功能

  • 编写 userAPI.lua

    require("utils.util")

    -- 定义函数grip用于控制吸取操作
    function userApiModule.release(params)
    local releaseCmd = tonumber('00000000'..'00001001', 2)
    local releaseParams = tonumber('9000', 16)
    HandleByModbus(function (modbusID)
    WriteBy485(modbusID, WRITE_ADDRESS, { releaseCmd, releaseParams })
    end, params.id)
    end
  • 编写 httpAPI.lua

    local userAPI = require("userAPI")

    -- 定义函数grip用于控制吸取操作
    httpModule.release = function(params)
    userAPI.release(params)
    return {
    --- Your responce data
    --- example: status = true
    }
    end

状态同步

  • 编写 userAPI.lua

    ---@param id number
    ---@return table|nil status
    function userApiModule.getStatus(id)
    local status = HandleByModbus(function (modbusID)
    Use485(id)
    local registerData = GetHoldRegs(modbusID, READ_ADDRESS, 3)
    UnLock485()
    if registerData[1] == nil then
    return false
    end
    local bitData = numConvert.decimalToBinary(registerData[1])
    return string.sub(bitData, -6, -5) == '11'
    end, id)
    return status
    end
  • 编写 daemon.lua

    local userAPI = require('userAPI')

    local function handleInLoop()
    local data = userAPI.getStatus(9)
    if data ~= nil then
    mqtt.publish(data)
    else
    mqtt.publish({
    status = false
    })
    end
    end
  • 编写 Main.tsx

    import { Button, StatusLight } from '@dobot-plus/components'
    import { useState } from 'react'
    import { useTranslation } from 'react-i18next'
    import { http } from '@dobot/http/http'
    import { DobotPlusApp } from '@dobot/components/DobotPlusApp'

    function App() {
    const { t } = useTranslation()

    const [status, setStatus] = useState(false)

    function handleButton1Click() { http.grip({id: 9 }) }

    function handleButton2Click() { http.release({ id: 9 }) }

    function handleMessage(data: object | string) {
    if (typeof data === 'object') {
    const { status } = data as { status: boolean }
    setStatus(status)
    }
    }

    return (
    <div className="app">
    <DobotPlusApp useMqtt={true} onMessage={handleMessage}>
    <Button type="primary" onClick={handleButton1Click}>Grip</Button>
    <Button type="primary" onClick={handleButton2Click}>Release</Button>
    <StatusLight status={status ? 'success' : 'error'}
    statusText={status ? '正常' : '异常'}>
    </StatusLight>
    </DobotPlusApp>
    </div>
    )
    }

    export default App

调试和验证

调试插件指令可进行以下两种情形的开发工作:

  • 仅调试页面
  • 连接真机进行调试
dpt dev

在执行上述命令时,命令行会提示开发者是否连接真机进行测试

$ dpt dev
? Debug lua on real device? Yes
? Please check the device IP: 192.168.5.1 and port: 22001 (y/n)

开发者需要确定:

  • 控制器的真实IP是否正确,默认是 192.168.5.1
  • 控制器服务端口是否正确,默认是 22001
  • SFTP 服务相关配置是否正确

上述配置的详细信息请查看 dpt.json 配置文件

{
"ip": "192.168.5.1", // 控制器 IP
"port": 22001, // 控制器端口
"pluginPort": 22100
}

构建插件

在完成插件的开发、调试、优化后,可执行最终的构建工作,执行

dpt build

在程序顺利执行完毕后,当前文件夹下会出现 dist 文件夹和 output 文件夹。

  • dist 文件夹中存放着本次构建后的插件代码,用于开发者检查构建结果
  • output 文件夹存放着压缩后的 zip 文件,文件名格式为 <插件名>-<版本号>.zip,该文件为实际在客户端导入使用的的插件。