本文介绍用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;
}
?>