因为需要给机械臂发送报文,所以想找个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