Delphi mit s7-300

schissern

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo erst mal,

ich hab ein kleines problem. ich muss ein programmierpraktikum machen und als thema hab ich eine kleine anlagen steuerung, die über eine oberfläche gesteuert werden soll. ich soll also anstelle der hardware schalter alles über in delphi programmierte buttons machen.
als hardware hab ich eine s7-315-2DP mit einer digitalen eingabebaugruppe und einer digitalen ausgabebaugruppe. verbinden tue ich mich von meinem laptop über eine cp-5512. ich benutze die delphi version 7 und hab siemens prodave 5 um eine verbindung zwischen delphi und s7 herzustellen. das prodave s7 demo tool funktioniert auch ohne probleme, d.h. ich kann mit prodave die s7 ansprechen.

ich bin in delphi kein profi aber kleine programme bekomme ich hin und die s7 programmierung ist auch nicht mein problem. aber ich hab keinen plan, wie ich wo was in delphi von prodave einbinden muss, damit ich eine verbindung zur s7 hinbekomme.
im forum hier und in vielen anderen auch anderssprachigen hab ich keine konkrete antwort gefunden.
kann mir vielleicht jemand mit einem kleinen delphi beispiel helfen in dem bei einem click auf einen button ein wert in ein db in einer s7 geschrieben wird oder irgendwie weiter helfen?

vielen dank schonmal
 
tach,

mach es mit libnodave....

Hab mich Anfangs auch schwer getan, aber dann ist der Groschen gefallen ( Danke an Ralle :) ) und seit dem ist das Super !

Such mal nach Libnodave im Forum ....

gruß stricky
 
Hab eine ältere Version von Prodave-Mini. Hier mal ein paar Fragmente aus meinem Delphi-Code:

Typedefinitionen:
Code:
BPuf = array[0..1024] of Byte;                            {* Bytepuffer *}
 
type
  TSPSBuf = record
    SPSBuf: array of BPuf;
    AltSPSBuf: array of BPuf;
end;
type
  plcadrtype = record
    adr: Byte;
    SEGMENTID: Byte;
    SLOTNO: Byte;
    RACKNO: Byte;
  end;

Variablendeklaration:
Code:
  //MPI
  plc_adr_table : array of plcadrtype;
  plc_name:array[0..255] of char;
  plc_res ,plc_amount: longint;
  plc_buffer : array[0..512] of word;

Die benötigten Funktionen aus der DLL deklarieren:
Code:
function Load_tool ( no:Byte; name: {pointer} PChar; adr:{pointer} PChar): longint; stdcall;
function DB_read ( dbno: longint; dwno: longint; var amount: longint; var plc_buffer): longint stdcall;
function DB_write ( dbno: longint; dwno: longint; var amount: longint; var plc_buffer): longint stdcall;
function D_field_write ( dbno: longint; dwno: longint; amount: longint;var plc_buffer): longint stdcall;
function new_ss (no: Byte): longint stdcall;
function Unload_tool: longint; stdcall;

Die Funktionen implementieren:
Code:
//MPI
function Load_tool ( no:Byte; name: {pointer} PChar; adr:{pointer} PChar): longint; stdcall; external 'W95_S7M.DLL' name 'load_tool';
function DB_read ( dbno: longint; dwno: longint; var amount: longint; var plc_buffer): longint stdcall; external 'W95_S7M.DLL' name 'db_read';
function DB_write ( dbno: longint; dwno: longint; var amount: longint; var plc_buffer): longint stdcall; external 'W95_S7M.DLL' name 'db_write';
function D_field_write ( dbno: longint; dwno: longint; amount: longint; var plc_buffer): longint stdcall; external 'W95_S7M.DLL' name 'd_field_write';
function new_ss (no: Byte): longint stdcall; external 'W95_S7M.DLL' name 'new_ss';
function Unload_tool: longint; stdcall; external 'W95_S7M.DLL' name 'unload_tool';

Daten für die Verbindung eintragen:
Code:
for I := 0 to SimDatenListe.SimN - 1 do
  begin
    plc_adr_table[i].adr := SimDatenListe.SimEintrag[I + 1].MPIAdrSim; {adresse}
    plc_adr_table[i].SEGMENTID := 0; {segment id}
    plc_adr_table[i].SLOTNO := 2; {slot nr}
    plc_adr_table[i].RACKNO := 0; {rack nr}
  end;
  plc_adr_table[SimDatenListe.SimN].adr := 0;
  strcopy(plc_name,'S7ONLINE');

Öffnen einer MPI-Verbindung zur SPS:
Code:
InitPG1Fehler := Load_tool(1,addr(plc_name),addr(plc_adr_table[0]));

Auslesen von Daten (wird z.Bsp. in einem extra Thread oder in einer Schleife aufgerufen):
Code:
var
blen: word;
  DBAR: BPuf;
 
...
 
begin
              //MPI ProDaveS7
              plc_amount := 1024;
              Y[SPS] := new_ss(SPS);
              if Y[SPS] = 0 then
              begin
                Y[SPS] := DB_read(SimDatenListe.SimEintrag[SPS].DBSim,0,plc_amount,DBAR);
                if Y[SPS] = $303 then          //$303 --> DB ist zu kurz
                  Y[SPS] := 0;
                if Y[SPS] = 0 then
                  DBDat.SPSBuf[SPS] := DBAR;
              end;
            end;

Daten schreiben:
Code:
begin
    Anzahl := 2;
    DBST := SimDatenListe.SimEintrag[SPS].DBSim;
    DNummer := DWNummer;
    Buf[0] := DL;
    Buf[1] := DR;
    F := new_ss(SPS);
    F := D_field_write(DBST ,DNummer ,Anzahl ,Buf);
  end;

Die Verbindung wieder schließen:
Code:
//MPI ProDaveS7
    InitPG1Fehler := Unload_tool;

Das ist mal schnell rauskopiert, ich hatte mehrere SPS, deshalb sind Dinge dabei, die bei dir nicht unbedingt rein müssen, aber als Anhaltspunkt reichts vielleicht. Prodave hat aber eine Doku dabei , mit der man schon etwas anfangen kann.

PS: Prodave hat eine andere DLL und evtl. haben sich bei der neuen Version die Funktionsaufrufe verändert.
 
Zurück
Oben