This is topic FBD-программный задатчик in forum Языки программирования (IL/FBD) / Algorithm Programming Languages at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/11/t/000056.html

Posted by HELLA (Участник № / Member № 104) on :
 
Возникла проблема:
среди стандартных FBD-блоков отсутствует
блок программного задатчика.
Может быть кто-то создавал его из
стандартных модулей или на С++ создал
свой блок и поделится опытом.
Вообще-то это серьезный пробел в библиотеке,
программное регулирование температуры,например,
очень часто требуется!
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Нет - штатного блока нет, но его можно легко на С++ написать. Если хотите - можем помочь. Давайте Ваш алгоритм задатчика.
 
Posted by HELLA (Участник № / Member № 104) on :
 
Добрый день!
Высылаем Вам алгоритм работы программного задатчика:
Программный задатчик формирует кусочно-линейную функцию времени(в сек ,0-86399), состоящую из нескольких (до 12) отрезков. Для каждого отрезка задается его продолжительность во времени
(в сек ,0-86399), и конечная ордината. Предусмотрена возможность пускать, останавливать и сбрасывать программу.
В состоянии сброса сигнал на выходе алгоритма имеет начальное значение Х=Хо,показания таймера
обнуляются(Nуч=0,Тост=0).
Алгоритм переводится в состояние “пуск”, “стоп”, “сброс” с помощью дискретных сигналов соответственно Сп, Сст и Ссбр, поступающих на вход алгоритмаПосле пуска сигнал X начинает изменяться в соответствии с заданной программой (от Х0). Параметры Хi и Тi на настроечных входах задают соответственно конечные ординаты и продолжительность отдельных участков программы.Nуч=номер текущего участка,Тост=время
до конца участка(таймер на убывание).
Алгоритм переводится в состояние “пуск”, “стоп”, “сброс” с помощью дискретных сигналов соответственно Сп, Сст и Ссбр, поступающих на вход алгоритма. При этом команды “пуск” и “стоп” действуют по переднему фронту (т.е. при переходе сигнала из состояния лог. 0 в лог. 1).
Сигнал "стоп" вызывает останов работы таймера (но не обнуление),выход
задатчика замораживается.После снятия сигнала "стоп" отсчет времени продолжается,
сигнал задатчика продолжает изменяться согласно программе с того значения,на
котором был "заморожен".
Сигнал “сброс” является приоритетным, то есть при наличии лог. 1 на входе “сброс” алгоритм переходит в состояние “сброс” и не может быть переведен в другие состояния с помощью дискретных команд на входе алгоритма. Если команды “пуск” и “стоп” пришли на вход алгоритма одновременно, то выполняется команда “стоп”.
После выполнения последнего участка программа переходит в состояние “конец программы” , при этом выходной сигнал Х замораживается.

Выходы алгоритма имеют следующее назначение:
Nуч текущий номер участка;
Тост время, оставшееся до окончания текущего участка;
Dп, Dст, Dсбр дискретные сигналы, индицирующие текущее состояние программы (соответственно “пуск”, “стоп”, “сброс”).
Dкп конец программы.
Если входной сигнал Сп =1 и снимается сигнал сброса (т.е. Ссбр переходит из состояния Ссбр =1 в состояние Ссбр =0), то алгоритм пускается (т.е. эта ситуация рассматривается как приход переднего фронта сигнала Сп). Если Сп =1 и снимается сигнал останова (т.е. Сст переходит из состояния Сст =1 в Сст =0) алгоритм остается в состоянии “стоп”.
Допустимы приемлемые упрощения алгоритма,
связанные с особенностями программирования.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Особенность FBD-блока в том, что его максимальное количество входов никак не может удовлетворить потребностям Вашего алгоритма - их всего реально может быть не больше 11 (без входа RUN). Остается только FBD+Глобальные переменные типа W, для реализации этого алгоритма.
 
Posted by HELLA (Участник № / Member № 104) on :
 
Возможно ли считывать значения величин время- значение в конечной точке в табличном виде в текстовом формате.Если нет ,то количество
программных участков сделать максимально возможным.
Нельзя ли предусмотреть в этом случае включение
последовательно нескольких FBD-блоков?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Как вариант - возможно в текстовом файле задавать таблицу, если этот вариант устроит, то можно попробовать...
 
Posted by HELLA (Участник № / Member № 104) on :
 
Табличный вариант вполне устроит.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Ловите:

code:
 
// fbd0.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

static float value[100];
static long time[100];
static int v_count=0;
static int c_step=-1;
static int c_call=0;

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
FILE *fl;
char Buf[50];

memset(Buf,'\0',50);

if ((fl=fopen("table.cfg","r"))==0){
return 0;
}
while(feof(fl)==0){
if(fgets(Buf,50,fl)){
value[v_count]=(float)atof(Buf);
fgets(Buf,50,fl);
time[v_count]=atol(Buf);
v_count++;
}
}
fclose(fl);
return TRUE;
}

__declspec(dllexport) int FBD_DLL( float*, float*, int*, int* );
__declspec(dllexport) void zFBD_DLL_info( void* );
__declspec(dllexport) void zFBD_DLL_varname( char* );

// Структура описывающая FBD-модуль
typedef struct
{
int q_in; // Количество входов
int q_out; // Количество выходов
int q_int; // Зарезервировано
int type; // Номер в списке функциональных разделов.
// Должно быть равно 17
char name[8]; // Короткое имя для вывода на экран
char fname[8]; // Полное имя
} DO_DEFAULT;

// Тело FBD-модуля
int FBD_DLL( float *in, // Указатель на массив входов
float *out, // Указатель на массив выходов
int *l, int *rl ) // Зарезервировано
{
if(c_step==-1){
out[0]=in[0];
c_step=0;
c_call=0;
}
if ((in[1]==1)&&(in[2]!=1)){
if (c_step==0){
out[0]=in[0]+c_call*(value[c_step]-in[0])/time[c_step];
out[1]=time[c_step]-c_call;
if(c_call==time[c_step]){
c_step++;
c_call=0;
}
c_call++;
}
else{
out[0]=value[c_step-1]+c_call*(value[c_step]-value[c_step-1])/time[c_step];
out[1]=time[c_step]-c_call;
if(c_call==time[c_step]){
if(c_step==v_count){
c_step=-1;
c_call=0;
}
else{
c_step++;
c_call=0;
}
}
c_call++;
}
out[2]=c_step;
}
else{
if (c_step==0){
out[0]=in[0]+c_call*(value[c_step]-in[0])/time[c_step];
out[1]=time[c_step]-c_call;
}
else{
out[0]=value[c_step-1]+c_call*(value[c_step]-value[c_step-1])/time[c_step];
out[1]=time[c_step]-c_call;
}
out[2]=c_step;
}
if(in[3]==1){
c_call=0;
c_step=-1;
out[0]=in[0];
}
return 0;
}

// Формирует указатель на описание FBD-модуля
void zFBD_DLL_info( void *buf )
{
DO_DEFAULT *dd;
dd=(DO_DEFAULT *)buf;

strcpy( dd->name, "fbd0" );
strcpy( dd->fname, "fbd0" );
dd->q_in = 5;
dd->q_out = 3;
dd->type = 17;
dd->q_int = 0;
}

// Формирует указатель на имена входов и выходов.
// На каждое имя отводится 8 байт

void zFBD_DLL_varname( char *varname )
{
strcpy( varname+0, "RUN" );
strcpy( varname+8, "X0" );
strcpy( varname+16, "Go" );
strcpy( varname+24, "Stp" );
strcpy( varname+32, "Rst" );
strcpy( varname+40, "Q" );
strcpy( varname+48, "T" );
strcpy( varname+56, "Cv" );
}

Входы:
X0 - Начальное значение
Go - Старт
Stp - Стоп
Rst - Сброс

Выходы:
Q - Текущее значение
T - Осталось времени на текущем шаге
Cv - № текущего шага (начиная с нуля).

FBD-блок работает по вызовам, поэтому, чтобы шаг=секунде, то вызов этой FBD надо делать раз в секунду (как в моем проекте).

Файл таблицы значений должен называться table.cfg и находится:
1) В директории Инструменталки - для РБК
2) В директории проекта - для РПД и МРВ

Его формат:
Значение1
Время1
Значение2
Время2
...
...
Значение100
Время100


Последняя строка в файле заканчивается переходом на следующую строку.
Всего - не более 100 интервалов.

Пример проекта, файла table.cfg и саму Dll отправил Вам по E-mail.
 
Posted by HELLA (Участник № / Member № 104) on :
 
Большое спасибо Бузинову Роману Анатольевичу
и группе технической поддержки за проект
программного регулятора.
Изучим и сообщим свое мнение.
 
Posted by HELLA (Участник № / Member № 104) on :
 
К сожалению,модуль fbd0.dll оказался
неработоспособным в среде ТМ5.09.
РБК модуль не видит,а в проекте присланном
Вами он предстает блочком с одним входом (тип-конст.) и одним выходом (out).
В то же время имеющийся у нас собственный
модуль fbd0.dll работает нормально.
Если не трудно ,вышлите fbd0.dll в неупакованном виде по почте.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Скорее всего он не нашел файл table.cfg при загрузке РБК. Выложите этот файл в корневую директорию Инстрменталки, а также в директорию проекта (это уже для МРВ и Профайлера).
 
Posted by HELLA (Участник № / Member № 104) on :
 
Спасибо,помогло!
 
Posted by HELLA (Участник № / Member № 104) on :
 
Проверили работу программного задатчика
на Вашем проекте и во вновь созданном
проекте.1.Наблюдается неприятный эффект при
работе в РПД и в профайлере:
при остановке пересчета базы каналов (нажатии
на кнопку с иконкой в виде бегущего человечка
в каждом втором случае выскакивает сообщение
Dr Watson :Ошибка в приложении DrawServ.exe
без номера.Далее повторно пересчет кнопкой
не запускается,нужно перезапускать РПД или
профайлер.
2.Пожелания на будущее:
хорошо бы представить табличные значения
точек работы прогр.задатчика в виде ActiveX-приложения-таблицы значений температур и временных
интервалов - графического элемента РПД с возможностью ввода значений при работающем МРВ.
При отработке значительных временных интервалов
оператор должен иметь возможность по ходу
процесса менять параметры НЕОТРАБОТАННЫХ участков
процесса.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
1) У нас этот эффект не воспроизводится. Вы его на своем проекте наблюдаете или на том, что я Вам выслал?

2) Ну, с ActiveX я уже врядли Вам помогу (своей квалификации не хватит, а отвлекать программиста я не смогу), а вот как отдельное приложение для этих целей сделать - это можно.
 
Posted by HELLA (Участник № / Member № 104) on :
 
Эффект наблюдается и на Вашем проекте и на
заново созданном Нашем проекте.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
У Вас 5.09? Если да - то Вам надо обновить ТМ.
 
Posted by HELLA (Участник № / Member № 104) on :
 
На работу проекта мистическим образом влияет
наличие файла table.cfg в директории проекта:
если таблица отсутствует,то старт-пуск проекта
по кнопке с иконкой бегущего человечка выполняется
нормально и многократно (естественно прогр.задатчик не формирует временную последовательность).
Стоит записать таблицу в директорию проекта -
он запускается нормально один раз,работает
циклически (без останова по окончание последнего
участка) но повторный запуск нормально не проходит.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Я сделал новый Программный задатчик как внешний компонент к системе. Скачать можно здесь:
http://www.adastra.ru/sequencer.rar
Он позволяет подключаться к МРВ и управлять любым его каналом по созданной Вами программе. Алгоритм программы этого задатчика может включать неограниченное количество точек и быть сохранен в отдельный файл в формате XML. То есть, Вы можете создавать собственные базы алгоритмов, а затем в процессе работы в реальном времени загружать их, или модифицировать.

Думаю, что этот элемент будет удобнее, чем FBD-блок на С++. [fun / веселый]

[clever / умный] Только одно "НО" - этот компонент написан на С# и для его работы требуется установить в ОС MS Windows компонент MS .Net Framework, иначе он не запуститься.

Если будут пожелания по его улучшению - обращайтесь. [phone / разговор]
 
Posted by HELLA (Участник № / Member № 104) on :
 
СПАСИБО за новый вариант задатчика!
Красиво и удобно.
Пожелание - кнопку STOP переименовать в RESET
а кнопку PAUSE в STOP.Так логичнее по функциональ-
ному значению.
Кроме того,было бы неплохо иметь счетчик циклов
выполнения программы,т.к. программа выполняется
циклически а количество циклов в технологии
важно;причем показания счетчика (начиная с 1)посылать в канал
МРВ аналогично выходу программного задатчика.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Здесь - новый вариант Задатчика!

Добавлено:
- тренд кривой задания
- задание каналов ТМ для приема №-цикла и оставшегося времени до конца текущего шага
- переименованы кнопки управления
 
Posted by HELLA (Участник № / Member № 104) on :
 
Все прекрасно,лучше не бывает!
Спасибо!
 
Posted by HELLA (Участник № / Member № 104) on :
 
Добрый день!
В процессе исследования работы графической
оболочки Sequence Control возникли некоторые
соображения по улучшению с точки зрения
технологов:
1.В окне trend сделать видимым начальный участок
от Initial value до первой табличной координаты,
т.к. этот участок приходится припасовывать
умозрительно.
2.Сделать доступным кроме номера цикла Cycle#
также номер текущего шага в цикле.
Заранее благодарны!
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Новый вариант Задатчика!

1) Сделал... [fun / веселый]

2) Не понял - Вы же хотели, чтобы было время оставшееся до конца текущего шага? [Недоумение / Confused]
 
Posted by HELLA (Участник № / Member № 104) on :
 
Время до конца шага и номер цикла действительно
нужны и они нормально работают в предыдующей
версии.
Номер же текущего шага в текущем цикле - как дополнение в список каналов,доступных МРВ.
Если же мало места для вкладки этого параметра,
то можно его и не включать.
 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2