LOGO  
AMBOS, Multimodale Verkehrsumlegung, Online-Hilfe

Einfhrung: Automations-Server
 

 
 
Das Programm kann in eigene Programme mittels COM eingebunden werden. Ab der Programmversion 1.3 besteht die Möglichkeit begrenzt Daten zwischen dem Programm und eigenen Programmen auszutauschen. Beschreibungen stehen für die unterschiedlichen Schnittstellen im Internet zur Verfügung:

Basisversion

NETWORK: Verkehrsnetz lesen, Attributwerte modifizieren

Verkehrsumlegung

NETWORK: Verkehrsnetz lesen, Attributwerte modifizieren
ASSIGNMENT: Verkehrsnetz lesen, Attribute modifizieren, Verkehrsnetz erstellen, Routensuche, Verkehrsumlegung

Um das Programm in eigene Programme zu integrieren, muss das Programm einmalig auf dem aktuellen Rechner mit dem Parameter /regserver gestartet werden. Bei diesem Aufruf erfolgt keine Bildschirmausgabe. Danach kann es von anderen Anwendungen über die definierten Schnittstellen angesprochen werden. Vor dem Entfernen des Programms vom Rechner, sollte das Programm mit dem Parameter /unregserver gestartet werden.

Die folgende Aufzählung enthält die Methoden, die durch das Programm zur Verfügung gestellt werden:

NETWORK-Interface

procedure EXIT;
function GET_LINKOFNODE_ASSTRING(NODEINDEX_P, LINKINDEX_P: Integer): OleVariant;
function GET_LINKOFNODE_ATTR_ASSTRING(NODEINDEX_P, LINKINDEX_P, ATTRINDEX_P: Integer): OleVariant;
function GET_LINKOFNODE_ATTR_COUNT(NODEINDEX_P, LINKINDEX_P: Integer): OleVariant;
function GET_LINKOFNODE_ATTR_NAME(NODEINDEX_P, LINKINDEX_P, ATTRINDEX_P: Integer): OleVariant;
function GET_LINKOFNODE_ATTR_VALUE(NODEINDEX_P, LINKINDEX_P, ATTRINDEX_P: Integer): OleVariant;
function GET_LINKOFNODE_COUNT(NODEINDEX_P: Integer): OleVariant;
function GET_LINKOFNODE_DESTINATION(NODEINDEX_P, LINKINDEX_P: Integer): OleVariant;
function GET_LINKOFNODE_IDENTIFIER(NODEINDEX_P, LINKINDEX_P: Integer): OleVariant;
function GET_NODE_ASSTRING(NODEINDEX_P: Integer): OleVariant;
function GET_NODE_ATTR_ASSTRING(NODEINDEX_P, ATTRINDEX_P: Integer): OleVariant;
function GET_NODE_ATTR_COUNT(NODEINDEX_P: Integer): OleVariant;
function GET_NODE_ATTR_NAME(NODEINDEX_P, ATTRINDEX_P: Integer): OleVariant;
function GET_NODE_ATTR_VALUE(NODEINDEX_P, ATTRINDEX_P: Integer): OleVariant;
function GET_NODE_COUNT: OleVariant;
function GET_NODE_KEY(NODEINDEX_P: Integer): OleVariant;
function INDEXOF_LINKOFNODE(NODEINDEX_P, DESTINATION_P, IDENTIFIER_P: Integer): OleVariant;
function INDEXOF_LINKOFNODE_ATTR(NODEINDEX_P, LINKINDEX_P: Integer; ATTRNAME_P: OleVariant): OleVariant;
function INDEXOF_NODE(NODE_P: Integer): OleVariant;
function INDEXOF_NODE_ATTR(NODEINDEX_P: Integer; ATTRNAME_P: OleVariant): OleVariant;
procedure OPEN(FILENAME_P: OleVariant);
procedure SAVE(FILENAME_P: OleVariant);
procedure SET_LINKOFNODE_ATTR_VALUE(NODEINDEX_P, LINKINDEX_P, ATTRINDEX_P: Integer; VALUE_P: Double);
procedure SET_NODE_ATTR_VALUE(NODEINDEX_P, ATTRINDEX_P: Integer; VALUE_P: Double);
procedure SET_WINDOWSTATE(STATE_P: OleVariant);
procedure ADD_LINK(ORIGIN_P: Integer; DESTINATION_P: Integer; IDENTIFIER_P: Integer; GROUPNAME_P: OleVariant);
procedure ADD_LINK_ATTR(ORIGIN_P: Integer; DESTINATION_P: Integer; IDENTIFIER_P: Integer;
ATTRNAME_P: OleVariant; VALUE_P: Double; FACTOR_P: Double; VALIDTYPE_P: Integer;
MIN_P: Double; MAX_P: Double);
procedure ADD_NODE(NODE_P: Integer; GROUPNAME_P: OleVariant; IS_ORIGIN_P: WordBool; IS_DESTINATION_P: WordBool;
IN_MATRIX_P: WordBool);
procedure ADD_NODE_ATTR(NODE_P: Integer; ATTRNAME_P: OleVariant; VALUE_P: Double; FACTOR_P: Double;
VALIDTYPE_P: Integer; MIN_P: Double; MAX_P: Double);
procedure CREATE_EMPTY_NETWORK;

ASSIGNMENT-Schnittstelle

function GET_PATHS_COUNT(ORIGIN_P: Integer; DESTINATION_P: Integer): OleVariant;
function GET_PATHS_NODE_COUNT(ORIGIN_P: Integer; DESTINATION_P: Integer; PATHINDEX_P: Integer): OleVariant;
function GET_PATHS_EVALUATION(ORIGIN_P: Integer; DESTINATION_P: Integer; PATHINDEX_P: Integer): OleVariant;
function GET_PATHS_NODE(ORIGIN_P: Integer; DESTINATION_P: Integer; PATHINDEX_P: Integer; NODEINDEX_P: Integer): OleVariant;
function GET_PATHS_LINK_ID(ORIGIN_P: Integer; DESTINATION_P: Integer; PATHINDEX_P: Integer; NODEINDEX_P: Integer): OleVariant;
function GET_LINK_BOARDING(ORIGIN_P: Integer; DESTINATION_P: Integer; IDENTIFIER_P: Integer): OleVariant;
function GET_LINK_LEAVING(ORIGIN_P: Integer; DESTINATION_P: Integer; IDENTIFIER_P: Integer): OleVariant;
function GET_LINK_VOLUME(ORIGIN_P: Integer; DESTINATION_P: Integer; IDENTIFIER_P: Integer): OleVariant;
function GET_NODE_BOARDING(NODE_P: Integer): OleVariant;
function GET_NODE_LEAVING(NODE_P: Integer): OleVariant;
function GET_NODE_VOLUME(NODE_P: Integer): OleVariant;
procedure PATH_SEARCH(SEARCHMODE_P: Integer);
procedure ASSIGNMENT(ASSIGNMENTMODE_P: Integer; SEARCHMODE_P: Integer; ASSIGNMENTFUNCTION_P: Integer; ALPHA_P: Double; DEMANDFILE_P: OleVariant);

Der Zugriff auf die Netzdaten erfolgt über die Integration von wenigen Quelltextzeilen in die eigenen Anwendungen. Das ausführbare Beispielprogramm kann hier aus dem Internet heruntergeladen werden.

Erzeugen des AMBOS-Automationsobjekt

procedure TFO_AMBOSCONTROLLER.FormCreate(Sender: TObject);
begin
AMBOS := CreateOleObject('AMBOS.NETWORK');
AMBOS.SET_WINDOWSTATE('MINIMIZED');
end;

Verkehrsnetz öffnen und alle Knoten in eine Liste eintragen

procedure OPEN_NETWORK;
var
I: Integer;
begin
AMBOS.OPEN('NETWORK.NBI');
for I:=0 to LongInt(AMBOS.GET_NODE_COUNT)-1 do
LISTBOX.Items.Add(string(AMBOS.GET_NODE_ASSTRING(I));
end;

Attributwert eines Knotens ändern

procedure TFO_AMBOSCONTROLLER.PB_ATTRClick(Sender: TObject);
var
ATTRINDEX, INDEX: LongInt;
begin
INDEX := LISTBOX_NODES.ItemIndex-1;
ATTRINDEX := LISTBOX_ATTR.ItemIndex-1;
AMBOS.SET_NODE_ATTR_VALUE(INDEX, ATTRINDEX, StrToFloat(EDIT_ATTR.Text));
end;

Verkehrsnetz manuell aufbauen

procedure CREATE_SMALL_NETWORK;
begin
// Knoten
AMBOS.ADD_NODE(1, 'DISTRICT', True, True, True);
AMBOS.ADD_NODE(2, 'NODE', False, False, False);
AMBOS.ADD_NODE(3, 'NODE', False, False, False);
AMBOS.ADD_NODE(4, 'DISTRICT', True, True, True);
AMBOS.ADD_NODE(5, 'NODE', False, False, False);

// Kanten
// 1. Kante
// Hinrichtung
AMBOS.ADD_LINK(1, 2, 1, 'ROAD');
AMBOS.ADD_LINK_ATTR(1, 2, 1, 'time', 10.0, 1.0, 2, 0, 99999);
// Rückrichtung
AMBOS.ADD_LINK(2, 1, 1, 'ROAD');
AMBOS.ADD_LINK_ATTR(2, 1, 1, 'time', 10.0, 1.0, 2, 0, 99999);
// 2. Kante
AMBOS.ADD_LINK(2, 3, 1, 'ROAD');
AMBOS.ADD_LINK_ATTR(2, 3, 1, 'time', 5.0, 1.0, 2, 0, 99999);
AMBOS.ADD_LINK(3, 2, 1, 'ROAD');
AMBOS.ADD_LINK_ATTR(3, 2, 1, 'time', 5.0, 1.0, 2, 0, 99999);
// restliche Kanten
AMBOS.ADD_LINK(3, 4, 1, 'ROAD');
AMBOS.ADD_LINK_ATTR(3, 4, 1, 'time', 11.0, 1.0, 2, 0, 99999);
AMBOS.ADD_LINK(4, 3, 1, 'ROAD');
AMBOS.ADD_LINK_ATTR(4, 3, 1, 'time', 11.0, 1.0, 2, 0, 99999);

AMBOS.ADD_LINK(1, 2, 2, 'BUS');
AMBOS.ADD_LINK_ATTR(1, 2, 2, 'time', 8.0, 1.0, 2, 0, 99999);
AMBOS.ADD_LINK(2, 1, 2, 'BUS');
AMBOS.ADD_LINK_ATTR(2, 1, 2, 'time', 8.0, 1.0, 2, 0, 99999);
AMBOS.ADD_LINK(2, 5, 2, 'BUS');
AMBOS.ADD_LINK_ATTR(2, 5, 2, 'time', 3.0, 1.0, 2, 0, 99999);
AMBOS.ADD_LINK(5, 2, 2, 'BUS');
AMBOS.ADD_LINK_ATTR(5, 2, 2, 'time', 3.0, 1.0, 2, 0, 99999);
AMBOS.ADD_LINK(5, 4, 2, 'BUS');
AMBOS.ADD_LINK_ATTR(5, 4, 2, 'time', 9.0, 1.0, 2, 0, 99999);
AMBOS.ADD_LINK(4, 5, 2, 'BUS');
AMBOS.ADD_LINK_ATTR(4, 5, 2, 'time', 9.0, 1.0, 2, 0, 99999);
end;

Routensuche durchführen

procedure PATH_SEARCH;
begin
AMBOS.PATH_SEARCH(0);
end;

Routensuche und Verkehrsumlegung durchführen

procedure ASSIGNMENT;
begin
AMBOS.ASSIGNMENT(0, 0, 0, 1.0, 'DEMAND.MAT');
end;

Wegedaten abfragen

procedure GET_PATHS;
var
I, J, K, L, PATH_NODE_COUNT, PATH_COUNT, KEY, ORIGIN, DESTINATION,
IDENTIFIER: Integer;
begin
// Wegedaten
for I:=0 to AMBOS.GET_NODE_COUNT-1 do
for J:=0 to AMBOS.GET_NODE_COUNT-1 do begin
ORIGIN := AMBOS.GET_NODE_KEY(I);
DESTINATION := AMBOS.GET_NODE_KEY(J);
PATH_COUNT := Integer(AMBOS.GET_PATHS_COUNT(ORIGIN, DESTINATION));
if PATH_COUNT ><BLOCK> 0 then begin
LB_RESULTS.Items.Add(Format('%d path(s) from %d to %d', [
PATH_COUNT, ORIGIN, DESTINATION]));
for K:=0 to PATH_COUNT-1 do begin
PATH_NODE_COUNT := Integer(AMBOS.GET_PATHS_NODE_COUNT(ORIGIN,
DESTINATION, K));
LB_RESULTS.Items.Add(Format('%d. path with evaluation %f ' +
'contains %d nodes', [K+1, Double(AMBOS.GET_PATHS_EVALUATION(
ORIGIN, DESTINATION, K)), PATH_NODE_COUNT]));
for L:=0 to PATH_NODE_COUNT-1 do
LB_RESULTS.Items.Add(Format('%d. node of %d path is no. %d'
+ ' (link: %d)', [L+1, K+1, Integer(AMBOS.GET_PATHS_NODE(ORIGIN,
DESTINATION, K, L)), Integer(AMBOS.GET_PATHS_LINK_ID(ORIGIN,
DESTINATION, K, L))]));
end;
end;
end;
end;

Verkehrsbelastungen abfragen

procedure GET_LOADS;
var
I, J, K, L, PATH_NODE_COUNT, PATH_COUNT, KEY, ORIGIN, DESTINATION,
IDENTIFIER: Integer;
begin
// Umlegungsdaten
for I:=0 to AMBOS.GET_NODE_COUNT-1 do begin
KEY := AMBOS.GET_NODE_KEY(I);
LB_RESULTS.Items.Add(Format('node [%d]: %8.2f %8.2f %8.2f',
[KEY,
Double(AMBOS.GET_NODE_BOARDING(KEY)),
Double(AMBOS.GET_NODE_LEAVING(KEY)),
Double(AMBOS.GET_NODE_VOLUME(KEY))]));
for J:=0 to AMBOS.GET_LINKOFNODE_COUNT(I)-1 do begin
DESTINATION := AMBOS.GET_LINKOFNODE_DESTINATION(I, J);
IDENTIFIER := AMBOS.GET_LINKOFNODE_IDENTIFIER(I, J);
LB_RESULTS.Items.Add(Format('link [%d %d %d]: %8.2f %8.2f %8.2f',
[KEY, DESTINATION, IDENTIFIER,
Double(AMBOS.GET_LINK_BOARDING(KEY, DESTINATION, IDENTIFIER)),
Double(AMBOS.GET_LINK_LEAVING(KEY, DESTINATION, IDENTIFIER)),
Double(AMBOS.GET_LINK_VOLUME(KEY, DESTINATION, IDENTIFIER))]));
end;
end;
end;
 

THOSCH software, WWW, AMBOS Online-Hilfe, Stand 24.06.08