Все взаимодействие происходит через стандартный ввод вывод. Это значит что вызов функций и получение результата, происходит посредством отправки «сигналов» то есть записи определённых строк в стандартный вывод и чтение из стандартного ввода. Эти сигналы являются аналогами операторов вызовов функций и возвращения результата. С той разницей что вызывающий и вызываемый код, находится в разных процессах операционной системы.
Взаимодействие происходит по принципу клиент-сервер. Один из компонентов в роли клиента, другой в роли сервера. Это означает что клиент может в любой момент вызвать любую функцию сервера, а сервер должен вернуть какой-нибудь результат выполнения функции. Но сервер не может вызывать функции на клиенте.
Формат и описание команд.
Все строки чувствительны к реестру. Если в описании слово взято в угловые скобки <> значит вместо него должно быть другое слово соответствующее ему по смыслу. Например если написано <proc> это значит что вместо <proc> должно быть имя процедуры например set или get или ещё какой то процедуры. Слово eol означает перенос строки (end of line).
Вызов функции.
<< call <proc> <mapped-dst> eol
<< [ <val> eol ]
<< eol
<proc> - имя функции
<mapped-dst> - имя компонента которому адресована функция.
<val> - параметр функции если требуется. У функции может быть ни одного один или более параметров. Параметры разделяются переносом строки. Признаком конца списка параметров, является пустая строка с символом eol в конце.
Вызов функции всегда подразумевает возвращение управления. Это выражается в необходимости получить результат после каждого вызова функции. До получения результата, система будет игнорировать все дальнейшие вызовы. Тем не менее, компонент может выполнять в это время собственные внутренние расчеты, или обращаться к файловой системе ОС.
Примеры:
Вызов функции set без параметров у компонента v1.
call set v1 #eol
#eol
код на С++
cout<<"call set v1"<<endl<<endl;
Вызов функции get с одним параметром у компонента v2.
call get v2 #eol
5 #eol
#eol
код на С++
cout<<"call get v2"<<endl<<5<<endl<<endl;
Возвращение результата.
<< ret ok|error eol
<< [<val> eol]
<< eol
ok|error - либо строка ok либо error. ок означает нормальное выполнение функции error означает ошибку.
[<val> eol] – результат выполнения функции. Результатов может быть ни одного, один или более одного. Результаты передаются точно так же как передаются параметры функции см. «call». Количество результатов не должно зависеть от успеха или ошибки при выполнении функции. Так как при чтении результата вызывающий компонент предполагает определённое количество результатов.
Возвращение одного значения
ret ok #eol
5 #eol
#eol
код на С++
cout<<"ret ok"<<endl<<5<<endl<<endl;
возвращение без значения
ret ok #eol
#eol
код на С++
cout<<"ret ok"<<endl<<5<<endl<<endl;
Ожидание получения результата
<< wait getret <val-count> eol
>> ok|error eol
>> [<val> eol]
<val-count> - количество ожидаемых результатов.
ok|error – успешное или ошибочное выполнение функции.
[<val> eol] – значение результата выполнения функции. Количество результатов всегда равно значению <val-count>. Даже если произошла ошибка. Если ожидаемое количество результатов <val-count> отличается от фактического количества результатов переданных обратно вызванным компонентом, то система возвращает ошибку и симулирует ожидаемое количество результатов.
Если не было вызова функции сигналом call но тем не менее компонент отправляет сигнал wait getret, то система возвращает ошибку. После отправки сигнала wait getret, все сигналы компонента блокируются, вплоть до получения результата.
Ошибка ожидания
wait ret и wait getret возвращают ошибку если функция не была вызвана
так как иначе ввод заблокируется и не будет возможности что-либо вызвать.
Пример:
Код C++
string ok;
int val;
cout<<”wait getret 1”<<endl;
cin>>ok>>val;
Получение вызова функции
<< get call <proc> <val-count> eol
>> ok|no|error eol
>> [ <val> eol ]
<proc> - предполагаемая функция
<val-count> - предполагаемое количество параметров
ok|no|error – есть ли вызов. ok есть вызов <proc> и нужно прочитать <val-count> параметров, дальнейшее получение входящих вызовов блокируется до отправки результата. Тем не менее, можно отправлять исходящие вызовы функций и получать их результаты. После отправки результата вызов считается обработанным. no если нет такого вызова, в таком случае читать ничего не нужно, и вызов считается не обработанным. error если вызов есть, но количество параметров отличается от <val-count> в таком случае система автоматически отправляет вызвавшему компоненту ошибку, и вызов считается обработанным, значит посылать результат не нужно.
Параметры извлекаются аналогично «wait getret».
Код C++ получение и обработка вызова функции
string ok;
int val;
cout<<”get call my_proc 1”;
cin>>ok>>val;
if(ok==”ok”)
{
cout<<”ret ok”<<endl<<endl;
}
Лабораторные работы
1. Движение тел под воздействием гравитации - вращение планет солнечной системы вокруг солнца. Зависимость положения планет от времени.
2. Движение тела по баллистической траектории. Зависимость положения тела от начальной скорости и угла.
3. Упругое столкновение. Зависимость положения тел от начальных условий и времени.
4. Неупругое столкновение. Зависимость положения тел от начальных условий и времени.
5. Гироскоп – Прецессия гироскопа http://learning.itsoft.ru:8000/coding/first/lab04/index.html
6. Маятник максвелла. Зависимость положения от времени.
7. Охлаждение жидкости. Зависимость температуры от времени. Есть возможность доливать жидкость указанной температуры.
8. Вольтамперная характеристика туннельного диода. Зависимость тока от напряжения.
9. Вольтамперная характеристика полупроводникового диода. Зависимость тока от напряжения.
10. Параллельный электрический колебательный контур (RLC). Зависимость амплитуды колебаний от параметров генератора и параметров колебательного контура.
11. Последовательный электрический колебательный контур (RLC). Зависимость амплитуды колебаний от параметров генератора и параметров колебательного контура.
12. Пассивный RC фильтр нижних частот. Зависимость фазы и напряжения на выходе от напряжения на входе и частоты.
13. Пассивный RC фильтр верхних частот. Зависимость фазы и напряжения на выходе от напряжения на входе и частоты.
14. Пассивный полосовой (полосо-пропускающий) RC фильтр. Зависимость фазы и напряжения на выходе от напряжения на входе и частоты.
15. Пассивный режекторный (полосо-заграждающий) RC фильтр. Зависимость фазы и напряжения на выходе от напряжения на входе и частоты.