Тестовый запрос Modbus TCP - PullRequest
       10

Тестовый запрос Modbus TCP

0 голосов
/ 11 сентября 2018

У меня есть вопрос, я провожу тестирование связи по протоколу Modbus TCP, и каждый запрос занимает примерно 200 мс. Можно ли улучшить это время?

Это код, который я использую для тестов:

from pymodbus.client.sync import ModbusSerialClient as ModbusClient
import time
import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

t1= time.time()
client = ModbusClient(method='rtu', port='COM7', baudrate=9600, timeout=1, 
parity='N')
response = client.read_holding_registers(address=13313, count=12, unit=0x02)
respuesta=response.registers[0:12]
client.close()
print(time.time()-t1)

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

В зависимости от ваших настроек связи каждый передаваемый символ / байт должен быть:

1 start bit
8 data bit
0 parity bits
2 stop bits (this should be 2 -> spec says 11 bits/char, but I have seen implementations that use 8N1)
-------------------------------
total: 11 bits/byte

1) Запрос

address:                1 byte
function code:          1 byte
starting address:       2 bytes
quantity of registers:  2 bytes
crc:                    2 bytes
-------------------------------
total: 8 bytes

Min time: 1s/9600bits * (8 bytes) * (11 bits/byte) = 9.2 ms

2) Интервал молчания между кадрами

Min time: 1s/9600bits * (3.5 bytes) * (11 bits/byte) = 4.0 ms

3) Ответ

address:          1 byte
function code:    1 byte
byte count:       2 bytes
register values:  24 bytes (2*12)
crc:              2 bytes
-------------------------------
total: 30 bytes

Min Time = 1s/9600bits * (30 bytes) * (11 bits/byte) = 34.3 ms

Таким образом, теоретическое минимальное время прохождения сигнала туда и обратно составляет: 9,2 + 4,0 + 34,3 = 47,5 мс

Таким образом, похоже, что есть потенциал для улучшения,но трудно точно знать, где ваши задержки.

В дополнение к тому, что предлагали другие, я обычно ставлю область видимости на линии связи, чтобы посмотреть, близки ли кадры tx и rx к теоретическим временам.Вы также должны быть в состоянии сказать, сколько времени занимает ответ сервера, посмотрев на время между концом tx и началом кадров rx.Если вы можете каким-то образом инициировать область действия перед тем, как начать отправку запроса, вы также можете измерить время, необходимое клиенту для генерации и начала передачи кадра запроса.

0 голосов
/ 12 сентября 2018

Я получаю очень быстрых результатов с minimalmodbus lib. MinimalModbus API .Работает с Python 3. Может быть, вы могли бы попробовать и сравнить?

import minimalmodbus
import serial
import struct
import time

i = minimalmodbus.Instrument(port='COM7', slaveaddress=1, mode='rtu')
i.serial.baudrate = 19200
i.serial.bytesize = 8
i.serial.parity = serial.PARITY_NONE
i.serial.stopbits = 1
i.serial.timeout = 1
i.debug = False

start = time.time()
var1 = i.read_registers(registeraddress=13313, numberOfRegisters=2, functioncode=4)
var1_ = [var1[0], var1[1]]
var1_pack = struct.pack('HH', var1_[0], var1_[1])
var1_unpack = struct.unpack('f', var1_pack)[0]
end = time.time()

print('Result: {}. Total time: {}'.format(var1_unpack, (end - start)))

Помимо этого, максимальное увеличение скорости передачи данных максимизирует скорость, но 200 мс на опрос довольно медленны;Я не думаю, что только бодрейт вылечит это.Могут быть и другие факторы в игре;какой преобразователь вы используете, какие кабели, как долго они проложены и т. д.

...