ISaGRAF. Version 3.4

         

ABS


Аргументы:

IN                         REAL                   любая знаковая аналоговая величина

Q                          REAL                   модуль аналоговой величины

Описание:

Дает абсолютное значение действительной величины.

(*FBD пример блока “ABS”*)

(* ST Эквивалент: *)

over := (ABS (delta) > range);

(* IL Эквивалент: *)

LD                     delta

ABS

GT                     range

ST                     over



ACOS


Аргументы:

IN                         REAL                   должен быть в диапазоне [-1.0..+1.0]

Q                          REAL                   арккосинус входа в диапазоне [0.0..Pi]

                                                                        0.0 для неверного входа

Описание:

Вычисляет арккосинус действительной величины.

(*FBD пример блока “COS” и “ACOS”*)

(* ST Эквивалент: *)

cosine := COS (angle);

result := ACOS (cosine); (*результат равен углу *)

(* IL Эквивалент: *)

LD                     angle

COS

ST                     cosine

ACOS

ST                     result



Администратор системных ресурсов: isassro


Этот модуль нужен всегда при любой конфигурации целевой задачи ISaGRAF и должен быть первым среди загружаемых модулей ISaGRAF. Он обеспечивает управление работающими одновременно нескольким целевыми задачами.



Адресная карта Modbus для SCADA


“Сетевые адреса” ISaGRAF часто используются для установления связи между системой ISaGRAF и SCADA на основе Modbus. В этом случае,  SCADA является мастером Modbus, а целевая задача ISaGRAF действует как подчиненный Modbus. Сетевые адреса используются для создания виртуальной карты Modbus для всех переменных ISaGRAF, которые должны управляться из SCADA. “Инструменты / Карта адресов Modbus для SCADA" создает виртуальную карту Modbus с переменными приложения.

Средства карты показывают два списка. Верхний список – это сегмент (положения 4096) карты Modbus, показывающий нанесенные на карту переменные (имеющие сетевые адреса). Нижний список показывает не нанесенные на карту переменные (без определенных сетевых адресов). Адрес "0" не может использоваться в карте для переменной.

Используйте команды "Поместить на карту выбранную переменную" и "Удалить переменную из карты" меню "Редактор", чтобы перемещать переменные из одного списка в другой, и строить, таким образом, карту. Такие же действия могут быть выполнены путем двойного щелчка на символе переменной в списке, чтобы послать ее в другой список. В любой момент вы можете использовать список "Сегмент", чтобы посмотреть другой сегмент в карте.

Команды меню "Опции" могут быть использованы для того, чтобы показать адреса в десятичном или шестнадцатеричном виде.

Команда "Редактор / Заменить" используется для поиска объявленной переменной, нанесена она на карту или нет.



ANA


Аргументы:

IN                                               ANY              любая нецелая аналоговая величина

Q                                                INT                 0 if IN = FALSE / 1 if IN = TRUE

                                                                        число миллисекунд для таймера

                                                                        целая часть действительного

                                                                        аналогового

                                                                        десятичное число представленное

                                                                        строкой

Описание:

Превращает переменную в целую.

(*FBD пример блоков ANALOG*)

(* ST эквивалент: *)

bres := ANA (true);                                (* bres равно 1 *)

tres := ANA (t#1s46ms);                        (* tres равно 1046 *)

mres := ANA ('0198');                            (* mres равно 198 *)

(* IL эквивалент: *)

LD                     true

ANA

ST                     bres

LD                     t#1s46ms

ANA

ST                     tres

LD                     '0198'

ANA

ST                     mres



Аналоговые переменные


Аналоговые означает - непрерывные. Такие переменные могут принимать значения знаковых целых или действительных (плавающих).  Возможны следующие форматы:

Integer            32  битовое знаковое целое: от -2147483647 до +2147483647

Real                        стандартное 32 битовое IEEE плавающее значение (одиночная точность)

                               1 знаковый + 23 бита мантиссы + 8 бит экспоненты

Значение экспоненты аналоговой переменной типа Real не может быть меньше -37 и больше +37.

Аналоговые переменные могут иметь один из следующих атрибутов:

Внутренняя:   переменная, хранящаяся в памяти, изменяемая программой

Константа:      неизменяемая переменная, хранящаяся в памяти, с начальным значением

Вход:               переменная, связанная с устройством ввода (обновляется системой)

Выход:            переменная, связанная с устройством вывода

Замечание:

Когда действительная переменна, привязана к устройству В/В, соответствующий драйвер В/В работает с эквивалентным целым значением.

Предупреждение:

Целые и действительные аналоговые переменные или константы не могут смешиваться в одном и том же аналоговом выражении.



& AND


Замечание: Для этого оператора количество входов может быть больше чем два.

Аргументы:

(inputs)                                      BOOLEAN

output                                        BOOLEAN     логическое И двух или более входов

Описание:

Логическое И двух или больше значений.

(*FBD пример блоков “AND”*)

(* ST эквивалент: *)

bo10 := bi101 AND NOT (bi102);

bo5 := (bi51 AND bi52) AND bi53;

(* IL эквивалент *)

                         LD                     bi101          (* текущий результат := bi101 *)

                         ANDN               bi102          (*текущий результат:= bi101 AND not(bi102) *)

                         ST                     bo10           (* bo10 := текущий результат *)

                         LD                     bi51            (*текущий результат:= bi51;

                         &                       bi52            (*текущий результат:= bi51 AND bi52 *)

                         &                       bi53            (* тек. результат := (bi51 AND bi52) AND bi53 *)

                         ST                     bo5             (* bo5 := текущий результат *)



AND_MASK


Аргументы:

IN                         INT                 целый формат

MSK                    INT                 целый формат

Q                          INT                 побитовый логический AND между IN и MSK

Описание:

Целый аналоговый побитовый И.

(*FBD пример блоков AND_MASK*)

(* ST эквивалент: *)

parity := AND_MASK (xvalue, 1); (* 1 if xvalue is odd *)

result := AND_MASK (16#abc, 16#f0f); (* equals 16#a0c *)

(* IL эквивалент: *)

LD                     xvalue

AND_MASK      1

ST                     parity

LD                     16#abc

AND_MASK      16#f0f

ST                     result



ARCREATE


Аргументы

ID                         INT                 идентификатор массива (должен быть в пределах [0..15])

Size                     INT                 количество элементов в массиве

Q                          INT                 результат исполнения

                                                  1 = если массив был успешно создан

                                                  2 = неправильный идентификатор массива или массив уже создан

                                                  3 = неправильный размер

                                                  4 = не хватило памяти

Описание:

                            Создание массива целых.

Предупреждение:

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

(*FBD программа, создающая массив целых*)

(* ST Эквивалент: *)

array_error := (ARCREATE (ident, 16) <> 1));

(* IL Эквивалент: *)

LD                     ident

ARCREATE       16

NE                     1

ST                     array_error



Архитектура проекта


Проект ISaGRAF разделен на несколько программных модулей, называемых программами. Программы проекта связаны друг с другом в древовидную структуру. Программы могут быть описаны с помощью графических или текстовых языков SFC, FBD, LD, ST или IL.



ARREAD


Аргументы:

ID                         INT                 идентификатор массива (должен быть в пределах [0..15])

Pos                     INT                 позиция элемента в массиве

                                                  (должна быть в пределах [0..size-1])

value                   INT                 значение считанного элемента

                                                  0 = если аргумент неправильный

Описание:

Читает элемент массива целых.

(*FBD программа, использующая блок управления массивом*)

(* ST Эквивалент: *)

If (array_error) Then Return; End_if;

read_value := ARREAD (ident, index);

(* array_error приходит от ARCREATE call *)

(* IL Эквивалент: *)

LD                     array_error

RETC

LD                     ident

ARREAD           index

ST                     read_value



ARWRITE


Аргументы:

ID                         INT                 идентификатор массива (должен быть в пределах [0..15])

Pos                     INT                 позиция элемента в массиве

                                                                        (должна быть в пределах [0..size-1])

IN                         INT                 новое значение элемента

ok                        INT                 результат исполнения

                                                  1 = запись была успешно выполнена

                                                  2 = неправильный идентификатор массива

                                                  3 = неправильный индекс

Описание:

Запоминает (записывает) значение в массив целых.

(*FBD программа, использующая блок управления массивом*)

(* ST Эквивалент: *)

If (array_error) Then Return; End_if;

write_status := ARWRITE (Ident, Index, value);

(* array_error приходит от ARCREATE *)

(* IL Эквивалент: *)

LD                     array_error

RETC

LD                     ident

ARWRITE          index,value

ST                     write_status



ASCII


Аргументы:

IN                         MSG              любая непустая строка

Pos                     INT                 позиция выбранного символа

                                                  в диапазоне [1..len] (len - длина сообщения IN)

Code                   INT                 код выбранного символа

                                                  (в диапазоне [0..255])

                                                  возвращает 0 если Pos вне строки

Описание:

Дает ASCII код символа в строке.

(*FBD пример блока “ASCII”*)

(* ST Эквивалент: *)

FirstChr := ASCII (message, 1);

(* FirstChr - это ASCII код первого символа строки *)

(* IL Эквивалент: *)

LD                     message

ASCII                 1

ST                     FirstChr



ASIN


Аргументы:

IN                         REAL                   должен быть в диапазоне [-1.0..+1.0]

Q                          REAL                   арксинус входа в диапазоне [-PI/2..+Pi/2]

                                                                        0.0 для неверного входа

Описание:

Вычисляет арксинус действительной величины.

(*FBD пример блоков “SIN” и “ASIN”*)

(* ST Эквивалент: *)

sine := SIN (angle);

result := ASIN (sine); (*результат равен углу *)

(* IL Эквивалент: *)

LD                     angle

SIN

ST                     sine

ASIN

ST                     result



ATAN


Аргументы:

IN                         REAL                   любая действительная аналоговая

Q                          REAL                   арктангенс входа в диапазоне [-PI/2..+PI/2]

                                                                        0.0 для неверного входа

Описание:

Вычисляет арктангенс действительной величины.

(*FBD пример блока “TAN”  и “ATAN”*)

(* ST Эквивалент: *)

tangent := TAN (angle);

result := ATAN (tangent); (*результат равен углу *)

(* IL Эквивалент: *)

LD                     angle

TAN

ST                     tangent

ATAN

ST                     result



AVERAGE


Аргументы:

RUN                                           BOO     TRUE=запустить/FALSE=сбросить

XIN                                             REAL    любая аналоговая переменная

N                                                INT         количество образцов, заданное

                                                                 приложением

XOUT                                         REAL     среднее значение XIN

Описание:

Запоминает значение на каждом цикле и вычисляет среднее значение всех уже запомненных величин. Запоминает только N последних значений.

Количество образцов не может превосходить 128.

Если команда “RUN” равна FALSE, то значение на выходе равно значению на входе.

Когда достигнуто максимальное значение N сохраненных величин, первое запомненное значение вытесняется последним.

(*FBD пример блоков “AVERAGE” *)

(* ST Эквивалент: Мы предполагаем, что AVERAGE1 - это экземпляр блока AVERAGE *)

AVERAGE1((auto_mode & store_cmd), sensor_value, 100);

ave_value:= AVERAGE1.XOUT;

(* IL Эквивалент: *)

LD                     auto_mode

AND                  store_cmd

ST                     AVERAGE1.run

LD                     sensor_value

ST                     AVERAGE1.xin

LD                     100

ST                     AVERAGE1.N

CAL                  AVERAGE1

LD                     AVERAGE1.XOUT

ST                     ave_value



BLINK


Аргументы:

RUN                     BOO              режим : TRUE=мигать/FALSE=сброс выхода в FALSE

CYCLE                TMR               период мигания

Q                          BOO              выходной мигающий сигнал

Описание:

Генерирует мигающий сигнал.

Временная диаграмма:



Блоки в LD


Используя Быстрый LD редактор, вы подключаете функциональные блоки к логическим линиям. Функция, в действительности, может быть оператором, функциональным блоком или функцией. Так как блоки не всегда имеют логические входы и/или логические выходы, введение блоков в LD диаграммы приводит к добавлению нескольких новых параметров EN, ENO в интерфейс блока. Параметры EN, ENO не добавляются, если вы используете FBD/LD редактор, и вы можете подключить переменные требуемого типа.

        Вход "EN"

В некоторых операторах, функциях или функциональных блоках первый вход не булевский. Так как первый вход всегда должен быть подключен к шине, на первую позицию автоматически вводится другой вход, называемый “EN”. Блок выполняется только тогда, когда вход EN равен TRUE. Ниже представлен пример оператора сравнения и эквивалентный код на ST:

IF rung_state THEN

   q := (value1 > value 2);

ELSE

   q := FALSE;

END_IF;

(* продолжить шину с состоянием q *)

        Выход "ENO"

В некоторых операторах, функциях или функциональных блоках первый выход не булевский. Так как первый выход всегда должен быть подключен к шине, на первую позицию автоматически вводится другой выход, называемый “ENO”. Выход ENO всегда имеет то же значение, что и первый вход блока. Ниже представлен пример функционального блока AVERAGE и эквивалентный код на ST:

AVERAGE(rung_state, Signal, 100);

OutSignal := AVERAGE.XOUT;

eno := rung_state;

(* продолжить шину с состоянием eno*)

        параметры "EN" и "ENO"

В некоторых случаях требуются EN и ENO. Ниже представлен пример с арифметическим оператором и эквивалентный код на ST:

IF rung_state THEN

   result := (value1 + value2);

END_IF;

eno := rung_state;

(* продолжить шину с состоянием eno *)



BOO


Аргументы:

IN                         ANY              любое не булевское значение

Q                          BOO              TRUE для ненулевого значения

                                                  FALSE для нулевого значения

                                                  TRUE для сообщения 'TRUE'

                                                  FALSE для сообщения 'FALSE'

Описание:

Превращает переменную в булевскую.

(*FBD пример блоков BOO*)

(* ST эквивалент: *)

ares := BOO (10);                                  (* ares равно TRUE *)

tres := BOO (t#0s);                                (* tres равно FALSE *)

mres := BOO ('false');                            (* mres равно FALSE *)

(* IL эквивалент: *)

LD                     10

BOO

ST                     ares

LD                     t#0s

BOO

ST                     tres

LD                     'false'

BOO

ST                     mres



Булевские действия


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

<boolean_variable> (N) ;                          присвоить переменной сигнал активности шага

<boolean_variable> ;                                тот же эффект (N не обязательно)

/ <boolean_variable> ;                              присвоить переменной отрицание сигнала активности шага

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

<boolean_variable> (S) ;                          присваивает переменной значение TRUE, когда шаг

<boolean_variable> (R) ;                          присваивает переменной значение FALSE, когда шаг

Логические переменные должны быть выходными (OUTPUT) или внутренними (INTERNAL). Следующая программа ведет себя таким образом:

Пример:

(* Программа SFC использующая булевские действия *)

 



Булевские переменные


Булевские означает логические. Такие переменные могут принимать одно из двух булевых значений: TRUE (ИСТИНА) или FALSE (ЛОЖЬ). Обычно, булевские переменные используются в логических выражениях. Булевские переменные могут иметь один из следующих атрибутов:

Внутренняя:   переменная, хранящаяся в памяти, изменяемая программой

Константа:      неизменяемая переменная, хранящаяся в памяти, с начальным значением

Вход:               переменная, связанная с устройством ввода (обновляется системой)

Выход:            переменная, связанная с устройством вывода

Предупреждение:

При объявлении логической переменной, могут быть определены строки, заменяющие ‘true’ или ‘false’ во время отладки. Эти строки не могут быть использованы в программах, если они не введены как ‘предопределенные слова’ для языка.



Быстрое объявление


Команда "Инструменты / Быстрое объявление " позволяет вам объявить несколько переменных одновременно. Переменным, созданным с помощью быстрого объявления, присваиваются имена в соответствии с числовым соглашением. Для этого, вы должны определить:

- индекс (число) первой и последней переменной,

- текст, который должен быть добавлен перед или после числа в символе переменной

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

Дополнительно, вы можете определить основные атрибуты созданных переменных (внутренняя, вход или выход...), плюс некоторые свойства, зависящие от типа переменной (атрибут "Хранить", целый или действительный формат, максимальная длина строки сообщения).

Вы всегда должны определять текст, который нужно вводить перед номером переменной так, как символ переменной не может начинаться с цифры. Если "количество переменных" установлено в "Auto", ISaGRAF форматирует количество переменных к минимальному необходимому количеству цифр. Когда определено количество цифр, ISaGRAF форматирует все числа, к определенной длине добавляя спереди символы '0'. Установка фиксированного количества цифр для номеров переменных может быть полезна для предотвращения неправильной лексикографической сортировки. Ниже дан пример.

Пример:  Это установка для быстрого объявления:

будут созданы три следующие переменные:

Var9xx      Var10xx      Var11xx

Пример:  Это установка для быстрого объявления:

будут созданы 100 переменных с именами от MyVar001 до MyVar100



“C” функции


“C” функции используются для расширения стандартных возможностей языков ST и FBD. Они могут быть использованы для реализации специфических вычислений, системных вызовов, связи или для установки набора средств диалога между приложением ISaGRAF и другими задачами. Функции, написанные на языке “C” компилируются и линкуются с ядром ISaGRAF.  Приращенное ядро должно быть инсталлировано на целевой PLC прежде, чем функция будет использована в проекте ISaGRAF.

Новые функции не могут быть интегрированы в симулятор ISaGRAF. Приложения ISaGRAF нужно симулировать до ввода нестандартных функций.

Предупреждение:

Функции - это синхронные операции, вызывающиеся менеджером В/В ISaGRAF, в цикле приложения во время ввода или вывода. Время, затраченное на выполнение функции, включается во временной цикл  ISaGRAF. В функции не должно быть “операций ожидания”, которые неоправданно растягивают временной цикл ISaGRAF.

       Добавление функции в библиотеку ISaGRAF

Для добавления функции в библиотеку ISaGRAF нужно использовать менеджер библиотек ISaGRAF (Library Manager). Используется команда “Новый” из меню “Файл”, когда выбрана библиотека “C” функций. Когда новая “C” функция создана, должно быть написано ее техническое замечание. Скелет исходного текста новой “C” функции автоматически генерируется менеджером библиотек ISaGRAF.

Для того чтобы определить параметры вызова и возврата новой функции используется команда “Parameters” из меню “Редактировать”.

       Использование “C” функций в проекте ISaGRAF

Любая интегрированная “C” функция может быть использована как стандартная функция в программах проекта ISaGRAF. “C” функции могут быть вызваны из языков ST и FBD и из специальных операторов языка SFC.

Вызов “C” функций из языка ST  следует соглашениям языка по вызову функций. Параметры вызова функции записываются после имени функции, между скобок, и разделяются запятыми. Выражение представляет значение, возвращаемое функцией. Вызов “C” функции может быть введен в любой оператор присвоения или сложное выражение.
Вот пример вызова “C” функции в операторе присвоения:

result := ProcName (par1, par2, ... parN);

Программа FBD может вызывать любую “C” функцию. Функция используется как стандартный функциональный ящик. Ее параметры вызова соединяются с левой стороной функционального ящика. Возвращаемый параметр соединяется с правой стороной ящика. Вот стандартный вид такого функционального ящика:



“C” функция может быть вызвана из любого блока действия SFC или любого блока действия, прикрепленного к переходу.

        Определение интерфейса “C” функции

Команда “Параметры”

меню “Редактировать” используется для определения параметров вызова и возврата новой функции. Функция может иметь до 31 параметра вызова, и всегда имеет один параметр возврата. Следующий диалог используется для описания параметров “C” функции:



Список в верхней части окна показывает параметры “C” функции, в соответствии с порядком прототипа: сначала параметры вызова, в конце параметр возврата. Нижняя часть окна показывает детальное описание параметров выбранных в списке:

- имя параметра

- направление параметра (вызов/возврат)

- тип параметра

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

Ниже представлено соответствие между типами ISaGRAF и “C”:

BOOLEAN

unsigned long

32 битное беззнаковое слово: 1=true / 0=false

ANALOG

long

32 битное знаковое целое слово

REAL

float

плавающее значение с одиночной точностью

TIMER

unsigned long

32 битное беззнаковое слово (единица - это 1 миллисекунда)

MESSAGE

char *

строка символов

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

- имя не может быть длиннее 16 символов



- первым символом должна быть буква

- последующими символами могут быть буквы, цифры или символ подчер

- заглавные и прописные буквы не различаются

Одно и то же имя не может быть использовано более чем для одного параметра функции. Параметр вызова не может иметь тот же тип, что и имя возвращаемого параметра. Одно и то же имя может быть использовано для параметров различных функций. Имя возвращаемого параметра по умолчанию - “Q”. Это имя может быть изменено. Имя параметра используется для идентификации исходного текста “C”.

Команда “Вставить” используется для ввода нового параметра перед выбранным параметром. Команда “Удалить” используется для уничтожения выбранного параметра. Команда “Упорядочить”

автоматически сортирует параметры так, что возвращаемый параметр оказывается в конце списка. При нажатии кнопки “Принять” определение интерфейса функции запоминается, и диалог закрывается. Нажатие кнопки “Отказ” закрывает диалог, без изменения интерфейса функции.

       Интерфейс ”C” функции

Интерфейс функции зависит от определения ее параметров. Параметры передаются через структуру. Эта структура определена в файле “GRUS0nnn.H”, где “nnn” - это логический номер функции в библиотеке ISaGRAF. Вот пример “C” интерфейса функции “SIN” (вычисление синуса):

/* Файл: GRUS0255.h - function "sample" */

typedef  long                                       T_BOO;

typedef  long                                       T_ANA;

typedef  float                                       T_REAL;

typedef  long                                       T_TMR;

typedef  char                                        *T_MSG;

typedef struct {

             /* CALL   */                            T_REAL   _param1;

             /* RETURN */                         T_REAL   _param2;

} str_arg;

#define PARAM1                               (arg->_param1)

#define PARAM2                               (arg->_param2)

/* end of file */

Ниже представлено соответствие между типами ISaGRAF и “C”.


Типы ISaGRAF определены как типы “C” в файле определения функции:

boolean

T_BOO

long (32 бита)

Integer analog

T_ANA

long

Real analog

T_REAL

float (32 бита, плавающее значение с одиночной точностью)

timer

T_TMR

long

message

T_MSG

char* (32 битный указатель)

Каждое поле структуры “str_srg” соответствует одному параметру функции. Возвращаемый параметр - последний в структуре. Параметры вызова возникают в структуре в том же порядке, в котором они были установлены в определении функции. Имена идентификаторов вводятся во время определения функции в менеджере библиотек ISaGRAF.

Файл определений изменяется каждый раз, когда интерфейс функций изменяется менеджером библиотек ISaGRAF. Это обеспечивает полное соответствие между реализацией функции и его использованием в программах ISaGRAF.

       Исходный текст

Ниже представлен стандартный скелет “C” функции:

/* Пример функции пользователя - Номер “255”  - имя ”SAMPLE”*/

#include "tasy0def.h"                        /* Общие определения ядра ISaGRAF */

#include "grus0255.h"                       /* определения интерфейса для функции */

void USP_sample (str_arg *arg)

{

             /* тело функции */

}

/*Следующая функция используется для инициализации функции и объявления ее реализации. Она реализует связь с ядром ISaGRAF, используя имя функции. Эта функция полностью генерируется менеджером библиотек ISaGRAF*/

UFP uspdef_sample (char *name)

{

             strcpy (name, "SAMPLE");  /* дает имя функции */

             return (USP_sample);            /* возвращает реализацию функции */

}

/* конец файла */

Включенный файл “TASY0DEF.h” из ядра ISaGRAF требуется для системозависимых определений. Он, также содержит тип UFP, который представляет указатель на  пустую функцию, и используется для объявления функции.

       Связь  между проектами и “C” реализацией

Логическая связь между реализацией функции и ее использованием в программах проекта ISaGRAF осуществляется через имя функции.


Функция объявления добавляется в исходный “C” код функции. Эта функция вызывается только один раз, когда приложение стартует и сообщает менеджеру В/В имя, которое соответствует реализованной функции. Вот стандартный формат такой функции объявления:

UFP uspdef_xxx (char *name)

{

             strcpy (name, "XXX");          /* gives the name of the function */

             return (USP_xxx);                    /* returns the implementation function */

}

/* (xxx is the name of the function) */

Имя функции, использующееся оператором strcpy, должно быть написано заглавными буквами. Оно должно быть написано маленькими буквами в реализации функции и в имени функции объявления. Использование префиксов ”USP_” и “uspdef_” для реализации функции и определения функции позволяет пользователю именовать функции ключевыми словами языка “C” или именами существующих функций из “C” библиотек ISaGRAF.

В функцию объявления могут быть добавлены другие операторы для того, чтобы реализовать специфические операции инициализации связанные с этой функцией. Система ISaGRAF гарантирует, что эта функция вызывается только однажды при запуске приложения. Функция объявления вызывается для любой интегрированной функции, даже если она не используется в приложении ISaGRAF.  Ядро  ISaGRAF выдает ошибку, если в приложении используется не реализованная функция.

Прежде чем линковать новые функции с ядром, пользователь должен написать другой файл с исходным текстом, под именем “GRUS0LIB.C” и вставить его с сохраненной функцией в список файлов для линкера. “GRUS0LIB.C” содержит только массив функций объявления. Этот массив читается во время инициализации приложения, для того чтобы создать динамические связи с функциями написанными на “C”. Вот пример такого файла:

/* Файл "GRUS0LIB.c" - Пример using trigonometric functions */

#include <tasy0def.h>                       /* required for types definition */

extern UFP uspdef_fc1 (char *name);             /* declaration functions */



extern UFP uspdef_fc2 (char *name);

extern UFP uspdef_fc3 (char *name);

extern UFP uspdef_fc4 (char *name);

UFP_LIST USPDEF[ ] = {                  /* array of declaration functions  */

             /* for integrated functions */

             uspdef_fc1,

             uspdef_fc2,

             uspdef_fc3,

             uspdef_fc4,

NULL };

/* end of file */

Массив USPDEF должен заканчиваться указателем NULL. Если это условие не выполнено, то могут возникнуть некоторые проблемы. Если массив USPDEF не определен, то во время линковки нового ядра ISaGRAF появятся неразрешенные ссылки. Написав этот файл, можно построить новое ядро, включая все существующие функции. Можно, также построить ядро, приспособленное для одного проекта, путем введения в массив USPDEF только тех преобразований, которые используются в проекте. Файл “GRUS0LIB.C” автоматически генерируется генератором кодов ISaGRAF, когда создается код приложения. Файл помещается в директорию проекта ISaGRAF и объединяет только те функции, которые используются в проекте.

 Ограничения

Библиотека ISaGRAF может содержать до 255 “C” функций. Функция может выполнять любой тип операции. Необходимо заметить, что  функции вызываются в цикле ISaGRAF синхронно, так что выполнение функции оказывает непосредственное влияние на временной цикл.

       Полный пример

Техническое замечание:

имя:                    Sample                                             

описание:          счетчик вверх

дата:                  18 мая 1995

автор:                CJ International

вызов:               CU: считающийся вход

                        R:    команда сброса

                           PV:  максимальная планируемая величина

возврат:            Q: определение максимума

                           СV: результат счета

прототип:          sample (count, reset_command, maximum_value);

                           max_detect := SAMPLE.Q;

                           count_result := SAMPLE.CV;

Интерфейс функции:





Заголовок функции:

/* Файл: GRUS0255.h - user C function definitions - Name: sample */

/* definition of standard ISaGRAF data types */

typedef long  T_BOO;

typedef long  T_ANA;

typedef float T_REAL;

typedef long  T_TMR;

typedef char  *T_MSG;

/* definition of the calling and return parameter structure */

typedef struct {

             T_ANA _par1;                       /* calling parameter #1 */

             T_ANA _par2;                       /* calling parameter #2 */

             T_ANA _sum;                        /* return parameter */

} str_arg;

/* identifiers used to access call and return parameters */

#define PAR1                                      (arg->_par1)

#define PAR2                                      (arg->_par2)

#define SUM                                       (arg->_sum)

/* end of file */

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

/* Файл: GRUS0255.c - user C function - Name: SAMPLE */

#include "tasy0def.h"                        /* required for types definition */

#include "grus0255.h"                       /* C function source header */

/* C main service: calculates the addition */

void USP_sample (str_arg *arg)

{

             SUM = PAR1 + PAR2;

}

/* declaration service required for dynamic link with ISaGRAF kernel */

UFP uspdef_sample (char *name)

{

             strcpy (name, "SAMPLE");

             return (USP_sample);

}

/* end of file */


“C” функции преобразований


Система разработки ISaGRAF включает утилиту линейного преобразования для выполнения простого преобразования В/В во время работы ISaGRAF на целевой машине. Эта утилита не требует никакой “C” разработки, так как она ограничивается прямым увеличением или уменьшением  непрерывных функций.

Функции преобразования позволяют пользователю применять любые сложные преобразования, с специфическими операциями описанными на языке “C”. Обычно, функции преобразования определяются как для входов, так и для выходов. Даже если одно из направлений не используется, его необходимо реализовать и протестировать прежде, чем интегрировать преобразование в ядро ISaGRAF, во избежание сбоя системы, обусловленного неправильным вызовом.

Функции преобразования, написанные на языке “C” компилируются и линкуются с ядром ISaGRAF.  Приращенное ядро должно быть инсталлировано на целевой PLC прежде, чем функция преобразования будет использована в проекте ISaGRAF. Новая функция преобразования не может быть интегрирована в симулятор ISaGRAF. Приложения ISaGRAF нужно симулировать до ввода нестандартных функций преобразования.

Исходные коды "C" стандартных преобразований написанный CJ International инсталлируется вместе с системой разработки ISaGRAF. Они могут быть использованы как примеры для создания новых функций. Не рекомендуется изменять

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

Предупреждение:

Функции преобразования - это синхронные

операции, вызывающиеся менеджером В/В ISaGRAF, в цикле приложения во время ввода или вывода. Время, затраченное на выполнение функции преобразования, включается во временной цикл  ISaGRAF. В функции преобразования не должно быть “операций ожидания”, которые неоправданно растягивают временной цикл ISaGRAF.

        Добавление функции в библиотеку ISaGRAF

Для добавления функции в библиотеку ISaGRAF нужно использовать менеджер библиотек ISaGRAF (Library Manager).
Используется команда “Новый” из меню “Файлы”, когда выбрана библиотека функций преобразования. Никаких параметров в системе разработки определять не надо потому, что функции преобразований используют стандартный предопределенный интерфейс.

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

        Использование преобразований в проекте ISaGRAF

Определенные функции преобразований могут быть использованы для фильтрации  входных и выходных аналоговых переменных выбранного проекта. Для того чтобы присоединить функции преобразования к переменной запускается редактор объявления переменной, выбирается входная или выходная аналоговая переменная и затем редактируются ее параметры. Поле преобразование диалога объявления аналога используется для установки функции преобразования присоединенной к аналоговой переменной В/В:



В списке возникают функции преобразования и таблицы. Это означает, что одно и тоже имя не может быть использовано для функции и таблицы.

Переменная не может быть присоединена к функции преобразования, которую только предполагается определить и интегрировать в ISaGRAF.

        Стандартный “C” интерфейс

Интерфейс функции преобразования всегда имеет один и тот же формат. Параметры и возвращаемое значение передаются через структуру. Структура определена в файле “TACN0DEF.h”:

/*

  Имя: tacn0def.h

  Файл определений преобразований целевой задачи

*/

#define DIR_INPUT 0                        /* направление = вход преобразования  */

#define DIR_OUTPUT 1                    /* направление = выход преобразования */

typedef int32   T_ANA;                     /* integer ANA type              */

typedef float   T_REAL;                    /* real ANA type                 */

typedef struct {                                   /* структура преобразования          */

      uint16 number;                              /* номер преобразования (зарезервирован)  */



      uint16 direction;                            /* направление преобразование          */

      T_REAL *before;                         /* значение до преобразования       */

      T_REAL *after;                             /* значение после преобразования        */

   } str_cnv;

#define ARG_BEFORE (*(arg->before))

#define ARG_AFTER  (*(arg->after))

#define DIRECTION  (arg->direction)

/* eof */

Структура “str_cnv” полностью описывает интерфейс. Единственный параметр “C” функции преобразования - указатель на эту структуру. Поле “number” - это логический номер функции преобразования (положение в библиотеке ISaGRAF), оно не должно использоваться в программе.

Поле “direction” определяет тип переменной, к которой применяется функция преобразования (входная или выходная). Она содержит значение DIR_INPUT для преобразования входов и DIR_OUTPUT для преобразования выходов.

Поле “before” указывает на значение до преобразования. Это поле имеет различные значения для преобразований входов и преобразований выходов. Оно представляет электрическое значение (считанное с устройства ввода) для преобразования входа, когда поле direction принимает значение DIR_INPUT. Оно представляет физическое  значение (использующееся в программе) для преобразования выхода, когда поле direction принимает значение DIR_OUTPUT.

Поле “after” указывает на значение после преобразования. Это поле имеет различные значения для преобразований входов и преобразований выходов. Оно представляет физическое значение (считанное с устройства ввода) для преобразования входа, когда поле direction принимает значение DIR_INPUT. Оно представляет электрическое  значение (использующееся в программе) для преобразования выхода, когда поле direction принимает значение DIR_OUTPUT.

Программист может использовать определения “ARG_BEFORE” и “ARG_AFTER” для прямого доступа к полям before и after структуры переданной в функцию преобразования. Обрабатываемые значения - плавающие с одиночной точностью.


Результат превращается в long integer, когда преобразование применяется к целой аналоговой переменной. Это означает, что одно и тоже преобразование может быть использовано, как для целых, так и для действительных аналоговых переменных В/В.       

       Исходный текст

Так как функции преобразования могут быть использованы как для входных, так и для выходных аналоговых переменных, исходный “C” текст функции разделен на две основные части: преобразование входов и преобразование выходов. Поле direction структуры интерфейса используется для выбора преобразования, которое будет применяться. Менеджер библиотек ISaGRAF автоматически генерирует  полный скелет функции, когда функция преобразования создается. Он включает основную выбирающую структуру IF. Ниже представлен стандартный скелет функции преобразования:

/*

  conversion function

  name: sample

*/

#include <tasy0def.h>

#include <tacn0def.h>

void CNV_sample (str_cnv *arg)

{

             if (DIRECTION == DIR_INPUT) { /*INPUT CONV*/

             }

             else { /*OUTPUT CONV*/

             }

}

/*Следующая функция показывает связь с менеджером В/В используя имя преобразования. Эта функция полностью генерируется менеджером библиотек ISaGRAF*/

UFP cnvdef_sample (char *name)

{

             sys_strcpy (name, "SAMPLE");         /* дает имя преобразования */

             return (CNV_sample);            /* возвращает функцию реализации */

}

Лучший способ заполнить специфические части функции - это написать две отдельные локальные функции для преобразования входов и преобразования выходов. Эти функции будут вызываться основным алгоритмом, как показано в комментариях предыдущего примера, в основной структуре SFC.

Включенный файл “TASY0DEF.h” из ядра ISaGRAF требуется для системозависимых определений. Он, также содержит тип UFP, который представляет указатель на  пустую функцию, и используется для объявления функции.

       Связь  между проектами и “C” реализацией



Логическая связь между реализацией функции преобразования и использованием преобразования в проекте ISaGRAF осуществляется через имя преобразования. Функция  “объявления” добавляется в исходный “C” код функции преобразования. Эта функция вызывается только один раз, когда приложение стартует и сообщает менеджеру В/В имя преобразования, которое соответствует реализованной функции. Вот стандартный формат такой  функции объявления:

UFP cnvdef_xxx (char *name)

{

             strcpy (name, "XXX");          /* имя преобразования */

             return (CNV_xxx);                   /* возвращает функцию преобразования */

}

/* (xxx is the name of the conversion) */

Имя функции, использующееся оператором strcpy, должно быть написано заглавными буквами. Оно должно быть написано маленькими буквами в реализации функции преобразования и в имени функции объявления.

Использование префиксов ”CNV_” и “cnvdef_” для реализации функции и определения функции позволяет пользователю именовать преобразования ключевыми словами языка “C” или именами существующих функций из “C” библиотек ISaGRAF.

В функцию объявления могут быть добавлены другие операторы для того, чтобы реализовать специфические операции инициализации связанные с этим преобразованием. Система ISaGRAF гарантирует, что эта функция вызывается только однажды при запуске приложения.

Функция объявления вызывается для любой интегрированной функции преобразования, даже если она не используется в приложении ISaGRAF.  Ядро  ISaGRAF выдает ошибку, если в приложении используется не реализованная функция преобразования.

Прежде чем линковать новые функции с ядром, пользователь должен написать другой файл с исходным текстом, под именем “GRCN0LIB.C” и вставить его с сохраненной функцией преобразования в список файлов для линкера. “GRCN0LIB.C” содержит только массив функций объявления. Этот массив читается во время инициализации приложения, для того чтобы создать динамические связи с функциями преобразования написанными на “C”.


Вот пример такого файла:

/* Файл "GRCN0LIB.c" - Пример with conversions of standard library */

#include <tasy0def.h>                       /* required for types definition */

extern UFP cnvdef_scale (char *name);         /* decl. function for SCALE conv */

extern UFP cnvdef_bcd (char *name);           /* decl. function for BCD conv */

UFP_LIST CNVDEF[ ] = {                 /* array of declaration functions for */

             /* integrated conversion functions */

             cnvdef_scale,

             cnvdef_bcd,

NULL };

/* end of file */

Массив CNVDEF должен заканчиваться указателем NULL. Если это условие не выполнено, то могут возникнуть некоторые проблемы. Если массив CNVDEF не определен, то во время линковки нового ядра ISaGRAF появятся неразрешенные ссылки.

Написав этот файл можно построить новое ядро, включая все существующие преобразования. Можно, также построить ядро, приспособленное для одного проекта, путем введения в массив CNVDEF только тех преобразований, которые используются в проекте. Файл “GRCN0LIB.C” автоматически генерируется генератором кодов ISaGRAF, когда создается код приложения. Файл помещается в директорию проекта ISaGRAF и объединяет только те преобразования, которые используются в проекте.

 Ограничения

Библиотека ISaGRAF может содержать до 128 функций преобразования. Функция преобразования может выполнять любой тип операции. Необходимо заметить, что  функции вызываются в цикле ISaGRAF синхронно, так что выполнение функции оказывает непосредственное влияние на временной цикл.


“C” функциональные блоки


“C” функциональные блоки объединяют операции и статические данные. Они дополняют набор “C” функций, допуская обработку статических объектов. “C” функции, обычно, используются для расширения стандартных возможностей языков ST и FBD. В отличие от функций, они могут работать со статическими данными. Это означает, что алгоритм функционального блока может меняться с течением времени.

Функциональные блоки, написанные на языке “C” компилируются и линкуются с ядром ISaGRAF.  Приращенное ядро должно быть инсталлировано на целевой PLC прежде, чем функция будет использована в проекте ISaGRAF. Новые функциональные блоки не могут быть интегрированы в симулятор ISaGRAF. Приложения ISaGRAF нужно симулировать до ввода нестандартных функций.

Предупреждение:

Функциональные блоки выполняют синхронные

операции, вызывающиеся ядром ISaGRAF, в цикле приложения. Время, затраченное на выполнение функции, включается во временной цикл  ISaGRAF. В функциональном блоке не должно быть “операций ожидания”, которые неоправданно растягивают временной цикл ISaGRAF.

       Объявление экземпляров функционального блока

Функциональный блок - это объект, который объединяет операции и статические данные. Ниже представлен пример функционального блока R_TRIG, который определяет передний фронт булевского выражения. Вот его описание:

Скрытая статическая  переменная “previous_state”

нужна для определения фронта. Эта переменная должна быть различной в каждом использовании функционального блока “R_TRIG” в приложении. Экземпляр функционального блока, используемого в языке ST, должен быть объявлен в словаре.  Так как функциональный блок имеет внутренние скрытые данные, каждая копия (экземпляр) функционального блока должна быть идентифицирована уникальным именем. Наименование типа блока осуществляется при помощи менеджера библиотек. Наименование экземпляров осуществляется при помощи редактора словаря.

Функциональные блоки, использующиеся в языке FBD не нужно объявлять, потому что редактор FBD автоматически объявляет экземпляры используемых блоков.
Экземпляры функциональных блоков автоматически объявленные редактором FBD всегда локальные для редактируемой программы.

       Добавление функционального блока в библиотеку ISaGRAF



Для добавления функционального блока в библиотеку ISaGRAF нужно использовать менеджер библиотек ISaGRAF. Используется команда “Новый” из меню “Файл”, когда выбрана библиотека функциональных блоков. Когда новый функциональный блок создан, должно быть написано его техническое замечание. Скелет исходного текста нового функционального блока автоматически генерируется менеджером библиотек ISaGRAF. Для того чтобы определить параметры вызова и возврата нового функционального блока используется команда “Параметры” из меню “Редактировать”.

        Добавление функционального блока в библиотеку ISaGRAF

Для добавления функционального блока в библиотеку ISaGRAF нужно использовать менеджер библиотек ISaGRAF (Library Manager). Используется команда “Новый” из меню “Файл”, когда выбрана библиотека функциональных блоков. Когда новый функциональный блок создан, должно быть написано его техническое замечание. Скелет исходного текста нового функционального блока автоматически генерируется менеджером библиотек ISaGRAF. Для того чтобы определить параметры вызова и возврата нового функционального блока используется команда “Parameters” из меню “Редактировать”.

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

FBINSTNAME.parname

используется, чтобы представить возвращаемый параметр “parname”, экземпляра функционального блока “FBINSTNAME”.

Экземпляры функционального блока, используемого в языке ST, должны быть объявлены в словаре.  Каждая копия (экземпляр) функционального блока должна быть идентифицирована уникальным именем.


Вот пример объявлений в библиотеке ISaGRAF:

instance:                 TRIG1                                               type:                 R_TRIG

                                TRIG2                                                                        R_TRIG

И пример использования, объявленных экземпляров в ST программе:

TRIG1 (boo_input1);

TRIG2 (boo_input2);

Command := (TRIG1.Q & TRIG2.Q);

Программа FBD может вызывать любой функциональный блок. Функциональный блок используется как стандартный функциональный ящик. Его параметры вызова соединяются с левой стороной функционального ящика. Возвращаемые параметры соединяется с правой стороной ящика. Вот стандартный вид такого функционального ящика:



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



        Определение интерфейса “C” функционального блока

Команда “Параметры”

меню “Edit” используется для определения параметров вызова и возврата нового функционального блока. Функциональный блок может иметь до 32

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

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

- имя параметра

- направление параметра (вызов/возврат)

- тип параметра

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

Ниже представлено соответствие между типами ISaGRAF и “C”:



BOOLEAN

unsigned long

32 битовое беззнаковое слово: 1=true / 0=false

ANALOG

long

32 битное знаковое целое слово

REAL

float

плавающее значение с одиночной точностью

TIMER

unsigned long

32 битное беззнаковое слово (единица - это 1 миллисекунда)

MESSAGE

char *

строка символов

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

- имя не может быть длиннее 16 символов

- первым символом должна быть буква

- последующими символами могут быть буквы, цифры или символ подчеркивания

- заглавные и прописные буквы не различаются

Одно и то же имя не может быть использовано более чем для одного параметра функционального блока. Параметр вызова не может иметь тот же тип, что и имя возвращаемого параметра. Одно и то же имя может быть использовано для параметров различных функциональных блоков. Имя возвращаемого параметра по умолчанию - “Q”. Это имя может быть изменено. Имя параметра используется для идентификации исходного текста “C”.

Команда “Вставить” используется для ввода нового параметра перед выбранным параметром. Команда “Удалить” используется для уничтожения выбранного параметра. Команда “Упорядочить”

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

       Интерфейс ”C” функционального блока

Интерфейс функционального блока зависит от определения его параметров. Параметры передаются через структуру. Эта структура определена в файле “GRFB0nnn.H”, где “nnn” - это логический номер функции в библиотеке ISaGRAF. Вот пример “C” интерфейса функционального блока “LIM_ALRM” (тревога предела):



/* function block interface - name: sample */

/* standard ISaGRAF data types */

typedef                                                 long       T_BOO;

typedef                                                 long       T_ANA;

typedef                                                 float       T_REAL;

typedef                                                 long       T_TMR;

typedef                                                 char        *T_MSG;

/* structure of calling parameters */

typedef struct {

             /* CALL   */                            T_BOO  _par1;

             /* CALL   */                            T_BOO  _par2;

} str_arg;

/* access to fields of str_arg structure */

#define                                                  PAR1     (arg->_par1)

#define                                                  PAR2     (arg->_par2)

/* return parameter logical numbers */

#define                                                  FBLPNO_Q1        0

#define                                                  FBLPNO_Q2        1

/* конец файла*/

Ниже представлено соответствие между типами ISaGRAF и “C”. Типы ISaGRAF определены как типы “C” в файле определения функционального блока:

boolean

T_BOO

long (32 бита)

analog

T_ANA

long

real

T_REAL

float (32 бита, плавающее значение с одиночной точностью)

timer

T_TMR

long

message

T_MSG

char* (32 битный указатель)

Каждое поле структуры “str_srg” соответствует одному параметру функционального блока.  Параметры вызова в структуре в том же порядке, в котором они были установлены в определении функционального блока. Идентификатор, написанный заглавными буквами, определяется для того, чтобы иметь прямой доступ к параметрам структуры передающейся в “C” реализацию службы активизации функционального блока. Имена идентификаторов вводятся во время определения функции в менеджере библиотек ISaGRAF.



Порядок нумерации возвращаемых параметров тот же который был установлен в определении функционального блока. Логический номер первого возвращаемого параметра всегда равен 0.

Определенные идентификаторы нужно использовать вместо численных значений для того, чтобы представить возвращаемые параметры в исходном тексте “C” программы. Это гарантирует, что исходный файл может быть легко перекомпилирован после изменений интерфейсных определений.

Файл определений изменяется каждый раз, когда интерфейс функций изменяется менеджером библиотек ISaGRAF. Это обеспечивает полное соответствие между реализацией функции и его использованием в программах ISaGRAF.

       Исходный текст

Реализация функционального блока на “C” делится на три входные точки:

службы инициализации

службы активизации - обработка параметров вызова

службы чтения возвращаемых параметров

Один и тот же код используется для каждого экземпляра одного функционального блока и не дублируется. С каждым экземпляром связана структура статических данных. К этим данным нет прямого доступа из ISaGRAF. Они содержат “скрытые переменные” функционального блока.

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

“Служба чтения” вызывается ядром ISaGRAF для чтения текущего значения одного возвращаемого параметра для одного экземпляра. В такой службе не нужно выполнять никаких специальных вычислений. Она только осуществляет передачу между скрытыми данными и приложением ISaGRAF.

Функциональная схема:



·       Статические данные функционального блока

Функциональный блок связывает операции и статические данные. С каждым экземпляром одного и того же функционального блока связана структура данных. Каждый раз, когда функциональный блок используется в программах ST или FBD, он соответствует одному экземпляру и одной структуре данных.


Следующий пример показывает соответствие между структурами данных “C” и экземплярами функционального блока, использующимися в FBD программе:



Память, требующаяся для структуры данных каждого экземпляра, размещается системой ISaGRAF, при запуске приложения. Указатель на соответствующую структуру данных экземпляра передается в службы “активизации” и “чтения”.

Менеджер библиотек ISaGRAF автоматически генерирует скелет исходного текста “C” для определения типа структуры данных. Тип структуры данных всегда называется “str_data”. Программист не должен изменять это имя для того, чтобы обеспечить совместимость с заголовками службы. Скрытые данные, обычно, группируют внутренние переменные с образом возвращаемых параметров. Служба “чтения” функционального блока используется для доступа к возвращаемым параметрам и  не может быть использована для других операций.

·       Служба инициализации

Служба инициализации функционального блока вызывается ядром ISaGRAF при запуске приложения. Она позволяет “C” программисту запросить систему разместить память для экземпляра. Ниже - стандартная программа службы инициализации:

uint16 FBINIT_xxx (uint16 hinstance)

/* "xxx" is the name of the f. block */

{

   return (sizeof (str_data));

}

Аргумент “hinstance” - это логический номер экземпляра. Он резервируется ISaGRAF для внутренних операций и не должен использоваться для программирования службы. Служба инициализации возвращает количество байт памяти требуемое для данных одного экземпляра. Объем требуемой памяти (возвращаемое значение) не может превышать 64K. Никакие другие операции не должны выполняться в этой службе. Исходный текст этой службы автоматически генерируется менеджером библиотек ISaGRAF при создании функционального блока.

·       Служба активизации

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


Ниже - стандартный скелет службы активизации:

void FBACT_xxx (

uint16 hinstance,                                 /* "xxx" is the name of the function block

*/

                                                               /* logical number of the instance */

str_data *data,                                    /* data: pointer to the instance data structure

*/

str_arg *arg                                         /* pointer to the calling parameters structure

*/

)

{

}

Аргумент “hinstance” - это логический номер экземпляра. Он резервируется ISaGRAF для внутренних операций и не должен использоваться для программирования службы. Аргумент “data” - это дальний указатель на структуру данных связанных с экземпляром. Аргумент “arg” это дальний указатель на структуру, которая содержит значения параметров вызова. Программист должен использовать идентификаторы, определенные в “C” заголовке функционального блока для доступа к полям структуры “arg”.

Алгоритм “активизации” обрабатывает параметры вызова (сохраненные в структуре “arg”) и изменяет поля структуры “data”.

Следующий пример показывает службу активизации функционального блока TRIG (определение переднего фронта):

/* definitions stored in the function block "C" header */

typedef struct {                                   /* calling parameters */

             T_BOO  _clk;                          /* trigger input */

} str_arg;

#define CLK       (arg->_clk)

/* function block instance data structure */

typedef struct {

             T_BOO prev_state;               /* previous state of the trigger input */

             T_BOO edge_detect;            /* edge value: image of return param */

} str_data;

/* activation service */

void FBACT_trig (uint16 hinstance, str_data *data, str_arg *arg)

{

             data->edge_detect = (T_BOO)(CLK && !data->prev_state);

             data->prev_state = CLK;  /* calling parameter */



}

Исходный текст этой службы автоматически генерируется менеджером библиотек ISaGRAF при создании функционального блока.

·       Чтение возвращаемых параметров

Служба “чтение’ вызывается каждый раз, когда ST или FBD программа ссылается на возвращаемый параметр функционального блока. Она используется для того, чтобы получить один возвращаемый параметр. Следующий пример показывает вызов “чтения”, исполняющийся во время работы ST программы:



Так как служба “чтение”  может быть вызвана более одного раза в течение цикла, для одного и того же возвращаемого параметра или экземпляра функционального блока, никаких специальных вычислений не должно выполняться в такой службе. Она только осуществляет передачу между скрытыми данными и приложением ISaGRAF. Ниже - стандартный скелет для службы чтения:

/* cast operation used to copy the value of a return parameter */

#define BOO_VALUE                        ((T_BOO *)value)

#define ANA_VALUE                       ((T_ANA *)value)

#define REAL_VALUE                      ((T_REAL *)value)

#define TMR_VALUE                       ((T_TMR *)value)

#define MSG_VALUE                        ((T_MSG *)value)

/* return parameters read service: called for each return parameter */

void FBREAD_xxx (                            /* "xxx" is the name of the function block */

uint16 hinstance,                                 /* logical number of the instance */

str_data *data,                                    /* pointer to the instance data structure */

uint16 parno,                                        /* logical number of read parameter */

void *value)                                         /* buffer where to copy the value of the param */

{

             switch (parno) {

                   case FBLPNO_XX: /* ... */ break;

                   case FBLPNO_YY: /* ... */ break;

                    /* .... */

             }

}

Аргумент “hinstance” - это логический номер экземпляра.


Он резервируется ISaGRAF для внутренних операций и не должен использоваться для программирования службы. Аргумент “data” - это дальний указатель на структуру данных связанных с экземпляром.

Аргумент “parno” - это логический номер возвращаемого параметра, значение которого требуется. Используйте идентификаторы, определенные в “C” заголовке функционального блока для идентификации возвращаемого параметра.  Тип данных, на которые указывает этот аргумент, зависит от типа возвращаемого параметра.

Ниже представлено соответствие между типами ISaGRAF и “C”:

boolean

long

32 битное беззнаковое слово: 1=true / 0=false

analog

long

32 битное знаковое целое слово

real

float

плавающее значение с одиночной точностью

timer

long

32 битное беззнаковое слово (единица - это 1 миллисекунда)

message

char *

строка символов

Следующие макроопределения  используются для доступа к буферу копирования, в соответствии с типом возвращаемого параметра:

#define             BOO_VALUE                       ((T_BOO *)value)

#define             ANA_VALUE                       ((T_ANA *)value)

#define             REAL_VALUE                      ((T_REAL *)value)

#define             TMR_VALUE                        ((T_TMR *)value)

#define             MSG_VALUE                       ((T_MSG *)value)

Вот общие программные операции для копирования значения или параметра к буферу ISaGRAF:

/* for a boolean parameter: */

   *BOO_VALUE = parameter_value;

/* for an integer analog parameter: */

   *ANA_VALUE = parameter_value;

/* for a real integer parameter: */

   *REAL_VALUE = parameter_value;

/* for a time parameter: */

   *TMR_VALUE = parameter_value;

/* for a string parameter: */

   strcpy (*MSG_VALUE, parameter_value);

Исходный текст этой службы автоматически генерируется менеджером библиотек ISaGRAF при создании функционального блока.

·       Пример исходного текста

Ниже представлен стандартный скелет “C” функционального блока:



/* function block (xxx is the name of the function block) */

#include <tasy0def.h>

#include <grfb0nnn.h>   /* nnn is the number of the f.block in library */

/* structure of hidden data for each instance of the block */

typedef struct {

             /* fields definition */

} str_data;

/* initialization service: returns the size of needed hidden data */

word FBINIT_xxx (uint16 hinstance)

{

             return (sizeof (str_data));

}

/* activation service: processes the calling parameters */

void FBACT_xxx (uint16 hinstance, str_data *data, str_arg *arg)

{

             /* ... */

}

/* cast operation used to copy the value of a return parameter */

#define BOO_VALUE   ((T_BOO *)value)

#define ANA_VALUE   ((T_ANA *)value)

#define REAL_VALUE  ((T_REAL *)value)

#define TMR_VALUE   ((T_TMR *)value)

#define MSG_VALUE   ((T_MSG *)value)

/* return parameters read service: called for each return parameter */

void FBREAD_xxx (uint16 hinstance, str_data *data, uint16 parno, void *value)

{

             switch(parno)

             {

                case FBLPNO_XX: *???_VALUE = ...; break;

                case FBLPNO_YY: *???_VALUE = ...; break;

             ....

            

}

/*Следующая функция используется для инициализации функционального блока и объявления его реализации. Она реализует связь с ядром ISaGRAF, используя имя функции. Эта функция полностью генерируется менеджером библиотек ISaGRAF*/

ABP fbldef_xxx (char *name, IBP *initproc, RBP *readproc)

{

             strcpy (name, "XXX");

             *initproc = (IBP)FBINIT_xxx;

             *readproc = (RBP)FBREAD_xxx;

             return ((ABP)FBACT_xxx);

}

/* end of file */

Включенный файл “TASY0DEF.h” из ядра ISaGRAF требуется для системозависимых определений. Он, также содержит определения типов данных, которые представляют дальние указатели на  реализованные службы.

       Связь  между проектами и “C” реализацией



Логическая связь между реализацией функции и ее использованием в программах проекта ISaGRAF осуществляется через имя функции. Служба объявления добавляется в исходный “C” код функционального блока. Эта служба вызывается только один раз, когда приложение стартует и сообщает ядру ISaGRAF имя, которое соответствует реализованной службе. Вот стандартный формат такой службы объявления:

ABP fbldef_xxx (char *name, IBP *initproc, RBP *readproc)

{

             strcpy (name, "XXX");                         /* name of the f.block */

             *initproc = (IBP)FBINIT_xxx;                              /* initialization service */

             *readproc = (RBP)FBREAD_xxx;                        /* read service */

             return ((ABP)FBACT_xxx);                  /* activation service */

}

/* xxx is the name of the function block */

Имя функционального блока, использующееся оператором strcpy, должно быть написано заглавными буквами. Оно должно быть написано маленькими буквами в реализации служб и в имени службы объявления.

Использование префиксов ”FBACT_”, ”FBINIT_”, ”FBREAD_” и “fbldef_” для реализации служб и определения службы позволяет пользователю именовать функции ключевыми словами языка “C” или именами существующих функций из “C” библиотек ISaGRAF.  Никакие другие операторы нельзя добавлять в службу объявления.

Служба объявления вызывается для любого интегрированного функционального блока, даже если он не используется в приложении ISaGRAF.  Ядро  ISaGRAF выдает ошибку, если в приложении используется не реализованный функциональный блок.

Прежде чем линковать новые функциональные блоки с ядром, пользователь должен написать другой файл с исходным текстом, под именем “GRFB0LIB.C” и вставить его с сохраненным функциональным блоком в список файлов для линкера. “GRFB0LIB.C” содержит только массив служб объявления. Этот массив читается во время инициализации приложения, для того чтобы создать динамические связи с функциональными блоками написанными на “C”.


Вот пример такого файла:

/* Файл: grfb0lib.c - implemented function blocks */

#include <tasy0def.h>

extern ABP fbldef_fb1(char *name, IBP *init, RBP *read);

extern ABP fbldef_fb2(char *name, IBP *init, RBP *read);

FBL_LIST FBLDEF[ ] = {

             fbldef_fb1,

             fbldef_fb2,

NULL };

/* конец файла */

Массив FBLDEF должен заканчиваться указателем NULL. Если это условие не выполнено, то могут возникнуть некоторые проблемы. Если массив FBLDEF не определен, то во время линковки нового ядра ISaGRAF появятся неразрешенные ссылки.

Написав этот файл, можно построить новое ядро, включая все существующие функции. Можно, также построить ядро, приспособленное для одного проекта, путем введения в массив FBLDEF только тех преобразований, которые используются в проекте. Файл “GRFB0LIB.C” автоматически генерируется генератором кодов ISaGRAF, когда создается код приложения. Файл помещается в директорию проекта ISaGRAF и объединяет только те функции, которые используются в проекте.

       Ограничения

Библиотека ISaGRAF может содержать до 255 “C” функциональных блоков. Функция может выполнять любой тип операции. Каждый тип функционального блока может быть скопирован (сделано экземпляров) до 255 раз в одном проекте.

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

       Полный пример

Ниже представлен пример функционального блока “sample”, который выполняет счет вверх.

Техническое замечание:

имя:                    Sample                                             

описание:          счетчик вверх

дата:                  18 мая 1995

автор:                CJ International

вызов:               CU: считающийся вход

                        R:    команда сброса

                           PV:  максимальная планируемая величина

возврат:            Q: определение максимума

                           СV: результат счета



прототип:          sample (count, reset_command, maximum_value);

                           max_detect := SAMPLE.Q;

                           count_result := SAMPLE.CV;

Интерфейс функционального блока:



Заголовок функционального блока:

/* function block interface - name: SAMPLE */

/* определение стандартных типов ISaGRAF  */

typedef long  T_BOO;

typedef long  T_ANA;

typedef float T_REAL;

typedef long  T_TMR;

typedef char  *T_MSG;

/* определение структуры параметров вызова */

typedef struct {

   T_BOO  _cu;

   T_BOO  _r;

   T_ANA  _pv;

} str_arg;

/* идентификаторы использующиеся для доступа к параметрам вызова*/

#define CU                                           (arg->_cu)

#define R                                              (arg->_r)

#define PV                                            (arg->_pv)

/* логические номера возвращаемых параметров */

#define FBLPNO_Q                            0

#define FBLPNO_CV                         1

/* end of file */

Исходный текст функционального блока:

( Только строки напечатанные жирным шрифтом вводятся программистом)

/* function block - name: SAMPLE */

#include <tasy0def.h>                       /* требуется для определения типов */

#include <grfb0255.h>                       /* заголовок*/

/* definition of the structure which contains the data for one instance */

typedef struct {

             T_BOO overflow;                  /* true:counting value >= programmed value */

             T_ANA value;                         /* counting current value */

} str_data;

/* initialization service: requires memory for instance data */

word FBINIT_sample (uint16 hinstance)

{

             return (sizeof (str_data));

}

/* activation service: up-counting algorithm */

void FBACT_sample (uint16 hinstance, str_data *data, str_arg *arg)

{

             if (R) data->value = 0;



             else if (CU && data->value < PV) (data->value)++;

             data->overflow = (data->value >= PV) ? (T_BOO)1 : (T_BOO)0;

}

/* cast operation required to copy parameters to ISaGRAF buffer */

#define BOO_VALUE   ((T_BOO *)value)

#define ANA_VALUE   ((T_ANA *)value)

#define REAL_VALUE  ((T_REAL *)value)

#define TMR_VALUE   ((T_TMR *)value)

#define MSG_VALUE   ((T_MSG *)value)

/* read service: get the value of one return parameter */

void FBREAD_sample (uint16 hinstance, str_data *data, uint16 parno, void *value)

{

             switch (parno) {

                case FBLPNO_Q   : *BOO_VALUE = data->overflow; break;

                case FBLPNO_CV : *ANA_VALUE = data->value; break;

             }

}

/* declaration service used for dynamic link with the ISaGRAF kernel */

ABP fbldef_sample (char *name, IBP *initproc, RBP *readproc)

{

             strcpy (name, "SAMPLE");

             *initproc = (IBP)FBINIT_sample;

             *readproc = (RBP)FBREAD_sample;

             return ((ABP)FBACT_sample);

}

/* end of file */


CAT


Замечание: Для этого оператора количество входов может быть больше чем два.

Аргументы:

(inputs)                                      MSG  (сумма длин всех сообщений не должна

                                                  превышать емкости выхода)

output                                        MSG        соединение всех входных сообщений

Описание:

Соединяет несколько сообщений в одно.

(*FBD пример блоков CAT*)

(* ST эквивалент: use the + operator *)

myname := ('Mr' + ' ') + 'Jones';

(* means: myname := 'Mr Jones' *)

(* IL эквивалент: *)

LD                     'Mr'

ADD                  ' '

ADD                  'Jones'

ST                     myname



Целые аналоговые константы


Целые константы представляются знаковыми длинными целыми (32 бита) величинами:

от -2147483647 до +2147483647

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

База

Префикс

Пример

DECIMAL

(none)

-908

HEXADECIMAL

"16#"

16#1A2B3C4D

OCTAL

"8#"

8#1756402

BINARY

"2#"

2#1101_0001_0101_1101

Символ подчерк  (‘_’) может быть использован для того, чтобы разделить группы цифр. Он не имеет особенного значения и используется для улучшения читаемости констант.



CHAR


Аргументы:

Code                   INT                 код в диапазоне [0..255]

Q                          MSG              строка из одного символа

                                                  символ имеет ASCII код заданный на входе

                                                  (используется ASCII код по модулю 256)

Описание:

                            Дает строку из одного символа с заданным ASCII кодом.

(*FBD пример блока “CHAR”*)

(* ST Эквивалент: *)

Display := CHAR ( value + 48 );

(* значение в диапазоне [0..9] *)

(* 48 - это ascii код '0' *)

(* result - строка из одного символа от '0' до '9' *)

(* IL Эквивалент: *)

LD                     value

ADD                  48

CHAR

ST                     Display



Циклические и последовательные операции


Иерархия программ разделена на четыре основных секции или группы:

Begin                           программы, выполняемые в начале каждого цикла целевой задачи

Sequential                  программы, определяемые динамическими правилами SFC

End                               программы, выполняемые в конце каждого цикла целевой задачи

Функции                     набор подпрограмм

Программы секций Begin и End  описывают циклические операции и не зависят от времени. Программы секции Sequential описывают последовательные операции, где временная переменная явно синхронизирует основные действия. Основные программы секции Begin систематически выполняются в начале каждого цикла. Основные программы секции End систематически выполняются в конце каждого цикла. Основные программы секции Sequential  выполняются в соответствии с динамическими правилами SFC.

Программы секции Функции - это подпрограммы, которые могут быть вызваны любой другой программой в проекте. Программы секции Функции могут вызывать другие программы этой же секции.

Основные программы и дочерние программы секции Sequential должны быть описаны при помощи языка SFC.  Программы циклических секций (Begin и End) не могут быть описаны при помощи языка SFC.

Программы секции Begin обычно используются для того чтобы описать предварительные операции с устройствами ввода и определить значения отфильтрованных переменных верхнего уровня. Такие переменные обычно используются программами секции Sequential. Программы секции End обычно используются для того, чтобы выполнить защитные операции с переменными прежде, чем отправить их значения в устройства вывода.



CMP


Аргументы:

VAL1                                         INT     любое знаковое целое аналоговое значение

VAL2                                         INT     любое знаковое целое аналоговое значение

LT                                              BOO   TRUE если val1 меньше чем val2

EQ                                              BOO   TRUE если val1 равно val2

GT                                             BOO   TRUE если val1 больше чем val2

Описание:

Сравнивает две величины: сообщает они равны или первая больше или меньше второй.

(*FBD пример блоков CMP*)

(* ST Эквивалент: Мы предполагаем, что CMP1 - это экземпляр блока CMP *)

CMP1(level, max_level);

pump_cmd:= CMP1.LT OR CMP1.EQ;

alarm := CMP1.GT AND NOT(manual_mode);

(* IL Эквивалент: *)

LD                     level

ST                     CMP1.val1

LD                     max_level

ST                     CMP1.val2

CAL                  CMP1

LD                     CMP1.LT

OR                    CMP1.EQ

ST                     pump_cmd

LD                     CMP1.GT

ANDN                manual_mode

ST                     alarm



COS


Аргументы:

IN                         REAL             любая действительная аналоговая

Q                          REAL             косинус входа в диапазоне [-1.0..+1.0]

Описание:

Вычисляет косинус действительной величины.

(*FBD пример блока “COS” и “ACOS”*)

(* ST Эквивалент: *)

cosine := COS (angle);

result := ACOS (cosine); (*результат равен углу *)

(* IL Эквивалент: *)

LD                     angle

COS

ST                     cosine

ACOS

ST                     result



CПримеры:


isaker &

isatst -t=/t0

Эти команды запускают:

Ядро ISaGRAF с номером подчиненного 1 по умолчанию

Коммуникационную задачу через последовательный порт на /t0 с номером подчиненного 1 (по умолчанию) и логическим номером 1 (последний указанный подчиненный=подчиненный по умолчанию=1)

isaker &

isanet -t=1100

Starts:

Ядро ISaGRAF с номером подчиненного 1 по умолчанию

Коммуникационную задачу по Ethernet через порт 1100 с номером слева 1 (по умолчанию) и логическим номером 1 (последний указанный подчиненный=подчиненный по умолчанию=1)

isaker -s=2 &

isanet -t=/t0 -s=2 (Соответственно isanet -t=1100 -s=2)

Эти команды запускают:

Ядро ISaGRAF с номером подчиненного 2

Коммуникационную задачу по последовательному порту /t0 (Ethernet порт 1100) с номером слева 2 и логическим номером 2 (последний указанный подчиненный=2)

Isaker -s=1 &

isaker -s=2 &

isanet -t=/t0 -s=1 -s=2 (Соответственно isanet -t=1100 -s=1 -s=2)

Эти команды запускают:

Ядро ISaGRAF с номером подчиненного 1

Ядро ISaGRAF с номером подчиненного 2

Коммуникационную задачу по последовательному порту /t0 (Ethernet порт 1100), взаимодействующую с подчиненными с номерами 1 и 2, и логическим номером 2 (последний указанный подчиненный=2)

isaker -s=1 &

isatst -t=/t0 -s=1 -c=1 &

(Соответственно isanet -t=1100 -s=1 -c=1 &)

isatst -t=/t1 -s=1 -c=2 (Соответственно isanet -t=1100 -s=1 -c=2)

Эти команды запускают:

Ядро ISaGRAF с номером подчиненного 1

Коммуникационную задачу по последовательному порту /t0 (Ethernet порт 1100), взаимодействующую с подчиненным номер 1, и логическим номером 1

Коммуникационную задачу по последовательному порту /t1 (Ethernet порт 1101), взаимодействующую с подчиненным номер 1, и логическим номером 2

Замечание:

Коммуникационные задачи по последовательному порту и Ethernet могут работать вместе.



CРабота с целевой задачей VxWorks


Для того чтобы начать работу с целевой задачей ISaGRAF нужно выполнить несколько команд в системе VxWorks для настройки параметров среды перед запуском целевых задач ISaGRAF. Эти команды можно выполнить из файла сценария. Они описываются в следующих разделах.



CСохранение переменных приложения


        Сохраняемые переменные

Редактор переменных системы разработки поддерживает атрибут ‘сохранять’ для каждой внутренней переменной (т.е. не входной и не выходной).

В конце каждого цикла целевой задачи значения сохраняемых переменных копируются в специальную область памяти. Этой областью обычно является питаемая от батареи RAM.

Во время старта если хотя бы одна переменная имела атрибут сохраняемой, ISaGRAF ищет сохраняемые переменные:

-  Если данное приложение уже запускалось ранее, ISaGRAF находит сохраненные значения и присваивает их соответствующим сохраняемым переменным.

-  Если ранее работало другое приложение или не было никакого, то ISaGRAF понимает, что сохраненные значения недействительны и переустанавливает все сохраняемые переменные в 0.

Область памяти для сохранения переменных определяется в системе разработки в меню Make/Опции выполнения приложения/Сохраняемые переменные. Указанная строка должна иметь следующий формат:

  boo_add , boo_size , ana_add , ana_size , tmr_add , tmr_size , msg_add , msg_size

 

где:

boo_add   Шестнадцатеричный адрес, используемый для сохранения булевских переменных. Должен быть отличен от 0.

boo_size  Шестнадцатеричный размер памяти в байтах, выделяемый по этому адресу. Для хранения булевской переменной требуется 1 байт.

ana_add    Шестнадцатеричный адрес, используемый для сохранения аналоговых переменных. Должен быть отличен от 0.

ana_size   Шестнадцатеричный размер памяти в байтах, выделяемый по этому адресу. Всегда требуется минимум 4 байта плюс 4 байта для хранения каждой аналоговой переменной.

tmr_add    Шестнадцатеричный адрес, используемый для сохранения таймерных переменных. Должен быть отличен от 0.

tmr_size   Шестнадцатеричный размер памяти в байтах, выделяемый по этому адресу. Для хранения таймерной переменной требуется 5 байт.

msg_add  Шестнадцатеричный адрес, используемый для сохранения строковых переменных. Должен быть отличен от 0.

msg_size Шестнадцатеричный размер памяти в байтах, выделяемый по этому адресу.
Для хранения таймерной переменной требуется 256 байт.

Требования

-  Должны быть специфицированы все поля для всех типов даже если Вы не собираетесь сохранять все типы переменных. В таком случае для неиспользуемого типа переменных Вы должны указать нулевой размер (за исключением аналогов, где минимальный размер - 4) и любой отличный от нуля адрес.

Пример:

Предположим, требуется резервирование

20 булевских переменных

0 аналоговых переменных

0 таймерных переменных

3 строковых переменных

Пусть память, питаемая от батареи, находится по адресу 0xA2F200.

Предположим, что:

Булевские переменные будут храниться, по адресу 0xA2F200 и будут занимать в точности 20 байт.

Аналоги будут по адресу 0xA2F214, и для них нужно 4 байта.

Фиктивный адрес для таймеров будет 0xA2F200, т.к. размер памяти - нулевой.

Строковые переменные будут храниться по адресу 0xA2F218, причем им требуется 3*256 байт.

Таким образом, в системе разработке должна быть введена строка

A2F200,14,A2F214,4,A2F200,0,A2F218,300

        Функциональный вызов SYSTEM

Если нужно хранить большинство переменных приложения, то следует использовать функцию SYSTEM, чтобы иметь дело со всем множеством переменных (подробнее о функции SYSTEM см. в Руководстве пользователя). Заметим, что в этом случае резервирование и восстановление управляются программистом на уровне приложения.

Прежде всего, Вы должны определить место расположения резервных копий всех типов переменных:

<новый_адрес>:=SYSTEM(SYS_INITxxx,<адрес>);

где

-  <адрес> адрес расположения памяти для резервирования (16#шестнадцацеричное значение). Он должен иметь четное значение, в противном случае операция не выполнится.

-  SYS_INITxxx может быть:

* SYS_INTBOO для определения начала памяти под булевские переменные.

* SYS_INTANA для определения начала памяти под аналоговые переменные.

* SYS_INTTMR для определения начала памяти под таймерные переменные.

* SYS_INTALL для определения начала памяти под все булевские, аналоговые и таймерные переменные.



-  <новый_адрес> значение следующего свободного адреса, который равен <адрес> + зарезервированная память в байтах согласно SYS_INITxxx. Это позволяет проконтролировать выделенный объем памяти. Если операция не выполнилась, <новый_адрес> получает нулевое значение.

Теперь можно сделать запрос на резервирование. Эту процедуру можно вызвать в любой момент в приложении; резервирование будет выполнено в конце текущего цикла. Если аппаратура дает возможность информировать пользователя с помощью булевского входа или C функции об отказе питания и обеспечивает хотя бы один цикл ISaGRAF после этого, резервирование можно делать только при обнаружении такого отказа:

         <ошибка>:=SYSTEM(SYS_SAVxxx,0);

где

-  SYS_SAVxxx может быть:

* SYS_SAVBOO для резервирования всех булевских переменных.

* SYS_SAVANA для резервирования всех аналоговых переменных.

* SYS_SAVTMR для резервирования всех таймерных переменных.

* SYS_SAVALL для резервирования всех булевских, аналоговых и таймерных переменных.

-  <ошибка> получает значение ненулевого кода ошибки если операция не выполнилась. (SYS_INITxxx не отработала).

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

<ошибка>:=SYSTEM(SYS_RESTxxx,0);

где

-  SYS_RESTxxx может быть:

* SYS_RESTBOO для восстановления всех булевских переменных.

* SYS_RESTANA для восстановления всех аналоговых переменных.

* SYS_RESTTMR для восстановления всех таймерных переменных.

* S YS_RESTALL для восстановления всех булевских, аналоговых и таймерных переменных.

-  <ошибка> получает значение ненулевого кода ошибки если операция не выполнилась. (SYS_INITxxx не отработала).

Вот сводка команд функции SYSTEM для управления резервированием переменных

Команда

Значение

Ключевое слово

Значение

SYS_INITBOO

16#20

Инициал. Резервирование булевских

SYS_SAVBOO

16#21

Сохранить булевские

SYS_RESTBOO

16#22

Восстановить булевские

SYS_INITANA

16#24

Инициал. Резервирование аналогов

SYS_SAVANA

16#25

Сохранить аналоги

SYS_RESTANA

16#26

Восстановить аналоги

SYS_INITTMR

16#28

Инициал. Резервирование таймеров

SYS_SAVTMR

16#29

Сохранить таймеры

SYS_RESTTMR

16#2A

Восстановить таймеры

SYS_INITALL

16#2C

Инициал. Резервирование всех типов

SYS_SAVALL

16#2D

Сохранить все типы

SYS_RESTALL

16#2E

Восстановить все типы

<


Команда (ключевое слово)

Аргумент

Возвр. Значение

SYS_INITxxx

адрес памяти

след. свободный адрес

SYS_SAVxxx

0

0 если успех

SYS_RESTxxx

0

0 если успех

        Пользовательская реализация

Наконец, используя функции “C” или функциональные блоки Вы можете построить процедуры доступа к памяти, питаемой от батареи, чтобы в любой момент сохранять и восстанавливать переменные в приложении.

Примеры:

1)   Процедура, предназначенная для приложения:

backup, restore_temp, restore_date, restore_cnt - “C” процедуры пользователя.

backup(temperature,date,cnt);   сохранение трех критических переменных

temperature:=restore_temp();     восстановление температуры

data:=restore_date();                   восстановление даты

cnt:=restore_cnt();                       восстановление счетчика

2)   Процедура общего назначения:

backup_init, backup_link, restore - “C” процедуры пользователя.

save_id:=backup_init(address,size);     выделить область в энергонезависимой памяти

backup(save_id,cpt1,3);                         сохранить cpt1 как третий элемент

rest_id:=backup_link(address,size);     прилинковать выделенную память

cpt1:=restore(rest_id,3);                        восстановить сохраненное значение


CTD


Аргументы:

CD                                             BOO вход для счета (считать вниз когда CD равно TRUE)

                                                  (счет вниз если CD равно TRUE)

LOAD                                        BOO  команда загрузить (доминанта)

                                                  (CV = PV если LOAD равно TRUE)

PV                                             INT планируемое максимальное значение

Q                                                BOO  переполнение: TRUE если CV = 0

CV                                             INT результат счета

Предупреждение:

Блок CTD не определяет передний и задний фронты входа (CD). Для того чтобы создать импульсный счетчик, его нужно связать с блоками “R_TRIG” или “F_TRIG”.

Описание:

Считает от заданного значения вниз до 0 по 1.

(*FBD пример блоков CTD*)

(* ST Эквивалент: Мы предполагаем, что R_TRIG1 - это экземпляр блока R_TRIG и CTD1 - это экземпляр блока CTD *)

CTD1(F_TRIG1(command),load_cmd,100);

underflow := CTD1.Q;

result := CTD1.CV;

(* IL Эквивалент: *)

LD                     command

ST                     F_TRIG1.clk

CAL                  F_TRIG1

LD                     F_TRIG1.Q

ST                     CTD1.cd

LD                     load_cmd

ST                     CTD1.load

LD                     100

ST                     CTD1.pv

CAL                  CTD1

LD                     CTD1.Q

ST                     underflow

LD                     CTD1.cv

ST                     result



CTU


Аргументы:

CU                                             BOO              вход для счета (считать когда CU равно TRUE)

RESET                                       BOO              команда сброса (доминанта)

PV                                             INT                 планируемое максимальное значение

Q                                                BOO              переполнение: TRUE если CV = PV

CV                                             INT                 результат счета

Предупреждение:

Блок CTU не определяет передний и задний фронты входа (CU). Для того чтобы создать импульсный счетчик, его нужно связать с блоками “R_TRIG” или “F_TRIG”.

Описание:

Считает от 0 до заданного значения по 1.

(*FBD пример блоков CTU*)

(* ST Эквивалент: Мы предполагаем, что R_TRIG1 - это экземпляр блока R_TRIG и CTU1 - это экземпляр блока CTU *)

CTU1(R_TRIG1(command),NOT(auto_mode),100);

overflow := CTU1.Q;

result := CTU1.CV;

(* IL Эквивалент: *)

LD                     command

ST                     R_TRIG1.clk

CAL                  R_TRIG1

LD                     R_TRIG1.Q

ST                     CTU1.cu

LDN                   auto_mode

ST                     CTU1.reset

LD                     100

ST                     CTU1.pv

CAL                  CTU1

LD                     CTU1.Q

ST                     overflow

LD                     CTU1.cv

ST                     result



CTUD


Аргументы:

                CU           BOO        вход для счета вверх (считать когда CU равно TRUE)

                CD           BOO        вход для счета вниз (считать когда CD равно TRUE)

                RESET     BOO        команда сброса (доминанта)

                                               (CV=0 когда RESET = TRUE)

                LOAD      BOO        команда загрузить (CV=PV когда LOAD = TRUE)

                PV           INT           планируемое максимальное значение

                QU           BOO        переполнение: TRUE если CV = PV

                QD           BOO        переполнение: TRUE если CV = 0

                CV          INT           результат счета

Предупреждение:

Блок CTUD не определяет передний и задний фронты входа (CU и CD). Для того чтобы создать импульсный счетчик, его нужно связать с блоками “R_TRIG” или “F_TRIG”.

Описание:

Считает от 0 до заданного значения по 1 или от заданного значения вниз до 0 по 1.

(* FBD программа использующая блок "CTUD" *)

 

(* ST Эквивалент: Мы предполагаем, что R_TRIG1 и R_TRIG2 - это экземпляры блока R_TRIG и CTD1 - это экземпляр блока CTUD *)

CTUD1(R_TRIG1(add_elt), R_TRIG2(sub_elt), reset_cmd, load_cmd,100);

full := CTUD1.QU;

empty := CTUD1.QD;

nb_elt := CTUD1.CV;

(* IL Эквивалент: *)

LD                     add_elt

ST                     R_TRIG1.clk

CAL                  R_TRIG1

LD                     R_TRIG1.Q

ST                     CTUD1.cu

LD                     sub_elt

ST                     R_TRIG2.clk

CAL                  R_TRIG2

LD                     R_TRIG2.Q

ST                     CTUD1.cd

LD                     reset_cmd

ST                     CTUD1.reset

LD                     load_cmd

ST                     CTUD1.load

LD                     100

ST                     CTUD1.pv

CAL                  CTUD1

LD                     CTUD1.QU

ST                     full

LD                     CTUD1.QD

ST                     empty

LD                     CTUD1.CV

ST                     nb_elt



Cycle


Значение:     Подвешивает исполнение скрипта до выполнения следующего цикла ISaGRAF.

Синтаксис:  Cycle

Замечание:  Инструкции скрипта исполняются в начале цикла ISaGRAF. Если симулятор в пошаговом режиме, за инструкцией "cycle" следует сразу цикл. Следующие инструкции цикла будут выполнены на следующей команде отладчика "Выполнить один цикл".

Пример:        (* программа ISaGRAF копирует A в B *)

         A := 0

         Cycle

         Print B

         A := 1

         Print B (* цикл не выполнен/B не установлено в 1 *)

         Cycle

         Print B

Выход:    B = 0

         B = 0

         B = 1



CЗапуск целевой задачи: isaker


        Номер подчиненного: -s ключ

Эта опция определяет номер целевой задачи. Он может принимать значения от 1 до 255, исключая 13 ($0D). Этот номер используется в протоколе связи. Он нужен для того, чтобы различать целевые задачи друг от друга, когда запущено несколько задач.

По умолчанию

номер подчиненного равен 1 (как и в системе разработки).



CЗапуск задачи связи по ETHERNET: isanet


        Конфигурирование коммуникаций: -t ключ

Задача isanet использует ETHERNET для связи с отладчиком. Номер порта определяется при помощи опции -t.

Нет значения по умолчанию: Если эта опция не использована, то связь с целевой задачей невозможна. В таком случае может быть выдано сообщение об ошибке номер 7.

При использовании отладчика убедитесь в соответствии параметров.

Для ISaGRAF целевая задача OS-9 является сервером, а отладчик - клиентом, который подсоединяется к указанному порту. Прежде чем начать первую сессию отладки по Ethernet необходимо убедиться, что сетевые средства OS-9 сконфигурированы правильно.

        Номер подчиненного: -s ключ

Эта опция определяет номер целевой задачи. Он может принимать значения от 1 до 255, исключая 13 ($0D). Этот ключ может быть повторен в командной строке до 4 раз (по числу подчиненных, работающих через данную задачу). Этот номер используется в протоколе связи. Он нужен для того, чтобы различать целевые задачи друг от друга, когда запущено несколько задач. Когда используется отладчик, убедитесь, что его подчиненный параметр соответствует номеру целевой задачи.

По умолчанию

номер подчиненного равен 1.

        Логический номер задачи связи: -c

Эта опция определяет логический номер задачи связи. Он используется для того, чтобы работать одновременно с несколькими задачами связи. Он принимает значения от 1 до 255 и должен быть различным у различных задач.

По умолчанию:

используется значение последнего из ключей -s. Тем самым обеспечивается совместимость с предыдущей версией ISaGRAF 3.0.



CЗапуск задачи связи по последовательному каналу: isatst


        Конфигурирование коммуникаций: -t ключ

Коммуникационная задача isatst использует последовательный порт для связи с отладчиком. Название порта определяется при помощи ключа -t.

Нет значения по умолчанию: Если эта опция не использована, то связь с целевой задачей невозможна. В таком случае может быть выдано сообщение об ошибке номер 7.

При реализации, использующей isatst связь через Ethernet невозможна.

Последовательный порт открывается в режиме передачи двоичных данных (нет  управляющих данных, нет XON/XOFF). Другие параметры порта должны быть установлены до запуска ISaGRAF. При использовании отладчика убедитесь в соответствии параметров, устанавливаемых для него и для целевой задачи.

Пример:

xmode /t0 baud=19200

Установить скорость передачи 19200 бит/с. на устройстве /t0.

        Номер подчиненного: -s ключ

Эта опция определяет номер целевой задачи. Он может принимать значения от 1 до 255, исключая 13 ($0D). Этот ключ может быть повторен в командной строке до 4 раз (по числу подчиненных, работающих через данную задачу). Этот номер используется в протоколе связи. Он нужен для того, чтобы различать целевые задачи друг от друга, когда запущено несколько задач. При использовании отладчика убедитесь в соответствии параметров, устанавливаемых для него и для целевой задачи.

По умолчанию

номер подчиненного равен 1.

           Логический номер задачи связи: -c

Эта опция определяет логический номер задачи связи. Он используется для того, чтобы работать одновременно с несколькими задачами связи. Он принимает значения от 1 до 255 и должен быть различным у различных задач.

По умолчанию:

используется значение последнего из ключей -s. Тем самым обеспечивается совместимость с предыдущей версией ISaGRAF 3.0.



DAY_TIME


Аргументы:

SEL                      INT                 выбор выхода

                                                  0=текущая дата

                                                  1=текущее время

                                                  2=день недели

Q                          MSG              время/дата, выраженные символьной строкой

                                                  ‘YYY/MMM/DDD’ если SEL = 0

                                                  ‘HH:MM:SS’ если SEL = 1

                                                  имя дня если SEL = 2 (например: ‘Monday’)

Описание:

Возвращает дату или время дня, выраженные символьной строкой.

(*FBD пример блока “DAY_TIME”*)

(* ST Эквивалент: *)

Display := Day_Time (0) + ' ; ' + Day_Time (1);

(*Формат текста: 'YYYY/MM/DD ; HH:MM:SS' *)

(* IL Эквивалент: Сначала вызывается day_time(1) *)

LD                     1

DAY_TIME

ST                     hour_str     (* промежуточный результат *)

LD                     0

DAY_TIME

ADD                  ' ; '

ADD                  hour_str

ST                     Display



Действия SFC


SFC действие - это дочерняя последовательность SFC, стартующая и убивающаяся в соответствии с изменением сигнала активности шага. SFC действие может иметь признак N (не запоминаемый ), R (установить), S (сбросить). Вот синтаксис основных SFC действий:

<child_prog> (N);                  запустить дочернюю последовательность, когда шаг становится активным и убить ее, когда шаг становится пассивным

<child_prog> ;                       тот же эффект (N не обязательно)

 

<child_prog> (S);                  запустить дочернюю последовательность, когда шаг становится активным и ничего не делать, когда шаг становится пассивным

              

<child_prog> (R);                  убить дочернюю последовательность, когда шаг становится

активным и ничего не делать, когда шаг         становится           пассивным

SFC последовательность, определенная как действие, должна быть дочерней SFC

программой редактируемой программы. Заметим, что использование признаков S

и R для SFC действия имеет тот же эффект, что и операторы GSTART и GKILL

в импульсном действии на языке ST.

Ниже представлен пример SFC действия. Основная SFC программа называется Father. Она имеет два SFC наследника - SeqMix и SeqPump. Текст родительской SFC программы:

 

(* Программа SFC использующая действия SFC *)

 



Действия внутри шагов


Уровень 2 шага SFC представляет собой детальное описание действий в период активности шага. Это описание может использовать текстовые дополнения языка SFC и другие языки, такие как Структурный Текст (ST). Основные типы действий:

- Булевские действия

- Импульсные действия, запрограммированные на ST

- Не сохраняемые действия, запрограммированные на ST

- SFC действия

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

- Вызовы подпрограмм

- Соглашения языка инструкций (IL)



Действительные аналоговые константы


Действительные аналоговые константы могут быть записаны в десятичном

или научном представлении. Десятичная точка (‘.’) разделяет целую и десятичную части. Десятичную точку нужно использовать, для того чтобы отличить действительную константу от целой. Научное представление использует буквы ‘E’ или ‘F’ для того, чтобы отделить мантиссу

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

             3.14159                         -1.0E+12

             +1.0                               1.0F-15

             -789.56                         +1.0E-37

Выражение ‘123’ не представляет действительную константу. Ее правильное представление ‘123.0’.



DELETE


Аргументы:

IN                         MSG              любая непустая строка

NbC                     INT                 количество символов, которые нужно удалить

Pos                     INT                 позиция первого символа для удаления

                                                  (позиция первого символа строки - 1)

Q                          MSG              измененная строка

                                                  пустая строка если Pos < 1

                                                  первоначальная строка если Pos > длина IN

                                                  первоначальная строка если NbC <= 0

Описание:

Удаляет часть строки.

(*FBD пример блока “DELETE”*)

(* ST Эквивалент: *)

complete_string := 'ABCD' + 'EFGH'; (* полная строка - это 'ABCDEFGH' *)

sub_string := DELETE (complete_string, 4, 3); (* sub_string is 'ABGH' *)

(* IL Эквивалент: *)

LD                     'ABCD'

ADD                  'EFGH'

ST                     complete_string

DELETE             4,3

ST                     sub_string



DERIVATE


Аргументы:

RUN                     BOO                    режим: TRUE=нормальный/FALSE=сброс

XIN                       REAL                   вход: любая действительная аналоговая величина

CYCLE                TMR                     период дифференцирования

XOUT                   REAL                   интегрированный выход

Описание:

Дифференцирование действительной величины

Если величина параметра CYCLE меньше чем время цикла приложения ISaGRAF, то период дифференцирования будет равен времени цикла приложения ISaGRAF.

(*FBD пример блока “DERIVATE” *)

(* ST Эквивалент: Мы предполагаем, что DERIVATE1 - это экземпляр блока DERIVATE *)

DERIVATE1(manual_mode, sensor_value, t#100ms);

derivated_value := DERIVATE1.XOUT;

(* IL Эквивалент: *)

LD                     manual_mode

ST                     DERIVATE1.run

LD                     sensor_value

ST                     DERIVATE1.XIN

LD                     t#100ms

ST                     DERIVATE1.CYCLE

CAL                  DERIVATE1

LD                     DERIVATE1.XOUT

ST                     derivated_value



Динамические правила SFC


Вот пять динамических правил языка SFC:

 Начальная ситуация

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

 Освобождение перехода

Переход либо разрешен,

либо запрещен. Говорят, что переход разрешен, если все непосредственно предшествующие шаги, связанные с соответствующим символом перехода,  активны, в противном случае, переход запрещен. Переход не может быть освобожден, если :

- он не разрешен и

- соответствующее условие перехода не true.

 Изменение состояния активного шага

Освобождение перехода одновременно ведет к активному состоянию непосредственно следующего шага и пассивному состоянию непосредственно предшествующего шага.

 Одновременное освобождение переходов

Для того чтобы определить переходы, которые должны освобождаться одновременно, могут быть использованы двойные линии. Если такие переходы изображены отдельно, то активное состояние предшествующих шагов (GSnnn.x) может быть использовано, чтобы выразить их условия.

 Одновременная активизация и дезактивация шага

                Если во время работы шаг одновременно активизируется и дезактивируется,      о приоритет отдается активизации.



Динамическое поведение FC


Исполнение Потоковой Диаграммы может быть представлено следующим образом:

- Символ Begin занимает один целевой цикл.

- Символ Конец занимает один целевой цикл и заканчивает исполнение схемы. После того, как этот символ достигнут, никаких действий на схеме не выполняется.

- Исполнение действия занимает один целевой цикл.

Замечание: В противоположность SFC, действие не постоянное состояние. Инструкции не повторяются, пока символ выделен.



Добавление команд в меню Инструменты


ISaGRAF обеспечивает способ ввода других команд в меню "Инструменты". Определенные пользователем команды, которые должны быть добавлены, описаны в текстовом файле "\ISAWIN\COM\ISA.MNU". Вы можете добавить до 10 команд. Комментарии, начинающиеся с символа «;», могут быть вставлены в любой строке. Каждая команда описана в двух текстовых строках в соответствии со следующим синтаксисом :

M=строка_меню

C=командная_строка

Строка меню - это текст, который должен быть изображён в меню. Командная строка - это команда MS-DOS или Windows, которая может завершаться аргументами. В командной строке Вы можете использовать символ «%А» вместо имени открытого проекта и символ «%P» вместо имени открытой программы. Следующий пример запускает  для редактирования выбранной программы ( для использования с программами IL и ST ) :

M=Edit with Notepad

C=Notepad.exe \isawin\apl\%A\%P.lsf



Дочерние SFпрограммы


Любая программа SFC последовательной секции может управлять другой программой SFC. Такие программы низкого уровня называются дочерними SFC программами. Дочерние SFC программы - это параллельные программы, которые могут быть запущены, убиты, заморожены и перезапущены своей родительской программой. Родительская программа и дочерняя программа могут быть описаны при помощи языка SFC. Дочерняя SFC программа может иметь локальные переменные и предопределенные слова.

Когда родительская программа запускает дочернюю SFC программу, она устанавливает SFC маркер (активизирует) на каждом начальном шаге дочерней программы. Эта команда описывается оператором GSTART. Когда родительская программа убивает SFC дочернюю программу, она очищает все существующие маркеры на шагах дочерней программы. Такая команда описывается оператором GKILL.

Когда родительская программа замораживает SFC дочернюю программу, она очищает все значения в дочерней программе, и сохраняет их состояние в памяти. Такая команда описывается оператором GFREEZE. Когда родительская программа перезапускает SFC дочернюю программу, она восстанавливает все значения SFC, которые были очищены при замораживание программы. Такая команда описывается оператором GRST.

Любая программа FC последовательной секции может управлять другими FC

подпрограммами. Родительская программа FC

блокируется (ждет) пока не выполнится подпрограмма FC. Одновременная работа родительской программы FC и подпрограммы невозможна.



Дополнительно о программных редакторах


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



Другие средства ISaGRAF


Меню  содержит команды, которые вызывают средства ISaGRAF для выделенного проекта. Обратитесь к соответствующим разделам этого документа за более подробным описанием этих средств.

        Привязка переменных ввода-вывода

Команда "Соединение В/В" запускает редактор соединения переменных ISaGRAF. Этот инструмент используется для создание связей между объявленными в словаре проекта переменными ввода-вывода и соответствующей аппаратурой.

        Редактор перекрестных ссылок

Команда "Перекрестные ссылки " позволяет пользователю определить таблицы преобразования для целого проекта. Таблица преобразования это множество точек, которое определяет множество исправленных значений для аналоговых величин. Преобразование может быть непосредственно присоединено к аналоговым переменным ввода или вывода, позволяя пользователю фильтровать физические величины ввода-вывода или преобразовывать электрические величины составляющих ввода-вывода в логические значения, значительно упрощая программирование уравнений в приложении.

        Ввод описания проекта

Команда  «Дескриптор проекта» используется для редактирования текстового описания проекта. Этот документ полностью характеризует проект. В него можно вносить записи, описывающие изменения в ходе работы с проектом. Он отображается в окне Менеджера Проектов.

        Печать завершённого документа

Команда «Печать документа проекта» позволяет создать и напечатать завершённый документ по выделенному проекту. Этот документ может содержать любые компоненты ( программы, переменные, параметры ) выделенного проекта.  Для создания незавершённого документа нужно только определить его содержание.

        История изменений

Эта команда открывает диалог, в котором представлена история изменений проекта. Смотрите главу "Управление проектами" для более подробных разъяснений.



Дублирование и восстановление


Список “Система” показывает объекты, существующие на ISaGRAF Workbench, установленные на жестком диске. Список “Архив” показывает объекты, сохраненные на указанном архивном диске и каталоге.

       Дублирование

Сохранение объекта в архиве достигается выбором объекта в списке слева

(объекты ISaGRAF Workbench) и нажатием кнопки “Сохранить”. Более одного объекта может быть выбрано в списке. Кнопка “Сохранить” запрещается, когда элемент выбран в списке справа

(режим восстановления).

        Восстановление

Копирование объекта из архива в ISaGRAF Workbench достигается путем выбора объекта в списке справа (архивные объекты), и нажатием кнопки “Восстановить”. Более одного объекта может быть выбрано в списке. Кнопка “Восстановить” запрещается, когда элемент выбран в списке слева (режим дублирования).



Двойные расхождения


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

Пример двойного схождения и расхождения:



End


Значение:     Заканчивает скрипт

Синтаксис:  End

Замечание:  Инструкция "End" должна быть в последней строке скрипта

Пример:        (* Этот виток работает до тех пор пока MyVar не равно TRUE *)

         Loop:

         If MyVar = FALSE Goto Continue

         End

         Continue:

         Print MyVar

         Goto Loop



EXPT


Аргументы:

IN                         REAL                   любая знаковая аналоговая величина

EXP                      INT                       целая аналоговая экспонента

Q                          REAL                   (INexp)

Описание:

Дает действительный результат операции: (база экспонента) ‘база’ - первый аргумент, экспонента - второй.

(*FBD пример блока “EXPT”*)

(* ST Эквивалент: *)

tb_size := ANA (EXPT (2.0, range) );

(* IL Эквивалент: *)

LD                     2.0

EXPT                 range

ANA

ST                     tb_size