1. 项目概述
最近在做一个自动化抓取项目,需要控制大寰CGI系列电动夹爪完成精密抓取动作。作为前端出身的开发者,我选择了Node.js作为控制平台,通过串口通信实现夹爪的精准控制。这种方案在工业自动化领域算是比较新颖的尝试,特别适合需要快速原型开发的场景。
大寰CGI夹爪是工业自动化中常用的电动执行器,支持Modbus RTU协议,通常通过RS485串口进行通信。传统控制方式多采用PLC或单片机,而用Node.js实现控制可以充分发挥JavaScript在异步IO方面的优势,特别适合需要与上位机系统集成的应用场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件准备与环境搭建
2.1 硬件组件清单
控制大寰CGI夹爪需要准备以下硬件设备:
- 大寰CGI系列电动夹爪(支持Modbus RTU协议)
- USB转RS485转换器(推荐使用FTDI或CH340芯片)
- 24V直流电源(为夹爪供电)
- 连接线缆(建议使用带屏蔽的双绞线)
注意:RS485通信距离较长时(超过15米),建议在总线两端加装120Ω终端电阻,避免信号反射导致通信异常。
2.2 开发环境配置
首先需要安装Node.js运行环境。建议使用LTS版本(当前为18.x),安装完成后检查npm是否可用:
bash复制node -v
npm -v
如果遇到"npm无法加载"的错误(常见于Windows系统),需要以管理员身份运行PowerShell执行:
powershell复制Set-ExecutionPolicy RemoteSigned
然后安装必要的Node.js串口通信库:
bash复制npm install serialport @serialport/parser-inter-byte-timeout
3. 串口通信基础
3.1 RS485通信参数配置
大寰CGI夹爪默认通信参数为:
- 波特率:115200
- 数据位:8位
- 停止位:1位
- 校验位:无
- 流控:无
在Node.js中初始化串口的代码如下:
javascript复制const { SerialPort } = require('serialport')
const port = new SerialPort({
path: 'COM3', // 根据实际串口号修改
baudRate: 115200,
dataBits: 8,
stopBits: 1,
parity: 'none'
})
3.2 Modbus RTU协议解析
大寰夹爪使用Modbus RTU协议,主要功能码包括:
- 0x03:读取保持寄存器
- 0x06:写入单个寄存器
- 0x10:写入多个寄存器
一个典型的Modbus RTU报文结构如下:
| 地址 | 功能码 | 数据 | CRC校验 |
|---|---|---|---|
| 1字节 | 1字节 | N字节 | 2字节 |
4. 夹爪控制实现
4.1 基础控制指令
大寰CGI夹爪的主要控制寄存器:
- 0x0001:控制模式(0=位置,1=速度,2=力)
- 0x0002:目标位置(0-1000对应全闭到全开)
- 0x0003:运动速度(1-100)
- 0x0004:抓取力度(1-100)
写入单个寄存器的函数实现:
javascript复制function writeSingleRegister(deviceId, register, value) {
const buffer = Buffer.alloc(8)
buffer[0] = deviceId // 设备地址
buffer[1] = 0x06 // 功能码
buffer.writeUInt16BE(register, 2) // 寄存器地址
buffer.writeUInt16BE(value, 4) // 写入值
const crc = calculateCRC(buffer.slice(0, 6))
buffer.writeUInt16LE(crc, 6) // CRC校验
port.write(buffer, err => {
if (err) console.error('写入失败:', err)
})
}
4.2 夹爪状态监测
读取夹爪状态的函数示例:
javascript复制function readHoldingRegisters(deviceId, startRegister, count) {
const buffer = Buffer.alloc(8)
buffer[0] = deviceId // 设备地址
buffer[1] = 0x03 // 功能码
buffer.writeUInt16BE(startRegister, 2) // 起始寄存器
buffer.writeUInt16BE(count, 4) // 寄存器数量
const crc = calculateCRC(buffer.slice(0, 6))
buffer.writeUInt16LE(crc, 6) // CRC校验
port.write(buffer, err => {
if (err) console.error('读取失败:', err)
})
}
5. 完整控制流程实现
5.1 夹爪初始化
在开始控制前需要初始化夹爪参数:
javascript复制async function initGripper(deviceId) {
// 设置控制模式为位置控制
writeSingleRegister(deviceId, 0x0001, 0)
// 设置运动速度为50%
writeSingleRegister(deviceId, 0x0003, 50)
// 设置抓取力度为70%
writeSingleRegister(deviceId, 0x0004, 70)
// 等待500ms确保设置生效
await new Promise(resolve => setTimeout(resolve, 500))
}
5.2 夹爪动作控制
实现夹爪开合控制的完整示例:
javascript复制async function controlGripper(deviceId, position) {
try {
// 写入目标位置
wri
