Интересно следующее:
1) Есть ли документация на модель памяти КДС и/или ОВЕН ПЛК. Судя по всему, нет.
2) Есть ли защита от word tearing. Например, разные задачи выполняются одновременно и пишут в смежные AT% ячейки памяти (или вообще в соседние биты).
3) out of order writes / happens-before / data race. Грубо говоря, разрешено ли компилятору менять порядок записи переменных.

Даже ПЛК110 (с учётом PRU) выполняет как минимум две задачи, и обработка PRU не влияет на основной цикл => значит должна быть какая-то синхронизация между PRU и механизмом обработки входов-выходов.


Цитата Сообщение от Николаев Андрей Посмотреть сообщение
Как бы я предупреждал. Заведите себе тему и в ней рубитесь.

К сути:
ЦАП на ПЛК работает не через библиотеки, а через Конфигурацию ПЛК. В соответствующий канал записывается значение переменной, в заданном диапазоне.
Про считывание входов, опрос и изменение во время цикла.`
1. К PLCOpen отсылать не буду, но книжку Петрова или Минаева полистать стоит. Есть думаю и другие достойные книги.
2. Нужно понимать особенности работы ПЛК. Опрос области памяти входов - выполнение цикла - запись области памяти выходов - сервисное время - опрос области памяти входов. ПЛК работает так и только так. Классически. Именно по этому Вы обращаетесь не к физической памяти контроллера, а к области памяти AT%...
3. А вот записываются значения физических входов в память входов, и управление физическими выходами из памяти выходов в независимости от цикла ПЛК.

Говоря простыми словами - после того как контроллер считал область памяти входов и ушел в выполнение цикла (а он может быть и в секундах - никто не запрещает) - изменение физических входов восприниматься не будет. И уже только закончив цикл и снова перейдя к чтению области памяти входов контроллер возьмет последнее записанное в эту область памяти значение, которое за это время могло измениться 100 раз.
При этом совершенно не важно сколько у Вас процессоров - 1 или 1000. Если Вы работаете с AT% - Вы всегда берете значение из области памяти входов.

Для задач, где требуется реагировать на изменение значения входов даже когда программа выполняет цикл - прерывания. Но это совсем другая история.

2. Нужно понимать особенности работы ПЛК. Опрос области памяти входов - выполнение цикла - запись области памяти выходов - сервисное время - опрос области памяти входов. ПЛК работает так и только так. Классически. Именно по этому Вы обращаетесь не к физической памяти контроллера, а к области памяти AT%...
Вопрос "что произойдёт, если две одновременно выполняющиеся задачи обратятся к одной/смежной области AT% всё равно открыт".
Например, одна задача запишет первый бит, вторая -- второй. А CPU вряд ли умеет отдельные биты в памяти менять. Наверняка наслоение какое-нибудь пойдёт.
Аналогично с чтением: один меняет биты, а второй читает WORD'ы -- word tearing в полный рост.

Говоря простыми словами - после того как контроллер считал область памяти входов и ушел в выполнение цикла (а он может быть и в секундах - никто не запрещает) - изменение физических входов восприниматься не будет
Если так окажется, что на ПЛК 2 ядра, и в каждый момент на каком-то из ядер выполняется хотя бы одна программа. Внимание, вопрос: в какой момент времени переносятся данные из "физической памяти" в "AT% память" и обратно? Или этот момент разный для разных ядер?

Ну, легко говорить, когда всего одно ядро (тут более-менее понятно, что есть цикл, есть пользовательское и системное время). А когда ядер несколько, то может возникнуть ситуация, что в каждый момент кто-то выполняется, и где там "цикл" неясно.