【PHP】PHP使用Modbus-Rut协议与RS485串口通信,向设备发送和接收数据

目录

一、前言

二、开发前说明

三、效果图

四、安装PHP扩展

五、安装phpModbus类库

六、通信逻辑

七、完整实例


一、前言

使用PHP语言与硬件设备通信交互,并向COM串口发送和接收数据。

前面写了三篇关于PHP与RS235和USB端口通信的文章,可以作为参考,本文介绍PHP怎么使用RS485串口的Modbus-Rut协议与硬件通信。

【PHP】PHP通过串口与硬件通讯,向硬件设备发送数据并接收硬件返回的数据_php串口通信-CSDN博客

【PHP】PHP实现与硬件串口交互,接收硬件发送的实时数据(上)_php 怎么进行串口通讯-CSDN博客

【PHP】PHP实现与硬件串口交互,向硬件设备发送指令数据(下)_c语言esp32,php怎么发送硬件信息-CSDN博客

二、开发前说明

需求:PHP通过COM串口与天平通信,PHP能够向天平发送指令,并接收天平返回的响应信息。

硬件设备:天平。

串口:RS485。

串口传输协议:Modbus-Rut。

指令集:由天平供应商提供。

开发语言:PHP7.4.3。

框架:ThinkPHP5。

三、效果图

四、安装PHP扩展

下载并安装dio扩展,下载地址PECL :: Package :: dio,注意要与使用的PHP版本保持一致,下载后将php_dio.dll文件拷贝到/Extensions/php/php7.4.3nts/ext/目录下,再打开php.ini,删除掉“extension=dio”前面的分号,如果没有则直接添加即可,最后重启Apache

五、安装phpModbus类库

使用composer安装modbus,注意安装前提是PHP ≥ 7.4.0,dio ≥ 0.2.0

由于modbus协议支持TCP/UDP和RTU两种,由于本项目使用的是COM串口,所以使用的是RTU协议,所以需要安装支持Modbus RTUd 类库

composer require fawno/modbus

安装完成之后,会在vendor文件夹里生成fawno/modubs文件夹,表示安装成功。

六、通信逻辑

dio扩展和modbus类库安装完成后,通信的前提就完成了。

由于Modbus RTU协议发送和接收的是十六进制的数据,所以可以根据自己需要对发送和接收的数据进行转码,转成十进制,方便使用。

业务逻辑

① 引用modbus类库

② 实例化

③ 打开COM串口

④ 发送指令

⑤ 接收响应结果

⑥ 对返回的结果进行解析,解析成需要的格式

⑦ 关闭串口

七、完整实例

  • 我这里发送的指令是”01 03 00 00 00 02 C4 0B“,使用chr()函数转成十六进制
  • 延迟100ms接收响应
  • 将返回的结果转换成十六进制格式
  • 对返回的结果进行解析,解析成需要的格式,我这里需要的是重量(浮点数)
<?php
namespace app\home\controller;
use think\Controller;
use think\Db;use Fawno\PhpSerial\Config\BaudRates;
use Fawno\PhpSerial\Config\StopBits;
use Fawno\PhpSerial\Config\Parity;
use Fawno\PhpSerial\Config\DataBits;
use Fawno\PhpSerial\SerialConfig;
use Fawno\PhpSerial\SerialDio;
use Fawno\Modbus\ModbusDDS238;
use Fawno\Modbus\ModbusRTU;class Tianpingapi extends Controller
{public function putCommond(){set_time_limit(0);$ret = [];  // 返回数组$response = '初始化';include "../vendor/fawno/modbus/autoload.php";$com='COM4'; $baud = '9600'; $data='8';  $stop = '1';try {// 指令  获取当前重量// $commond = "01 03 00 00 00 02 C4 0B";$commond = chr(0x01) . chr(0x03) . chr(0x00) . chr(0x00) . chr(0x00) . chr(0x02) . chr(0xC4) . chr(0x0B);$dds238 = new ModbusDDS238($com);$dds = $dds238->open();if ($dds) {TLog("打开串口:".$com."成功");}else{TLog("打开串口:".$com."失败");TLog(">>>> end <<<<");TLog("\r\n");}// 读取串口数据TLog(">>>> 天平模块 <<<<");TLog(">>>> start <<<<");// 延迟100msusleep(100000);// 发送指令$dds->send($commond);// 接收设备的响应$response = $dds238->read();if (!empty($response)) {// 转成十六进制,并且字母小写$hex = strtolower(bin2hex($response));TLog("读取串口".$com."的响应结果成功:十六进制【".$hex."】");// 响应结果处理,返回重量$wei = $this->responseParse($hex);$log = "接收:".$hex."。重量:".$wei. "\r\n";// 响应结果解析成功TLog($log);$ret['code'] = '200';$ret['data'] = $wei;}else{TLog("读取串口".$com."的响应结果失败"."\r\n");$ret['code'] = '110';$ret['data'] = 99999;}TLog(">>>> end <<<<");TLog("\r\n"."-------------------------------------");// 关闭串口$dds238->close();} catch (Exception $e) {$ret['code'] = '110';$ret['message'] = $e->getMessage();}return $ret;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/458876.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现代数字信号处理I--最佳线性无偏估计 BLUE 学习笔记

目录 1. 最佳线性无偏估计的由来 2. 简单线性模型下一维参数的BLUE 3. 一般线性模型下一维参数的BLUE 4. 一般线性模型下多维参数的BLUE 4.1 以一维情况说明Rao论文中的结论 4.2 矢量参数是MVUE的本质是矢量参数中的每个一维参数都是MVUE 4.3 一般线性模型多维参数BLUE的…

视频剪辑哪个软件好用?推荐四款热门工具!!

在这个Vlog和短视频当道的互联网时代&#xff0c;掌握一款好用的视频剪辑软件就像拥有了打开创作世界的魔法钥匙。今天我们来聊聊视频剪辑软件&#xff0c;帮你成为剪辑达人哦&#xff01;接下来&#xff0c;给大家详细介绍四款常用且各具特色的视频剪辑软件&#xff0c;助你轻…

算法:利用前序序列和中序序列构造二叉树

题目 链接&#xff1a;leetcode链接 思路分析 前序遍历的顺序是&#xff1a;根 左子树 右子树 中序遍历的顺序是&#xff1a; 左子树 根 右子树 所以&#xff0c;我们可以通过前序遍历获得二叉树的根 可以通过中序遍历去分割二叉树&#xff0c;将二叉树分割成 左子树 根…

偷懒总结篇|贪心算法|动态规划|单调栈|图论

由于这周来不及了&#xff0c;先过一遍后面的思路&#xff0c;具体实现等下周再开始详细写。 贪心算法 这个图非常好 122.买卖股票的最佳时机 II(妙&#xff0c;拆分利润) 把利润分解为每天为单位的维度&#xff0c;需要收集每天的正利润就可以&#xff0c;收集正利润的区间…

HarmonyOS ArkTS与C++数据类型转换

1. HarmonyOS ArkTS与C数据类型转换 本文介绍了C与TS各自数据类型与互相之间的数据类型转换&#xff0c;在需要使用C模块时可以快速上手对各种数据类型进行转换。 1.1. 概述 HarmonyOS的主力开发语言是ArkTS&#xff0c;也提供了C语言的支持&#xff0c;对于一些能力&#xff…

1.3 面向对象 C++面试问题

1.3.1 简述一下什么是面向对象,面向对象与面向过程的区别 什么是面向对象 面向对象&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种编程范式&#xff0c;它通过将现实世界中的实体抽象为“对象”来组织代码。面向对象编程关注对象及其交互&#x…

D51【python 接口自动化学习】- python基础之模块与标准库

day51 模块的导入 学习日期&#xff1a;20241027 学习目标&#xff1a;模块与标准库 -- 66 模块的导入&#xff1a;如何使用其他人编写好的代码功能&#xff1f; 学习笔记 模块的作用 导入模块的方法 # 导入模块 # 方式一 import os # 获取当前的位置 print(os.getcwd())# …

arduino uno R3更换328pb-au芯片,烧录bootloader

使用usbasp烧录器进行烧录&#xff0c;解压 【免费】usbsap驱动以及软件资源-CSDN文库 安装驱动 然后打开软件 界面如下 1按步骤选中芯片&#xff0c; ATmega328P&#xff08;由于没有328PB&#xff0c;直接选这个也行&#xff09; 2查看spi接线&#xff0c; 3读取芯片id&a…

【SpringCloud】07-分布式事务与Seata

1. 分布式事务 2. Seata 3. 安装seata 配置数据库 CREATE DATABASE IF NOT EXISTS seata /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTIONN */; USE seata;------------------------------- The script used when storeM…

加强版 第一节图像二值化定义

本节课介绍了图像又彩色图像转变为彩色图像转变为灰度图像转变为黑色图像的转化过程。 灰度图像-单通道-取值范围为0-255 二值图像-单通道-取值0&#xff08;黑色&#xff09;-255&#xff08;白色&#xff09; 二值分割 有五种分割方式 如图所示 第一种&#xff1a;大于…

RabbitMQ 高级特性——事务

文章目录 前言事务配置事务管理器加上Transactional注解 前言 前面我们学习了 RabbitMQ 的延迟队列&#xff0c;通过延迟队列可以实现生产者生产的消息不是立即被消费者消费。那么这篇文章我们将来学习 RabbitMQ 的事务。 事务 RabbitMQ 是基于 AMQP 协议实现的&#xff0c;…

「C/C++」C/C++标准库之#include <cmath>数学库

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

认识线程 — JavaEE

目录 认识线程&#xff08;Thread&#xff09; 1 线程是什么? 2 为什么要有线程 3 进程和线程的区别 区别一 区别二 区别三 区别四 4. Java的线程和操作系统线程的关系 认识线程&#xff08;Thread&#xff09; 1 线程是什么? 一个线程就是一个 "执行流"。…

Excel-多表数据查找匹配(VLOOKUP)

&#x1f496;简介 Excel的VLOOKUP函数同样可以用来查找表格中的数据。VLOOKUP&#xff08;垂直查找&#xff09;是一个非常有用的函数&#xff0c;它可以在一个表格或数据表的一列中搜索特定的值&#xff0c;并返回与之在同一行上的另一列中的值。 &#x1f4d6;环境 WPS …

R语言机器学习算法实战系列(十二)线性判别分析分类算法 (Linear Discriminant Analysis)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍LDA的原理LDA的步骤教程下载数据加载R包导入数据数据预处理数据描述数据切割构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve保存模型总结优点:缺…

【大数据学习 | kafka】producer的参数与结构

1. producer的结构 producer&#xff1a;生产者 它由三个部分组成 interceptor&#xff1a;拦截器&#xff0c;能拦截到数据&#xff0c;处理完毕以后发送给下游&#xff0c;它和过滤器不同并不是丢弃数据&#xff0c;而是将数据处理完毕再次发送出去&#xff0c;这个默认是不…

【c++篇】:探索c++中的std::string类--掌握字符串处理的精髓

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 前言一.std::string对象的创建二.std::string对象的访问三.std::str…

读取有空格的string对象(getline)

文章目录 读取有空格的string对象1.使用标准库中的iostream来写2.**使用getline读取一整行** 读取有空格的string对象 1.使用标准库中的iostream来写 #include<iostream> using namespace std; int main() {string s;cin >> s;cout << s << endl;ret…

探索Python安全字符串处理的奥秘:MarkupSafe库揭秘

文章目录 探索Python安全字符串处理的奥秘&#xff1a;MarkupSafe库揭秘第一部分&#xff1a;背景介绍第二部分&#xff1a;MarkupSafe是什么&#xff1f;第三部分&#xff1a;如何安装MarkupSafe&#xff1f;第四部分&#xff1a;MarkupSafe的简单使用方法1. 使用escape函数2.…

Tomcat安装与使用

Tomcat优点 1、开源免费&#xff1a;是一个免费、开源的Web服务器&#xff0c;可以在任何环境下自由使用&#xff0c;无需支付任何费用。 2、轻量级&#xff1a;是一个轻量级的Web服务器&#xff0c;其核心仅有几百K&#xff0c;启动速度非常快。 3、易于安装和配置&#xff1a…