ISaGRAF в многозадачном режиме: isakerse, isakeret
Для того, чтобы уменьшить время реакции целевой задачи ISaGRAF, целевая задача разделена на два процесса: программу связи и прикладную исполнительную задачу.
Такая архитектура более гибкая. Она позволяет запускать несколько коммуникационных задач с одной и той же целевой задачей или до 4 целевых задач с одной и той же коммуникационной задачей. Это позволяет работать через один и тот же порт с 4 целевыми задачами. Это также облегчает интеграцию различных процессов (например, визуализацию и отладку) в рамках одного приложения.
Целевая задача и задача связи не зависят друг от друга. Единственное требование состоит в том, чтобы задача ядра была запущена первой, так чтобы она смогла установить параметры системного окружения и задача связи смогла связаться с ней.
Задача ISaGraf не нарушает работу фоновых процессов и программ обработки прерываний.
Предлагается два модуля в зависимости от аппаратных возможностей:
- Для последовательной связи: isakerse.o
Этот модуль позволяет запустить ядра и последовательную связь.
- Для последовательной связи и/или через Ethernet: isakeret.o
Этот модуль позволяет запустить ядра и задачи для последовательной связи и/или для связи по Ethernet.
Способ запуска ISaGRAF с помощью этих модулей - один и тот же, с той лишь разницей, что в случае isakeret.o можно указать как имя последовательного устройства для последовательной связи, так и номер порта для связи по Ethernet, которые передаются как параметры при запуске ISaGRAF с помощью tst_main_ex (см. далее).
По отношению к ISaGRAF целевая задача VxWorks является сервером, а отладчик является клиентом, который подсоединяется к указываемому номеру порта.
Регистрация ядра
Ядро ISaGRAF характеризуется номером подчиненного. Он может принимать значения от 1 до 255, исключая 13 ($0D). Этот номер используется в протоколе связи. Он нужен для того, чтобы различать целевые задачи друг от друга когда запущено несколько задач. Поэтому, прежде чем запустить ядра ISaGRAF их нужно зарегистрировать с помощью вызова isa_register_slave().
uchar isa_register_slave
(
uchar slave /* Номер подчиненного */
)
Описание:
Регистрирует новый подчиненный в системе с несколькими целевыми задачами.
Возвращаемое значение:
0 в случае успеха, BAD_RET - в случае ошибок.
Регистрация коммуникационных задач
Коммуникационная задача ISaGRAF характеризуется логическим номером. Он может принимать значения от 1 до 255. Он нужен для того, чтобы различать целевые задачи друг от друга когда запущено несколько задач. Поэтому, прежде чем запустить коммуникационную задачу ISaGRAF ее нужно зарегистрировать с помощью вызова isa_register_com().
uchar isa_register_com
(
uchar com_id /* Идентификатор комм. задачи */
)
Описание:
Регистрирует новый подчиненный в системе с несколькими целевыми задачами.
Возвращаемое значение:
0 в случае успеха, BAD_RET - в случае ошибок.
Каталог для хранения резервных файлов приложения
Глобальная переменная TSK_FUNIT(char *) может содержать название каталога, в котором приложение будет хранить файлы резервных копий. Целевая задача ISaGRAF использует стандартные вызовы fopen, fread, fwrite, fclose для работы с файлами.
Значение по умолчанию - пустая строка (“”), указывающая, что каталог не назначен.
Пример:
TSK_FUNIT = "host name:/C:/ISaGRAF/target/apl/"
Назначает каталог ISaGRAF\target\apl в корне C: на хост-ПК с именем host_name для файлов резервных копий. Важно не забыть последний слеш, иначе файлы будут открываться в каталоге ISaGRAF\target и иметь в имени префикс apl.
При необходимости эта переменная может иметь различные значения для различных целевых задач. Дальнейшие детали о файлах резервных копий содержатся в разделе Отличительные особенности / Резервирование приложения.
Управление окончанием цикла
Переменная TSK_NBTCKSCHED (uint32) имеет значение задержки в тиках, которую целевая задача ISaGRAF использует в конце цикла. Значение по умолчанию - 0 (один и тот же приоритет у всех задач). При необходимости для каждой целевой задачи это значение может быть своим.
Дальнейшие детали содержатся в разделе Отличительные особенности / Продолжительность цикла.
Запуск задачи ядра ISaGRAF
После того как установлены переменные среды, на заключительном шаге с помощью вызова isa_main запускается задача ядра ISaGRAF:
uchar isa_main
(
uchar slave, /* Номер подчиненного*/
char *com /* НЕ ИСПОЛЬЗУЕТСЯ, м.б. пустой строкой*/
)
Описание:
Стартует задачу ядра ISaGRAF.
Возвращаемое значение:
Возвращает ненулевое значение в случае возникновения ошибок.
Номер подчиненного - тот же самый, который обсуждался в разделе о регистрации подчиненного. Может быть запущено несколько целевых задач при условии, что они имеют различные номера подчиненных.
Запуск коммуникационной задачи ISaGRAF
После того как установлены переменные среды, на заключительном шаге с помощью вызова tst_main_ex запускается коммуникационная задача ISaGRAF:
uchar tst_main_ex
(
char *com, /* Имя коммуникационного устройства*/
uchar *slave, Указатель на 4х байтовое поле с номерами подчиненных ядер*/
uchar com_id /* Идентификатор коммуникационной задачи*/
)
Описание:
Стартует коммуникационную задачу ISaGRAF.
Возвращаемое значение:
Возвращает ненулевое значение в случае возникновения ошибок.
В 4х байтовом поле указываются номера подчиненных ядер, с которыми поддерживает связь коммуникационная задача. Если подчиненных меньше 4, соответствующие байты заполняются нулями. После того, как задача запущена это поле больше не используется.
Имя коммуникационного устройства должно совпадать с именем последовательного устройства, через которое поддерживается связь.
Можно запустить более одной коммуникационной задачи, при этом они должны иметь разные идентификаторы задач.
При использовании отладчика необходимо, чтобы номера подчиненных целевой задачи и системы разработки совпадали.
Пример
Данный пример показывает как запустить:
Задачу ядра ISaGRAF с номером подчиненного 1.
Коммуникационную задачу ISaGRAF с идентификатором задачи 1, связанную с ядром 1 через последовательное устройство /tyCo/1.
Коммуникационную задачу ISaGRAF с идентификатором задачи 2, связанную с ядром 1 по Ethernet через порт 1100.
Текущим каталогом является тот, где установлена целевая задача.
Загрузить модуль isassr.o
ld < RELS/isassr.o
Загрузить модуль isakeret.o (Его можно загрузить даже если связь по Ethernet не предполагается)
ld < CMDS/isakeret.o
Конфигурирование последовательной связи
ISAMOD ("/tyCo/1", 19200)
Частота системных часов
CLKRATE = sysClkRateGet ()
Регистрация подчиненного
isa_register_slave (1)
Регистрация коммуникационных задач
isa_register_com (1)
isa_register_com (2)
Каталог для резервирования (можно опустить, ибо используется умолчание)
TSK_FUNIT = ""
Управление окончанием цикла (можно опустить, ибо используется умолчание)
TSK_NBTCKSCHED = 0
Запуск задачи ядра ISaGRAF
sp (isa_main, 1, "")
Коммуникационная задача, связь со подчиненными
SlavesLink = 0x01000000
Запуск коммуникационных задач ISaGRAF
sp (tst_main_ex, "/tyCo/1", &SlavesLink, 1)
sp (tst_main_ex, "1100", &SlavesLink, 2)
Эта последовательность соответствует следующей схеме
Возможны также следующие конфигурации.
Это наиболее типичный случай когда ядро связано с коммуникационной задачей, работающей через последовательный порт (Ethernet).
Эта конфигурация состоит из двух ядер, связанных с одной коммуникационной задачей, работающей через последовательный порт (Ethernet), SlavesLink=0x01020000.