Jak zrobić moduł testowania{aplikacja o układach logiczny

0

Witam serdecznie wszystkich forumowiczow.

Zwracam sie do Was z ogromna prosba, gdyz nie potrafie sobie poradzic z aplikacja ktora tworze.
Zaczne od tego do czego sluzyc bedzie moja aplikacja.
Sluzy ona do tworzenia i testowania modeli logicznych. Zadaniem uzytkownika jest, utworzenie z bramek logicznych modelu ktory nastepnie mozna przetestowac. I tu sie zaczyna problem.
Utworzylem sobie brameczki ktore za pomoca Drag&Dropa mozna przesuwac po ekranie, laczyc je z innym bramkami itp, ale nie wiem jak poradzic sobie z samym testowaniem.
Wpadlem na pomysl zeby to zrobic nastepujaco
zależnie od sygnału na linii nadajemy jej inny kolor np. 1 czerwony, 0 zielony, każda bramka dba sama o siebie, czyli sprawdza jakie kolory linii są na jej wejściach i jak wie, że jest typu AND, to jeżeli wchodzą do niej dwie czerwone linie, to sama daje na wyjście kolor czerwonyniezależnie od ilości bramek problem jest tak samo prosty, kazda bramka sama za siebie odpowiada tzn. wie jakie kolory mają linie wejściowe i na tej podstawie określa kolor linii wyjściowej. I tu jest wlasnie problem z ktorym sie zwracam do Was. Chcialbym zeby to zadzialalo ale juz mecze sie z tym jakis czas i nie wiem jak to zrobic.
Zalezy mi przede wszystkim na tym aby mozna bylo laczyc generator (panel z Comboboxami i panelami) z bramkami na ekranie, tak zeby w zaleznosci od sygnalu z generatora kolor linii laczacej bramke zmienial sie, i przy polaczeniu typu Bramka z bramka ten kolor linii tez odpowiadal jej stanowi (zielony 1, czerowny 0).

Caly projekt znajduje sie ->http://informatyk.cba.pl/Uk%B3ady.zip. Jak by ktos z Was wiedzial jak to mozna zrobic to bylbym niezmiernie wdzieczny.

Pozdrawiam i dziekuje za poswiecony czas.

// popraw tytuł wątku, zanim inny moderator wywali posta do kosza za nic niemówiący temat - Ł

0

To może niech każdą bramką zajmuje się osobny wątek. Jego zadaniem byłoby:

  • ustalenie stanu jaki ma dać na wyjścia
  • pokolorownie odpowiednich połączeń
  • wysłanie sygnału (np. jakiś Event) do wszystkich bramek podłączonych do wyjść informujący o zmianie stanu na ich wejściach
  • czekanie na sygnał od innych bramek

i tak w kółko

0

A nie lepiej uzyc "Electronick Workbanch'a"?

Po co pisac aplikacje które istnieją?

0

Pomysł z sygnalizowaniem innym bramkom to zły pomysł

Może raczej jakoś tak:

type
  twejscia=array[1..maxwe] of boolean;   //bramka ma maxwe wejść

  tfunkcja = record
    bramka: typbramki;
    wejścia: twejscia; // indeksy do stary[]
  end;

var
  siec: array[1..iledrucikow] of tfunkcja
  stary, nowy:array[1..iledrucikow] of boolean;

begin
  repeat
    for i=1..iledrucikow         // drucik może mieć więcej niż dwa końce
      nowy[i]=oblicz(siec[i]);
    stary=nowy

    paint(stary)
  until doZnudzenia
end.

function oblicz(funkcja:tfunkcja):boolean;
begin
  case funkcja.bramka of
    OR:  oblicz:=BramkaOR(funkcja.wejscia);
    AND: oblicz:=BramkaAND(funkcja.wejscia)
    ......

function bramkaOR(we:twejscia):boolean;
begin
  result:=false;
  for i:=1 to maxwe do
    if (we[i]<>0)  // druciki numerowane od 1
      if stary[we[i]] then result:=true
end;

Dobrze by było uwzględnić stan nieustalony (np. wiszące wejście)
0 - wejście nie istnieje, bramka może mieć mniej niż MAXWE wejść
1 - logiczne 1
2 - logiczne 0
3 - stan nieustalony

Pobaw się fajną, prostą zabawką MMLogic: A MultiMedia Logic Design System
może cię czymś natchnie

0
Xitami napisał(a)

Pomysł z sygnalizowaniem innym bramkom to zły pomysł

Popieram a jak ktoś sobie ułoży układ na wzór przerzutnika np. JK ?
To się zaczną dziać jaja jak w programie, którym nas katowali na uczelni ;)
Jak ktoś hce to niech popatrzy http://kik.ie.tu.koszalin.pl/tools/symulus/SymuLUS.exe

0
chesti napisał(a)

A nie lepiej uzyc "Electronick Workbanch'a"?

Po co pisac aplikacje które istnieją?

Pisze takie cos dla siebie. Tak jak napisalem jestem bardzo poczatkujacy, wymyslilem sobie takie cos i probuje to zrealizowac... :-/

0
Xitami napisał(a)
type
  twejscia=array[1..maxwe] of boolean;   //bramka ma maxwe wejść

  tfunkcja = record
    bramka: typbramki;
    wejścia: twejscia; // indeksy do stary[]
  end;

var
  siec: array[1..iledrucikow] of tfunkcja
  stary, nowy:array[1..iledrucikow] of boolean;

begin
  repeat
    for i=1..iledrucikow         // drucik może mieć więcej niż dwa końce
      nowy[i]=oblicz(siec[i]);
    stary=nowy

    paint(stary)
  until doZnudzenia
end.

function oblicz(funkcja:tfunkcja):boolean;
begin
  case funkcja.bramka of
    OR:  oblicz:=BramkaOR(funkcja.wejscia);
    AND: oblicz:=BramkaAND(funkcja.wejscia)
    ......

function bramkaOR(we:twejscia):boolean;
begin
  result:=false;
  for i:=1 to maxwe do
    if (we[i]<>0)  // druciki numerowane od 1
      if stary[we[i]] then result:=true
end;

Dzieki za to co napisales ale szczerze powiem ze srednio to zrozumialem. Jakos nie potrafie tego zaimplementowac do swojego projektu [glowa] zeby to zadzialalo. Przepraszam ze tak prosze o pomoc, ale nie moge sobie dac z tym rady. Moze wydaje Wam sie ze to jest banalne i po cichu smiejecie sie ze mnie, ale poczatki zawsze bywaja trudne. :-(
Moglbys mi z tym pomoc, bo widze ze znasz sie na rzeczy [wstyd] .

0
(* full demo duplex, primo voto pic ;-)

No dobra, przykładowy układ:

        |-\
 3 -----|  \
        | A O----+--------  1
      +-|  /     |
      | |_/      |
       \         |
        \        /
         \      /
          \----^--\
              /   |
      _______/    |
      |           |
      | |-\       |
      +-|  \      |
        | B O-----+   2   nie wychodzi dalej, ale numerek musi mieć
 4 -----|  /
        |_/

 Bramki dwie, drucikow 4
 np. drucik 1 to wyjscie bramki A i jedno z wejść bramki B
 Numeracja dowolna, byle tylko kompletna

 tablica SIEC[]:

    bramka  |    wejscia
            | 1   2   3   4 ....
  +---------+---+---+---+---  -+
1 | NANDf   | 3 | 2 | 0 |....  |  bramka A
2 | NANDf   | 4 | 1 | 0 |..... |  bramka B
3 | HIf     |.......           |  coś trzeba zrobić, np. stan log. 1
4 |                            |             - " -
  | .....                      |

  ileDrucikow == 4

*)
const
  MaxWe=8;
  ileDrucikowMax=100;
  // na wyrost i spuchliznę

type
  tTypBramki = (ORf, NORf, ANDf, NANDf, NOTf, HIf, LOf);   //itd itp
  //ile sobie wymyślisz
  //nie można pisać AND czy OR bo to słowa kluczowe

  twejscia=array[1..MaxWe] of longword;   //bramka może mieć MaxWe wejść
  //wstawiamy indeks do tablicy STAN, czyli gdzie podpięte to wejście
  // zero jeżeli wejście nie istnieje (np. bramka ma tylko dwa, a nie maxWe)

  //co musimy wiedzieć o bramce?
  //jaką funkcję realizuje i gdzie podpięte wejścia
  tfunkcja = record
    bramka: tTypbramki; //
    wejscia: twejscia;  // indeksy do tablicy STAN[]
  end;

var
  siec: array[1..ileDrucikowMAX] of tfunkcja;
  //tu zapisana jest nasza sieć, tak jak na rys  ;-)  powyżej
  ileDrucikow:longint;
  //a wpisów jest : ileDrucikow


  stan, // tu mamy logiczne stany drucikow
  nowy  // tu obliczymy nowe
      :array[1..iledrucikowMAX] of boolean;

  nrTaktu:int64;
  //może się przydać np. dla generatora

//------ piszę od tyłu, ale tak mi wygodniej ------------------
function oblicz(funkcja:tfunkcja):boolean; forward;

function bramkaOR  (we:twejscia): boolean; forward;
function bramkaAND (we:twejscia): boolean; forward;
{ .... }
//-------------------------------------------------------------

procedure paint; begin end; //rysujemy nowy stan


procedure jedenTakt;
var i:longword;
begin
  nrtaktu += 1;                  // może się przydać

  for i:=1 to iledrucikow do
      nowy[i]:=oblicz(siec[i]);  // dla wszystkich obliczamy nową wartość

  paint;                         // możemy odrysowywać tylko zmiany
                                 //   np. if stan[k] <> nowy[k] then ...

  stan:=nowy;                    // teraz znowu stan ukladu opisuje STAN[]
end;

procedure symulacja; begin
  // w jakiś sposób musimy zainicjować zmienne:
  //   ILEDRUCIKOW i tyle samo pozycji w tablicach SIEC i STAN
  // czyli przenieść z twojego na moje

  // mamy układ w chwili ZERO
  nrTaktu:=0;

  //wio
  repeat
    jedenTakt
  until false // doZnudzenia
end;

// obliczamy nowy stan drucika
function oblicz(funkcja:tfunkcja):boolean;
begin
  case funkcja.bramka of
    ORf:  result:=BramkaOR(funkcja.wejscia);
    ANDf: result:=BramkaAND(funkcja.wejscia)
    {......}
  end
end;

function bramkaHI (we:twejscia):boolean; begin result:=true end;

function bramkaOR (we:twejscia):boolean;
var i:longword;
begin
  result:=false;
  for i:=1 to maxwe do
    if (we[i]<>0) then        // druciki numerowane od 1, zero brak
      if stan[we[i]] then result:=true
end;

function bramkaAND(we:twejscia):boolean;
begin
  // bardzo podobnie do OR
end;

{function bramka........ itd}

begin
  symulacja
end.

// hazard, no tak, to rzecz brzydka i należy ją zwalczać ;-)

0

8-O Piszesz to z glowy czy na przykladzie mojej aplikacji? Normalnie szacunken, mam nadzieje ze mi to wyjdzie w tym moim czyms... :-/

Prosze pokaz mi to na moim projekcie bo mi za Chiny ludowe to nie chce dzialac... [???] [glowa] [glowa] [glowa] [glowa] [glowa] [glowa] Będe naprawde niezmiernie wdzieczny... [browar]

// wyedytuj swojego pierwszego posta i popraw w nim temat!!! - Ł

1 użytkowników online, w tym zalogowanych: 0, gości: 1