基於modbus_tcp php 呼叫python 控制網路繼電器

adong發表於2022-06-30

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

相關文章