keysansa вы не поняли, стандарт прозрачен, путаницу вносят производители, указывая то физический адрес, то логический как первый в карте регистров своих устройств.
keysansa вы не поняли, стандарт прозрачен, путаницу вносят производители, указывая то физический адрес, то логический как первый в карте регистров своих устройств.
Я согласен, что производители вносят путаницу смещением. Но мне не понятно, что в части Modbus является физическим, а что логическим адресом, которые отличатся 1,2,3,4. Я так понимаю, что физический адрес переменной - это адрес памяти устройства, где хранится переменная, доступная обмену по Modbus по ее логическому адресу в таблицах. Но тогда у их смещения могут быть более одной страницы памяти, а никак не +1..4...
Последний раз редактировалось keysansa; 13.11.2021 в 19:27.
Последний раз редактировалось Евгений Кислов; 13.11.2021 в 19:55.
Связь со мной: telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru (личка на форуме - не подходит)
Раздел CDS V3.5 на сайте | Основные темы по CDS V3.5 на форуме: Вопросы и ответы | Визуализация | Настройка обмена с другими устройствами
Repository Archive V3.5 SP4 (необходим для СПК207/СПК1хх без Eth/ПЛК3xx)
oscat.ru | Как обратиться в техподдержку? | Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | Проблема XY | Как правильно задавать вопросы | AnyDesk
Добрый день.
Честно пытался найти на форуме ответ, но по "запросу" передний фронт (rising edge) ничего подходящего не нашел.
В проект подлкючено несколько slave устройст. Естественно они орашиваются значительно дольше, чем идет цикл программы.
Я хочу записывать значение в регистр слева, только если оно было изменено и по триггру "передний фронт".
Вопрос:
Если у меня цикле программы будет такая конструкция:
IF A<>B THEN
wNewValue:=B; //переменная привязанная к каналу
xWriteValue:=TRUE; // триггерная переменная
xWriteValue:=FALSE;
END_IF;
слейв заметит этот "передний фронт"?
или надо держать триггер в TRUE и ждать когда значение регистра изменится и только потом сбразывать в FALSE?
наверное есть какое то более надженое решение?
Нет, не заметит.слейв заметит этот "передний фронт"?
При подобном подходе в некоторых конкретных ситуациях могут возникнуть проблемы: например, записываемое в слэйв значение выходит за допустимый диапазон.или надо держать триггер в TRUE и ждать когда значение регистра изменится и только потом сбразывать в FALSE?
В результате слэйв не будет его обрабатывать, значение в регистре останется прежним и триггер навсегда зависнет в TRUE.
Есть типовое решение - использовать ФБ R_TRIG из библиотеки Standard для генерации переднего фронта команды записи.наверное есть какое то более надженое решение?
Чтобы говорить про "надежность" - для начала нужно определить ее критерии.
Связь со мной: telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru (личка на форуме - не подходит)
Раздел CDS V3.5 на сайте | Основные темы по CDS V3.5 на форуме: Вопросы и ответы | Визуализация | Настройка обмена с другими устройствами
Repository Archive V3.5 SP4 (необходим для СПК207/СПК1хх без Eth/ПЛК3xx)
oscat.ru | Как обратиться в техподдержку? | Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | Проблема XY | Как правильно задавать вопросы | AnyDesk
ага. спасибо.Есть типовое решение - использовать ФБ 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 - и коммуникационный драйвер "увидит" только его.
Последний раз редактировалось Евгений Кислов; 28.11.2021 в 19:19.
Связь со мной: telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru (личка на форуме - не подходит)
Раздел CDS V3.5 на сайте | Основные темы по CDS V3.5 на форуме: Вопросы и ответы | Визуализация | Настройка обмена с другими устройствами
Repository Archive V3.5 SP4 (необходим для СПК207/СПК1хх без Eth/ПЛК3xx)
oscat.ru | Как обратиться в техподдержку? | Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | Проблема XY | Как правильно задавать вопросы | AnyDesk
Спасибо!
а может посоветуете учебные материалы для изучения этого вопроса?
или примеры использования откуда можно идеи списать)
Связь со мной: telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru (личка на форуме - не подходит)
Раздел CDS V3.5 на сайте | Основные темы по CDS V3.5 на форуме: Вопросы и ответы | Визуализация | Настройка обмена с другими устройствами
Repository Archive V3.5 SP4 (необходим для СПК207/СПК1хх без Eth/ПЛК3xx)
oscat.ru | Как обратиться в техподдержку? | Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | Проблема XY | Как правильно задавать вопросы | AnyDesk