нефтехимическое производство

Оглавление сайта

Главная

  Приветствие

  Что нового

  Системные требования

  Общая блок-схема

  Запуск программы

  Панель "Расчет"

  Панель "Аппараты"

  Панель "Потоки"

  Панель "Схема"

  Встроенный Паскаль

  Работа с AutoCAD

  Объектная модель

  Оглавление банка ФХС

  Как создать библиотеку

  Подключение библиотеки

  Как собрать схему

  Выполнение расчета

  Структурный анализ

  Отладка

  Загрузка и сохранение

  Итерационные расчеты

  Работа с ФХС

  Использование в учебном процессе

  Синтез аммиака

  Синтез метанола

  Производство бензола

  Производство азотной кислоты

  Производство серной кислоты

  Процесс Клауса

  Контакты

  Как получить программу

  Лицензия

Скачать

Видеоурок

Встроенный Паскаль
Предыдущий Начало Следующий

Встроенный Паскаль

            Система Комфорт имеет встроенный интерпретатор NAT (New Application Translator). NAT - язык, подобный упрощенному Паскалю или Delphi с переменными вариантного типа.
            Программа состоит из команд, заканчивающихся точкой с запятой;
            Переменные явно не описываются. Их тип определяется динамически.
Имена переменных могут содержать латинские и русские буквы, цифры и символ _ .
Строчные и заглавные буквы имени не различаются, макс.длина - до 30 символов.
Числа имеют обычный формат с точкой дробной части: 123, -12.34, +1.23e-2 .
Для строк используется одинарный апостроф 'Nick''s Dog' и операция сцепления (конкатенации)  ||
Даты обрабатываются так же, как в Delphi, т.е. как целое число - номер дня
относительно 30.12.1899.
Логические константы True(-1) и False(0).
Новое присвоение может изменить тип переменной.

            Элементы программирования языка NAT:

Комментарий: (*...*) или {...} или //... до конца строки.

Присваивание: A:=B*(C-D); или X:='ab'||'cd';

Блок операторов: begin ... end;

Условный оператор:
             if Abc>=0 then
                         Cde:=(Abc+Xyz10)*10
            else begin
                       Cde:=Abc-1;
                       Xyz:=True;
            end;

Переход по метке:
            goto L1;
            ...
            L1: ... ;

Оператор цикла WHILE:
            I:=1;
            while I<3 do begin
                        Sum:=Sum+X[I];
                         I:=I+1;
            end;

Оператор цикла FOR:    
             for I:=1 to 3 do
                        for J:=1 to 3 do
                                    Sum:=Sum+Y[I,J];
            Организация досрочного выхода из цикла:
                        for I:=1 to 10 do begin
                                    //обработка в цикле
                                    if <условие_досрочного_выхода> then
                                                goto L1;
                        end;    L1: ...;

            Цикл по убыванию:
                        for I:=3 downto 1 do
                                    J:=I;

Оператор цикла по списку:
            for X in (12,23,34) do
                        print('X=',X);

Оператор цикла ПОКА НЕ:
            repeat <команды через точку с запятой> until <выражение>;
            повторяет команды, пока выражение остается равным False
            Например: N:=1; repeat N:=N+1; until N>5.5; {выход со значением N=6}

Математические функции:
   Y:=Exp(X);
   Y:=Pow(X1,X2);         // возвращает X1 в степени X2, другой вариант Y:=X1**X2;
   Y:=Ln(X);                   // натуральный логарифм
   Y:=Lg(X);                   // десятичный логарифм
   Y:=Sqrt(X);
   Y:=Abs(X);
   Y:=Min(X1,X2 … );
   Y:=Max(X1,X2 … );
   Y:=Mod(X1,X2);         // целочисленный остаток от деления X1 на X2
   Y:=IIF(X,Y,Z);             // функция вычисляет значения аргументов X, Y и Z,
                                     // затем возвращает: если X=True, то значение Y, иначе Z.

Функции обработки дат:
   Операции Dat+N и Dat-N выполняют сдвиг даты на N дней.
   Dat:=Date('DD.MM.YYYY'); //преобразовать строку в дату
      Разделители день/месяц/год в строке могут быть . или /
      Например, Date('31.12.99') -> 31.12.1999
                Date('09.03.2012')
   Dat:=Date(D,M,Y); //сформировать дату из дня, месяца, года
   Date() -> текущая дата 09.03.2012
   S:=Str(Dat);       //преобразовать дату в строку
   Y:=Year   (Dat); //получить номер года       из даты
   Q:=Quarter(Dat); //получить номер квартала   из даты
   M:=Month  (Dat); //получить номер месяца     из даты
   D:=Day    (Dat); //получить номер дня месяца из даты
   D:=Bom    (Dat); //первый    день месяца
   D:=Boq    (Dat); //первый    день квартала
   D:=Boy    (Dat); //первый    день года
   D:=Eom    (Dat); //последний день месяца
   D:=Eoq    (Dat); //последний день квартала
   D:=Eoy    (Dat); //последний день года
   NewDat:=IncPeriod(Dat,N,Type);   //сдвинуть дату на N периодов
      где N - целое число, большее, меньшее или равное нулю
          Type = 1  //сдвиг на месяцы
          Type = 2  //сдвиг на кварталы
          Type = 3  //сдвиг на годы
          Type =... //иначе сдвиг даты на N дней.

Преобразования:
   Y:=Float(X);   //преобразует аргумент в плавающее число
   Y:=Fixed(X);  //преобразует число в целое путем отбрасывания дробной части
   Y:=Str  (X);    //преобразует аргумент в строку
   Y:=Bool (X);    //преобразует аргумент в логическое значение
            Bool (0) -> False, любое другое число дает True
            Если аргумент Bool - строка, проверяется, начинается ли она с символа
            'T' (True), 'Y' (Yes) или 'Д' (Да), независимо от регистра.
            Если так, Bool возвращает значение True, иначе False.

Обработка логических выражений:
Логические выражения строятся на обычных операциях сравнения:
   A=B, A<B, A<=B, A>B, A>=B
к которым добавлено сравнение на равенство любому значению из списка:
if X in 111, 222, 333 then
   Y:=4;
Список можно записывать без скобок и со скобками:
if X in (111,222,333) then Y:=X+4; Z:=(X in 115,226);

Обработка строк:
   Строки могут содержать апострофы и управляющие символы, например:
      S:=#65'b''c'#$D#$A'De'#70;
   Операция конкатенации S:=S1||S2; объединяет две строки в одну.
      Ее операнды могут быть любого типа: 'Abc'||1.23 -> 'Abc1.23'
   Y:=Trim (X);    //удаляет пробелы в начале и конце строки X
   Y:=Upper(X);    //преобразует символы строки в верхний регистр
   Y:=Lower(X);    //преобразует символы строки в нижний регистр
   I:=InStr(xMainStr,xSubstr); //находит позицию xSubstr в xMainStr
   Y:=HexToStr(X); //формировать строку по шестнадцатеричным кодам:
       CrLf:=HexToStr('0D0A');  //два символа перевода каретки

Системные функции:
   Debug(['текст']); // перейти в диалоговый отладочный режим расчета
                              // Команда Debug(); должна быть ПЕРВОЙ в программе расчета аппарата
   Stop('Abc=',Abc); // печатает строку Abc=<значение переменной Abc> и завершает расчет
   или Stop();          // просто завершает расчет
   Trace(N);            // устанавливает уровень трассировки:
      N=0 - отменить трассировку
      N=1 - печатать результаты присваивания значений переменным
      N=2 - печатать дополнительно коды команд
   Чтобы войти в режим трассировки при зацикливании, нажмите во время выполнения любую клавишу.
   Break(N);           // вызывает изменение режима расчета.
      N=0 - продолжить расчет без остановки,
      N=1 - останов после выполнения каждого оператора (на точке с запятой),
      N=2 - прервать расчет.
   Print ( 'X=' , X, ', Y=', Y);       // печать любых выражений по списку
      Функция возвращает последнее значение из списка, в данном случае, значение переменной Y.
   PrintVar('Значения переменных'); // печать всех переменных программы в формате:
      Идентификатор = значение
      из параметров вызова PrintVar будет сформирован заголовок печати.
   Чтобы останавливаться на командах ВНУТРИ цикла, следует использовать блок BEGIN ... END,
   так как останов производится на точке с запятой:
      X:=Date('09.03.2012');
      for I:=-2 to +2 do begin
         Y:=Str(IncPeriod(X,I,1)); //на этой точке с запятой хотим остановиться
      end;

Работа с массивами:
Переменные можно определить как векторы или матрицы:
            array X[2];         // вектор X[0]..X[2]
            array Y[3,3];       // матрица Y[0,0]..Y[3,3]
Пример программы:
            N:=3;
            array M[N];
            for I:=1 to N do
                        A[I]:=I*10+I;
            for I:=1 to N do
                        print('M[',I,']=',M[I]);
Формирование массива из списка с инициализацией:
             M:=VarArray(-1,23.45e-1,'Str');
            for I:=1 to High(M) do
                        Y:=M[I];
Для массивов определена функция Sort, которая сортирует строки вектора или матрицы.
В случае матрицы, сортировка производится по элементам нулевого столбца.
Пример сортировки матрицы:
   array m[2,1];
   M[0,0]:=222; M[0,1]:='AAA';
   M[1,0]:=111; M[1,1]:='BBB';
   M[2,0]:=000; M[2,1]:='CCC';
   Sort(M);
даст результат, отсортированный по нулевому столбцу:
   M[0,0] = 000; M[0,1] = 'CCC'
   M[1,0] = 111; M[1,1] = 'BBB'
   M[2,0] = 222; M[2,1] = 'AAA'

Таким образом можно найти атрибуты наибольшего/наименьшего элементов в списке.

Обращаем Ваше внимание, что имена массивов A[I,J] и F[I,J] зарезервированы, это - псевдо-матрицы параметров аппаратов и потоков ХТС.


            В начале сходимости ConvOpen записываются команды:
ArgApp (
              <имя или индекс аппарата>
            , <имя или индекс параметра>
            [,<нижняя>
               [,<верхняя граница поиска>]
            ]
            );
Задать переменную поиска - параметр аппарата,       например:
            ArgApp(10,2); //второй параметр 10-го аппарата.
   или  ArgApp('Десорбер1',2); //по имени аппарата в схеме

ArgFlow(
              <имя или индекс потока> 
            , <имя или индекс параметра>
            [,<нижняя>
               [,<верхняя граница поиска>]
            ]
            );
Задать переменную поиска - параметр потока,    например:
            ArgFlow(20,1);
            или
            for I:=1 to 10 do
                        ArgFlow(4,I,0.0,1e4);

В конце сходимости ConvClose записываются команды:
Вычислить невязку/дисбаланс уравнения:
DisBal(
            <невязка>
            ,<точность>
            [,<наименование невязки>]
            );
 Например:
            for I:=1 to 10 do
                        DisBal( GetFlow(4,I) - GetFlow(5,I) , 1e-6, 'Невязка рецикла[' || I || ']' );

Управление сходимостью в начале или конце сходимости:

Method('XXX'); //метод сходимости
       'NEWTON' - метод Ньютона, по умолчанию
       'WOLFE   ' - метод Вольфа
       'SIMPLE'   - метод простых итераций
        'RTF'        - метод Мюллера (квадратичной аппроксимации)

Func(Y); //для метода простых итераций - новое значение итерационной переменной

AbsRel(<абс.пробный шаг>,<отн.пробный шаг>); //По умолчанию AbsRel(1e-6,1e-6);

Iteration(<макс.число итераций>,<шаг печати>); //По умолчанию Iteration(100,0);

C:=Coef();              //узнать значение коэффициента сходимости

Coef(<новое значение>); //задать значение коэффициента сходимости
   Коэф.сходимости по умолчанию 1.0, но может быть уменьшен до ~0.5 для нелинейных уравнений

I:=GetIter();           //узнать номер текущей итерации: 0,1,2...

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

Y:=GetFlow(<имя или индекс потока>, <имя или индекс параметра>);
SetFlow   (<имя или индекс потока>, <имя или индекс параметра>, <значение>);

узнать номер вещества PDB /тип параметра потока
iPDB:=GetFlowPDB(<имя или индекс потока>, <имя или индекс параметра>);

Y:=GetApp (<имя или индекс аппарата>, <имя или индекс параметра>);
SetApp    (<имя или индекс аппарата>, <имя или индекс параметра>, <значение>);

A[I,J] - элемент псевдо-матрицы A: J-ый параметр I-ого аппарата

F[I,J] - элемент псевдо-матрицы F: J-ый параметр I-ого потока

Также можно получить общий расход потока и содержание компонента в долях/процентах:
Tot:=Total  (<имя или индекс потока>);
Prt:=Part   (<имя или индекс потока>,<индекс компонента>); //доля компонента
Prc:=Percent(<имя или индекс потока>,<индекс компонента>); //%    компонента

Определение номера аппарата или потока по его имени:
iApp :=GetAppIndex (<имя аппарата>);
iFlow:=GetFlowIndex(<имя потока>);
SetNextApp(<имя или индекс аппарата>); //задать след.аппарат в расчете схемы

Определение числа параметров аппарата или потока:
N:=GetAppCount (<имя или индекс аппарата>);
N:=GetFlowCount(<имя или индекс потока>);

Текст доп.информации аппарата/потока/схемы:
S:=GetAppText(<имя или индекс аппарата>);
SetAppText   (<имя или индекс аппарата>,<строка-значение>);

S:=GetFlowText(<имя или индекс потока>);
SetFlowText   (<имя или индекс потока>,<строка-значение>);

Общие параметры расчета схемы:
Y:=GetCommon(<имя или индекс общего параметра>);
SetCommon   (<имя или индекс общего параметра>,<значение>);
т.е. Вы можете в любой точке схемы работать с глобальными параметрами.
На уровне расчетных модулей отдельных аппаратов Вы имеете доступ к этим глобальным переменным с помощью методов:
            Y:=Dbg.GetCommon(<имя или индекс общего параметра>);
и
            Dbg.SetCommon   (<имя или индекс общего параметра>,<значение>);


Текст описания схемы в целом:
S:=GetSchemaText();
SetSchemaText   (<строка-значение>);

Функции ввода-вывода:
Y:=MsgBox('Сообщение' [, <Кнопки> [,'Заголовок'] ] )
   <Кнопки>   0 - OKOnly        Результат: OK  = 1
              4 - YesNo                    YES = 6, NO = 7
              3 - YesNoCancel              CANCEL = 2
            +32 - Question      YesNo +Question   =4+32=36
            +48 - Exclamation   OKOnly+Exclamation=0+48=48
            +64 - Information
Y:=InputBox('Заголовок' [,'Запрос' [,'По умолчанию'] ] );
   возвращает строку, введенную пользователем
   в окне диалога.
Write(список); и WriteLn(список); - вывод отладочной печати в протокол .DBG

В библиотеке .BPL может быть определена функция пользователя User.

"Константы" - предопределенные переменные:
Result  = 0 - результат работы программы, начальное значение 0
SysDate = текущая дата, например, SysDate = 40977 ~ StrToDate('09.03.2012')
Pi      = 3.14159265358979
true      = логическая константа
false    = логическая константа
  

Встроенный Паскаль
Предыдущий Начало Следующий