2016-11-21 21 views
0

Предупреждение - общий новичок с Modbus и промышленным управлением в целом ... Извините за любую неправильную терминологию/и т. Д. заранее!Включить/выключить катушки ModBus с помощью Python - Beckhoff BK9000

У меня есть проект с использованием межсетевого соединения 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' на False (но не нажимайте на true), и состояние чтения катушек не изменяется. TwinCat также не показывает никаких изменений. Я получаю «Нет» от записи, что указывает на то, что он не работает в соответствии с документацией модуля.

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] 

Я уверен, что это что-то простое с битовыми операциями или чем-то подобным, которое я пропускаю. Любые идеи о том, что я делаю неправильно, что приводит к сбою записи?

+0

Непонятно, если вы можете установить состояние катушки с помощью twincat или нет. Если нет, я бы посмотрел на руководство/настройки контроллера. – intrepidhero

+0

Кроме того, попробовали ли вы включить режим [debug mode] (https://pythonhosted.org/pyModbusTCP/quickstart/index.html#modbusclient-debug-mode), чтобы узнать, дает ли он какую-либо полезную обратную связь? Вы также можете попробовать захватить трафик в Wireshark - он должен декодировать Modbus/TCP и может быть проще следовать, чем данные кадра Modbus от Python. Сначала я попытаюсь исключить любые возможные проблемы с конфигурацией оборудования. – thephez

+0

Я обязательно проверю режим отладки и Wireshark, если ничего больше не всплывет.Насколько я могу судить, аппаратное обеспечение работает нормально - я могу полностью контролировать его через TwinCat3, либо через мягкий ПЛК, либо вручную щелкнув правой кнопкой мыши, и установив выходы на 1 или 0. У меня также есть две единицы (BK9000 дома и BK9100 при работе), и оба имеют одинаковое поведение. – user2726921

ответ

2

Я полностью новичок с ПЛК 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 сбрасывает?)

BTW. вы должны увеличить адрес катушки на 16. в вашей петле, как писал phez. Например:

var output0addr = 0x12346789 
for i in range(4): 
    print(str(i) + str(c.read_coils(output0addr + (i * 16), 16)))