Gripper Control
This example will complete the development of a suction cup plugin for gripping and releasing workpieces.
Plugin Initialization
The plugin initialization work can refer to the initialization process in the IO Control Case.
Plugin Workflow
The workflow of this plugin is as follows:
Control Functions
Write control.lua
require("utils.util")
local numConvert = require('utils.num_convert')
local control = {}
local modbusID = nil
-- Define the grip function to control the gripping operation
function control.grip(id)
    if modbusID == nil then
        local err, _modbus = ModbusCreate("127.0.0.1", 60000, id, true)
        if err ~= 0 then
            -- Failed to create Modbus connection
            return nil
        else
            -- Successfully created Modbus connection
            modbusID = _modbus
        end
    end
    if modbusID ~= nil then
        local gripCmd = tonumber('00001001'..'00000000', 2)
        local gripParams = 0
        WriteBy485(modbusID, 0x03E8, { gripCmd, gripParams })
    end
end
function control.release(id)
    if modbusID == nil then
        local err, _modbus = ModbusCreate("127.0.0.1", 60000, id, true)
        if err ~= 0 then
            -- Failed to create Modbus connection
            return nil
        else
            -- Successfully created Modbus connection
            modbusID = _modbus
        end
    end
    if modbusID ~= nil then
        local releaseCmd = tonumber('00001001'..'00000000', 2)
        local releaseParams = 100
        WriteBy485(modbusID, 0x03E8, { releaseCmd, releaseParams })
    end
end
---@param id number
---@return table|nil status
function control.getStatus(id)
    if modbusID == nil then
        local err, _modbus = ModbusCreate("127.0.0.1", 60000, id, true)
        if err ~= 0 then
            -- Failed to create Modbus connection
            return nil
        else
            -- Successfully created Modbus connection
            modbusID = _modbus
        end
    end
    local status = false
    if modbusID ~= nil then
        Use485()
        local registerData = GetHoldRegs(modbusID, 0x07D0, 3)
        UnLock485()
        if registerData[1] == nil then
            return false
        end
        local bitData = numConvert.decimalToBinary(registerData[1])
        return string.sub(bitData, -6, -5) == '11'
    end
    return status
end
return control
Network Requests
Write httpAPI.lua
local httpModule = {}
local control = require("control")
-- Define the grip function to control the gripping operation
function httpModule.grip(params)
    control.grip(params.id)
    return {
        status = true
    }
end
function httpModule.release(params)
    control.release(params.id)
    return {
        status = true
    }
end
return httpModule
Status Synchronization
- Write 
lua/daemon.lua 
local control = require('control')
local function handleInLoop()
    -- Default id for Epick suction cup is 9
    local data = control.getStatus(9)
    if data ~= nil or data ~= false then
        mqtt.publish(data)
    else
        mqtt.publish({
            status = false
        })
    end
end
- Write 
.dobot/http/http.ts 
import { request } from './axios'
export const grip = (data: any) => {
  return request({
    url: 'grip',
    data
  })
}
export const release = (data: any) => {
  return request({
    url: 'release',
    data
  })
}
- Write 
ui/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 ? 'Normal' : 'Abnormal'}>
                </StatusLight>
            </DobotPlusApp>
        </div>
    )
}
export default App
Debugging
The debugging command for the plugin can perform the following two types of development work:
- Debug only the page
 - Connect to a real device for debugging
 
dpt dev
When executing the above command, the command line will prompt developers whether to connect a real device for testing.
$ dpt dev
? Debug lua on real device? Yes
? Please check the device IP: 192.168.5.1 (y/n)
Developers need to confirm:
- Whether the actual IP of the controller is correct; the default is 
192.168.5.1 - Whether the SFTP service-related configuration is correct
 
For detailed information on the above configurations, please refer to the dpt.json configuration file.
{
  "ip": "192.168.5.1", // Controller IP
  "pluginPort": 22100
}
Building the Plugin
After completing the development, debugging, and optimization of the plugin, you can execute the final build work by running:
dpt build
After the program executes successfully, there will be a dist folder and an output folder in the current directory.
- The 
distfolder contains the plugin code after this build, allowing developers to check the build results. - The 
outputfolder contains a compressedzipfile named in the format<plugin_name>-<version_number>.zip, which is the plugin to be imported for actual use on the client.