背景:生產車間需要控制色母箱的開啟,所以購買了
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 協議》,轉載必須註明作者和本文連結