ModBus по TCP с Java

введите описание изображения здесьУ меня есть устройство HLK-DIO16, поддерживающее Modbus через TCP.

В руководстве пользователя я вижу пример чтения одновременно 16 цифровых входов

строка:

0x01030026000165c1

01 адрес устройства 03 код функции 0026 начальный адрес регистра 0001 номер регистра 65c1 crc

Используя код Java с библиотекой jlibmodus, метод будет

int[] registerValues = m.readHoldingRegisters(slaveId, offset, quantity);

какое значение параметров для 3 переменных воспроизводит строку 0x01030026000165c1

?


person Giuseppe    schedule 18.07.2019    source источник
comment
какая версия jlibmodbus?   -  person Erich Kitzmueller    schedule 19.07.2019
comment
в этом другом руководстве drive.google.com/file/d/… они сказали, что Modbus работает только через интерфейс RS.. для протокола инструкций TCP HEX.. помощь hilink сводит меня с ума.. Я спросил их, как управлять устройством удаленно по Wi-Fi, и они присылают мне спецификацию Modbus. Итак, мне нужна спецификация протокола в шестнадцатеричном формате? как вы думаете, я отправлю шестнадцатеричный через сокет tcp?   -  person Giuseppe    schedule 22.07.2019


Ответы (1)


EDIT: приведенный ниже ответ относится только к Modbus RTU через последовательный порт для конкретного устройства, о котором идет речь, которое, по-видимому, не поддерживает Modbus TCP (хотя оно поддерживает другой HEX-протокол через TCP-порт 8080). ).

Вот как перевести эти различные соглашения об именах:

slaveId = Адрес устройства (в вашем случае 01)

offset = начальный регистр (откуда вы начинаете читать), 0x0026 в приведенном выше примере, что составляет 38 десятичных знаков.

quantity= Количество регистров для чтения (должно быть 0001, если вы хотите прочитать 1 регистр, который будет включать 16 DI в качестве битов)

Код функции 0x03 и CRC будут добавлены библиотекой при вызове readHoldingRegisters, поэтому вам не нужно о них беспокоиться.

Итак, вы можете сделать:

int[] registerValues = m.readHoldingRegisters(1, 38, 1);

И вы должны получить эти 16 бит в вашей переменной registerValues. Например, если вы получаете:

registerValues=255

Это будет означать, что все ваши входы установлены на высокий уровень (до 1).

person Marcos G.    schedule 18.07.2019
comment
спасибо Маркос. Я пробовал, но получил ModbusIOException: ожидалось 6 байт, но получено 0. соединение было в порядке (isConnected() возвращает true) - person Giuseppe; 19.07.2019
comment
Странно... Я не смог достать мануал для вашего устройства. Если у вас есть копия, чтобы поделиться, я могу взглянуть. Иногда isConnected означает, что вы правильно создали экземпляр клиента. Можете ли вы пропинговать устройство и убедиться, что порт 502 открыт? - person Marcos G.; 19.07.2019
comment
настроен порт 8080 (используя по умолчанию 502 соединение дает исключение сокета из-за неправильного порта) руководство drive.google.com/file/d/1DrobylPN8ieLZpM8GIsed_zolV7RxX6M/ - person Giuseppe; 19.07.2019
comment
Теперь я вижу ошибку, адрес должен быть HEX, а не INT, как я написал. Можете ли вы попробовать изменить 26 на 38 (десятичное число 0x26 = 38)? SlaveID и количество тоже должны быть в HEX, но они будут одинаковыми... - person Marcos G.; 19.07.2019
comment
он не может работать также с преобразованием в шестнадцатеричный формат. Я попробовал цикл for по смещению, пробуя значения от 1 до 100.. но ничего. Это очень странно.. - person Giuseppe; 19.07.2019
comment
Давайте продолжим обсуждение в чате. - person Giuseppe; 19.07.2019