Язык программирования SimInTech - это высокоуровневый интерпретируемый императивный язык программирования.
Язык программирования предназначен для создания программ, описывающих функционирование типового блока «Язык программирования», а также для задания глобальных или локальных констант и переменных для текущей страницы проекта.
При помощи языка программирования можно написать программу (скрипт), которая может производить по мере расчета манипуляции с объектами схемы, а также запрограммировать видеокадры.
«Скрипт» есть на каждом уровне вложенности субмоделей, и у каждой субмодели может быть записана своя локальная программа.
Идентификаторы (имена констант, переменных, меток, функций и процедур) могут содержать буквы латинского и русского алфавита, знак подчеркивания «_» и цифры. Идентификатор должен начинаться с буквы или знака подчеркивания и может иметь произвольную длину. Не допускается использовать в качестве идентификаторов ключевые слова (эти слова автоматически выделяются при вводе полужирным шрифтом). Строчные и прописные буквы по умолчанию в идентификаторах не различаются (t и T – одинаковые идентификаторы). Данные параметр можно изменить в настройках системы.
Программа состоит из деклараций и операторов. Декларации начинаются с ключевых слов и инициализируют соответствующие переменные и константы:
сonst – константы;
var – алгебраические переменные;
init – динамические (дифференциальные) переменные;
input – входные переменные блока;
output – выходные переменные блока.
После ключевого слова перечисляются через запятую имена переменных либо констант с возможным заданием начальных значений, например:
const a=5.3, b=1.2e-4, c=10, y0=a*b/c;
var x1, v=b;
output y=y0;
Если начальное значение не задано, то оно принимается равным 0. Разделителем деклараций и операторов является точка с запятой (;).
В декларациях обязательно должны быть описаны входные, выходные и динамические (дифференциальные) переменные. Остальные переменные могут быть заданы автоматически в соответствии с выражением, которое присваивается переменной. Рекомендуется (но не обязательно) помещать декларации в начало программы. Переменную или константу можно использовать только после того, как она описана в декларации или задана в операторе присваивания.
Доступны также следующие системные переменные:
Переменная | Тип данных | Назначение |
time | Вещественное (double) | Модельное время |
stepsize | Вещественное (double) | Шаг интегрирования |
goodstep | Двоичное (Boolean) | Флаг «хорошего» шага |
getderi | Двоичное (Boolean) | Флаг вычисления значений производных |
setstepflag | Двоичное (Boolean) | Флаг принудительного присвоения шага |
newstepvalue | Вещественное (double) | Принудительное значение шага при setstepflag = 1 |
Программа может содержать комментарии, заключенные в фигурные скобки:
{текст комментария}
либо в виде:
//текст комментария до конца строки.
Приведем несколько простых примеров программ для блока «Язык программирования».
Выходная переменная блока – максимальное значение из двух входных переменных.
input u1,u2; if u1>u2 then y=u1 else y=u2; output y;
Можно упростить эту программу, используя функцию max языка, тогда оператор вычисления выходной переменной запишется в виде y=max(u1,u2);
Выходная переменная запоминает максимальное значение входной переменной.
input u; if time=0 then y=u else if goodstep then y=max(y,u); output y;
Значение time=0 соответствует начальному моменту модельного времени. Переменная y практически задает состояние блока. Расчет таких переменных рекомендуется выполнять только на хорошем шаге, когда булевская переменная goodstep равна 1. В противном случае (при goodstep=0) переменная u может быть вычислена, например, на промежуточной итерации решения алгебраических уравнений, в результате чего значение переменной y будет неверным.
Блок вычисляет время переходного процесса, т.е. время, в течение которого абсолютное значение входной переменной z уменьшается до z0 и в дальнейшем не превышает этой величины.
const z0=0.05; input z; output T=0; //0 – начальное значение if goodstep and (abs(z)>z0) then T=time;
Блок описывает уравнение Ван-дер-Поля.
const mu=1e6; init x1=2,x2=0; x1’=x2; //дифференциальные уравнения x2’=mu*((1-x1^2)*x2-x1); output x1,x2;
Здесь операторы присваивания задают дифференциальные уравнения и определяют новые переменные x1’,x2’ (производные соответствующих переменных), которые, как и другие переменные, могут быть использованы в математических выражениях.
Счетчик числа поступающих на вход импульсов.
input u; output Nimp=0; var u0=1; if goodstep and (u0<=0) and (u>0) then begin Nimp=Nimp+1; u0=u; end;
Импульсы считаются по переднему фронту, т.е. моменту модельного времени, когда входная переменная возрастает и становится положительной.
В следующих подразделах справки приведены описания ключевых слов и функций языка программирования. Символами < и > помечены обязательные идентификаторы. Символами { и } помечены дополнительные идентификаторы.