Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

PLC Siemens (S7-300) <-> DELPHI ?? Jak to rozwiązać ??

bestler 25 Feb 2009 10:42 4291 6
SterControl
  • #1
    bestler
    Admin of DIY, Automation
    Witam,

    Po długiej lekturze archiwalnych postów na podobne tematy postanowiłem założyć własny dość precyzyjny temat.

    Chciałbym nawiązać aktywną aktywna komunikację PC z S7-300. Chciałbym tez aby przy pomocy Delphi mógł odczytywać i wprowadzać dane dla sterownika.

    Wiele czytałem o OPC Serwerze i chyba najprawdopodobniej to jest najlepsze rozwiązanie. Problem natomiast pojawi się najprawdopodobniej w kwestii komunikacji Delphi i OPC - są może jakieś przykłady ??

    Co o tym myślicie ? Pewnie wiele osób zna gotowe rozwiązania o wiele lepsze od mojego pomysłu - ja się dopiero wdrażam w temat komunikacji sterowników z PC, i szczerze liczę na pomoc.

    Jeśli znacie jakąś literaturę, która mi w tym pomoże w tym zagadnieniu to proszę o tytuły.

    Pozdrawiam,
    Paweł
  • SterControl
  • #2
    Glinek
    Level 13  
    Jest to jak najbardziej możliwe.

    Jak chcesz zobacz temat:
    https://www.elektroda.pl/rtvforum/topic1232471.html

    Opracowałem tam program tylko nie w Delphi a C++ Builderze i nie dla Siemensów a dla GE Fanuków ale z tego co napisałeś spełnia te funkcje. Umożliwia odczyt i zapis wartości w sterowniku.

    Z tego co wiem mój kolega próbował z serwerem OPC ale zrezygnował bo były problemy z dostępem do pewnych rzeczy. Trzeba chyba być w tej organizacji. Nie znam szczegółów tego problemu. Ja osobiście wolałem się nie mieszać w OPC, ale kto wie może to lepsze rozwiązanie.

    Ale jeśli chcesz to zrobić w Delphi to właściwie musisz tylko obsłużyć port szeregowy komputera, zaimplementować wybrany protokół który wykorzystują te sterowniki i opracować algorytm komunikacji który realizował by to do czego chcesz to wykorzystywać.

    Życzę powodzenia.
  • SterControl
  • #4
    bestler
    Admin of DIY, Automation
    Jeden z kolegów tworzy programy wykorzystujące komunikacje między PLC a PC, ale robi to przy pomocy kodów asci. Do każdego S7-300 dokupywany jest moduł 340 (rs485) i po odpowiednim oprogramowaniu zarówno tego modułu jak i rs485 w PC udaje sie wysyłać i odbierać dane. Sposób żmudny, kłopotliwy i uciążliwy i bardzo męczący.

    Ja chciałbym stworzyć taką komunikację jaką dysponuje np WinCC - w aplikacji deklaruje się zmienne rodem ze stepa7 (M0.1, MW4 itp). Wiem, że to nie jest proste ale chyba wykonalne ??

    Paweł
  • #5
    bestler
    Admin of DIY, Automation
    Wygląda na to, że Prodave to jest to, czego szukam. Teraz tylko jak tego użyć pod delphi ?? W manulalu i handbuchu są przykłady użycia, ale tylko pod C++. Przydałbym się plik *.pas do delphi. Zapewne wiele osób rozgryzło już ten problem, ale czy ktoś się podzieli osiągnięciami ??

    Znalazłem na jakiejś niemieckiej stronie przykład programu, ale nie potrafię go wkomponować w reszcztę kodu.

    PAweł
  • #6
    shadoweyes
    Level 20  
    Możesz podać adres tej strony.
    Często do kart RS-485(Profibus/MPI/Modbus) do PC sprzedawanych przez firmy dołączane jest oprogramowanie do komunikacji PLC<->PC niestety w większości biblioteki napisane są w C++.
  • Helpful post
    #7
    Artik_b
    Level 15  
    Witaj,

    Temat nadal aktualny?

    Deklaracja w Delphi... też miałem problemy, zwłaszcza że nie jestem zawodowym programistą...



    function Load_tool ( no:Byte;
    name: {pointer} PChar;
    adr:{pointer} PChar):Integer;
    stdcall;
    external ´w95_s7.dll´ name ´load_tool´;
    function DB_read ( dbno:Integer;
    dwno:Integer;
    var amount:Integer;
    var buffer):Integer
    stdcall;
    external ´w95_s7.dll´ name ´db_read´;
    function Unload_tool:Integer;
    stdcall;
    external ´w95_s7.dll´ name ´unload_tool´;
    Example:
    var
    plc_adr_table : array [0..15] of byte;
    name:array[0..255] of char;
    res ,amount: integer;
    buffer : array[0..255] of word; (może być array of Byte)
    plc_adr_table[0] := 2; {address}
    plc_adr_table[1] := 0; {segment id}
    plc_adr_table[2] := 2; {slotno}
    plc_adr_table[3] := 0; {rackno}
    plc_adr_table[4] := 0;
    strcopy(name,'S7ONLINE');
    res := Load_tool(1,addr(name),addr(plc_adr_table[0]));
    res := DB_read(10,0,amount,buffer);
    res := Unload_tool;

    Loadtool łączy się ze sterownikiem,
    w res będzie nr błędu - jak res=0 to OK,

    DBread czyta blok DB... itd. Reszta w manualu...

    Powodzenia..