Далее к ответу от @maxy; modbus spe c указывает, что код исключения 1 (ILLEGAL FUNCTION) означает:
Код функции, полученный в запросе, не является допустимым действием для сервера (или подчиненного устройства). ). Это может быть связано с тем, что код функции применим только к новым устройствам и не был реализован в выбранном устройстве. Это также может указывать на то, что сервер (или подчиненный) находится в неправильном состоянии для обработки запроса этого типа, например, потому что он ненастроен и запрашивается для возврата значений регистра.
Итак, в этом случае я бы сказал, что устройство не поддерживает эту команду.
Однако, учитывая, что другой пользователь сообщил о проблеме с этой командой, я подумал, что стоит проверить кодировку:
1- Slave ID
23- Function Code
0, 2- Read Starting Address
0, 1- Quantity to Read
0, 23- Write Starting Address
0, 1 - Quantity to write
2, Write Byte Count
0,1, - Write Registers value
55,131 - CRC (have not checked)
Это выглядит правильно для меня с одним исключением; Непонятно, откуда берется «Начальный адрес записи» (и подозрительно, что он совпадает с кодом функции). Глядя на источник :
pdu = struct.pack(
">BHHHHB",
function_code, starting_address, quantity_of_x, defines.READ_WRITE_MULTIPLE_REGISTERS,
len(output_value), byte_count
)
Мне это кажется неправильным (defines.READ_WRITE_MULTIPLE_REGISTERS
всегда будет 23). Код был изменен на это в commit dcb0a2f115d7a9d63930c9b4466c4501039880a3 ; ранее это было:
pdu = struct.pack(
">BHHHHB",
function_code, starting_address, quantity_of_x, starting_addressW_FC23,
len(output_value), byte_count
)
Это имеет больше смысла для меня (вам нужен способ передать адрес, чтобы начать писать, и текущий интерфейс, похоже, не обеспечивает этого). Я добавил примечание к этому вопросу github .
Итак, в заключение ваша проблема, вероятно, связана с устройством, но даже если устройство поддерживает команду, я не думаю, что это будет работа из-за ошибки в modbus-tk.