Подключите все шлюзы составного модуля к подмодулю в Omnet ++ - PullRequest
0 голосов
/ 03 мая 2018

Я относительно новичок в Omnet ++. В настоящее время я пытаюсь инкапсулировать флуд (простой) модуль в составной модуль. Вот что я придумал:

Node.ned:

module Node
{
    gates:
        inout g[];
    submodules:
        floodingModule: FloodingModule;
    connections allowunconnected:
        g++ <--> floodingModule.g++;
}

FloodingModule.ned

simple FloodingNode
{
    parameters:
        bool sendInitialMessage = default(false);
    gates:
        inout g[] @loose;
}

Network.ned

network FloodingNetworkSmall {
    submodules:
        node0 : Node;
        node1 : Node;
        node2 : Node;
        node3 : Node;
        node4 : Node;
        node5 : Node;
        node6 : Node;
        node7 : Node;
        node8 : Node;
        node9 : Node;
    connections:
        node0.g++ <--> Link <--> node1.g++;
        node0.g++ <--> Link <--> node3.g++;
        node0.g++ <--> Link <--> node5.g++;
        node1.g++ <--> Link <--> node2.g++;
        node1.g++ <--> Link <--> node4.g++;
        node1.g++ <--> Link <--> node6.g++;
        node1.g++ <--> Link <--> node7.g++;
        node1.g++ <--> Link <--> node9.g++;
        node2.g++ <--> Link <--> node5.g++;
        node2.g++ <--> Link <--> node8.g++;
        node3.g++ <--> Link <--> node4.g++;
        node3.g++ <--> Link <--> node6.g++;
        node4.g++ <--> Link <--> node6.g++;
        node4.g++ <--> Link <--> node8.g++;
        node6.g++ <--> Link <--> node7.g++;
        node7.g++ <--> Link <--> node8.g++;
}

Я вызываю flooding в методе initialize модуля floodingModule следующим образом:

    for (GateIterator i(this); !i.end(); i++) {
        cGate *gate = *i;
        if (gate->getType() == cGate::OUTPUT) {
            SimpleMessage *csmsg = smsg->dup();
            send(csmsg, gate);
        }
    }

Проблема, с которой я сталкиваюсь, заключается в том, что затопление происходит только на первой созданной ссылке. Это означает, что должна быть проблема с отображением составных шлюзов модуля во шлюзы субмодуля или нет? Я делаю что-то не так, что очевидно? Вам нужно больше кода?

Спасибо за любой совет!

1 Ответ

0 голосов
/ 03 мая 2018

Я даже не смог запустить симуляцию с неизмененным вашим кодом, потому что были неподключенные ворота. (И есть небольшие раздражающие несоответствия между именами файлов и модулей со словами Node и Module, но это не относится к делу.)

Чтобы решить эту проблему, вам нужно изменить сегмент connections вашего модуля Node на нечто похожее на то, что есть в модуле Node образца routing примера моделирования, включенного в OMNeT ++:

module Node
{
    gates:
        inout g[];
    submodules:
        floodingModule: FloodingNode;
    connections:
        for i=0..sizeof(g)-1 {     // <= this is the important part
            g++ <--> floodingModule.g++;
        }
}

Дело в том, что для каждого "внешнего" соединения между Node s в сети должно быть соответствующее соединение (для продолжения пути) внутри модуля Node (на каждом конце), между ним и субмодуль floodingNode. «Автоматическое объединение / расхождение» путей соединения в векторах затвора на границах составного модуля отсутствует.

Да, это означает, что если у любого данного узла есть, скажем, пять других узлов, связанных с ним на одном и том же векторе ворот, то внутри этого узла должно быть пять «параллельных» соединений, все из которых ведут к вектору затвора субмодуль - в данном случае.

И не нужно ни спецификатора allowunconnected, ни свойства @loose нигде, в этом случае они приносят больше вреда, допуская «недействительные» сети, чем пользы. В любом случае, они в основном полезны для беспроводного моделирования.

Кроме того, вы должны рассмотреть только планирование простого «таймерного» собственного сообщения (даже если оно в T=0) в initialize() и отправку «настоящих» сообщений в методе handleMessage() при получении указанного таймера, таким образом, визуализация графической среды работает лучше, и это также возможно лучший дизайн.

...