控制末端夹爪
该示例会完成一个吸盘插件的开发,用于吸盘末端的吸取和释放工件。
插件初始化
插件的初始化工作可以参考 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
,该文件为实际在客户端导入使用的的插件。