Как я могу отправить с типом struct.pack через Modbus TCP? - PullRequest
0 голосов
/ 30 октября 2018

Я хочу отправить пакет по протоколу Modbus TCP. Я хочу использовать:

Но я не могу отправить этот путь, как я могу отправить этот пакет? (Я не знаю, что-то будет)

req = struct.pack(
   'Something', transaction, identifier, length, unitid, func_code, reg_addr
) 

Это мои переменные:

transaction=0x01
identifier=0x00
length=[0x00,0x06]
unitid=0x01
func_code=0x03
reg_addr=[0x13,0x14,0x15]

1 Ответ

0 голосов
/ 30 октября 2018
  • Сначала вы можете использовать библиотеку pymodbus с очень широкими возможностями.
  • Также struct.pack() не поддерживает список в качестве аргумента.
  • 0001 0000 0006 11 03 006B 0003 - это стандартный пример пакета Modbus-TCP, который содержит:

0001: Transaction Identifier

0000: Protocol Identifier

0006: Message Length (6 bytes to follow)

11: The Unit Identifier (17 = 11 hex)

03: The Function Code (read Analog Output Holding Registers)

006B: The Data Address of the first register requested. (40108-40001 = 107 =6B hex)

0003: The total number of registers requested. (read 3 registers 40108 to 40110)

Ссылка

Таким образом, вы можете создать Modbus-TCP пакет с приведенным выше примером:

import struct

transaction = 0x0001
identifier = 0x0000
length = 0x0006
unitid = 0x11
fcode = 0x03  # Holding register fcode.
reg_addr = 0x006B  # Register address.
count = 0x0003  # Read three register.


total_pack_string = '0x{:04x}{:04x}{:04x}{:02x}{:02x}{:04x}{:04x}'.format(
    transaction, identifier, length, unitid, fcode, reg_addr, count
)
total_pack_hex = hex(int(total_pack_string, 16))

'''Or with using pack method.'''
pack_ = struct.pack(
   '>HHHBBHH', transaction, identifier, length, unitid, fcode, reg_addr, count
)

# Then send the pack_ or total_pack_hex using a TCP-Socket.

[ Примечание ]:

  • transaction 2Byte == Short == H
  • identifier 2Byte == Short == H
  • length 2Byte == Short == H
  • unitid равен 1 байт == B
  • fcode равен 1 байт == B
  • reg_addr 2Byte == Short == H
  • count - 2 байт == Короткий == H
  • B - это unsigned byte
  • H is unsigned short

Таким образом, формат будет таким: >HHHBBHH


Использование pymodbus эквивалент:

from pymodbus.client.sync import ModbusTcpClient

unitid = 0x11
fcode = 0x03  # Holding register fcode.
reg_addr = 0x006B  # Register address.
count = 0x0003  # Read three register.

cli = ModbusTcpClient('127.0.0.1', port=502)

if cli.connect():
    res = cli.read_holding_registers(reg_addr, count=count, unit=unitid)

    if not res.isError():
        print(res.registers)

    else:
        print('There is an error.')

    cli.close()

else:
    print('Error in connection.')
...