ThinkPHP 结合 Modbus 和 MQTT 实现 MES 代码示例

好!直接给你 ThinkPHP 可直接复制运行的两套代码:

1. Modbus Slave 数据读取(PLC / 机床仿真)

2. MQTT 数据订阅 + 自动入库(MES 设备上云)

你直接贴到项目里就能跑。

 

---

一、ThinkPHP 读取 Modbus Slave(机床 / PLC 仿真)

1. 先装库

composer require angeloc/php-modbus

2. 代码(控制器 / 任务)

<?php

namespace app\api\controller;

 

use PHPModbus\ModbusMaster;

use think\Controller;

 

class Modbus extends Controller

{

    // 读取 Modbus Slave 模拟机床数据

    public function readMachine()

    {

        // 你的电脑/模拟器IP(Modbus Slave所在机器)

        $host = '127.0.0.1';

        $port = 502; // 默认Modbus TCP端口

 

        try {

            // 1. 连接Modbus TCP

            $modbus = new ModbusMaster($host, 'TCP');

            $modbus->port = $port;

            $modbus->timeout_sec = 5;

 

            // 2. 读取保持寄存器(机床地址1,从0开始读10个)

            // 对应你Modbus Slave里设置的 Slave Definition

            $unitId = 1;

            $startAddress = 0;

            $quantity = 10;

            $data = $modbus->readMultipleRegisters($unitId, $startAddress, $quantity);

 

            // 3. 解析机床数据(和你模拟器对应)

            $machine = [

                'status'   => $data[0], // 0=停机,1=运行,2=报警

                'speed'    => $data[1], // 转速

                'total'    => $data[2], // 总产量

                'work_sec' => $data[3], // 加工时长

                'alarm'    => $data[4], // 报警码

            ];

 

            // 4. 直接给MES用:存库/显示/统计

            return json([

                'code' => 1,

                'msg'  => '读取成功',

                'data' => $machine

            ]);

 

        } catch (\Exception $e) {

            return json([

                'code' => 0,

                'msg'  => '失败:'.$e->getMessage()

            ]);

        }

    }

}

3. 怎么用

- 打开 Modbus Slave → F3 选 Connection → Connect → TCP/IP

- 端口 502 → 点 OK

- 访问:http://你的项目/api/modbus/readMachine

 

---

二、ThinkPHP MQTT 订阅 + 自动入库(MES 必备)

1. 先装库

composer require php-mqtt/client

2. 建表 SQL

CREATE TABLE `machine_data` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `topic` varchar(100) DEFAULT NULL COMMENT 'MQTT主题',

  `device` varchar(50) DEFAULT NULL COMMENT '机床编号',

  `status` tinyint(1) DEFAULT '0' COMMENT '0停机1运行2报警',

  `speed` int(11) DEFAULT '0' COMMENT '转速',

  `total` int(11) DEFAULT '0' COMMENT '产量',

  `alarm` int(11) DEFAULT '0' COMMENT '报警码',

  `raw` text COMMENT '原始JSON',

  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3. 订阅代码(命令行常驻运行)

app/command/MqttSubscribe.php

<?php

namespace app\command;

 

use PhpMqtt\Client\MqttClient;

use think\console\Command;

use think\console\Input;

use think\console\Output;

use think\Db;

 

class MqttSubscribe extends Command

{

    protected function configure()

    {

        $this->setName('mqtt:subscribe')->setDescription('MQTT机床数据订阅');

    }

 

    protected function execute(Input $input, Output $output)

    {

        // 配置(和你MQTTX一致)

        $server   = 'broker.emqx.io'; // 免费测试服务器

        $port     = 1883;

        $clientId = 'mes-machine-'.uniqid();

        $topic    = 'mes/cnc/#'; // 订阅所有机床

 

        try {

            // 连接MQTT

            $mqtt = new MqttClient($server, $port, $clientId);

            $mqtt->connect();

            $output->writeln('✅ MQTT已连接,等待机床数据...');

 

            // 订阅+入库

            $mqtt->subscribe($topic, function ($topic, $message) use ($output) {

                $output->writeln("\n📥 收到:$topic");

                $output->writeln("内容:$message");

 

                // 解析JSON

                $data = json_decode($message, true);

                if (!$data) return;

 

                // 写入MES数据库

                Db::name('machine_data')->insert([

                    'topic'   => $topic,

                    'device'  => $data['device'] ?? '',

                    'status'  => $data['status'] ?? 0,

                    'speed'   => $data['speed'] ?? 0,

                    'total'   => $data['total'] ?? 0,

                    'alarm'   => $data['alarm'] ?? 0,

                    'raw'     => $message,

                    'create_time' => date('Y-m-d H:i:s')

                ]);

 

                $output->writeln('✅ 已存入数据库');

            }, 0);

 

            // 常驻循环

            $mqtt->loop(true);

            $mqtt->disconnect();

 

        } catch (\Exception $e) {

            $output->writeln('❌ 错误:'.$e->getMessage());

        }

    }

}

4. 运行订阅(命令行)

php think mqtt:subscribe

5. 测试(用 MQTTX 发)

- 主题:mes/cnc/001

- 消息:

{

  "device": "CNC-001",

  "status": 1,

  "speed": 1500,

  "total": 300,

  "alarm": 0

}

发完 → 数据库立刻有记录 ✅

 

---

三、你现在就能做

1. 运行 Modbus Slave → 改数字 → PHP 直接读到

2. 运行 MQTT 订阅 → MQTTX 发 JSON → 自动进 MES 库

3. 完全不用真实机床、不用现场、不用强电

要不要我再给你:

- 机床状态 / 产量 / 报警 前端看板页面(HTML+Vue)

- 定时采集 + 历史曲线 + 导出 Excel 的完整代码?

更多推荐