Могу ли я прочитать данные Modbus RS485, полученные на подчиненном компьютере с Python?

Я работаю на ведомом компьютере и хочу сохранить данные, передаваемые от ведущего через Modbus RS485, в текстовый файл. Главный компьютер постоянно отправляет запросы на запись и чтение на подчиненный компьютер, над которым я работаю, ниже - изображение, полученное монитором последовательного порта.

введите здесь описание изображения

Я только что обнаружил, что с помощью minimalmodbus вы можете читать регистры. Но, похоже, это работает только в том случае, если вы являетесь ведущим устройством. Могу ли я сделать что-то подобное, но на подчиненном компьютере? http://minimalmodbus.readthedocs.io/en/master/usage.html

#!/usr/bin/env python
import minimalmodbus

instrument = minimalmodbus.Instrument('/dev/ttyUSB1', 1) # port name, slave 
#address (in decimal)

## Read temperature (PV = ProcessValue) ##
temperature = instrument.read_register(289, 1) # Registernumber, number of 
#decimals
print temperature

## Change temperature setpoint (SP) ##
NEW_TEMPERATURE = 95
instrument.write_register(24, NEW_TEMPERATURE, 1) # Registernumber, value, 
#number of decimals for storage

person Yang    schedule 21.12.2017    source источник
comment
Вы можете использовать PyModbus для создания сервера на своем ведомом устройстве, я не уверен, что на вашем ведомом устройстве уже запущено ведомое устройство Modbus или нет, в любом случае Обратитесь к этим примерам github.com/riptideio/pymodbus/blob/master/examples/common/, github.com/riptideio/pymodbus/blob/master/examples/contrib /, github.com/riptideio/pymodbus/blob / master / examples / common /.   -  person Sanju    schedule 23.12.2017


Ответы (2)


modbus-tk позволяет написать собственное ведомое устройство Modbus.

Вот пример запуска сервера RTU со 100 регистрами хранения, начиная с адреса 0:

import sys

import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
import serial


PORT = 0
#PORT = '/dev/ptyp5'

def main():
    """main"""
    logger = modbus_tk.utils.create_logger(name="console", record_format="%(message)s")

    #Create the server
    server = modbus_rtu.RtuServer(serial.Serial(PORT))

    try:
        logger.info("running...")
        logger.info("enter 'quit' for closing the server")

        server.start()

        slave_1 = server.add_slave(1)
        slave_1.add_block('0', cst.HOLDING_REGISTERS, 0, 100)
        while True:
            cmd = sys.stdin.readline()
            args = cmd.split(' ')

            if cmd.find('quit') == 0:
                sys.stdout.write('bye-bye\r\n')
                break

    finally:
        server.stop()

if __name__ == "__main__":
    main()

Я надеюсь, что это помогает

person luc    schedule 26.01.2018
comment
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится. - Из отзыва - person The fourth bird; 26.01.2018
comment
Хорошо, я заменил ссылку каким-то кодом. Однако ссылка указывала на документацию библиотеки, которая должна оставаться в актуальном состоянии. - person luc; 26.01.2018
comment
Спасибо! Вроде удалось открыть порт. Но как я могу прочитать сообщение от мастера? Могу я прочитать это как текст? Где именно на моем компьютере находятся регистры? - person Yang; 26.01.2018
comment
мастер отвечает за отправку запроса к мази для получения значения регистра. Регистры - это просто числа, которые могут быть прочитаны / записаны запросом Modbus. - person luc; 26.01.2018
comment
Вы имеете в виду, что только мастер может вытаскивать значения в регистры? Если я запускаю python на ведомом устройстве, я не могу получить доступ к регистрам? - person Yang; 27.01.2018
comment
Подчиненное устройство (в большинстве случаев ПЛК) отвечает на запросы, отправленные мастером. Мастер может отправлять запросы для записи значений регистров. но общение инициируется мастером - person luc; 27.01.2018
comment
Это правильно. Но в этом случае нашим ведущим устройством является ведущий ПЛК Siemens, который продолжает отправлять показания других ведомых устройств (датчиков) этому ведомому устройству (моему компьютеру). Можно ли извлечь запросы с помощью modbus_tk.modbus.Slave.get_values? - person Yang; 29.01.2018
comment
Да, это возможно с помощью modbus_tk.modbus.Slave.get_values - person luc; 29.01.2018
comment
Спасибо! Но вроде работает только я вынимаю часть cmd = sys.stdin.readline (). Запросы от мастера читаются sys.stdin.readline ()? - person Yang; 29.01.2018
comment
Привет @luc, спасибо за помощь. Другой вопрос, как настроить ведомое устройство для представления целого числа со знаком вместо беззнакового. Например, теперь я использую 16-битные данные, (FC19) HEX должен представлять десятичное число -999, но теперь оно читается как 64537. Спасибо! - person Yang; 09.02.2018
comment
Привет @Yang, это может быть другой вопрос по SO :-) Вы можете передать флаг data_format для преобразования значений: См. github.com/ljean/modbus-tk/blob/master/examples/ Для подписанных значений это должно быть› b Подробнее см. в модуле структуры docs.python.org/2/library/struct.html - person luc; 09.02.2018
comment
Привет @luc, я создал новый вопрос, не могли бы вы взглянуть: stackoverflow.com/questions/48708648/. - person Yang; 09.02.2018
comment
Привет @Yang, извини, я неправильно понял твой вопрос. Я отвечу по другому. - person luc; 09.02.2018
comment
Привет @luc, возможно ли захватить сообщение главного запроса с помощью Modbus-tk? например 01 10 00 64 00 02 04 00 63 00 0A? В идеале я хотел бы иметь что-то вроде: modbustools.com/poll_traffic.html. Спасибо! - person Yang; 14.02.2018
comment
@Yang Существует механизм перехвата, который должен позволять делать что-то подобное. - person luc; 14.02.2018
comment
Привет @luc, спасибо. Не могли бы вы рассказать мне, как я могу использовать эту функцию? Есть ли какие-нибудь примеры? - person Yang; 14.02.2018
comment
Привет, @Yang, я предлагаю вам задать вопрос в списке рассылки modus_tk или в репозитории. Ответить легче, чем в комментариях. - person luc; 16.02.2018
comment
Привет @luc, я разместил вопрос в списке рассылки. Не могли бы вы взглянуть? Спасибо. groups.google.com/forum/#!topic/modbus-tk/ rEvAIvCTsUI - person Yang; 20.02.2018

Возможно, вы захотите напрямую управлять последовательным портом.

Для этого вы можете использовать модуль pyserial, и вы должны знать, как Протокол Modbus работает.

Базовая конфигурация может быть:

import serial

port = '/dev/ttyUSB1'
serial_comunication = serial.Serial(port, baudrate=4800, timeout=0.75)
serial_comunication.write(b'frame')
answer = serial_comunication.read(255)
serial_comunication.close()
print answer.decode()
person Gsk    schedule 21.12.2017