kobb500
New member
Использую плату NODEMCU с LUA интерпритатором.
Решаю задачу принять от устройства которое передаёт по MODBUS TCP.
Нужно принять пакет и сформировать ответ.
Устройство передает такой пакет: 00 01 00 00 00 06 01 03 00 00 00 01
Ответ нужно сформировать такой:00 01 00 00 00 05 01 03 02 00 00
Ну это к примеру, если ответ будет правильным, то все гуд.
С самим приемом и передачей проблем нету, я пробовал отправить принятый пакет обратно, он проходит, только устройство ругается, что неправильный ответ, ну это понятно)
Вот например код, который это делает:
Проверяю тип принятых данных, длину и например преобразовываю в байтовую информацию:
В терминале будет вывод будет такой:
Это соответствует первому переданному пакету от MODBUS TCP устройства: 00 01 00 00 00 06 01 03 00 00 00 01
Только вывод в десятичном виде, я думал этого мне достаточно, хотя можно и преобразовать в шестнадцатиричные числа другой функцией, с этим проблем нету.
Попробовал сформировать ответ в ручную, который тоже успешно прошел:
Я уже обрадовался и хотел собрать такой пакет из переменных, но ничего не получилось. Даже если мне удаётся собрать такую строку из переменных или массива, при выводе в терминал все показывает правильно, но передаётся в таком же виде, то есть когда я смотрю в анализаторе пакетов, вместо нормального ответа передаётся "\0\1\0\0\0\5\1\3\0\0\0".
Если кто сталкивался с таким, буду очень благдарен за ответ, спасибо.
Решаю задачу принять от устройства которое передаёт по MODBUS TCP.
Нужно принять пакет и сформировать ответ.
Устройство передает такой пакет: 00 01 00 00 00 06 01 03 00 00 00 01
Ответ нужно сформировать такой:00 01 00 00 00 05 01 03 02 00 00
Ну это к примеру, если ответ будет правильным, то все гуд.
С самим приемом и передачей проблем нету, я пробовал отправить принятый пакет обратно, он проходит, только устройство ругается, что неправильный ответ, ну это понятно)
Вот например код, который это делает:
Код:
srv = net.createServer(net.TCP)
srv:listen(502, function(conn)
conn:on("receive", function(sck, payload)
sck:send(payload)
end)
end)
Код:
print(type(payload))
print(string.len(payload))
print(string.byte(payload, 1, string.len(payload)))
Код:
string
12
0 1 0 0 0 6 1 3 0 0 0 1
Только вывод в десятичном виде, я думал этого мне достаточно, хотя можно и преобразовать в шестнадцатиричные числа другой функцией, с этим проблем нету.
Попробовал сформировать ответ в ручную, который тоже успешно прошел:
Код:
sck:send("\0\1\0\0\0\5\1\3\0\0\0")
Если кто сталкивался с таким, буду очень благдарен за ответ, спасибо.