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!
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.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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!
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.