时至今日,工业上云远程控制等需求越来越多,那么作为主流后端开发语言的Java是如何远程PLC从而控制三菱FX5U PLC的呢?
我们举个例子,以我们需要打开公司的设备管理系统的网页,点击网上按钮一键启动一个电机为例。
我们注意用到的技术栈是:
Web前端部分:Vue框架
Java程序部分:Spring Boot框架,
PLC通信部分: MC协议
实现流程解析:
第一步:[Web前端调用Java API接口]发送POST请求到[Spring Boot API],
第二步:[Spring Boot API]通过MC协议通信连接三菱FX5U PLC,
第三步:然后通过FX5U PLC的梯形图逻辑M0接通,从而启动电机。
关键地址说明:
M10: 启动触发信号(Java API写入该位)
D100: 存储转速值(前端传入参数)
Y0: 实际控制电机启停的输出点
编译程序并下载到PLC,确保PLC处于RUN模式
下面咱们进入Java开发
Java后端开发(Spring Boot实现)
第一步: 引入通信库
<!-- pom.xml 添加HSLCommunication依赖 -->
<dependency>
<groupId>com.hsl</groupId>
<artifactId>hsl-communication</artifactId>
<version>3.5.0</version>
</dependency>
第二步: PLC服务层封装
@Service
public class MitsubishiPlcService {
private MelsecMcNet plcClient;
@PostConstruct
public void init() {
// 连接FX5U PLC(IP/端口需与GX Works3设置一致)
plcClient = new MelsecMcNet("192.168.0.10", 5000);
plcClient.setConnectTimeout(3000);
}
// 电机控制方法
public void startMotor(int speed) throws PlcException {
try {
// 写入速度值到D100寄存器(16位有符号整数)
OperateResult writeSpeed = plcClient.Write("D100", speed);
if (!writeSpeed.IsSuccess) throw new PlcException("速度写入失败");
// 触发M10启动位(置1后PLC程序自动复位)
OperateResult writeTrigger = plcClient.Write("M10", true);
if (!writeTrigger.IsSuccess) throw new PlcException("启动信号发送失败");
} catch (Exception e) {
throw new PlcException("PLC通信异常: " + e.getMessage());
}
}
}
第三步: 编写REST API调用接口
@RestController
@RequestMapping("/api/motor")
public class MotorController {
@Autowired
private MitsubishiPlcService plcService;
@PostMapping("/start")
public ResponseEntity<?> startMotor(@RequestParam @Min(500) @Max(5000) int speed) {
try {
plcService.startMotor(speed);
return ResponseEntity.ok(Map.of("status", "success", "message", "电机已启动"));
} catch (PlcException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of("error", e.getMessage()));
}
}
}
紧接着,我们进入VUE前端开发
<template>
<div>
<input v-model.number="speed" type="number" min="500" max="5000">
<button @click="startMotor">启动电机</button>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
speed: 1000
}
},
methods: {
async startMotor() {
try {
const response = await axios.post('/api/motor/start', {
speed: this.speed
});
alert(response.data.message);
} catch (error) {
console.error('控制失败:', error.response?.data.error);
alert('控制指令发送失败!');
}
}
}
}
<sc<x>ript>
关键步骤与通信失败检查
[前端报错] --> 查看后端日志 -->|连接超时| C[检查PLC网络连通性] -->|写入失败| D[确认寄存器地址权限] -->|ping测试| [PLC网口指示灯状态] --> [GX Works3在线监视寄存器值]
当前第一篇文章,还有很多不完善的地方,比如
1、通信安全与用户操作合法性校验
2、PLC通信协议解析
3、操作异常记录日志
4、多设备高并发处理
5、如何避免高频建立连接
6、前端操作抖动,如何避免用户一直点击
等等,后续有机会再聊,欢迎大家补充拍砖
楼主最近还看过