Инструментальная среда имитационного моделирования
Рассмотрение формальных моделей распределенных систем. Обзор ресурсно-управляемой сети временных автоматов. Обоснование выбора программных и аппаратных средств. Соответствие графической визуализации текущего состояния модели ее структурному представлению.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 07.03.2016 |
Размер файла | 2,4 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
this.panel2.ResumeLayout(false);
this.panel2.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit();
this.menuStrip1.ResumeLayout(false);
this.menuStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.TreeView treeView1;
private System.Windows.Forms.Button btn_exec;
private System.Windows.Forms.ListBox lb_Vars;
private System.Windows.Forms.MenuStrip menuStrip1;
private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem;
private System.Windows.Forms.CheckBox cb_Log;
private System.Windows.Forms.SplitContainer splitContainer2;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Button btn_Trace;
private System.Windows.Forms.CheckBox cb_Trace;
private System.Windows.Forms.Button btn_Loop;
private System.Windows.Forms.ToolStripProgressBar toolStripProgressBar1;
private System.Windows.Forms.Button btn_chart;
private System.Windows.Forms.ToolStripMenuItem выходToolStripMenuItem;
private System.Windows.Forms.Button btn_time;
private System.Windows.Forms.NumericUpDown numericUpDown1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ToolStripMenuItem справкаToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem загрузитьДемоМодельToolStripMenuItem;
private System.Windows.Forms.Button btn_steps;
private System.Windows.Forms.CheckBox cb_chart;
private System.Windows.Forms.ToolStripMenuItem оПрограммеToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem языкОписанияМоделиToolStripMenuItem;
private System.Windows.Forms.NumericUpDown numericUpDown2;
private System.Windows.Forms.Button btn_rezult;
private System.Windows.Forms.Panel panel3;
private System.Windows.Forms.CheckBox cb_Finiteness;
private System.Windows.Forms.CheckBox cb_Marking;
private System.Windows.Forms.CheckBox cb_lock;
private System.Windows.Forms.CheckBox cb_stop;
private System.Windows.Forms.Panel panel4;
private System.Windows.Forms.CheckBox cb_visual;
private System.Windows.Forms.CheckBox cb_autonet;
private System.Windows.Forms.ToolStripMenuItem englishToolStripMenuItem;
}
}
Приложение 13
Form1_io.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Reflection;
namespace Automata {
public partial class Form1: Form {
void save_model() {
if(m == null) {
log(ml["model_undef"]/*"Модель не определена!"*/);
return;
}
SaveFileDialog d = new SaveFileDialog();
DialogResult rez = d.ShowDialog();
if(rez != DialogResult.OK) return;
log(ml["save_in_file"]/*"Сохраняем в файл "*/ + d.FileName);
using(StreamWriter sw = File.CreateText(d.FileName)) {
wr = sw;
write_model();
}
status(ml["file_is_saved"]/*"Файл сохранен"*/);
}
StreamWriter wr;
void sp() {
wr.WriteLine("");
}
void sp(string s1, string s2) {
wr.WriteLine(s1 + "(" + s2.Replace(' ','_') + ")");
}
void sp(string s1, string s2,string s3) {
wr.WriteLine(s1 + "(" + s2.Replace(' ','_') + "," + s3.Replace(' ','_') + ")");
}
void sp(string s1, string s2, string s3, string s4) {
wr.WriteLine(s1 + "(" + s2.Replace(' ', '_')
+ "," + s3.Replace(' ', '_') + "," + s4.Replace(' ', '_') + ")");
}
void write_model() {
sp("model", m.name);
sp();
foreach(Place p in m.p_list) {
sp("place",p.name);
}
foreach(Place p in m.p_list) {
foreach(Arc a in p.list_in) {
sp("arc_in",p.name,a.p.name,a.port.name);
}
foreach(Arc a in p.list_out) {
sp("arc_out",p.name,a.p.name,a.port.name);
}
}
foreach(Type t in m.t_list) {
sp();
sp("type", t.name);
if(t.initial_state != null) {
sp(" state", t.initial_state.name);
}
foreach(Const c in t.list_const) {
sp(" const", c.name);
}
foreach(Var v in t.list_var) {
sp(" var", v.name);
}
foreach(Port port in t.list_port) {
sp(" port", port.name);
}
foreach(Transition trans in t.list_trans) {
sp(" trans", trans.state_from.name, trans.state_to.name);
if(trans.priority != Transition.default_priority) {
sp(" priority", ""+trans.priority);
}
if(trans.duration_max != Transition.default_duration) {
if(trans.duration_max == trans.duration_min) {
sp(" duration", ""+trans.duration_min);
} else {
sp(" duration", ""+trans.duration_min,""+trans.duration_max);
}
}
foreach(Term term in trans.list_term_in) {
sp(" term_in", term.port.name, term.res.name);
}
foreach(Term term in trans.list_term_out) {
sp(" term_out", term.port.name, term.res.name);
}
}
}
foreach(Place p in m.p_list) {
sp();
sp("place", p.name);
foreach(Instance inst in p.list_inst) {
if(inst.current_state == null) {
sp(" inst", inst.con.name);
} else {
sp(" inst", inst.con.name,inst.current_state.name);
}
}
}
}
string trda_file_name = "";
void load_model() {
if(m != null) {
if(!confirm(ml["del_cur_model"]/*"Удалить текущую модель?"*/)) return;
}
log(ml["loading_new_model..."]/*"Загружаем новую модель ..."*/);
OpenFileDialog d = new OpenFileDialog();
DialogResult rez = d.ShowDialog();
if(rez != DialogResult.OK) return;
log(ml["loading_new_model_from_file"]/*"Загружаем новую модель из файла "*/+d.FileName);
m = new Model(ml["new model"]/*"Новая модель"*/);
int n_err = 0;
multy_alarm_on();
using(StreamReader sr = File.OpenText(d.FileName)) {
string line = "";
int n_str = 0;
comment_deep = 0;
while ((line = sr.ReadLine()) != null) {
n_str++;
log("sou("+n_str+")="+line);
if (!scan_blank(line, n_str)) {
n_err++;
if (n_err > 5) {
alarm(ml["too_many_errors_in_input_file"]/*"Слишком много ошибок во входном файле."*/);
break;
}
}
}
}
if(n_err == 0){
m.fix_marking();
model_ready(ml["model_is_loaded"]/*"модель загружена"*/);
this.Text = ml["TRDA_typed_model"]/*"Модель типа TRDA "*/ + d.SafeFileName;
this.trda_file_name = d.FileName;
}else{
status(ml["model_is_not_loaded"]/*"Модель не загружена"*/);
m = null;
model_not_ready();
}
multy_alarm_off();
}
int comment_deep = 0;
bool scan_blank(string ss,int n_str) {
Char[] null_c_list = null;
bool rez = true;
foreach(string s in ss.Split(null_c_list,StringSplitOptions.RemoveEmptyEntries) ){
log("==>"+s);
if (!scan(s, n_str, ss)) {
rez = false;
}
}
return rez;
}
bool scan(string ss, int n_str, string sou) {
Char[] delim = {'(',',',')',';'};
string[] s_list = ss.Split(delim, StringSplitOptions.RemoveEmptyEntries);
foreach(string s in s_list) {
log("---->" + s);
}
try {
if(s_list[0] == "/*") {
comment_deep++;
log("----> /* deep=" + comment_deep);
return true;
}
if(s_list[0] == "*/") {
comment_deep--;
log("----> */ deep="+comment_deep);
return true;
}
if(comment_deep > 0) return true;
if(comment_deep < 0) {
error(ml["unopened comment id closed"]/*"закрыт не открытый комиментарий"*/);
}
decode(s_list, n_str, sou);
return true;
} catch(Exception e) {
log("n_str=" + n_str + ": " + sou);
log("decode_error: " + e.Message );
string err_msg = e.Message;
if(e.InnerException != null) {
log("innerException: " + e.InnerException.Message);
err_msg = e.InnerException.Message;
}
alarm("decode_error in "+s_list[0]+": " + err_msg);
return false;
}
}
void decode(string[] sl, int n_str, string sou) {
System.Type t = m.GetType();
int n = sl.Length;
Object[] pars = null;
System.Type[] types = null;
if(n > 1) {
pars = new Object[n - 1];
types = new System.Type[n - 1];
for(int i = 1; i < n; i++) {
pars[i - 1] = sl[i];
types[i-1]=typeof(string);
}
}
string func_name = sl[0];
if(func_name.Equals("const")) {
func_name = "dconst";
} else if(func_name.Equals("var")) {
func_name = "dvar";
} else if(func_name.Equals("time")) {
func_name = "duration";
}
MethodInfo method = t.GetMethod(func_name,types);
method.Invoke(m, pars);
}
}
}
Приложение 14
FormChart.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Automata {
public partial class FormChart : Form {
public FormChart() {
InitializeComponent();
}
void log(string ss) {
Form1.log(ss);
}
MultyLanguage ml = MultyLanguage.get_MultyLanguage();
Form1 main_form;
ChartInfo chin = null;
public FormChart(Form1 i_form) {
InitializeComponent();
main_form = i_form;
}
void set_text() {
this.Text = ml["chart_diagram_title"];
}
public void set_chin(ChartInfo i_chin) {
chin = i_chin;
panel1.Refresh();
}
Graphics gr;
Color[] colors = {Color.Red, Color.Orange, Color.Yellow
,Color.Green, Color.LightBlue,Color.Blue
,Color.Violet, Color.Aquamarine, Color.Brown, Color.Black
,Color.Aqua,Color.Bisque,Color.Coral,Color.BurlyWood
};
List<Pen> pens = new List<Pen>();
List<SolidBrush> brushes = new List<SolidBrush>();
int ix_by_dx(double dx, int i_max, double d_max, int X0, int X_GAP) {
double f1 = dx * (i_max - X0-X_GAP) / d_max;
int ix = X0 + (int)f1;
return ix;
}
private void panel1_Paint(object sender, PaintEventArgs e) {
gr = panel1.CreateGraphics();
int xmax = panel1.ClientSize.Width;
int ymax = panel1.ClientSize.Height;
for (int i = 0; i < colors.Length; i++) {
Pen p = new Pen((Color)colors[i], 10);
pens.Add(p);
}
int x1,y1,x2,y2;
for (int i = 0; i < colors.Length; i++) {
SolidBrush b = new SolidBrush((Color)colors[i]);
brushes.Add(b);
}
int X0 = 80;
int X_GAP = 10;
// считаю размер шага по оси времени
int n_x = (int) Math.Round(Math.Log10(chin.x_max));
double s_x = Math.Pow(10, n_x - 1);
log("x_max="+chin.x_max
+ " log10="+Math.Log10(chin.x_max)
+ " n_x="+n_x
+ " s_x="+s_x
);
// ось времени
int y0 = ymax - 65;
gr.DrawLine(new Pen(colors[9], 3), X0, y0, xmax - X_GAP, y0);
// формирование подписей оси времени
double x0=0;
int j = 0;
while (x0 < chin.x_max) {
x1 = ix_by_dx(x0,xmax,chin.x_max,X0,X_GAP);
/*
double f1 = x0 * (xmax-X0) / chin.x_max;
x1 = X0 + (int) f1 ;
*/
y1 = ymax - 60;
x0 += s_x;
gr.DrawString(""+s_x*j, new Font(Font.SystemFontName, 10), brushes[8], x1-5,y1);
// отметки на оси времени
gr.DrawLine(new Pen(colors[9], 3), x1+1, y0+2, x1+1, y0-5);
j++;
}
// позиции
for (int i = 0; i < chin.positions.Count; i++) {
x1 = 2;
y1 = ymax - 100 - i * 35;
gr.DrawString(chin.positions[i], new Font(Font.SystemFontName, 10), brushes[8], x1,y1);
}
// рисование линий по позициям
int n_color;
foreach(ChartItem item in chin.items) {
x1 = ix_by_dx(item.x_from, xmax, chin.x_max, X0, X_GAP);
x2 = ix_by_dx(item.x_to, xmax, chin.x_max, X0, X_GAP);
y1 = ymax - 90 - item.position * 35;
n_color = item.state % colors.Length;
gr.DrawLine(new Pen(colors[n_color], 10), x1, y1, x2, y1);
}
// легенда - цвета состояний
int n = chin.states.Count;
n = Math.Max(n, 10);
int dx = xmax / n;
int gap_x = dx/2;
int gap_y = 10;
log("y0=" + y0);
for (int i = 0; i < chin.states.Count; i++) {
log(chin.states[i]);
x1 = 20 + dx*i;
y1= ymax - 3*gap_y;
x2 = x1 + gap_x;
y2=y1;
n_color = i % colors.Length;
gr.DrawLine(new Pen(colors[n_color], 10),x1,y1,x2,y2);
System.Drawing.Point p = new System.Drawing.Point();
p.X = x1;
p.Y = y1 + gap_y;
gr.DrawString(chin.states[i],new Font(Font.SystemFontName,10),brushes[8],p);
}
}
private void panel1_Resize(object sender, EventArgs e) {
panel1.Refresh();
}
private void FormChart_FormClosing(object sender, FormClosingEventArgs e) {
main_form.chart_visible(false);
/*
this.Visible = false;
e.Cancel = true;
*/
}
private void FormChart_Activated(object sender, EventArgs e) {
set_text();
}
}
}
Приложение 15
FormChart.Designer.cs
namespace Automata {
partial class FormChart {
/// <summary>
/// Требуется переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing) {
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором форм Windows
/// <summary>
/// Обязательный метод для поддержки конструктора - не изменяйте
/// содержимое данного метода при помощи редактора кода.
/// </summary>
private void InitializeComponent() {
this.panel1 = new System.Windows.Forms.Panel();
this.SuspendLayout();
//
// panel1
//
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Margin = new System.Windows.Forms.Padding(2);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(671, 743);
this.panel1.TabIndex = 0;
this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint);
this.panel1.Resize += new System.EventHandler(this.panel1_Resize);
//
// FormChart
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(671, 743);
this.Controls.Add(this.panel1);
this.Margin = new System.Windows.Forms.Padding(2);
this.Name = "FormChart";
this.Text = "Временная диаграмма";
this.Activated += new System.EventHandler(this.FormChart_Activated);
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormChart_FormClosing);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Panel panel1;
}
}
Приложение 16
FormHelp.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Automata {
public partial class FormHelp : Form {
public FormHelp(string i_title, string i_text) {
InitializeComponent();
this.Text = i_title;
textBox1.Text = i_text;
textBox1.Select(0, 0);
}
static MultyLanguage ml = MultyLanguage.get_MultyLanguage();
static void help(string p_title, string p_text) {
FormHelp frmhelp = new FormHelp(p_title,p_text);
frmhelp.Show();
}
public static void help_about(string i_build_id) {
help(ml["about_program"]/*"О программе"*/,
ml["program_implements_trda"]+" (build="+i_build_id+")"
/*@"Программа реализует систему временных конечных автоматов"*/
);
}
public static void help_bnf() {
help(ml["model_description_language"]/*"Язык описания модели"*/,
ml["bnf"]/*@"Описание модели с помощью формализма
БНФ
<Описание модели> ::= model(<название модели>)
<системная сеть>
<автоматный слой>
<начальная разметка>
<системная сеть> ::=
[<определение вершины системного слоя>, … ]
[<определение дуги системного слоя>, … ]
<определение вершины системного слоя> ::= place(<название вершины>)
<определение дуги системного слоя> ::=
<определение входящей дуги> | <определение исходящей дуги>
<определение входящей дуги> ::=
arc_in(<вершина приемник>, <вершина источник>, <название порта>)
<определение исходящей дуги> ::=
arc_out(<вершина источник>, <вершина приемник>, <название порта>)
<автоматный слой> ::= [<определение типа>, … ]
<определение типа> ::= type(<имя типа>)
[<определение элемента типа>, … ]
[<обозначение состояния на графике>, … ]
[<определение перехода>, … ]
<определение элемента типа> ::= <определение состояния> | < определение порта>
| < определение константы> | < определение переменной>
<определение состояния> ::= state(<имя состояния>)
<определение переменной> ::= var(<имя переменной>)
<определение константы> ::= const(<имя константы>)
<определение порта> ::= port(<имя порта>)
<обозначение состояния на графике> ::=
state_chart_name(<имя состояния>, <имя состояния на графике>)
<определение перехода> ::=
trans(<имя исходного состояния>, <имя итогового состояния> [, <название перехода>])
[<атрибут перехода>, … ]
[<определение преобразования ресурсов>, … ]
<атрибут перехода> ::= <продолжительность перехода>
| <обозначение перехода на графике>
| <вероятность перехода>
<ожидание начала работы перехода> ::=
wait(<минимальное время ожидания перехода>[, <максимальное время ожидания перехода>])
<продолжительность перехода> ::=
time(<минимальное время длительности работы перехода>[, <максимальное время длительности работы перехода>])
<вероятность перехода> ::=
priority(<приоритет перехода>)
<обозначение перехода на графике> ::=
trans_chart_name(<имя перехода на графике>)
<определение преобразования ресурсов> ::=
<определение потребления ресурсов> | <определение производства ресурсов>
<определение потребления ресурсов> ::=
term_in(<имя порта>, <имя ресурса>[, <состояние потребляемого ресурса>])
<определение производства ресурсов> ::=
term_out(<имя порта>, <имя ресурса>[, <состояние производимого ресурса>])
<имя ресурса> ::= <имя константы> | <имя переменной>
"*/
);
}
}
}
Приложение 17
FormHelp.Designer.cs
namespace Automata {
partial class FormHelp {
/// <summary>
/// Требуется переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing) {
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором форм Windows
/// <summary>
/// Обязательный метод для поддержки конструктора - не изменяйте
/// содержимое данного метода при помощи редактора кода.
/// </summary>
private void InitializeComponent() {
this.textBox1 = new System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBox1.Location = new System.Drawing.Point(0, 0);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.ReadOnly = true;
this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.textBox1.Size = new System.Drawing.Size(365, 313);
this.textBox1.TabIndex = 0;
//
// FormHelp
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(365, 313);
this.Controls.Add(this.textBox1);
this.Name = "FormHelp";
this.Text = "frmHelp";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox textBox1;
}
}
18 FormLog.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Automata {
public partial class FormLog : Form {
Form1 main_form;
public FormLog(Form1 i_form) {
main_form = i_form;
InitializeComponent();
}
public void log(string ss) {
textBox1.AppendText(ss+"\r\n");
}
private void FormLog_FormClosing(object sender, FormClosingEventArgs e) {
main_form.log_visible(false);
// this.Visible = false;
e.Cancel = true;
}
}
}
19 FormLog.Designer.cs
namespace Automata {
partial class FormLog {
/// <summary>
/// Требуется переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing) {
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором форм Windows
/// <summary>
/// Обязательный метод для поддержки конструктора - не изменяйте
/// содержимое данного метода при помощи редактора кода.
/// </summary>
private void InitializeComponent() {
this.textBox1 = new System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBox1.Font = new System.Drawing.Font("Courier New", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.textBox1.Location = new System.Drawing.Point(0, 0);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.textBox1.Size = new System.Drawing.Size(292, 260);
this.textBox1.TabIndex = 0;
this.textBox1.WordWrap = false;
//
// FormLog
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(292, 260);
this.Controls.Add(this.textBox1);
this.Name = "FormLog";
this.Text = "FormLog";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormLog_FormClosing);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TextBox textBox1;
}
}
20 FormRezult.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace Automata {
public partial class FormRezult : Form {
string file_name;
static MultyLanguage ml = MultyLanguage.get_MultyLanguage();
public FormRezult(string fname) {
InitializeComponent();
file_name = fname + ".rez";
textBox2.Text = file_name;
this.Text = ml["title_FormRezults"];
btn_save.Text = ml["save"];
}
public void log_begin() {
textBox1.Text = "";
}
public void log(string ss){
textBox1.AppendText(ss+"\r\n");
}
private void btn_save_Click(object sender, EventArgs e) {
SaveFileDialog d = new SaveFileDialog();
d.FileName = file_name;
if(d.ShowDialog() != DialogResult.OK) {
return;
}
using(StreamWriter sw = File.CreateText(d.FileName)) {
sw.Write(textBox1.Text);
}
}
}
}
21 FormRezult.Designer.cs
namespace Automata {
partial class FormRezult {
/// <summary>
/// Требуется переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing) {
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором форм Windows
/// <summary>
/// Обязательный метод для поддержки конструктора - не изменяйте
/// содержимое данного метода при помощи редактора кода.
/// </summary>
private void InitializeComponent() {
this.panel1 = new System.Windows.Forms.Panel();
this.textBox2 = new System.Windows.Forms.TextBox();
this.btn_save = new System.Windows.Forms.Button();
this.textBox1 = new System.Windows.Forms.TextBox();
this.panel1.SuspendLayout();
this.SuspendLayout();
//
// panel1
//
this.panel1.Controls.Add(this.textBox2);
this.panel1.Controls.Add(this.btn_save);
this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel1.Location = new System.Drawing.Point(0, 500);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(646, 63);
this.panel1.TabIndex = 0;
//
// textBox2
//
this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.textBox2.Location = new System.Drawing.Point(12, 23);
this.textBox2.Name = "textBox2";
this.textBox2.Size = new System.Drawing.Size(516, 22);
this.textBox2.TabIndex = 1;
//
// btn_save
//
this.btn_save.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btn_save.Location = new System.Drawing.Point(544, 17);
this.btn_save.Name = "btn_save";
this.btn_save.Size = new System.Drawing.Size(90, 34);
this.btn_save.TabIndex = 0;
this.btn_save.Text = "Сохранить";
this.btn_save.UseVisualStyleBackColor = true;
this.btn_save.Click += new System.EventHandler(this.btn_save_Click);
//
// textBox1
//
this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBox1.Location = new System.Drawing.Point(0, 0);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.textBox1.Size = new System.Drawing.Size(646, 500);
this.textBox1.TabIndex = 1;
//
// FormRezult
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(646, 563);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.panel1);
this.Name = "FormRezult";
this.Text = "Результаты анализа";
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Button btn_save;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.TextBox textBox2;
}
}
22 FormVisual.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
namespace Automata {
public partial class FormVisual : Form {
string dot_file_name;
Form1 main_form;
VisualNet net;
static MultyLanguage ml = MultyLanguage.get_MultyLanguage();
public FormVisual(Form1 i_form1, VisualNet i_net) {
InitializeComponent();
net = i_net;
set_text();
this.main_form = i_form1;
}
void set_text() {
if (net == VisualNet.system_net) {
this.Text = ml["title_SystemNet"];
}
if (net == VisualNet.automata_net) {
this.Text = ml["title_AutomataNet"];
}
btn_save_dot.Text = ml["save"];
}
public void new_dot(string i_file_name) {
dot_file_name = i_file_name + ".dot";
textBox2.Text = dot_file_name;
textBox1.Text = "";
}
public void write_dot(string ss){
textBox1.AppendText(ss + "\r\n");
}
private void btn_save_dot_Click(object sender, EventArgs e) {
SaveFileDialog d = new SaveFileDialog();
d.FileName = textBox2.Text;
if(d.ShowDialog() != DialogResult.OK) {
return;
}
dot_file_name = d.FileName;
textBox2.Text = dot_file_name;
save_dot_file();
}
void save_dot_file() {
using(StreamWriter sw = File.CreateText(dot_file_name)) {
sw.Write(textBox1.Text);
}
}
private void log(string ss){
toolStripStatusLabel1.Text = ss;
Form1.log(ss);
}
private void tabVisual_Enter(object sender, EventArgs e) {
log("tab_Visual_Enter fire at " + System.DateTime.Now);
draw_graph();
}
public void draw_graph() {
log("save_dot_file");
save_dot_file();
string jpg_file_name = dot_file_name + ".jpg";
log("jpg_file_name=" + jpg_file_name);
if(pictureBox1.Image != null) {
log("pictureBox1.Image.Dispose()");
pictureBox1.Image.Dispose();
}
try {
log("do delete_dot_file");
File.Delete(jpg_file_name);
log("posle delete_dot_file");
} catch(Exception e) {
log("Error while delete old jpg file " + jpg_file_name
+": "+e.Message
);
}
try {
string ss = "dot.exe -Tjpg -o\"" + jpg_file_name + "\" \"" + dot_file_name + "\"";
log("try begin. ss=" + ss);
System.Diagnostics.Process p = System.Diagnostics.Process.Start("dot.exe", ss);
log("in try. p=" + p);
p.WaitForExit();
int exit_code = p.ExitCode;
log("in try. p exit. exit_code="+exit_code);
p.Close();
} catch(Exception e) {
log("on run e=" + e.Message);
}
Image mem;
try{
Stream stream = File.Open(jpg_file_name, FileMode.Open);
// mem = Image.FromFile(jpg_file_name);
mem = Image.FromStream(stream);
stream.Close();
pictureBox1.Image = mem;
log("mem size = " + mem.Size
+" pbi size = " + pictureBox1.Image.Size
);
pictureBox1.Size = mem.Size;
// log("image size = " + pictureBox1.Size);
} catch(Exception e) {
log("on load e=" + e.Message);
}
}
private void FormVisual_FormClosing(object sender, FormClosingEventArgs e) {
main_form.set_visual(false, net);
e.Cancel = true;
}
private void FormVisual_Activated(object sender, EventArgs e) {
set_text();
}
}
}
23 FormVisual.Designer.cs
namespace Automata {
partial class FormVisual {
/// <summary>
/// Требуется переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing) {
if(disposing && (components != null)) {
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором форм Windows
/// <summary>
/// Обязательный метод для поддержки конструктора - не изменяйте
/// содержимое данного метода при помощи редактора кода.
/// </summary>
private void InitializeComponent() {
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabVisual = new System.Windows.Forms.TabPage();
this.panel2 = new System.Windows.Forms.Panel();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.tabDot = new System.Windows.Forms.TabPage();
this.textBox1 = new System.Windows.Forms.TextBox();
this.panel1 = new System.Windows.Forms.Panel();
this.btn_save_dot = new System.Windows.Forms.Button();
this.textBox2 = new System.Windows.Forms.TextBox();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
this.tabControl1.SuspendLayout();
this.tabVisual.SuspendLayout();
this.panel2.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.tabDot.SuspendLayout();
this.panel1.SuspendLayout();
this.statusStrip1.SuspendLayout();
this.SuspendLayout();
//
// tabControl1
//
this.tabControl1.Controls.Add(this.tabVisual);
this.tabControl1.Controls.Add(this.tabDot);
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControl1.Location = new System.Drawing.Point(0, 0);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(430, 300);
this.tabControl1.TabIndex = 0;
//
// tabVisual
//
this.tabVisual.Controls.Add(this.panel2);
this.tabVisual.Location = new System.Drawing.Point(4, 25);
this.tabVisual.Name = "tabVisual";
this.tabVisual.Padding = new System.Windows.Forms.Padding(3);
this.tabVisual.Size = new System.Drawing.Size(422, 271);
this.tabVisual.TabIndex = 1;
this.tabVisual.Text = "visual";
this.tabVisual.UseVisualStyleBackColor = true;
this.tabVisual.Enter += new System.EventHandler(this.tabVisual_Enter);
//
// panel2
//
this.panel2.AutoScroll = true;
this.panel2.Controls.Add(this.pictureBox1);
this.panel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel2.Location = new System.Drawing.Point(3, 3);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(416, 265);
this.panel2.TabIndex = 1;
//
// pictureBox1
//
this.pictureBox1.Location = new System.Drawing.Point(0, 0);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(0, 0);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
//
// tabDot
//
this.tabDot.Controls.Add(this.textBox1);
this.tabDot.Controls.Add(this.panel1);
this.tabDot.Location = new System.Drawing.Point(4, 25);
this.tabDot.Name = "tabDot";
this.tabDot.Padding = new System.Windows.Forms.Padding(3);
this.tabDot.Size = new System.Drawing.Size(422, 271);
this.tabDot.TabIndex = 0;
this.tabDot.Text = "dot";
this.tabDot.UseVisualStyleBackColor = true;
//
// textBox1
//
this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBox1.Location = new System.Drawing.Point(3, 3);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.textBox1.Size = new System.Drawing.Size(416, 223);
this.textBox1.TabIndex = 0;
//
// panel1
//
this.panel1.Controls.Add(this.btn_save_dot);
this.panel1.Controls.Add(this.textBox2);
this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panel1.Location = new System.Drawing.Point(3, 226);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(416, 42);
this.panel1.TabIndex = 1;
//
// btn_save_dot
//
this.btn_save_dot.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.btn_save_dot.Location = new System.Drawing.Point(307, 14);
this.btn_save_dot.Name = "btn_save_dot";
this.btn_save_dot.Size = new System.Drawing.Size(104, 23);
this.btn_save_dot.TabIndex = 1;
this.btn_save_dot.Text = "Save";
this.btn_save_dot.UseVisualStyleBackColor = true;
this.btn_save_dot.Click += new System.EventHandler(this.btn_save_dot_Click);
//
// textBox2
//
this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.textBox2.Location = new System.Drawing.Point(5, 15);
this.textBox2.Name = "textBox2";
this.textBox2.Size = new System.Drawing.Size(296, 22);
this.textBox2.TabIndex = 0;
//
// statusStrip1
//
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripStatusLabel1});
this.statusStrip1.Location = new System.Drawing.Point(0, 300);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(430, 23);
this.statusStrip1.TabIndex = 0;
this.statusStrip1.Text = "statusStrip1";
//
// toolStripStatusLabel1
//
this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
this.toolStripStatusLabel1.Size = new System.Drawing.Size(141, 18);
this.toolStripStatusLabel1.Text = "toolStripStatusLabel1";
//
// FormVisual
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(430, 323);
this.Controls.Add(this.tabControl1);
this.Controls.Add(this.statusStrip1);
this.Name = "FormVisual";
this.Text = "FormVisual";
this.Activated += new System.EventHandler(this.FormVisual_Activated);
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormVisual_FormClosing);
this.tabControl1.ResumeLayout(false);
this.tabVisual.ResumeLayout(false);
this.panel2.ResumeLayout(false);
this.panel2.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.tabDot.ResumeLayout(false);
this.tabDot.PerformLayout();
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabDot;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.TabPage tabVisual;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Button btn_save_dot;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Panel panel2;
}
}
24 Lib.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
namespace Automata {
public class Lib {
static Random r = new Random();
public static double get_random_from_interval(double min, double max) {
int N = 100000;
int i = r.Next(N);
double x = min + (max - min) * i / N;
x = Math.Round(x, 2);
return x;
}
public static void alarm(string ss) {
MessageBox.Show(ss, "Сообщение");
}
public static bool confirm(string ss) {
DialogResult result =
MessageBox.Show(ss, "Подтверждение", MessageBoxButtons.YesNo);
return (result == DialogResult.Yes);
}
public static int nvl_int(String value, int default_value) {
int rez = default_value;
try {
rez = int.Parse(value);
} catch(Exception e) {
Lib.alarm("nvl_int e=" + e.Message);
}
return rez;
}
public static void form_attr_read(XmlElement e, Form f) {
String ss = e.GetAttribute("window_state");
FormWindowState st = FormWindowState.Normal;
if(ss.Equals("Maximized")) st = FormWindowState.Maximized;
if(ss.Equals("Minimized")) st = FormWindowState.Minimized;
f.Top = nvl_int(e.GetAttribute("top"), f.Top);
f.Left = nvl_int(e.GetAttribute("left"), f.Left);
f.Width = nvl_int(e.GetAttribute("width"), f.Width);
f.Height = nvl_int(e.GetAttribute("height"), f.Height);
f.WindowState = st;
}
public static void form_attr_write(XmlElement e, Form f) {
FormWindowState s = f.WindowState;
if(f.WindowState != FormWindowState.Normal) {
f.WindowState = FormWindowState.Normal;
}
e.SetAttribute("top", "" + f.Top);
e.SetAttribute("left", "" + f.Left);
e.SetAttribute("width", "" + f.Width);
e.SetAttribute("height", "" + f.Height);
e.SetAttribute("window_state", "" + s);
f.WindowState = s;
}
}
}
25 Model.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Text.RegularExpressions;
namespace Automata {
partial class Model {
enum Context { nil, type, trans, place, marking, marking_place };
Context context = Context.nil;
//
Hashtable Places = new Hashtable();
Place current_place;
public List<Place> p_list = new List<Place>();
//
Hashtable Types = new Hashtable();
Type current_type;
Transition current_transition;
public List<Type> t_list = new List<Type>();
//
Hashtable Constants = new Hashtable();
//
Hashtable Vars = new Hashtable();
//
Hashtable Ports = new Hashtable();
public List<Port> port_list = new List<Port>();
//
List<Instance> inst_list = new List<Instance>();
//
Hashtable markings = new Hashtable();
Marking current_marking;
//
List<Bound> bound_list = new List<Bound>();
//
public string name;
static Model m = null;
public Model(string i_name) {
name = i_name;
m = this;
}
public static Model get_model() {
return m;
}
static void log(string ss) {
Form1.log(ss);
}
static void rez(string ss) {
Form1.rez(ss);
}
static void log_t(string ss) {
Form1.log_t(ss);
}
static void error(string ss) {
Form1.log("error: " + ss);
Exception e = new Exception(ss);
throw e;
}
public void model(string ss) {
this.name = ss;
}
public Type type(string i_name) {
context = Context.type;
if(Types.Contains(i_name)) {
current_type = (Type)Types[i_name];
return current_type;
} else {
Type t = new Type(i_name);
current_type = t;
Types.Add(i_name, t);
t.id = Types.Count;
t_list.Add(t);
return t;
}
}
public Port port(string i_name) {
Port p;
if(Ports.Contains(i_name)) {
p = (Port)Ports[i_name];
} else {
p = new Port(i_name);
Ports.Add(i_name, p);
port_list.Add(p);
}
if(context == Context.type) {
if(p.type == null){
p.type = current_type;
current_type.list_port.Add(p);
}else{
if(current_type != p.type) {
Exception e = new Exception("Разные типы для порта " + i_name
+ ". Был " + p.type.name + ", определяется " + current_type.name);
throw e;
}
}
}
return p;
}
public void dconst(string i_name) {
Const c;
if(Constants.Contains(i_name)) {
c = (Const)Constants[i_name];
if(current_type != c.type) {
Exception e = new Exception("Разные типы для константы " + i_name
+ ". Был " + c.type.name + ", определяется " + current_type.name);
throw e;
}
} else {
c = new Const(i_name);
c.type = current_type;
Constants.Add(i_name, c);
c.id = Constants.Count - 1;
current_type.list_const.Add(c);
}
}
public void dvar(string i_name) {
Var v;
if(Vars.Contains(i_name)) {
v = (Var)Vars[i_name];
if(current_type != v.type) {
error("Разные типы для переменной " + i_name
+ ". Был " + v.type.name + ", определяется " + current_type.name);
}
} else {
v = new Var(i_name);
v.type = current_type;
Vars.Add(i_name, v);
current_type.list_var.Add(v);
}
}
public Place place(string i_name){
if (context == Context.marking
|| context == Context.marking_place
) {
context = Context.marking_place;
if (Places.Contains(i_name)) {
if (current_marking.places.Contains(i_name)) {
error("marking " + current_marking.name + ": place"
+ i_name + " already present in marking");
}
Place p = (Place)Places[i_name];
Place place = new Place(i_name);
place.id = p.id;
//current_marking.current_place = place;
current_place = place;
current_marking.places.Add(i_name,place);
} else {
error("marking "+current_marking.name +": place"
+ i_name + " not found");
}
return null;
} else {
context = Context.place;
if (Places.Contains(i_name)) {
current_place = (Place)Places[i_name];
return current_place;
} else {
Place p = new Place(i_name);
current_place = p;
Places.Add(i_name, p);
p_list.Add(p);
p.id = p_list.Count - 1;
return p;
}
}
}
public void arc_in(string i_place_to, string i_place_from, string i_port_name) {
Place p_to = this.place(i_place_to);
Place p_from = this.place(i_place_from);
Port port_ = port(i_port_name);
Arc arc = new Arc(p_from, port_);
arc.p0 = p_to;
arc.in_out = Arc.IN;
p_to.list_in.Add(arc);
}
public void arc_out(string i_place_from, string i_place_to, string i_port_name) {
Place p_to = this.place(i_place_to);
Place p_from = this.place(i_place_from);
Port port_ = port(i_port_name);
Arc arc = new Arc(p_to, port_);
arc.p0 = p_from;
arc.in_out = Arc.OUT;
p_from.list_out.Add(arc);
}
public State state(string i_name) {
return state(i_name, null);
}
public State state(string i_name,string i_symbol) {
if(context != Context.type && context != Context.trans) {
error("При определении состояния " + i_name + " не определен контекст типа. "+context);
}
Type type = current_type;
State s;
Form1.log("->state " + i_name);
if(type.States.Contains(i_name)) {
Form1.log("-->old state " + i_name);
s = (State)type.States[i_name];
}else{
Form1.log("-->new state " + i_name);
s = new State(i_name, type);
type.States.Add(i_name,s);
type.list_states.Add(s);
s.id = type.list_states.Count -1;
}
if(i_symbol != null) s.symbol = i_symbol[0];
if(type.initial_state == null) {
type.initial_state = s;
}
return s;
}
public Register timer(string i_name) {
return register(i_name, RegType.rt_timer);
}
public Register register(string i_name, RegType i_reg_type){
if(context != Context.type && context != Context.trans) {
error("При определении регистра " + i_name + " не определен контекст типа. " + context);
}
Type type = current_type;
Register reg;
if(type.Registers.Contains(i_name)) {
Form1.log("-->old register " + i_name);
reg = (Register)type.Registers[i_name];
if(reg.reg_type != i_reg_type) {
error("Регистр " + i_name + " уже определен с другим типом в типе " + type.name);
}
} else {
Form1.log("-->new register " + i_name);
reg = new Register(i_name, i_reg_type);
type.Registers.Add(i_name, reg);
type.list_regs.Add(reg);
reg.id = type.list_regs.Count - 1;
}
return reg;
}
public void reset(string i_timer) {
if(context != Context.trans) {
error("reset timer=" + i_timer + ": контекст не переход");
}
Type type = current_type;
Transition trans = current_transition;
Register t_reg;
if(type.Registers.Contains(i_timer)) {
t_reg = (Register)type.Registers[i_timer];
if(t_reg.reg_type != RegType.rt_timer) {
error("Тип регистра " + i_timer + " в типе " + type.name + " не Timer");
}
} else {
t_reg = timer(i_timer);
}
trans.list_reset.Add(t_reg);
}
public void constr(string i_text){
if(context != Context.trans) {
error("constraint=" + i_text + ": контекст не переход");
}
Type type = current_type;
Transition trans = current_transition;
log("constr=" + i_text);
Regex rx = new Regex(@"^([a-zA-Z]*)\s*([+|-]*)\s*([a-zA-Z]*)(>=|<=|>|<|=)(\d+)");
Match match = rx.Match(i_text);
if(match.Success) {
log("constr ----> match");
} else {
log("constr ----> not match");
error("Error in constraint " + i_text + ". Constraint must look like X + Y < 10");
}
GroupCollection gc = match.Groups;
/*
foreach(Group g in gc) {
log("g=" + g.Value);
}
*/
int[] gn = rx.GetGroupNumbers();
foreach(int i in gn) {
log("group i[" + i + "]="+gc[i].Value);
}
if(gc[1].Value == "") {
error("Error in constraint " + i_text + ": first variable is null");
}
Constraint constr = new Constraint();
constr.r1 = timer(gc[1].Value);
constr.a = 1;
if(gc[2].Value == ""){
constr.r2 = null;
constr.b = 0;
}else {
if(gc[3].Value == "") {
error("Error in constraint " + i_text + ": sign found, but second variable is null");
}
constr.r2 = timer(gc[3].Value);
if(gc[2].Value == "+"){
constr.b = 1;
} else if(gc[2].Value == "-"){
constr.b = -1;
}
}
if(gc[4].Value == ">=") {
constr.rel = ConstraintRelation.ge;
} else if(gc[4].Value == "<=") {
constr.rel = ConstraintRelation.le;
} else if(gc[4].Value == "<") {
constr.rel = ConstraintRelation.lt;
} else if(gc[4].Value == ">") {
constr.rel = ConstraintRelation.gt;
} else if(gc[4].Value == "=") {
constr.rel = ConstraintRelation.eq;
}
constr.c = stoi(gc[5].Value);
trans.list_constr.Add(constr);
log("a=" + constr.a + " b=" + constr.b + " c=" + constr.c);
}
public void trans_symbol(string i_symbol) {
if(context != Context.trans) {
error("trans_symbol=" + i_symbol
+ ": контекст не переход");
}
if(i_symbol.Length > 0) current_transition.symbol = i_symbol[0];
}
public void trans(string i_state_from, string i_state_to) {
trans(i_state_from, i_state_to, null);
}
public void trans(string i_state_from, string i_state_to, string i_name) {
Form1.log("trans " + i_state_from + " -> " + i_state_to);
if(context != Context.type && context != Context.trans) {
error("При определении перехода " + i_state_from + "->"+i_state_to
+ " не определен контекст типа. "+context);
}
State s_from = state(i_state_from);
State s_to = state(i_state_to);
Transition trans = new Transition(s_from,s_to);
if(i_name != null) {
trans.name = i_name;
trans.chart_name = i_name;
}
current_type.list_trans.Add(trans);
s_from.list_trans.Add(trans);
trans.id = s_from.list_trans.Count()-1;
// trans.name += "(" + trans.id + ")";
context = Context.trans;
current_transition = trans;
}
int stoi(string i_ss) {
return stoi(i_ss, 0);
}
int stoi(string i_ss, int i_default) {
int rez = i_default;
rez = Int32.Parse(i_ss);
return rez;
}
double stod(string i_ss) {
return stod(i_ss, 0);
}
double stod(string i_ss, double i_default) {
double rez = i_default;
rez = double.Parse(i_ss);
return rez;
}
public void wait(string i_time) {
wait(i_time, i_time);
}
public void wait(string time_from, string time_to) {
if(context != Context.trans) {
error("wait time_from=" + time_from
+ " time_to=" + time_to
+ ": контекст не переход");
}
double time1 = stod(time_from, Transition.default_wait);
double time2 = stod(time_to, time1);
current_transition.wait_min = time1;
current_transition.wait_max = time2;
}
public void duration(string i_time) {
duration(i_time, i_time);
}
public void duration(string time_from, string time_to) {
if(context != Context.trans) {
error("duration time_from=" + time_from
+ " time_to="+ time_to
+ ": контекст не переход");
}
double time1 = stod(time_from, Transition.default_duration);
double time2 = stod(time_to, time1);
current_transition.duration_min = time1;
current_transition.duration_max = time2;
}
public void priority(string i_prty) {
if(context != Context.trans) {
error("priority=" + i_prty
+ ": контекст не переход");
}
int prty = stoi(i_prty, 1);
current_transition.priority = prty;
}
public void term_in(string i_port_name, string i_con_var, string i_state) {
term("in", i_port_name, i_con_var, i_state);
}
public void term_in(string i_port_name, string i_con_var) {
term("in", i_port_name,i_con_var, null);
}
public void term_out(string i_port_name, string i_con_var, string i_state) {
term("out", i_port_name, i_con_var, i_state);
}
public void term_out(string i_port_name, string i_con_var) {
term("out", i_port_name,i_con_var, null);
}
public void term(string i_dir, string i_port_name, string i_cv, string i_state) {
if(context != Context.trans) {
error("term_" + i_dir + "=" + i_port_name + "," + i_cv
+ ": контекст не переход");
}
Transition trans = current_transition;
if(!Ports.Contains(i_port_name)) {
error("term_" + i_dir + "=" + i_port_name + "," + i_cv
+ "порт не найден");
}
Port port = (Port)Ports[i_port_name];
Term term = null;
Res res = null;
if(Constants.Contains(i_cv)) {
Const c = (Const)Constants[i_cv];
if(c.type != port.type) {
error("term_" + i_dir + "=" + i_port_name + "," + i_cv
+ ": не совпадают типы! type(" + i_port_name + ")=" + port.type.name
+ ", type(" + i_cv + ")=" + c.type.name
);
}
term = new Term(port, c);
res = c;
} else if(Vars.Contains(i_cv)) {
Var v = (Var)Vars[i_cv];
if(port.type == null) {
error("term_" + i_dir + "=" + i_port_name + "," + i_cv
+ ": не определен тип порта");
}
log("1: v.type="+v.type.name
//+ " port.type="+port.type.name
);
if(v.type != port.type) {
error("term_" + i_dir + "=" + i_port_name + "," + i_cv
+ ": не совпадают типы! type(" + i_port_name + ")=" + port.type.name
+ ", type(" + i_cv + ")=" + v.type.name
);
}
log("2");
term = new Term(port, v);
log("3");
res = v;
/*
if(i_state != null) {
log("111: term_" + i_dir + "=" + i_port_name + "," +...
Подобные документы
Обзор средств компьютерного имитационного моделирования по созданию веб-приложения для визуализации имитационных моделей. Система имитационного моделирования AnyLogic, Arena, SimuLab. Серверная, клиентская часть. Модель работы отдела банка и участка цеха.
дипломная работа [3,3 M], добавлен 25.05.2015Проектирование и реализация модели, которая будет имитировать автозаправочную станцию с постоплатой. Подбор оптимальных параметров модели с учетом требований к сети массового обслуживания. Разработка модели в среде имитационного моделирования GPSS World.
контрольная работа [279,5 K], добавлен 16.03.2014Создание систем имитационного моделирования AnyLogic, Arena, SimuLab, Simbigraph и Forio. Серверная и клиентская часть. Разработка модели работы отдела банка, участка цеха, движения автобуса по маршруту и социальной сети. Описание web-приложения.
дипломная работа [3,4 M], добавлен 25.05.2015Разработка имитационной модели "Перекресток" для анализа бизнес-процессов предприятия и принятия решения в сложных условиях. Алгоритм построения имитационной модели на основе CASE-средств. Обзор программного обеспечения для имитационного моделирования.
дипломная работа [2,6 M], добавлен 22.11.2015Описание комплекса программных модулей, предназначенного для повышения эффективности аппаратных ресурсов компьютера. Характеристика компонентов сетевых и распределенных операционных систем. Модели сетевых служб. Способы разделения приложений на части.
презентация [1,4 M], добавлен 10.11.2013Роль гидродинамических процессов в современной технике и технологиях. Необходимость использования компьютерных методов при моделировании. Обзор дискретных моделей решетчатых газов. Соответствие реальных величин параметрам модели. Программное обеспечение.
дипломная работа [1,6 M], добавлен 22.04.2012Понятие компьютерной и информационной модели. Задачи компьютерного моделирования. Дедуктивный и индуктивный принципы построения моделей, технология их построения. Этапы разработки и исследования моделей на компьютере. Метод имитационного моделирования.
реферат [29,6 K], добавлен 23.03.2010Центральные магистрали передачи данных. Улучшение параметров мультисервисной сети за счет использования имитационного моделирования. Сети с трансляцией ячеек и с установлением соединения. Коммутация в сети Ethernet. Многоуровневая модель протоколов.
курсовая работа [2,3 M], добавлен 25.06.2014Значение вербальных и знаковых информационных моделей для исследования объектов, процессов, явлений. Роль метода формализации в процессе создания компьютерной модели. Использование программы AutoCAD для трехмерного моделирования и визуализации объекта.
курсовая работа [866,5 K], добавлен 08.01.2015Обзор пакетов программ, предназначенных для визуализации и анализа данных. Обоснование выбора среды программирования. Организация аварийного буфера. Передача данных от нижнего уровня к верхнему и сохранение данных. Отображение данных в графической форме.
дипломная работа [512,4 K], добавлен 28.08.2012Характеристики распределенных систем баз данных, формируемые путем "интеграции" разнородных аппаратных и программных средств. Концепция дифференциального файла для различных приложений. Сравнение разных технологий файлового сервера и "клиент-сервера".
курсовая работа [411,9 K], добавлен 28.05.2015Основы технологии моделирования Arena. Построение простой имитационной модели. Моделирование работы системы обслуживания покупателей на кассе супермаркета. Построение модели IDEF3. Анализ результатов имитационного моделирования и аналитического решения.
курсовая работа [659,1 K], добавлен 24.03.2012Сущность концептуального и физического моделирования. Описание графической среды AnyLogic как единственного инструмента имитационного моделирования. Основные этапы создания модели, позволяющей наглядно проанализировать влияние рекламы на покупателей.
курсовая работа [690,2 K], добавлен 30.05.2014Построение, исследование описательных и формальных информационных моделей. Применение электронных обучающих средств в современной системе образования. Обусловленность выбора средств разработки и языков программирования. Обзор пользовательского интерфейса.
дипломная работа [7,3 M], добавлен 09.02.2017Основы систематизации языков имитационного моделирования, моделирование систем и языки программирования. Особенности использования алгоритмических языков, подходы к их разработке. Анализ характеристик и эффективности языков имитационного моделирования.
курсовая работа [1,4 M], добавлен 15.03.2012Особенности систем массового обслуживания и сущность имитационного моделирования с использованием GPSS. Структурная схема модели системы и временная диаграмма. Сравнение результатов имитационного моделирования и аналитического расчета характеристик.
курсовая работа [214,2 K], добавлен 23.06.2011Основные характеристики и алгоритмы настройки виртуальной локальной вычислительной сети VLAN, протоколов маршрутизации, системы доменных имен и трансляции сетевых адресов с целью разработки корпоративной сети в среде имитационного моделирования.
курсовая работа [556,1 K], добавлен 23.04.2011Математическое описание имитационной модели. Описание блок-схемы алгоритма. Анализ полученных результатов имитационного моделирования. Сопоставление полученных результатов для разработанных моделей. Математическое описание аналитического моделирования.
курсовая работа [306,5 K], добавлен 25.03.2015Особенности моделирования биологических систем с использованием программы "AnyLogic". Влияние различных факторов на популяции жертв и хищников. Принципы имитационного моделирования и его общий алгоритм с помощью ЭВМ. Анализ результатов моделирования.
курсовая работа [922,2 K], добавлен 30.01.2016Характеристика функций имитационного моделирования. Знакомство с особенностями имитационного моделирования агрегированной системы массового обслуживания. Анализ программы GPSSWorld: рассмотрение возможностей, способы составления имитационной модели.
курсовая работа [1,6 M], добавлен 27.05.2013