То, что FF
вы видите прямо перед тем, как функция Modbus на самом деле верна. Цитирование Руководства по внедрению Modbus , стр. 23:
В TCP / IP адрес сервера MODBUS адресован с использованием его IP-адреса;поэтому идентификатор устройства MODBUS бесполезен. Значение 0xFF должно быть использовано.
Итак, libmodbus просто придерживается спецификации Modbus. Я предполагаю, что проблема в easymodbus , который, очевидно, ожидает, что вы будете использовать 0x01
в качестве идентификатора устройства в своих запросах.
Я полагаю, что вы этого не делаетехотите связываться с easymodbus , чтобы вы могли довольно легко решить эту проблему с libmodbus : просто измените идентификатор устройства по умолчанию:
modbus_set_slave(ctx, 1);
Вы также можете пойти с:
rc = modbus_set_slave(ctx, MODBUS_BROADCAST_ADDRESS);
ASSERT_TRUE(rc != -1, "Invalid broadcast address");
, чтобы ваш клиент обратился ко всем ведомым в сети, если у вас их больше одного.
У вас есть дополнительная информация и краткое объяснение того, откуда возникает эта проблема. справочная страница libmodbus для функции modbus_set_slave
.
Для очень подробного примера вы можете проверить libmodbus unit tests
А что касается вашего вопроса № 5, я не знаю, как на него ответить, вы подразумеваете, что нули - это состояния (истинные или ложные), которые вы хотите записать (или прочитать) вкатушки. Для записи вы можете изменить их в поле значения функции modbus_write_bit(ctx, address, value)
.