Включение / выключение катушек 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)))
Другие вопросы по тегам