«

PHP采用RS485协议通过继电器控制灯的开关代码

时间:2024-3-3 10:48     作者:韩俊     分类: PHP


本文介绍用PHP代码采用RS485协议来控制与继电器相连的指示灯开关以及温度的采集,文中给出了PHP向继电器发送指令的代码,还需要一个“有人科技型号W610”的串口服务器接收和发送TCP指令,电源采用DC12V。

先看一各种设备连接的示意图,第一张是连线图,第二张图是两路继电器的背面,是默认的常开和常关接口可以根据需要接入对应的线。第三图是WEB控制界面的图。

首页index.php代码:

<?
date_default_timezone_set ("PRC");//设置时区
set_time_limit(0);
ini_set('memory_limit','1024M');
header("Content-Type: text/html;charset=GB2312");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<script src="jquery.min.js"></script>
<script>
function tcp_control(zhiling,type){

    $("#status").html('正在读取数据,请稍后...');

    //版本所有,毛票票 www.maopiaopiao.com

    var ajaxform=$.post("rs485-ajax.php",{zhiling:zhiling,type:type},function(result){

        var give_strs= new Array(); //定义一数组
        give_strs=result.split("|"); //字符分割 

        if (give_strs[0]=="ok"){
            if (zhiling=='wendu'){
                $("#shidu").html(give_strs[1]);
                $("#wendu").html(give_strs[2]);
                $("#status").html('<span style=color:green>读取温、湿度,成功,返回值:'+give_strs[3]+'</span>');
            }if (zhiling=='light'){
                $("#status").html('<span style=color:green>执行成功,返回值:'+give_strs[1]+'</span>');
            }
        }else{
            $("#status").html('<span style=color:red>Error-'+result+'</span>')
        }
    }); 

}
</script>
<style>
body{ background:#DDF4FF}
input { font-size:14px; padding:8px 0; margin:0 15px; width:200px; cursor:pointer;}
</style>
<title>RS485+PHP通讯实例</title>
</head>

<body>
<div style="width:800px; border:2px solid #CCCCCC; background:#FFFFFF; padding:30px; margin:0 auto;margin-top:50px; border-radius:15px;">
    <table width="800" border="0" align="center" cellpadding="0" cellspacing="0">
        <tr>
            <td height="77" colspan="2" align="center" style="font-size:26px; font-family:'黑体'">RS485+Apache+PHP 通讯实例</td>
        </tr>
        <tr>
            <td width="50%" height="45" align="center">当前温度:<span id="wendu">-</span></td>
            <td width="50%" height="45" align="center">当前湿度:<span id="shidu">-</span></td>
        </tr>
        <tr>
            <td height="45" colspan="2" align="center"><span id="status">---</span></td>
        </tr>
        <tr>
            <td height="80" colspan="2" align="center">
                <input type="button" name="Submit" value="查询温、湿度" onclick="tcp_control('wendu','')" />
                <input type="button" name="Submit22" value="打开所有灯" onclick="tcp_control('light','open_all')"/>
                <input type="button" name="Submit2" value="关闭所有灯" onclick="tcp_control('light','close_all')"/>
            </td>
        </tr>
        <tr>
            <td height="80" colspan="2" align="center"><input type="button" name="Submit222" value="打开灯(0号)" onclick="tcp_control('light','open_0')"/>
                <input type="button" name="Submit22222" value="关闭灯(0号)" onclick="tcp_control('light','close_0')"/>
            <input type="button" name="Submit2222" value="闪一下灯(0号)" onclick="tcp_control('light','shan_0')"/></td>
        </tr>
        <tr>
            <td height="80" colspan="2" align="center"><input type="button" name="Submit2223" value="打开灯(1号)" onclick="tcp_control('light','open_1')"/>
                <input type="button" name="Submit222222" value="关闭灯(1号)" onclick="tcp_control('light','close_1')"/>
            <input type="button" name="Submit22223" value="闪一下灯(1号)"onclick="tcp_control('light','shan_1')" /></td>
        </tr>
    </table>
</div>
</body>
</html>

rs485-ajax.php发送数据指令的代码:

<?
date_default_timezone_set ("PRC");//设置时区
set_time_limit(0);
ini_set('memory_limit','1024M');
header("Content-Type: text/html;charset=GB2312");

//防止踩坑,16进制的指令必须为双引号"",不能为单引号''
//********************************************版本所有,毛票票 www.maopiaopiao.com

$zhiling=$_POST["zhiling"];
$type=$_POST["type"];

function tcp($sendStr){

    $host = "192.168.1.107";//串口服务器IP
    $port = 8899;//服务器端口

    $socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname("tcp"));  // 创建Socket
    socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO,array("sec"=>3, "usec"=>0 ) );//接收超时
    socket_set_option($socket,SOL_SOCKET,SO_SNDTIMEO,array("sec"=>1, "usec"=>0 ) );//发送超时

    if (socket_connect($socket, $host, $port)) {  //连接
        socket_write($socket, $sendStr);  // 逐组数据发送
        $receiveStr = '';
        $receiveStr = socket_read($socket, 1024, PHP_BINARY_READ);  // 采用2进制方式接收数据
        $receiveStrHex = bin2hex($receiveStr);  // 将2进制数据转换成16进制
        return $receiveStrHex;//返回的值
    }

    socket_close($socket);// 关闭Socket
}

if ($zhiling=='wendu'){

    //要发送的指令(温度传感器发出的查询指令:01 03 00 00 00 02 C4 0B)
    $sendStr = "\x01\x03\x00\x00\x00\x02\xC4\x0B";  // 16进制数据

    $get_value=tcp($sendStr);

    $shidu=substr($get_value,6,4);//获取湿度信息
    $shidu_str=number_format((hexdec($shidu)/10),2)."%";
    //echo "当前湿度:".$shidu.",转为十进制:".hexdec($shidu).",显示为:".number_format((hexdec($shidu)/10),2)."%";

    $wendu=substr($get_value,10,4);//获取温度信息
    $wendu_str=number_format((hexdec($wendu)/10),2)."℃";
    //echo "当前温度:".$shidu.",转为十进制:".hexdec($shidu).",显示为:".number_format((hexdec($shidu)/10),2)."℃";

    echo "ok|".$shidu_str."|".$wendu_str."|".$get_value;

}elseif ($zhiling=='light'){

    /* **************参数说明**************
        注意:设置地址时,只接一个设备,否则地址都会被设置。
        设置地址为:01
        00 10 00 00 00 01 02 00 01 6A 00// 修改成01
        设置地址为:02
        00 10 00 00 00 01 02 00 02 2A 01// 修改成02
        设置地址为:03
        00 10 00 00 00 01 02 00 03 EB C1// 修改成03
        ------------------------------------
        闪开指令:
        说明:开启后马上关闭,100MS为一个单位[1代表100MS]

        1号地址:
        0号继电器闪开 : 01 05 02 00 07 00 CE 42  //700MS = 7*100MS = 700MS
        1号继电器闪开 : 01 05 02 01 08 00 9A 72  //800MS
        返回:跟发送指令一样
        2号地址:
        0号继电器闪开 : 02 05 02 00 05 00 CF 11  //500MS
        1号继电器闪开 : 02 05 02 01 06 00 9E 21  //600MS
        ------------------------------------
        读取地址
        00 03 00 00 00 01 85 db
        返回:
        00 03 02 00 01 44 44 //01为地址
        ------------------------------------
        全部翻转指令:
        01 05 00 00 5A 00 F7 6A
        ------------------------------------
        单一翻转指令:
        0号继电器翻转:01 05 00 00 55 00 F2 9A
        1号继电器翻转:01 05 00 01 55 00 A3 5A
        2号继电器翻转:01 05 00 02 55 00 53 5A
        3号继电器翻转:01 05 00 03 55 00 02 9A
        4号继电器翻转:01 05 00 04 55 00 B3 5B
        5号继电器翻转:01 05 00 05 55 00 E2 9B
        6号继电器翻转:01 05 00 06 55 00 12 9B
        7号继电器翻转:01 05 00 07 55 00 43 5B
    ***************END**********************/

    switch ($type) {
        case "open_all":
            $sendStr    ="\x01\x0F\x00\x00\x00\x08\x01\xFF\xBE\xD5";//全亮
            break;
        case "close_all":
            $sendStr    ="\x01\x0F\x00\x00\x00\x08\x01\x00\xFE\x95";//全灭
            break;
        case "open_0":
            $sendStr    ="\x01\x05\x00\x00\xFF\x00\x8C\x3A";//0号开
            break;
        case "close_0":
            $sendStr    ="\x01\x05\x00\x00\x00\x00\xCD\xCA";//0号关
            break;
        case "shan_0":
            $sendStr    ="\x01\x05\x02\x00\x07\x00\xCE\x42";//0号闪亮
            break;

        case "open_1":
            $sendStr    ="\x01\x05\x00\x01\xFF\x00\xDD\xFA";//1号开
            break;
        case "close_1":
            $sendStr    ="\x01\x05\x00\x01\x00\x00\x9C\x0A";//1号关
            break;
        case "shan_1":
            $sendStr    ="\x01\x05\x02\x01\x08\x00\x9A\x72";//1号闪亮
            break;
    }

    $get_value=tcp($sendStr);

    echo "ok|".$get_value;
}

?>

 

标签: php php教程

热门推荐