Python使用ModbusTCP通信

该Python脚本用于通过socket连接向机械臂发送ModbusTCP协议报文,用户输入寄存器地址和写入值,脚本将数据转换并发送到指定IP的502端口,然后接收响应。脚本包含了write_holding1和write_holding2两个函数,分别用于写入不同寄存器地址的数据,并在每次发送后暂停1秒以避免覆盖前次发送数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为需要给机械臂发送报文,所以想找个Python脚本来代替网络调试助手。但是很多脚本运行的都有些问题,后面在b站上找到了一个视频,简单暴力直接把报文发过去。下面的代码是根据自己的需要做了一点点修改。 原视频连接:Python使用socket解析Modbus TCP协议报文_哔哩哔哩_bilibili

from socket import *
import time
while 1:
    i = input('请输入寄存器:')
    j = input('请输入要写入的值:')
    while 1:
        time_start = time.time() #开始计时
        client_socket = socket(AF_INET,SOCK_STREAM)
        client_socket.connect(('192.168.1.10',502))
        time_end = time.time()    #结束计时
        time_c = time_end - time_start   #运行所花时间
        # print('time cost', time_c, 's')
        if time_c < 10:
            i = 2*int(i)
            j = int(j)
            a = int(j / 65536)
            b = j - a * 65536
            a1 = int(a / 256)
            a2 = a - a1 *256
            b1 = int(b / 256)
            b2 = b - b1 * 256
            print(i,a1,a2,b1,b2)
            def write_holding1(socket,address,Num1,Num2):
                message = bytearray([
                        0x00,0x00,
                        0x00,0x00,
                        0x00,0x06,
                        0x0A,
                        0x06,
                        0x00,address,
                        Num1,Num2
                ])
                socket.send(message)
                return socket.recv(1024)
                time.sleep(1)#这里需要注意,在对同一个寄存器进行传输的时候,后一次报文发送的数据将前一次的报文发送数据覆盖。
            def write_holding2(socket,address,Num3,Num4):
                message = bytearray([
                        0x00,0x00,
                        0x00,0x00,
                        0x00,0x06,
                        0x0A,
                        0x06,
                        0x00,address + 1,
                        Num3,Num4
                ])
                socket.send(message)
                return socket.recv(1024)
                time.sleep(1)

            recv_date1 = write_holding1(client_socket,i,a1,a2)
            recv_date2 = write_holding2(client_socket,i,b1,b2)
            # recv_date4 = write_holding4(client_socket,i,b2)
            print(recv_date1)
            print(list(recv_date1))
            print(recv_date2)
            print(list(recv_date2))
            break

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值