基于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 协议》,转载必须注明作者和本文链接
写代码是一件趣事。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2
Flex

php 也支持socket ... 是不是人家只提供了ptyhon版的demo :see_no_evil:

1年前 评论
adong (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!