php对接Modbus设备详细讲解

1、下载ModbusMaster类库文件

参考地址:https://hotexamples.com/examples/-/ModbusMaster/-/php-modbusmaster-class-examples.html

下载地址1:https://github.com/sergejey/majordomo-modbus    //功能码比较全,无案例

下载地址2:https://github.com/krakorj/phpmodbus  //类库功能码少,有案例

工具:

1.  Modbus Slave: 从机端模拟软件,这里测试可以把他作为服务端,PHP为客户端就是取该机子的数据。

2.   Modbus Poll: 主机仿真器,用于测试和调试Modbus从设备,这里测试也只是把他当做客户端使用。

3.   ModScan32:  主机/从机模拟程序 ,以后介绍。

4.   MThings:  一个国产免费软件, 既可以模拟主机设备 又可以模拟从机设备,以后介绍。

工具操作:

一.  Modbus Poll

1. 创建TCP/IP连接。

(1). 点击connection->connection,弹出参数窗口,可以按下面确

(2). 修改为slave机子对应的IP地址和端口,点击保存。

 

(3). 连接成功后,查看读写定义,可以按指定slave配置修改。

配置函数,点击setup->Read/Write Definition,弹出参数窗口,默认OK就可以。

Slave ID:设备从地址ID

Function:功能码

 

 

 

(4). 连接失败,Mbpoll面板会提示红色字体。面板文字说明如下。

Tx = 4表示向主站发送数据帧次数,图中为4次; Error = 0表示通讯错误次数,图中为0次; ID = 1表示模拟的Modbus子设备的设备地址,图中地址为1;F = 03表示所使用的Modbus功能码,图中为03功能码; SR = 1000ms表示扫描周期。红字部分,表示当前的错误状态,“No Connection”表示未连接状态。

(5). 查看读写数据。

 

 

 

 

 

FC3读取参数功能码PHP案例(readMultipleRegisters)

FC3参数讲解

require_once dirname(__FILE__) . '/modbus/ModbusMaster.php';
// Create Modbus object
$modbus = new ModbusMaster($HOST, $PROTOCOL);
// FC3
$recData = $modbus->readMultipleRegisters($DEVICE_ID, $REQUEST_START, $REQUEST_TOTAL);

注释:
HOST: modbus设备IP地址
PROTOCOL:通讯协议(TCP/UDP)
DEVICE_ID:设备从地址(slave ID)
REQUEST_START:寄存器地址起始位置
REQUEST_TOTAL:要读多少个数据。当想读五个监控项数据时,返回的数据是做了转换的,返回的是有十个键值的一维数组,需要两两16进制合并在转换10进制才可得到真实值。

FC3读取参数php demo

require_once dirname(__FILE__) . '/modbus/ModbusMaster.php';

// Create Modbus object
$modbus = new ModbusMaster("192.168.0.15", "TCP");
try {
    // FC3
        $recData = $modbus->readMultipleRegisters(1, 0, 5);
}
catch (Exception $e) {
    // Print error information if any
    echo $modbus;
    echo $e;
    exit;
}
// 获取到的$recData数据需要做一下转换

foreach($recData as $k =>$v){
        $recData[$k] = dechex($v); //转换成16
}
$con = [];
for($i=0;$i<count($recData);$i++){
        $res = $i%2;
        if($res == 0){
                $str16=$recData[$i].$recData[$i+1]; //两两合并
                $con[] = hexdec($str16); //转换成十进制
        }
}
print_r($con);die;

FC5写入单个状态功能码PHP案例(writeSingleCoil)

FC5写入单个状态php demo

require_once dirname(__FILE__) . '/modbus/ModbusMaster.php';

// Create Modbus object
$modbus = new ModbusMaster("192.168.0.100", "TCP");
// Data to be writen
$data_set = array(TRUE);
try {
    // FC5
    $modbus->writeSingleCoil(1, 0, $data_set);
}
catch (Exception $e) {
    // Print error information if any
    echo $modbus;
    echo $e;
    exit;
}

// Print status information
echo $modbus;

FC6写入单个参数功能码PHP案例(writeSingleRegister)

FC6写入单个参数php demo

require_once dirname(__FILE__) . '/modbus/ModbusMaster.php';

// Create Modbus object
//$modbus = new ModbusMaster("192.168.0.100", "UDP");
$modbus = new ModbusMaster("192.168.0.14", "TCP");
// Data to be writen
$data_set = array(16000);
$dataTypes = array("INT"); 
$swapregs = false;
try {
    // FC6
        $recData = $modbus->writeSingleRegister(1, 0, $data_set, $dataTypes, $swapregs);
}
catch (Exception $e) {
    // Print error information if any
    $rec['LOG'] = date('Y-m-d H:i:s') . " FC6 Error: $modbus $e\n" . $rec['LOG'];
    exit;
}

// Print status information
echo $modbus;

 

posted on 2023-04-13 16:18  泽一年  阅读(1400)  评论(0编辑  收藏  举报

导航