ISaGRAF. Version 3.4

         

“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 */


Содержание раздела