keysansa вы не поняли, стандарт прозрачен, путаницу вносят производители, указывая то физический адрес, то логический как первый в карте регистров своих устройств.
keysansa вы не поняли, стандарт прозрачен, путаницу вносят производители, указывая то физический адрес, то логический как первый в карте регистров своих устройств.
Я согласен, что производители вносят путаницу смещением. Но мне не понятно, что в части Modbus является физическим, а что логическим адресом, которые отличатся 1,2,3,4. Я так понимаю, что физический адрес переменной - это адрес памяти устройства, где хранится переменная, доступная обмену по Modbus по ее логическому адресу в таблицах. Но тогда у их смещения могут быть более одной страницы памяти, а никак не +1..4...
Добрый день.
Честно пытался найти на форуме ответ, но по "запросу" передний фронт (rising edge) ничего подходящего не нашел.
В проект подлкючено несколько slave устройст. Естественно они орашиваются значительно дольше, чем идет цикл программы.
Я хочу записывать значение в регистр слева, только если оно было изменено и по триггру "передний фронт".
Вопрос:
Если у меня цикле программы будет такая конструкция:
IF A<>B THEN
wNewValue:=B; //переменная привязанная к каналу
xWriteValue:=TRUE; // триггерная переменная
xWriteValue:=FALSE;
END_IF;
слейв заметит этот "передний фронт"? :)
или надо держать триггер в TRUE и ждать когда значение регистра изменится и только потом сбразывать в FALSE?
наверное есть какое то более надженое решение?
Нет, не заметит.Цитата:
слейв заметит этот "передний фронт"?
При подобном подходе в некоторых конкретных ситуациях могут возникнуть проблемы: например, записываемое в слэйв значение выходит за допустимый диапазон.Цитата:
или надо держать триггер в TRUE и ждать когда значение регистра изменится и только потом сбразывать в FALSE?
В результате слэйв не будет его обрабатывать, значение в регистре останется прежним и триггер навсегда зависнет в TRUE.
Есть типовое решение - использовать ФБ R_TRIG из библиотеки Standard для генерации переднего фронта команды записи.Цитата:
наверное есть какое то более надженое решение?
Чтобы говорить про "надежность" - для начала нужно определить ее критерии.
ага. спасибо.Цитата:
Есть типовое решение - использовать ФБ R_TRIG из библиотеки Standard для генерации переднего фронта команды записи.
я правильно понял, что после того как R_TRIG отработает, можно будет сразу скинуть тригерную переменную?
Код:IF A<>B THEN
wNewValue:=B; //переменная привязанная к каналу
RTRIGInst(CLK:= TRUE);
xWriteValue := RTRIGInst.Q;
xWriteValue:=FALSE;
END_IF;
Нет, вы поняли неправильно.
Пояснение - передача значений переменных, привязанных к каналам, в коммуникационный драйвер происходит после выполнения цикла задачи, к которой привязана программа.Код:IF A <> B THEN
wNewValue := B; //переменная привязанная к каналу
END_IF
RTRIGInst(CLK:= (A <> B), Q => xWriteValue);
"Промежуточные" значения (которые переменная принимает до окончания цикла) не учитываются.
В обоих ваших примерах, которые выложены выше, переменная xWriteValue к концу цикла будет иметь значение FALSE - и коммуникационный драйвер "увидит" только его.
Спасибо!
а может посоветуете учебные материалы для изучения этого вопроса?
или примеры использования откуда можно идеи списать)