2015-01-27 1 views
2

Я поддерживаю проект для ПЛК, написанного на ST. Для реализации новой функции мне нужно, чтобы циклическая программа А знала, когда событие произошло в циклической программе В.Какой метод обычно используется для связи между программами в структурированном тексте

Как это вообще делается в ST? Я просто использую глобальные переменные или есть другой метод? Если я использую глобальные переменные, как они защищены от одновременной модификации?

Я использую ПЛК X20 от B & R Автоматизация.

ответ

1

Асинхронная связь сложна.

Итак, представьте себе глобальный 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.

Я не знаю о ваших конкретных ПЛК, но во многих системах есть атомарные операции, которые увеличивают количество отсчетов и т. Д. Вы можете использовать это вместо рукопожатия.

+0

Благодарим вас за приятный ответ. – martinhans

1

Да, вам нужно объявить переменную, которая имеет общую область действия для обеих циклических программ.

Вы можете сделать это, используя существующий файл global.var, или вы можете создать новый файл переменной и ограничить, какие программы могут читать или записывать на него, помещая его в «пакет» (папку в вашем проекте).

Чтобы создать новый файл вар декларации ...

-Верны мыши в логическом виде

-add объект

-Выберите категории «Файл» и выберите новый файл

-name и перейти на «сохранить как * .var» в раскрывающемся списке

По умолчанию видимость объявления новой переменной будет ограничена пакетом ge он содержится внутри. Чтобы проверить это, щелкните файл правой кнопкой мыши и перейдите к свойствам. Выберите вкладку сведений.

Невозможно защитить от одновременной модификации, но вы можете использовать инструмент перекрестных ссылок, чтобы увидеть, где выбранная переменная записывается и читается в вашем проекте. Сначала создайте перекрестную ссылку, а затем используйте вкладку внизу.

Удачи вам!