Асинхронная связь сложна.
Итак, представьте себе глобальный A_DONE, инициализированный ложным, с B, периодически проверяющим его. Запускает и устанавливает A_DONE. B может реагировать на это событие ... но что он делает, если ему нужно обрабатывать другое событие?
Если вы считаете, что событие, которое сообщает A сигналу A_DONE, происходит только после того, как B видит A_DONE, B может просто сбросить A_DONE на false (при условии, что это всегда происходит до следующего события A_DONE), и цикл может повторяться.
Если A_DONE может появиться «снова», в то время как B обрабатывает результаты просмотра A_DONE, B не может просто сбросить A_DONE: вы можете получить осколок синхронизации, в котором B читает A_DONE, A снова устанавливает A_DONE и B затем очищает A_DONE; теперь вы проиграли событие. Если это событие контролирует ваши аварийные стержни вашего реактора, это может быть очень плохо, потому что пуф, B пропустил его.
В этом случае вам, скорее всего, потребуется рукопожатие от A до B и обратно. Мы добавляем сигнал от B обратно к A, назовем его A_DONE_SEEN, чтобы B сказал A, что он обработал событие. Затем A устанавливает A_DONE, ждет A_DONE_SEEN; A очищает A_DONE, ожидает, что A_DONE_SEEN перейдет в ложь и продолжит свою деятельность. Если A_DONE необходимо установить, когда A_DONE уже установлен или установлен A_DONE_SEEN, мы знаем, что мы пропустили событие, и может быть выполнена некоторая процедура аварийного восстановления. B наблюдает за A_DONE, обрабатывает действие A_DONE, устанавливает A_DONE_SEEN, часы для A_DONE, идущие false, и устанавливает A_DONE_SEEN_FALSE.
Я не знаю о ваших конкретных ПЛК, но во многих системах есть атомарные операции, которые увеличивают количество отсчетов и т. Д. Вы можете использовать это вместо рукопожатия.
Благодарим вас за приятный ответ. – martinhans