基于modbus_tcp php 调用python 控制网络继电器
背景:生产车间需要控制色母箱的开启,所以购买了
1.25 路网络继电器
2. 协议选择 modbus_tcp
3. 电锁不允许长时间供电,通电后需要立刻断电。
4. 局域网
5.centos7
php 代码很容易
echo shell_exec("python test.py 1") //开启1号料箱并关闭
/*php socket*/
$s= socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
$rs = socket_connect($s,'192.168.10.15',502);
if($rs){
echo "连接成功";
$buf;
socket_recv($s,$buf,7,MSG_WAITALL);//首次连接确认
//echo bin2hex($buf)."<br/>";
//$str = "\x00\x00\x00\x00\x00\x06\x01\x02\x00\x00\x00\x01";
$str = pack("c*",0,0,0,0,0,6,1,2,0,0,0,1);//打包
socket_send($s,$str,strlen($str),MSG_EOR);
//sleep(1);
socket_recv($s,$buf,12,MSG_PEEK);//这里最长12查询是10个字节
echo bin2hex($buf)."<br/>";
socket_close($s);
}else{
echo "连接失败";
}
python 源码
import socket
import struct
import time
import sys
TCP_IP = '192.168.10.15'
TCP_PORT = 502
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.settimeout(3)
try:
sock.connect((TCP_IP,TCP_PORT))
except OSError:
print("timeout")
exit()
sock.recv(256) #把连接成功的信息释放掉
try:
oc = 0x01 # 开启 0x00 关闭0x01
functionCode = 0x05 # 功能码
coilId = int(sys.argv[1]) # 线圈 0x00 0x01 0x02---- 这里开启2号箱子
req = struct.pack('12B', 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, functionCode, 0x00, coilId, oc, 0x00)
sock.send(req)
time.sleep(1)
#print("收到信息")
a = sock.recv(256)
#print(a)
oc = 0x00 # 关闭
req = struct.pack('12B', 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, functionCode, 0x00, coilId, oc, 0x00)
sock.send(req)
time.sleep(1)
#print("收到信息")
a = sock.recv(256)
#print(a)
finally:
sock.close()
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: