
ОПИСАНИЕ
Данный
проект
предназначен
для
моделирования,
графического
представления
и
мониторинга
работы
различных
реальных
систем (например:
телекоммуникационной,
транспортной,
market-системы).
На
сегодняшний
день имеет
возможности:
•
Визуальное,
векторное
представление
объектов
моделей(в
виде
топографической
карты),
которое
реализует:
•
легкое
управление
отображение
модели.
Позволяет
плавно
перемещаться,
плавно
менять
масштаб и
поворот
изображения;
•
простое
редактирование
(drag and drop),
добавление,
удаление
изображений.
Возможность
изменения
масштаба и
ориентирования
объектов и
целых
регионов
карты;
•
синхронизация
отображений
всех
клиентов
системы, т.е.
изменения,
сделанные
одним
клиентом
одновременно
отображаются
у других;
•
возможность
использования
в качестве
первоосновы
топографическую
карту
местности (в
виде файла
графического
формата bmp,jpeg и т.д.);
•
возможность
удаленного
доступа
через модем;
•
Представление
объектов в
виде панелей
свойств, т.е.
окна
отображающего
основные
параметры
объекта. Ее
основные
возможности:
•
синхронизация
панелей
свойств, т.е.
изменения
свойств
объекта,
произошедшие
на любом
клиенте,
одновременно
обновляют
панели
свойств
других
клиентов;
•
возможность custom-изации
панели
свойств для
любого
конкретного
объекта, т.е.
возможность
изменения
конфигурации
панели
свойств под
конкретный
объект (элементов
управления
их положение
и размер);
•
Практически
неограниченное
число
объектов
модели (ограничено
лишь
возможностями
сервера и SQL сервера
хранения
информации
системы);
В
настоящее
время проект
используется
для
автоматизации
работы узла
электросвязи(г.
Арзамас ~ 118 тыс.
жителей), где
служит для:
•
хранения
ресурсов
линейного
хозяйства
ГТС:
магистралей,
распределений,
распределительных
шкафов,
колодцев и т.д.(паспортная
группа);
•
хранения
станционных
ресурсов ГТС:
станционного
оборудования,
абонентских
комплектов,
монтированной
емкости и т.д.(КРОСС);
•
ведения
абонентской
картотеки (электронный
аналог
абонентской
карточки ТФ2/2)
(КРОСС);
•
регистрации
и устранения
станционных
и линейных
повреждений (бюро
ремонта 05,
КРОСС);
•
автоматизации
установки
телефонов и
выделения
других
ресурсов
узла
(абонентский
отдел);
•
статистической
обработки
информации о
занятых,
свободных и
поврежденных
ресурсах;
При
разработке
проекта за
основу
принимались
следующие
основные
понятия:
Developer Level
.
•
Представление
-
информация
об объекте
доступная и
понятная
клиенту(разработчику,
пользователю).
По ней клиент
может понять,
что
представляет
собой объект
(примеры:
панель
свойств есть
визуальное
представление
свойств
объекта, Com-
интерфейс
служит
представлением
Com-объекта
в памяти Win32-процесса,
карта это 2D представление
реальных
объектов)
•
Функциональность
-
«InProcess» представление
объекта. Т.е.
представление
объекта в
памяти
процесса
системы
•
Абстрактная
модель
-
некоторое
множество представлений
объектов +
принципы и
логика
взаимодействия
объектов
через эти представления.
(примеры:
файловая
система,
схема
интернет-соединения,
расписание
движения
транспорта и
т.д.)
DATA Storage Level
.
•
Объект
- реальная
сущность,
находящаяся
в носителях
информации (например:
файл, SQL таблица, Com-объект),
видимая и
доступная
только через абстрактные
модели
(примеры: дом,
улица,
телефон,
транспорт,
яблоко и т.д.)
Client(User) Level
.
•
Представитель
модели
-
некоторая
сущность,
реальная
или
виртуальная,
предназначенная
для
отображения представления
модели
клиентам в
понятной для
них форме для
анализа и
изменения(примеры: Reflector(TReflector)
отображает 2D-визуализацию
объектов,
память Win32-процесса
содержит в
себе
интерфейсы Com-модели)
Для
представления
объекта в Win32
процессе,
служит «InProcess»
функциональность, или
просто – функциональность.
Базовой(корневой)
функциональностью
процесса
является
класс TFunctionality(аналог
Com-интерфейса
IUnknown).
TFunctionality служит
для запроса
другой
функциональности
объекта и для
контроля
времени
жизни(описана
в файле TypesDef\Functionality.pas).
Ниже следует
ее описание:
TFunctionality = class
private
RefCount:
integer; //. Счетчик
ссылок на
экземпляр
функциональность
public
Constructor
Create;
function AddRef:
integer; virtual; Stdcall; //. увеличивает число
ссылок
function
Release: integer;
virtual; Stdcall; //.
уменьшает
число ссылок,
если оно
становится = 0,
то удаляет
объект
function QueryFunctionality(RequiredFunctionalityClass:
TFunctionalityClass; out F: TFunctionality):
boolean; virtual;
StdCall; //.
запрашивает
новую
функциональность,
по ее типу
end;
Все
типы
функциональностей
явно
унаследованы
от TFunctionality.
Первичными
моделями, т.е.
моделями на
основе
которых
строятся
другие (вторичные)
модели в
данной
проекте
являются
следующие:
• Идентификационная
модель.
• Компонентная
модель.
• Модель
2D-визуализации.
• Модель
панелей
свойств.
Ниже
дано
описание
реализаций
этих моделей.
Идентификационная
модель
Согласно
этой модели,
каждый
объект имеет идентификатор(id), по
которому
находится
именно этот
объект. ID SQL хранимого
объекта это:
TID = record
idTObj: integer;
//.
идентификатор
типа объекта (ссылка
на таблицу
хранения
объекта);
idObj: integer;
//.
идентификатор
экземпляра (ссылка
на строку
таблицы).
end;
Функциональности
данной
модели
следующие:
• Функциональность
типа(наследует
TFunctionality,
описана в
файле TypesDef\Functionality.pas):
TTypeFunctionality = class (TFunctionality)
private
function
getidType: integer;
function
getTableName: shortstring;
function
getSpace: TProxySpace;
function
getImageList_Index: integer; virtual; stdcall;
public
TypeSystem:
TTypeSystem;
FImage:
TTypeImage;
Constructor
Create; virtual;
Destructor
Destroy; override;
function
_CreateInstance: integer; virtual; stdcall;
//. создает экземпляр типа
function
CreateInstance: integer; stdcall;
//.
создает
экземпляр
типа,
используя
другой
объект
function CreateInstanceUsingObject(const
idTUseObj,idUseObj: integer): integer; virtual; stdcall;
procedure
_DestroyInstance(const idObj: integer); virtual; stdcall;
//. уничтожает экземпляр типа
procedure
DestroyInstance(const idObj: integer); stdcall;
//.
получает
список
экземпляров
данного типа
procedure GetInstanceList(var List:
TList); virtual; stdcall;
//.
создает
компонентную
функциональность(см.
ниже) объекта
с idComponent
function
TComponentFunctionality_Create(const idComponent: integer):
TComponentFunctionality; virtual; stdcall;
function
getName: shortstring; virtual; stdcall;
function
getImage: TTypeImage; virtual; stdcall;
//.
операция
синхронизации
данных всей
модели
procedure DoOnComponentOperation(const
idTObj,idObj: integer; const Operation:
TComponentOperation);
//. id типа
property idType:
integer read getidType;
//.
имя таблицы, в
которой
хранится
данный тип
property TableName: shortstring read
getTableName;
//. пространства данных
проекта
property Space:
TProxySpace read getSpace;
//.
строковое имя типа
property Name:
shortstring read getName;
//. изображение типа
property Image:
TTypeImage read getImage;
//.
индек
изображения
типа в
таблице
изображений
типов
property ImageList_Index: integer
read getImageList_Index;
end;
Компонентная
модель
Согласно
ей
полагается,
что каждый
объект
пространства
является компонентом.
Основные
правила
компонентной
функциональности:
•
Каждый
компонент
имеет
собственника,
которому он
принадлежит.
Если
собственник
компонента = nil,
т.е. пустой, то
это значит,
что
компонент
принадлежит
корневому(Root)
компоненту –
пространству
•
Каждый
компонент
является (или
может
являться)
собственником,
которому
принадлежат
другие
компоненты.
•
Принадлежность
компонента,
означает, что
он доступен и
виден только
через своего
собственника,
которому он
принадлежит.
•
Если
собственник
компонента = nil,
т.е. пустой, то
это значит,
что
компонент
принадлежит
корневому(Root)
компоненту –
пространству.
Функциональности
данной
модели
следующие:
• Функциональность
типа (см. выше).
• Компонентная
функциональность
(наследует TFunctionality,
реализует
базовые
свойства и
методы
компонента,
описана в
файле TypesDef\Functionality.pas):
TComponentFunctionality
= class (TFunctionality)
private
function
getTypeSystem: TTypeSystem;
function
getTableName: string;
public
TypeFunctionality:
TTypeFunctionality;
idObj:
integer; //. id компонента
Constructor
Create(pTypeFunctionality: TTypeFunctionality; const pidObj: integer); virtual;
Destructor
Destroy; override;
//.
проверяет
компонент на
существование
procedure
Check; virtual; stdcall;
//. вставляет компонент
procedure
InsertComponent(const idTComponent,idComponent: integer;
var id: integer); virtual; stdcall;
//. удаляет компонент
procedure
RemoveComponent(const idTComponent,idComponent: integer); virtual; stdcall;
procedure
_ToClone(var idClone: integer); virtual; stdcall;
//. клонирует компонент
procedure
ToClone(var idClone: integer); virtual; stdcall;
//.
клонирует
компонент,
используя
другой
procedure
ToCloneUsingObject(const idTUseObj,idUseObj: integer; var idClone: integer);
virtual; stdcall;
function
CanDestroy(var Reason: shortstring): boolean; virtual; stdcall;
//.
извещает
компонент об
операции над
другим
компонентом
procedure
Notify(const NotifyType: TComponentNotifyType;
const pidTObj,pidObj: integer); virtual; stdcall;
//. получает собственник компонента
function
GetOwner(var idTOwner,idOwner: integer): boolean; virtual; stdcall;
//.
устанавливает
собственные
компоненты,
используя
другой
компонент
function
SetComponentsUsingObject(const idTUseObj,idUseObj: integer): boolean; virtual;
stdcall;
//. уничтожает собственные компоненты
procedure
DestroyComponents; virtual; stdcall;
//.
удаляет себя
как
компонент в
составе
другого, без
уничтожения
procedure
RemoveSelfAsComponent; stdcall;
//.
получает
список
собственных
компонент
procedure
GetComponentsList(var ComponentsList: TComponentsList); virtual; stdcall;
//.
запрашивает
список
собственных
компонент по
классу
функциональности
function
QueryComponents(FunctionalityClass: TFunctionalityClass; out ComponentsList:
TComponentsList): boolean; overload; virtual; stdcall;
//.
запрашивает
список
собственных
компонент по
типу
function
QueryComponents(const idTNeededType: integer; out ComponentsList:
TComponentsList): boolean; overload; virtual; stdcall;
//.
запрашивает
единичный
компонент по
типу
function
QueryComponent(const idTNeededType: integer; out idTComponent,idComponent:
integer): boolean; virtual; stdcall;
//.
запрашивает
функциональность
по типу
function
QueryComponentFunctionality(NeededFunctionalityClass: TFunctionalityClass; out
Functionality: TFunctionality): boolean; virtual; stdcall;
//.
число
собственных компонент
function
ComponentsCount: integer; virtual; stdcall;
//.
получает
корневого
собственника(т.е.
у которого Owner
= nil)
function
GetRootOwner(var idTOwner,idOwner: integer): boolean; virtual; stdcall;
//.
создает
обновитель
представлений
компонента
function
TPresentUpdater_Create(pUpdateProc: TProc; pOffProc: TProc):
TComponentPresentUpdater;
//.
свойства и
методы
панели
свойств(модель
см. ниже)
procedure
CreateNewPanelProps;
procedure
DestroyPanelProps;
function
IsPanelPropsExist: boolean;
function
GetPanelPropsLeftTop(var PanelProps_Left,PanelProps_Top: integer): boolean;
virtual; stdcall;
function
GetPanelPropsWidthHeight(var PanelProps_Width,PanelProps_Height: integer):
boolean; virtual; stdcall;
procedure
SetPanelPropsLeftTop(const PanelProps_OfsX,PanelProps_OfsY: integer); virtual;
stdcall;
procedure
SetPanelPropsWidthHeight(const PanelProps_Width,PanelProps_Height: integer);
virtual; stdcall;
//.
CustomPanelProps routines
function
IsCustomPanelPropsExist: boolean;
function
idCustomPanelProps: integer;
function
CustomPanelProps: TClientBlobStream;
procedure
SetCustomPanelProps(Stream: TStream; const flNewValue: boolean{если = true, то заменяет панелью с новым ID});
procedure
SetCustomPanelPropsByID(const idPanelProps: integer);
procedure
ReleaseCustomPanelProps;
//.
создает
новую панель свойств
function
TPanelProps_Create(pflReadOnly: boolean; pidOwnerObjectProp:
integer;pOwnerPanelsProps: TAbstractSpaceObjPanelsProps; const pProxyObject:
TObjectDescr): TAbstractSpaceObjPanelProps; virtual; stdcall;
function
getName: shortstring; virtual; stdcall;
procedure
setName(Value: shortstring); virtual; stdcall;
function
getHint: shortstring; virtual; stdcall;
function
getidTObj: integer; stdcall;
function
getSpace: TProxySpace;
//.
операция
синхронизации
данных всей
модели на Update компонента
procedure
DoOnComponentUpdate;
//.
id типа компонента
property
idTObj: integer read getidTObj;
//.
система
типа компонента
property
TypeSystem: TTypeSystem read getTypeSystem;
//.
имя
компонента
property
Name: shortstring read getName write setName;
//.
подсказка
компонента
property
Hint: shortstring read getHint;
//.
имя
таблицы хранения
property
TableName: string read getTableName;
//.
имя
пространства
данных
проекта
property
Space: TProxySpace read getSpace;
end;
Компонентная
функциональность
объекта
получается
вызовом
глобальной
процедуры:
procedure TComponentFunctionality_Create(const
idTObj,idObj: integer): TComponentFunctionality,
где
idTObj:
идентификатор
типа
компонента, idObj –
идентификатор
компонента.
Модель
2D-визуализации
Это
модель
плоского 2D пространства,
основанная
на
компонентной
модели, в
которой
каждый
компонент
может иметь
визуальное
представление
- визуализацию.
Модель
визуализации
храниться в
файле,
называемом
как Файл
пространства.
Файл
пространства
2D-визуализации
является
последовательностью
объектов(TSpaceObj) и узлов их
фигур-полигонов(TPoint) (определено
в файле ServerSpace\GlobalSpaceDefines.pas):
Const
nilPtr=-1; //. пустой
указатель
type
TPtr =
Integer;
TCrd
= Real48;
{описание
точки}
Type
TPoint =
packed record
ptrNextObj:
TPtr;
X,Y:
TCrd;
end;
{описание
фигуры}
Type
TSpaceObjLineWidth
= Real48;
Type
TSpaceObj
= packed record
ptrNextObj:
TPtr; //. не менять
положение
idTObj:
integer;
idObj:
integer;
ptrFirstPoint:
TPtr;
flagLoop:
boolean;
Color:
TColor;
Width:
TSpaceObjLineWidth;
flagFill:
boolean;
ColorFill:
TColor;
ptrListOwnerObj:
TPtr;
end;
Структура
файла
пространства
показана
ниже:
Функциональности
модели 2D-визуализации
следующие:
•
Функциональность
типа Base2DVisualization(унаследована
от TTypeFunctionality,
описана в
файле TypesDef\Functionality.pas):
TTBase2DVisualizationFunctionality
= class(TTypeFunctionality)
private
function
getReflector: TReflector; virtual; stdcall;
procedure
setReflector(Value: TReflector); virtual; stdcall;
public
function
_CreateInstanceEx(pObjectVisualization: TObjectVisualization; ptrOwner: TPtr):
integer; virtual; abstract;
function
CreateInstanceEx(pObjectVisualization: TObjectVisualization; ptrOwner: TPtr):
integer;
procedure
_DestroyInstance(const idObj: integer); override; stdcall;
function
CreateObj(pReflector: TReflector; pObjectVisualization: TObjectVisualization;
const flAbsoluteCoords: boolean; const idTObj,idObj: integer; ptrOwner: TPtr):
TPtr; stdcall;
procedure
DestroyObj(const ptrDestrObj: TPtr); stdcall;
function
StdObjectVisualization: TObjectVisualization; virtual; stdcall; abstract;
property
Reflector: TReflector read getReflector write setReflector;
end;
• Функциональность Base2DVisualization компонента (унаследована от TComponentFunctionality, описана в
файле
TypesDef\Functionality.pas):
TBase2DVisualizationFunctionality
= class(TComponentFunctionality)
private
FReflector:
TReflector;
function
getReflector: TReflector; virtual; stdcall;
procedure
setReflector(Value: TReflector); virtual; stdcall;
function
getIdLay: integer; stdcall;
public
procedure
CreateClone(const ptrObj: TPtr; const ptrCloneOwner: TPtr; var idClone: integer);
stdcall;
//. отобразить визуализацию
function
Reflect(pFigure: TFigureWinRefl; pReflectionWindow: TReflectionWindow; pCanvas:
TCanvas): boolean; virtual; stdcall; abstract;
//.
уничтожить SQL-данные
визуализации
procedure
DestroyData; virtual; stdcall; abstract;
//. клонировать данные
визуализации
procedure
CloneData(var idClone: integer); virtual; stdcall; abstract;
//.
указатель на
данные
визуализации
в файле
пространства
function
Ptr: TPtr; stdcall;
//.
получить
информацию о
слое
procedure
GetLayInfo(var Lay,SubLay: integer); stdcall;
//.
сделать на
изменение
масштаба
визуализации
в
пространстве
procedure
DoOnChangeScale(const ChangeCoef: Extended); virtual; stdcall;
//. используемый рефлектор
property
Reflector: TReflector read getReflector write setReflector;
//. id слоя,
в котором
расположена
визуализация
property
idLay: integer read getIdLay;
end;
Представителем
этой модели в
проекте
является Reflector(TReflector),
который
отображает
на экране
плоское
пространство
(описан в
файле Reflector\unitReflector.pas). Внешний
вид
рефлектора
показан ниже:
Навигация
по
пространству
осуществляется
при
удержании
правой
кнопки мыши.
Модель
панелей
свойств
Согласно
ей
полагается,
что каждый
компонент
имеет
экранное
представление,
именуемое
как Панель
свойств. Панель
свойств это
экранное
визуальное
представление
данных
компонента.
Панели
свойств
собственных
компонентов
объекта
располагаются
внутри
родительской
панели. Ниже
приведен
пример
панели
свойств:

Панель
свойств
описана в
файле ServerProxySpace\SpaceObjInterpretation.pas.
Функциональности
данной
модели:
•
Абстрактная
панель
свойств (описана
в файле TypesDef\Functionality.pas):
TAbstractSpaceObjPanelProps
= class(TForm)
public
FflFreeOnClose:
boolean;
procedure
Update; virtual; abstract;
procedure
Show;
procedure
SaveChanges; virtual; abstract;
procedure
Controls_ClearPropData; virtual; abstract;
procedure
setflFreeOnClose(Value: boolean); virtual;
property
flFreeOnClose: boolean read FflFreeOnClose write setflFreeOnClose;
end;
Вторичные
модели
базируются
на моделях
описанных
выше и на
текущий
момент
включают
следующие:
• Модель
телекоммуникационного
соединения (работа
телефонной
станции).
• Транспортная
модель (работа
транспорта).
• Товарная
модель (предложение-заявка
товаров).
Модель телекоммуникационного соединения Моделирует работу телефонной станции, ее устройств и т.д. Функциональности модели описаны в файлах TypesDef\TypesFunctionality.pas, TypesDef\TypesImpl\SpaceObjPanelsProps\unitConnector_Recource.pas.
Транспортная
модель
Моделирует
работу
транспорта. Функциональности
модели(описаны
в файлах TypesDef\TypesFunctionality.pas) :
•
Функциональность
транспортного
узла TTransportNodeFunctionality(унаследована
от TComponentFunctionality).
• Функциональность транспортного маршрута TTransportКщгеуFunctionality(унаследована от TComponentFunctionality).
Товарная
модель
Моделирует
работу рынка (купля-продажа).
Функциональности
модели(описаны
в файлах TypesDef\TypesFunctionality.pas) :
•
Функциональность
товара TGoodsFunctionality(унаследована
от TComponentFunctionality).
•
Функциональность
товара
предложения TOfferGoodsFunctionality(унаследована
от TComponentFunctionality).
•
Функциональность
товара
заявки TDemandGoodsFunctionality(унаследована
от TComponentFunctionality).
Проект
выполнен по
модели Client/Server при
использовании
технологии DCOM(Microsoft).
Конструктивно
состоит из
следующих com-объектов:
•
coProxySpace(приложение
ServerProxySpace.exe) – клиент.
Состоит из
прокси(кэш)
копии файла
пространства
2D-визуализации(TProxySpace)
и системы
типов
компонент(TTypesSystem).
Реализует
рефлекторы(TReflector)
и панели
свойств(TSpaceObjPanelProps).
Имеет
следующие com-интерфейсы(описаны
в ServerProxySpace.tlb):
• IReflectorManager - менеджер рефлекторов.
• IProxySpacePartitionManager –
менеджер разбиения пространства.
•
IProxySpaceManager
- менеджер
прокси
пространства.
•
Семейство
серверов.
Служат для
обработки
запросов
клиентов и
поддержания
действительного
состояния
данных
системы.
Включают в
себя:
• coSpace (приложение
ServerSpace.exe) –
основной
сервер-синхронизатор.
Хранит в себе
основной
файл
пространства
2D-визуализаций
+ кэши для
этого файла(TGlobalSpace).
Реализует
синхронизацию
данных (кэшей)
всех
зарегистрированных
клиентов.
Имеет
следующие com-интерфейсы
(описаны в ServerSpace.tlb):
•
IProxySpacesProvider
–
поставщик
прокси
пространств(TProxySpace).
•
ISpaceManager
– менеджер
основного
пространства.
•
ISpaceConfigManager
– менеджер
конфигурации
сервера ServerSpace.exe.
•
ISpaceReportsProvider
–
поставщик
отчетов
работы.
•
ISpaceAdministrator
–
администратор
основного
пространства.
•
ISpacePartitionManager
– менеджер
разбиения
основного
пространства.
•
IProxySpacesManager
– менеджер
прокси-пространств(клиентов).
•
ISpaceRemoteManager
–
удаленный
менеджер
основного
пространства.
•
ISpaceCashDataProvider
–
поставщик
кэш-данных
основного
пространства.
•
ISpaceNotifier
–
интерфейс
извещения
основного
пространства.
•
SpaceObjProps
(приложение SQLServerSpaceObjProps.exe) – SQL stub для
запросов
клиентов.
Посредник
между MIDAS(Borland)
и SQL сервером
хранения
данных.
Принимает и
транслирует sql-запросы
от клиента.
Имеет
следующие com-интерфейсы
(описаны в SQLServerObjProps.tlb):
• IAppServer – интерфейс Midas(Borland DELPHI6).
Функциональная
структурная
схема
проекта:

Дерево
каталогов
проекта:
[MODEL] – каталог
проекта
[ServerProxySpace] – каталог
клиента (выполняемые
файлы: ServerProxySpace.exe,Types091099.dll).
[ServerSpace] – каталог
сервера
синхронизатора(выполняемый
файл: ServerSpace.exe).
[SQLServerSpace] – каталог
SQLStub(выполняемый
файл: SQLServerSpaceObjProps.exe).
Модель
телекоммуникационного
соединения
Для учета линейных и станционных сооружений (пар, громполос, абонентских комплектов, телефонов) существует модель телефонного соединения. Модель определяет взаимосвязи между: громполосами – парами, парами – кроссировками и т.д.; схематически это реализовано следующим образом:
Рассмотрим
пример
линейной
трассы
телефона 43315
ГТС г.
Арзамаса.
Найдем
этот телефон
в Reflector-е:

1.
Находим
оконечное
устройство
телефона (кнопка
«ОУ»). Это
коробка 34а (спаренная
коробка 300-го
распределения).
Для коробки появляется панель с ее свойствами (например: ее адрес, зона обслуживания (т.е. интервал обслуживаемых квартир), ресурсы):

2.
Нажимаем
кнопку “Ресурсы”,
т.е. входим
внутрь этого
соединителя.
Появляется
картинка,
показывающая,
как связаны
распределительные
пары с
абонентскими
устройствами,
в данном
случае с
телефонами:

3. Выбираем Л.Кн. мыши занятую пару (например: 49), нажимаем кнопку “->” и идем “по шнуру” до следующего соединителя (в данном случае до шкафа).

Появляется картинка шкафа: на ней изображено, как данное распределение соединено с конкретной магистралью:

4.
Выбираем
магистральную
пару и,
аналогично п.
3 идем до
следующего
соединителя (до
кросса).

Появляется
картинка
кросса: здесь
показано как
магистральная
пара
соединяется
кроссировкой
с
соответствующим
абонентским
комплектом:

5.
Аналогично
доходим до
динамического
соединителя
– станции.
Пройденный
путь
показывает
линейную
трассу
телефона 43315.