Имеются моторы Onviz DT82 (Dooya). При подключении и настройке через Serial Tool корректно исполняют команды и отвечают на них. При добавлении в wb-mqtt-serial.conf ловлю следующий баг:
Планировщик не успевает получить полный ответ от мотора, и либо режет часть CRC либо считает что ответ очень короткий. Изменение периода вопроса частично решило проблему только с одним мотором (стал время от времени отвечать). wb-mqtt-serial_20220807T180603.log (19.0 КБ)
Добрый день.
А попробуйте пожалуйста установить для порта “Задержка перед записью в порт”, больше чем 20000. 40000 например.
Ну и выложите диагностический архив, попробую воспроизвести.
пока так сделал.
По крайней мере контролы в интерфейсе не красные.
но и тут вопрос.
Команды нормально уходят и четко исполняются.
А ответа от мотора runShellCommand exitCallback нет. Только exitCode возвращает исправно.
Как достучаться до мотора и прочитать, что он там вернул?
Очевидно там ответ не мгновенный…и runShellCommand в этом не поможет?
Так… Но зачем? “красные” - просто оттого что ответа от устройства или нет или он “неверный”.
Изобретать альтернативную систему обработки ответов - можно, но непродуктивно, совершенно. Ну и получим кучу недостатоков.
Я думаю что нужно настроить wb-mqtt-serial.
Воспроизвел конфигурацию, подключив к ttyRS485-2 привод:
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Write: 55 01 01 01 02 01 a1 42
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] <10.0.0.71:502>145624910: Wait until 145625278
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 10000 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] ReadFrame: 55 01 01 01 01 2d a0 6f
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] </dev/ttyRS485-2 9600 8 N 2>145624931: Wait until 145624942
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 100 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] </dev/ttyRS485-2 9600 8 N 2>145624942: Wait until 145624968
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 100 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] </dev/ttyRS485-2 9600 8 N 2>145624969: Wait until 145624999
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 100 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] </dev/ttyRS485-2 9600 8 N 2>145625000: Wait until 145625005
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 100 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] </dev/ttyRS485-2 9600 8 N 2>145625005: Wait until 145625105
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] <10.0.0.71:502>145625010: Wait until 145625278
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 100 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Write: 55 01 01 01 02 01 a1 42
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] <10.0.0.71:502>145625110: Wait until 145625278
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 10000 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] ReadFrame: 55 01 01 01 01 2d a0 6f
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] </dev/ttyRS485-2 9600 8 N 2>145625132: Wait until 145625142
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 100 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] </dev/ttyRS485-2 9600 8 N 2>145625142: Wait until 145625168
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 100 us
Картину похожую на ту, что приведена в первом сообщении (чуть лучше) удается получить если отключить провод от клеммы gnd или добавить резистор на 470 последовательно с одной линией шины.
Если подключаю все провда - ошибок нет, совсем.
У вас точно именно с физическим подключением все в порядке?
Предлагаю подключить один привод заведомо исправным кабелем и проверить?
ну, зато поупражнялся…поглубже узнал как работает runShellCommand и serial_tool
Я пробовал одним кабелем на прямую подключать (длина кабеля 20 м, 4 витые жилы). Эффекты те же.
Назовите мне несколько объективных параметров, что бы я понял, что у меня физическое подключение страдает. В арсенале есть мультиметр и даже осциллограф найду если надо.
Я еще раз все кропотливо проверю.
Провода вроде все правильно подключены. Я прозвонил их неоднократно все от клемм контроллера до RJ. Подключение попробовал делать ко всем трем доступным портам.
Могу все это проделать в anydesk например под чутким руководством, если такое практикуется.
Для теста лучше все ж покороче. Хотя - сейчас взял кусок около 30 м - работает (чего б не работать).
А на клеммы A и B подключали по одному проводу одной пары? Покажите фото подключения, на контроллере и на приводе? неконтакт разьема rj на самом приводе исключен?
Тут методика такая, с помощью мультиметра: Вытаскиваяем разьем из контроллера (оставляем подключенным к приводу) и в режиме измерения напряжения между Gnd и A около 4-4,7В
Между A и B -4-4,7В.
у stop_bits не 2, а 1…
0х0101 вроде работает. но он и раньше проявлял признаки жизни.
Не красный. Но позиции крайние 1 и 98
Лимиты настроил, как написано.
0х0201 красный… на изменения position реагирует, но пассивно… положение не считывает.
Крайние позиции 2 и 95 Лимиты настроил, как написано.
но тут ОК
сделал все настройки как тут кроме “path”
при подключении отдельным проводом 2 движка выглядят так
остальные так
на смену Position все открываются и закрываются.
два вот этих правила управляют каждым движком в отдельности ожидаемо: и позиция меняется и считывается без ошибок.
posChanging = false;
defineRule({
whenChanged: “Dooya_0x0101/enabled”,
then: function (newValue, devName, cellName) {
var n = 0;
var P = 0;
var prevP = -1;
if (dev[“Dooya_0x0101”][“enabled”]){
log(“Старт”)
_interval = setInterval(function () {
n += 1;
runShellCommand(“serial_tool -b 9600 -pN -d8 -s1 -t0.2 /dev/ttyMOD1 --batch ‘55 01 01 01 02 01 A1 42’”, {
captureOutput: true,
exitCallback: function(exitCode, capturedOutput){
var s = ‘0x’ + capturedOutput.substring(15,17);
P = parseInt(s, 16);
if (P > -1 ) {
dev[“Dooya_0x0101”][“position”] = P;
}
}
});
if ((n >= 20) || (P == prevP)){
clearInterval(_interval);
posChanging = false;
}
prevP = P;
}, 500);
}
}
});
Это может быть аргументом, что с физикой все норм или мне не расслабляться?
тогда я уже не знаю, куда двигаться.
один прям совсем ожил!!!
Но так только если он напрямую подключен или если на общей шине не больше 3 движков одновременно.
Все таки физические проблемы похоже…
А шина не звездой ли случайно?
Да, все ж физика. Мощный и хорошо спроектированный передатчик контроллера обеспечивает хороший “исходящий” уровень а в приводах видимо недостаточно сильные.
То есть до приводов команды доходят а их ответ контроллеру - нет. Или все ж где-то емкость/наводки. А отключение терминирующего резистора и растяжки в контроллере как-то влияет на связь?
не, точно не звезда.
Но я сейчас выяснил вот что.
Кабель выходит из щитка, соединяет все движки…и от дальнего движка возвращается в шкаф.
Обратка просто свободно висит на клеммниках…
Завтра повешу туда согласующий резистор.
Но это ладно, на прямое то подключение движков та же история…
Ну, резистор все ж лучше 120 ом. И попробовать с ним, с резистором не три (или сколько приводов работало без ошибок) а на один больше. Ну и если шина приводов заходит вторым концом в щит - попробовать этот конец подключить и проверить сколько с “другого края” работает. Можно шину разделить на две тогда, добавив в контроллер еще порт.
Устройство на тот же порт? может быть связано с тем что опрос стал реже. Это можно проверить простым увеличением периода опроса для порта.