193 lines
5.3 KiB
Python
193 lines
5.3 KiB
Python
print("modbus test")
|
||
|
||
# Настройки клиента Modbus
|
||
MODBUS_SERVER_HOST = "192.168.70.55" # IP-адрес Modbus-сервера
|
||
MODBUS_SERVER_PORT = 502
|
||
MODBUS_SLAVE_ID = 11
|
||
|
||
indent = 21100
|
||
s = 800
|
||
k = 2
|
||
|
||
from pymodbus.client import ModbusTcpClient
|
||
from pymodbus.constants import Endian
|
||
from pymodbus.payload import BinaryPayloadDecoder
|
||
import time
|
||
import struct
|
||
|
||
|
||
def two_byte_convert(result):
|
||
# print(result)
|
||
v0 = result.registers[0]
|
||
value = (v0 << 16) + result.registers[1]
|
||
if result.registers[0] > (65535 * 0.5):
|
||
value = value - (1 << 32)
|
||
return value
|
||
|
||
|
||
def bulb(addr):
|
||
try:
|
||
coils = client.read_coils(addr, 1, MODBUS_SLAVE_ID)
|
||
print("читаем начальное состояние", coils.bits)
|
||
|
||
new_bits = coils.bits
|
||
new_bits[0] = not new_bits[0]
|
||
print("пытаемся записать", new_bits, coils.slave_id)
|
||
result = client.write_coil(addr, new_bits[0], coils.slave_id)
|
||
print(result)
|
||
|
||
print(
|
||
"читаем после попытки",
|
||
client.read_coils(0, len(coils.bits), coils.slave_id).bits,
|
||
)
|
||
except Exception as e:
|
||
raise e
|
||
|
||
|
||
def get_coordinates():
|
||
try:
|
||
data = [
|
||
("j1", 2268),
|
||
("j2", 2270),
|
||
("j3", 2272),
|
||
("j4", 2274),
|
||
("j5", 2276),
|
||
("j6", 2278),
|
||
("x", 2332),
|
||
("y", 2334),
|
||
("z", 2336),
|
||
("u", 2338),
|
||
("v", 2340),
|
||
("w", 2342),
|
||
]
|
||
i = 2
|
||
for d in data:
|
||
result = client.read_holding_registers(d[1], 2, MODBUS_SLAVE_ID)
|
||
value = two_byte_convert(result)
|
||
adjusted_value = value / 1000.0
|
||
i *= 2
|
||
print(d[0], result.registers, adjusted_value)
|
||
except Exception as e:
|
||
raise e
|
||
|
||
|
||
def get_or_set_speed(number=None):
|
||
result = client.read_holding_registers(20200, 1, MODBUS_SLAVE_ID)
|
||
print("сейчас скорость", result.registers[0] * 0.1)
|
||
if number and number > 0 and number <= 1000:
|
||
client.write_register(20200, number * 10, MODBUS_SLAVE_ID)
|
||
result = client.read_holding_registers(20200, 1, MODBUS_SLAVE_ID)
|
||
print("установлена скорость", result.registers[0] * 0.1)
|
||
|
||
|
||
def set_user_register(n, values):
|
||
client.write_registers(indent + s + k * n, values, MODBUS_SLAVE_ID)
|
||
|
||
|
||
def to_double(integr):
|
||
return [(integr >> 16) & 0xFFFF, integr & 0xFFFF]
|
||
|
||
|
||
client = ModbusTcpClient(
|
||
host=MODBUS_SERVER_HOST,
|
||
port=MODBUS_SERVER_PORT,
|
||
)
|
||
client.connect()
|
||
# максимальное количество coils = 286
|
||
|
||
# bulb(0)
|
||
# get_coordinates()
|
||
# get_or_set_speed(10)
|
||
try:
|
||
data = [
|
||
(0, to_double(0)),
|
||
(1, to_double(0)),
|
||
(2, to_double(0)),
|
||
(3, [0, 0]),
|
||
(4, [0, 0]),
|
||
(5, [0, 0]),
|
||
]
|
||
for item in data:
|
||
d, values = item
|
||
set_user_register(d, values)
|
||
# старт в авторежиме single loop
|
||
client.write_register(20002, 1, MODBUS_SLAVE_ID)
|
||
|
||
total = 0
|
||
state = None
|
||
step = 0
|
||
counter = 0
|
||
while True:
|
||
time.sleep(1)
|
||
total += 1
|
||
green_light = client.read_coils(0, 1, MODBUS_SLAVE_ID).bits[0]
|
||
print(f"total {total}, state {state}, green light {green_light}")
|
||
|
||
if state == green_light:
|
||
continue
|
||
|
||
state = green_light
|
||
|
||
if state == True:
|
||
continue
|
||
|
||
step += 1
|
||
# собираем предварительные данные
|
||
# x = two_byte_convert(client.read_holding_registers(2332, 2, MODBUS_SLAVE_ID))
|
||
# y = two_byte_convert(client.read_holding_registers(2334, 2, MODBUS_SLAVE_ID))
|
||
# z = two_byte_convert(client.read_holding_registers(2336, 2, MODBUS_SLAVE_ID))
|
||
# u = two_byte_convert(client.read_holding_registers(2338, 2, MODBUS_SLAVE_ID))
|
||
# v = two_byte_convert(client.read_holding_registers(2340, 2, MODBUS_SLAVE_ID))
|
||
# w = two_byte_convert(client.read_holding_registers(2342, 2, MODBUS_SLAVE_ID))
|
||
# print(
|
||
# f"Предварительные данные X {x * 0.001}, Y {y * 0.001}, Z {z*0.001}, U {u*0.001}, V {v*0.001}, W {w*0.001}"
|
||
# )
|
||
|
||
# работаем с REL относительными координатами
|
||
x = 0
|
||
y = 0
|
||
z = 0
|
||
|
||
w = 100
|
||
h = 100
|
||
if step == 1:
|
||
x -= w * 1000
|
||
elif step == 2:
|
||
y -= h * 1000
|
||
elif step == 3:
|
||
x += w * 1000
|
||
elif step == 4:
|
||
y += h * 1000
|
||
elif step == 5:
|
||
z += h * 1000
|
||
elif step == 6:
|
||
z -= h * 1000
|
||
else:
|
||
counter += 1
|
||
step = 0
|
||
state = None
|
||
|
||
data = [
|
||
(0, to_double(x)),
|
||
(1, to_double(y)),
|
||
(2, to_double(z)),
|
||
(3, [0, 0]),
|
||
(4, [0, 0]),
|
||
(5, [0, 0]),
|
||
]
|
||
for item in data:
|
||
d, values = item
|
||
set_user_register(d, values)
|
||
result = client.read_holding_registers(
|
||
indent + s + k * d, k, MODBUS_SLAVE_ID
|
||
)
|
||
print(s + d, "===", two_byte_convert(result) * 0.001)
|
||
|
||
bulb(0)
|
||
|
||
|
||
except Exception as e:
|
||
print("error", e)
|
||
|
||
client.close()
|