ISaGRAF. Version 3.4

         

“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 синхронно, так что выполнение функции оказывает непосредственное влияние на временной цикл.


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