告别专用软件:用Node.js/Postman也能读写三菱FX5U PLC数据(SMLP协议详解)
用Node.js与Postman玩转三菱FX5U PLC:SMLP协议实战指南
工控领域与IT技术的融合正在打破传统边界。对于熟悉Web开发的工程师来说,通过Node.js或Postman这类通用工具直接与PLC交互,不仅能绕过专业软件的复杂环境配置,还能将工业设备无缝集成到现代技术栈中。本文将深入解析SMLP协议的本质,并演示如何用开发者熟悉的工具链实现PLC通信。
1. SMLP协议:工控领域的HTTP
SMLP(Seamless Message Protocol)作为三菱电机PLC的开放通信协议,其设计哲学与Web开发中的RESTful API惊人地相似。这个基于TCP的文本协议采用简单的请求-响应模型,让设备通信变得像发送HTTP请求一样直观。
协议的核心特征包括:
- 纯文本指令集 :所有指令均为ASCII字符,例如读取线圈用
0401表示 - 固定头结构 :每个报文包含6字节的子头(Subheader)和2字节的请求码
- 大端序编码 :多字节数据采用网络字节序传输
- 默认端口2000 :与FX5U通信的标准端口(可配置)
典型请求报文示例:
5000 00FF FF03 0010 0000 0100 0401 0000 000A
这个16进制字符串表示读取D10开始的10个寄存器值。与工控领域常见的二进制协议相比,SMLP的文本特性使其特别适合用通用工具进行调试。
2. Node.js实现PLC通信实战
2.1 建立TCP连接基础
使用Node.js的net模块可以轻松建立与FX5U的TCP连接。以下代码展示了基础连接框架:
const net = require('net');
const plcIp = '192.168.3.250';
const plcPort = 2000;
const client = new net.Socket();
client.connect(plcPort, plcIp, () => {
console.log('Connected to PLC');
// 发送SMLP指令...
});
client.on('data', (data) => {
console.log('Received:', data.toString('hex'));
});
client.on('close', () => {
console.log('Connection closed');
});
2.2 构造SMLP指令报文
读取D寄存器的完整实现示例:
function buildReadCommand(deviceType, startAddress, pointCount) {
const header = '500000FFFF0300100000'; // 固定报文头
const requestCode = '0101'; // 读命令
const deviceCode = {
'D': 'A8', // 数据寄存器
'M': '90' // 内部继电器
}[deviceType];
const addressHex = startAddress.toString(16).padStart(6, '0');
const countHex = pointCount.toString(16).padStart(4, '0');
return Buffer.from(header + requestCode + deviceCode + addressHex + countHex, 'hex');
}
// 读取D100开始的5个寄存器
const readCommand = buildReadCommand('D', 100, 5);
client.write(readCommand);
2.3 解析响应数据
处理PLC返回的二进制数据需要按照协议规范解码:
client.on('data', (data) => {
const hexString = data.toString('hex');
const values = [];
// 跳过22字节的报文头
for (let i = 22; i < hexString.length; i += 4) {
const wordHex = hexString.substr(i, 4);
values.push(parseInt(wordHex, 16));
}
console.log('Register values:', values);
});
3. Postman作为PLC调试神器
对于快速测试场景,Postman的Raw TCP功能可以替代专业工控软件:
- 新建请求 → 选择"Raw"类型
- 输入PLC的IP和端口(如
192.168.3.250:2000) - 在请求体输入16进制指令(如读取D0的值):
5000 00FF FF03 0010 0000 0100 0401 0000 0001 - 发送后会收到类似响应:
表示D0寄存器的值为26(0x001A)D0 00 001A
关键技巧 :
- 启用"Hex"显示模式便于阅读二进制响应
- 保存常用指令到Postman集合形成可复用的测试用例
- 结合环境变量管理不同PLC的IP地址
4. 专业工具与通用方案的对比
| 特性 | 专用工控软件 | Node.js/Postman方案 |
|---|---|---|
| 开发效率 | 低(需专门学习) | 高(使用现有技能) |
| 功能完整性 | 完整 | 基础通信 |
| 跨平台支持 | 通常Windows-only | 全平台 |
| 二次开发灵活性 | 有限 | 极高 |
| 适合场景 | 深度配置与调试 | 快速测试与系统集成 |
5. 实战中的注意事项
-
网络配置要点 :
- 确保PC与PLC在同一子网
- 禁用防火墙或添加端口例外
- 建议使用静态IP避免地址变化
-
常见错误处理 :
- 连接超时 → 检查物理连接和IP设置
- 无响应 → 确认PLC端口和协议类型(ASCII/二进制)
- 错误代码
3101→ 指令格式错误
-
性能优化技巧 :
- 批量读取减少请求次数(单次最多960字)
- 使用连接池管理TCP连接
- 异步处理避免阻塞事件循环
6. 扩展应用场景
将PLC数据接入现代Web应用的典型架构:
graph LR
PLC -->|SMLP| Node.js服务
Node.js服务 -->|WebSocket| 实时看板
Node.js服务 -->|REST API| 移动应用
Node.js服务 -->|MQTT| IoT平台
实现示例:用Express暴露REST接口
app.get('/api/plc/:device/:address', async (req, res) => {
const { device, address } = req.params;
const value = await readPlcValue(device, parseInt(address));
res.json({ value });
});
这种架构让传统工业设备瞬间获得Web能力,实现:
- 远程监控仪表盘
- 手机APP控制
- 与MES/ERP系统对接
- 大数据分析平台接入
7. 安全防护建议
虽然SMLP协议使用方便,但直接暴露PLC端口存在风险:
-
基础防护 :
# 使用iptables限制访问IP iptables -A INPUT -p tcp --dport 2000 -s 192.168.3.100 -j ACCEPT iptables -A INPUT -p tcp --dport 2000 -j DROP -
进阶方案 :
- 通过Node.js实现协议转换网关
- 添加JWT认证层
- 记录完整操作日志
在实际项目中,我们曾用300行Node.js代码替代了原有的OPC服务器,不仅节省了授权费用,还将数据采集延迟从秒级降低到毫秒级。这种轻量化方案特别适合需要快速验证概念的场景,或是作为专业系统的补充通道。
更多推荐


所有评论(0)