Лабораторная работа №1 (990535), страница 2
Текст из файла (страница 2)
Данная таблица полна и непротиворечива. Проверка выполнена в программно-инструментальном комплексе СИМПР.
Имеются логические следующие отношения:
c4->!c5
c4->!c6
c5->!c6
Т.е. корабль не может находится сразу в двух состояниях, например в состоянии “движение” и “разгрузка”.
c7->!c9
c7->!c11
c7->!c13
c7->!c15
c9->!c11
c9->!c13
c9->!c15
c11->!c13
c11->!c15
c13->!c15
Т.е. корабль не может сразу находится в нескольких местах, например в области дока 1 и в области дока 2.
Трансляция последовательная: C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, P14, P15, P16, P17, P18, P19, P20, P21, P22, P23, P24, P25, P26, P27, P28, P29, P30, P31, P32, P33, P34, P35, P36, P37, P38, P39, P40.
Трансляция оптимизированная: C1, C2, C3, C4, C15, P7, P16, P25, P34, C11, P8, P26, C13, P9, P27, C12, P11, P29, C14, P13, P31, C7, P17, P35, C8, P2, P20, C9, P18, P36, C10, P4, P22, P1, P3, C5, C6, P5, P6, P14, P15, P23, P24, P32, P33, P39, P40, P37, P38, P10, P12, P19, P21, P28, P30.
-
Таблица 3 (Движение):
Таблица 3 имеет одно условие и одно действие. Данная таблица проверяет был ли сделан шаг кораблем. Если условие C1 верно (шаг сделан), то происходит переход к таблице 1, т.е. проверяем условие “Программа включена”. Если условие C1 не верно (шаг не сделан), то выполняется действие R1 (сделать шаг), а затем переход к таблице 1.
| 1 | 2 | |
| C1 | T | F |
| R1 | 1 | |
| + | 1 | 1 |
| Описание таблицы 3 (Движение) | |
| C1 | Шаг сделан |
| R1 | Сделать шаг |
Данная таблица полна и непротиворечива. Проверка выполнена в программно-инструментальном комплексе СИМПР.
При проектировании данной таблицы логические отношения не использовались.
Трансляция последовательная: C1, P1, P2.
Трансляция оптимизированная: C1, P1, P2.
-
Таблица 4 (Швартовка):
Таблица 4 имеет два условия и два действия. C1 (док достигнут) проверяет достигнут ли док. Если данное условие верно, то выполняется действие R2 (переход в состояние “разгрузка”). Условие C2 проверяет был ли сделан шаг к доку. Если условие C1 и условие C2 не верны, то выполняется действие R1 (сделать шаг по направлению к доку).
При любых условиях, после выполнения соответствующих действий выполняется переход к таблице 1.
По окончании разгрузки, корабль возвращается в состояние движение и освобождает док для следующего корабля.
| 1 | 2 | 3 | 4 | |
| C1 | T | T | F | F |
| C2 | T | F | T | F |
| R1 | 1 | 1 | ||
| R2 | 1 | 1 | ||
| + | 1 | 1 | 1 | 1 |
| Описание таблицы 4 (Швартовка) | |
| C1 | Док достигнут |
| C2 | Шаг к доку сделан |
| R1 | Сделать шаг |
| R2 | Переход в состояние разгрузка |
Данная таблица полна и непротиворечива. Проверка выполнена в программно-инструментальном комплексе СИМПР.
При проектировании данной таблицы логические отношения не использовались.
Трансляция последовательная: C1, C2, P1, P2, P3, P4.
Трансляция оптимизированная: C1, C2, P1, P2, P3, P4.
-
Таблица 5 (Разгрузка):
Таблица 5 имеет два условие и два действие. C1 проверяет (таймер запущен) работает ли таймер. C2 (таймер сработал) проверяет сработал ли таймер, т.е., если это условие верно, то таймер должен был быть запущен и уже сработал.
Действие R1 (запустить таймер) выполняется когда оба условия не верны, затем выполняется переход к таблице 1.
Действие R2 (Переход в состояние “движение”), R3 (Переход в состояние “без груза”), R4 (Освободить док) выполняются лишь в том случае, когда верно условие C2 (таймер уже сработал) и не верно C1 (таймер не работает, остановлен), затем выполняется переход к таблице 1..
Если таймер запущен, но еще не сработал, то выполняется переход к таблице 1.
Если C1 верно (таймер запущен, еще работает) и C2 верно (уже сработал), то возникает парадокс. В этом случае, выполняется действие R5 (Вывести сообщение об ошибке), и выполняется переход в конечное состояние S.
| 1 | 2 | 3 | 4 | |
| C1 | T | T | F | F |
| C2 | T | F | T | F |
| R1 | 1 | |||
| R2 | 1 | |||
| R3 | 2 | |||
| R4 | 3 | |||
| R5 | 1 | |||
| + | S | 1 | 1 | 1 |
| Описание таблицы 4 (Разгрузка) | |
| C1 | Таймер запущен |
| C2 | Таймер сработал |
| R1 | Запустить таймер |
| R2 | Переход в состояние “движение” |
| R3 | Переход в состояние “без груза” |
| R4 | Освободить док |
| R5 | Вывести сообщение об ошибке |
Данная таблица полна и непротиворечива. Проверка выполнена в программно-инструментальном комплексе СИМПР.
При проектировании данной таблицы логические отношения не использовались.
Трансляция последовательная: C1, C2, P1, P2, P3, P4.
Трансляция оптимизированная: C1, C2, P2, P1, P4, P3.
-
Приложение. Выдержки из программного кода с комментариями.
-
Процедура-функция WinProc().
//Управление кораблями
void __fastcall TfrmMain::WndProc(Messages::TMessage &Message)
{
if(Message.Msg == MsgSIMPR)
{
//Sleep(int_timeSleep);
//Условия
if(Message.WParamHi == 0)
//Таблицы
switch(Message.WParamLo)
{
//Первая tabl (выключатель)
case 1:
{
if(flgPg != 0)
{
fprintf(input, "\n");
fprintf(input, "----------------------------------------------------------------------------------------------------\n");
fprintf(input, "\n");
}
fprintf(input, "X = %d, Y = %d\n", ShipMas[int_ID]->GetX(), ShipMas[int_ID]->GetY());
flgPg++;
fprintf(input, "condition tabl 1");
//Номер условия
switch(Message.LParam)
{
//Условие 1
case 1:
{
fprintf(input, " OnOff -");
if(flgOnOff == 1)
{
fprintf(input, " 1");
Message.Result = true;
}
else if(flgOnOff == 0)
{
fprintf(input, " 0");
Message.Result = false;
}
fprintf(input, "\n");
return;
break;
}
}
}
//Вторая tabl (диспетчер)
case 2:
{
fprintf(input, "condition tabl 2");
//Номер условия
switch(Message.LParam)
{
//Условие 1
case 1:
{
fprintf(input, " %d Last -", int_ID);
if(int_i == last)
{
fprintf(input, " 1");
Message.Result = true;
frmInfo->radgrp1->ItemIndex = 0;
frmInfo->RadioButton1->Checked = true;
}
else
{
fprintf(input, " 0");
Message.Result = false;
frmInfo->RadioButton1->Checked = false;
}
fprintf(input, "\n");
int_ID = int_i;
frmInfo->lbNum->Caption = int_ID + 1;
Sleep(int_timeSleep);
return;
break;
}
//Условие 2
case 2:
{
fprintf(input, " %d MissionPas -", int_ID);
if(ShipMas[int_ID]->GetMission() == 0)
{
fprintf(input, " 1");
Message.Result = true;
frmInfo->radgrp1->ItemIndex = 1;
frmInfo->RadioButton2->Checked = true;
}
else if(ShipMas[int_ID]->GetMission() == 1)
{
fprintf(input, " 0");
Message.Result = false;
frmInfo->RadioButton2->Checked = false;
}
fprintf(input, "\n");
Sleep(int_timeSleep);
return;
break;
}
//Условие 3
case 3:
{
fprintf(input, " %d Load -", int_ID);
if(ShipMas[int_ID]->GetLoad() == 1)
{
fprintf(input, " 1");
Message.Result = true;
frmInfo->radgrp1->ItemIndex = 2;
frmInfo->RadioButton3->Checked = true;
}
else if (ShipMas[int_ID]->GetLoad() == 0)
{
fprintf(input, " 0");
Message.Result = false;
frmInfo->RadioButton3->Checked = false;
}
fprintf(input, "\n");
Sleep(int_timeSleep);
return;
break;
}
//Условие 4
case 4:
{
fprintf(input, " %d Move -", int_ID);
if(ShipMas[int_ID]->GetStatus() == 0)
{
fprintf(input, " 1");
Message.Result = true;
frmInfo->radgrp1->ItemIndex = 3;
frmInfo->RadioButton4->Checked = true;
}
else if(ShipMas[int_ID]->GetStatus() != 0)
{
fprintf(input, " 0");
Message.Result = false;
frmInfo->RadioButton4->Checked = false;
}
fprintf(input, "\n");
Sleep(int_timeSleep);
return;
break;
}
//Условие 5
case 5:
{
fprintf(input, " %d Dock -", int_ID);
if(ShipMas[int_ID]->GetStatus() == 1)
{
fprintf(input, " 1");















