Включение / выключение катушек ModBus с помощью Python - Beckhoff BK9000
Предупреждение - тотальный новичок с Modbus и промышленный контроль в целом... Извините за неправильную терминологию / и т.д. заблаговременно!
У меня есть проект, использующий сетевой соединитель Beckhoff BK9000/BK9100, и мне нужно проверить состояния до шести цифровых выходов (модулей KL2602), а также включить / выключить эти те же шесть выходов в зависимости от логики.
Я знаю, что устройство работает и имеет указанный IP-адрес, так как я могу видеть его в TwinCat3 и вручную манипулировать выходами.
Я пытался использовать следующий код:
from pyModbusTCP.client import ModbusClient
SERVER_HOST = "172.16.17.32"
SERVER_PORT = 502
# TCP auto connect on modbus request, close after it
c = ModbusClient(host=SERVER_HOST, port=SERVER_PORT, auto_open=True, auto_close=True)
for i in range(4):
print(str(i) + str(c.read_coils(i,16)))
status = c.write_single_coil(0, False)
print(status)
for i in range(4):
print(str(i) + str(c.read_coils(i,16)))
Когда я это делаю, я вижу, что True/False для катушки '0' соответствуют различным состояниям вывода, которые я установил вручную с помощью TwinCat3. Есть шесть выходов, установленных вручную, которые видны здесь:
0[True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, False]
1[True, True, True, True, True, True, True, False, False, False, False, False, False, False, False, False]
2[True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False]
3[True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False]
Похоже, что когда я увеличиваю "катушку", она просто читает на один бит дальше в поток, поскольку "катушка" 1, 2 и 3 вращается влево.
Тем не менее, я все еще не могу изменить значения. Я слышу таинственное срабатывание реле при установке катушки "0" на "Ложь" (но нет щелчка по истине), и состояние чтения катушки не меняется. TwinCat также не показывает изменений. Я получаю "None" обратно от записи, которая указывает на то, что она не работает согласно документации модуля.
0[True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, False]
1[True, True, True, True, True, True, True, False, False, False, False, False, False, False, False, False]
2[True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False]
3[True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False]
None
0[True, True, True, True, True, True, True, True, False, False, False, False, False, False, False, False]
1[True, True, True, True, True, True, True, False, False, False, False, False, False, False, False, False]
2[True, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False]
3[True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False]
Я уверен, что это что-то простое с побитовыми операциями или что-то вроде того, что я пропускаю. Любые идеи о том, что я делаю неправильно, что вызывает сбой записи?
1 ответ
Я абсолютный новичок с ПЛК Beckhoff;), но я почти уверен, что битовый адрес неверен. bit_addr
не совпадает с номером выхода модуля. Вы должны быть в состоянии получить его откуда-то, например, из утилиты обнаружения и настройки модулей.
Из документации по pyModbusTCP.client:
write_single_coil(bit_addr, bit_value) Parameters: bit_addr (int) – bit address (0 to 65535) bit_value (bool) – bit value to write Returns: True if write ok or None if fail
Вы получаете статус None
т.е. fail
, Вы слышали щелчок реле, потому что что-то случилось (plc сбросил?)
КСТАТИ. Вы должны увеличить адрес катушки на 16. в вашем цикле, как писал thephez. Например:
var output0addr = 0x12346789
for i in range(4):
print(str(i) + str(c.read_coils(output0addr + (i * 16), 16)))