Menu

Snap7 e Delphi

2020-09-24
2020-09-26
  • Edoardo Ceccarini

    Ciao a tutti,
    sto provando ad utilizzare Snap7 con Delphi per sviluppare un semplice
    software che possa leggere e scrivere dati (BOOL, DEC, WORD) dal DB1 del
    mio Siemens S7-1200.
    Sono riuscito a fare la connessione e la disconnessione del PLC, a leggere
    lo stato e, credo, a utilizzare la funzione DBRead() visto che
    utilizzandola mi ritorna come risultato 0.
    Il problema è che non riesco a capire come leggere i dati letti da DBRead()
    perchè, su un esempio per C# che ho trovato online, utilizzavano la
    funzione GetIntAt() ma quest'ultima non credo esista per Delphi.
    Se avete un semplice esempio scritto in Delphi per fare quello che devo ve
    ne sarei infinitamente grato.
    Grazie, saluti!

     
  • Mauro Ruby

    Mauro Ruby - 2020-09-26

    Prova questo

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    PLC:=TS7Client.Create;
    PLC.ConnectTo('172.31.225.10',0,1); // indirizzo PLC 1500
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    PLC.Destroy;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    errore, I: Integer;
    MyBYTE: Boolean; // max 1 byte
    CilcoBYTE,ContaByteS : Integer;
    Ruby : String;
    begin
    ContaByteS := 0;
    if not PLC.Connected then // se il PLC non risponde esco
    begin
    showmessage('PLC NON RISPONDE VERIFICA INDIRIZZO TCP-IP E CHE IL PLC SIA ACCESO');
    end;
    Errore := PLC.DBRead(102, // Numero della DB
    0, // Partenza byte
    2, // per quante byte leggo
    @Dati_BIT);
    if Errore <> 0 then
    begin
    // Scrivo nel memo errori cosa ha causato l'errore
    Showmessage((Trim(CliErrorText(Errore)))); // Errore mi torna da SNAP7
    Exit;
    end;
    Memo1.Lines.add('Valori booleani della DB letta:');
    for CilcoBYTE := 0 to 2 do
    begin
    for I := 0 to 7 do //SPAZZOLO GLI 8 BIT
    begin
    // LEGGIAMO UN VALORE DI BOOL CHE OCCUPA 1 BYTE
    // UTILIZZIAMO LA FUNZIONE s7.ValBit che converte il valoredel BYTE in bit
    MYBYTE:= S7.ValBit[@Dati_BIT[CilcoBYTE],I];
    if MYBYTE = True then Ruby := 'True' else Ruby := 'False';
    Memo1.Lines.add('[DB102.DBX '+inttostr(ContaByteS)+'.' + inttostr(I) + ']: ' + Ruby);
    end;
    ContaByteS := ContaByteS + 1;
    end;
    end;
    end.

     

Log in to post a comment.