欢迎您来到,李雷博客 | PHP博客        登录  |  注册

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

更新:2023-01-10 16:49:13
人气:51
来源:本站原创
A+

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

?>

 

推荐的文章
# 发表我的评论
  /     /  
# 最近评论
暂时还没有评论,要不要说点什么?
  Ads by Google
  联系博主
Hello,本博客系统采用PHP和MySql开发,程序开发完全是因为个人爱好,是自己纯手写PHP源代码,未采用任何PHP框架!
QQ:858353007   微信号:lileihot123
网站地图
会员服务
关于我们
QQ:858353007
 
广告服务
加我微信
移动端访问
 
 
Copyright © 2014- 2023 www.mdaima.com All Rights Reserved.
李雷博客,专注PHP经验、PHP教程及PHP源代码开源下载分享的PHP博客!   ICP备案号:京ICP备10202169号-4