![]() |
'Adressfehler beim Auslesen einer Simatic S7-200'
:(
Hallo, kennt sich irgendjemand mit PRODAVE aus ? ich habe ein kleines Problem bei der Kommunikation mit einer S7-200 (über PC_PPI-Kabel). Ich will mit PRODAVE S7 mini einen Datenbereich aus einer S7-200 auslesen. Dazu habe ich ein Delphiprogramm erstellt. Beim Aufruf des Auslesebefehls kommen zwar die gewünschten Daten, gleichzeitig bekomme ich aber als Returncode den Fehler 8105H -> Adressfehler. Dadurch bekomme ich beim Beenden des Programmes eine Zugriffsverletzungsfehler. Hier meine Deklarationen / Aufrufe: plc_adr_table[0] := 2; //adresse plc_adr_table[1] := 0; //segment id plc_adr_table[2] := 2; //rack nr plc_adr_table[3] := 0; //slot nr strcopy(plc_name,'S7ONLINE'); res1 := Load_Tool(1,addr(plc_name),addr(plc_adr_table[0])); res2 := as200_vs_field_read(null, max_buffer, buffer ); res3 := unload_Tool; Ergebnis: res1 und res3 = 0 res2 = 8105 Ich hab schon allerhand probiert ohne gewünschten Erfolg ! kann mir jemand einen Tip geben ? Danke |
Re: 'Adressfehler beim Auslesen einer Simatic S7-200'
mit den delphi tags würde der code übersichtlicher sein ...
welcher variable typ ist den plc_name? und hast du für den auch speicher reserviert? (den ein strcopy reserviert keinen speicher, sondern kopiert nur speicher) was ist max_buffer, und wie reservierst dafür speicher? zeig mal den ganzen code bitte |
Re: 'Adressfehler beim Auslesen einer Simatic S7-200'
Hallo,
hier ist der komplette Code:
Delphi-Quellcode:
Danke deine Hilfe
unit US200;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids; type TFS200 = class(TForm) TestGrid: TStringGrid; procedure FormActivate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var FS200: TFS200; plc_adr_table : array[0..15] of byte; plc_name : array[0..255] of char; null, max_maschinen, max_buffer, res1,res2,res3 : integer; buffer : array[0..50] of byte; mzaehler : array[0..25] of word; const max_buffer1 = 10; implementation {$R *.dfm} function Load_tool ( no :Byte; name:{Pointer}PChar; adr:{pointer}PChar):integer; stdcall; external 'w95_s7m.dll' name 'load_tool'; function as200_vs_field_read ( no :integer; var anz:integer; var buffer):integer; stdcall; external 'w95_s7m.dll' name 'as200_vs_field_read'; //function as200_ag_zustand ( var buffer):integer; //stdcall; //external 'w95_s7m.dll' name 'as200_ag_zustand'; function Unload_tool:integer; stdcall; external 'w95_s7m.dll' name 'unload_tool'; procedure TFS200.FormActivate(Sender: TObject); var i,j : integer; state : char; begin max_maschinen := 10; max_buffer := max_maschinen * 2; null := 0; plc_adr_table[0] := 2; //adresse plc_adr_table[1] := 0; //segment id plc_adr_table[2] := 2; //rack nr plc_adr_table[3] := 0; //slot nr plc_adr_table[4] := 0; //adresse plc_adr_table[5] := 0; //segment id plc_adr_table[6] := 2; //rack nr plc_adr_table[7] := 0; //slot nr strcopy(plc_name,'S7ONLINE'); res1 := Load_Tool(1,addr(plc_name),addr(plc_adr_table[0])); res2 := as200_vs_field_read(null, max_buffer, buffer ); res3 := unload_Tool; j := 0; // Die Bytes zu WORDS zusammensetzen for i:=0 to max_maschinen do begin mzaehler[i] := 0; mzaehler[i] := buffer[j] shl 8; mzaehler[i] := mzaehler[i] + buffer[j+1]; inc(j); inc(j); end; FS200.Close; end; end. Das mit den DELPHI Tags wurde schon erwähnt. Nächstes Mal bitte selber einpflegen. Mfg, Jelly |
Re: 'Adressfehler beim Auslesen einer Simatic S7-200'
Probier mal
Delphi-Quellcode:
Hantiert as200_vs_field_read wirklich mit Bytes? Da waere ich mir nicht so sicher. Verlaengere mal das Array buffer auf 80 Bytes.
res2 := as200_vs_field_read(null, max_buffer, buffer[0] );
null ist ein selten daemlicher Name und auch bereits in Delphi belegt. |
Re: 'Adressfehler beim Auslesen einer Simatic S7-200'
Hallo,
danke für die Tips. Ich habe beide ausprobiert, leider ohne Erfolg. Hast du sonst noch eine Idee, was ich machen könnte ? |
Re: 'Adressfehler beim Auslesen einer Simatic S7-200'
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Ich kann dir mal meine Prodave-Import Unit zur Verfügung stellen. Bei mir hat sie damals ganz gut funktioniert. Allerdings bin ich inzwischen auf die freie LibNoDave umgestiegen. MfG Kolbaschedder |
Re: 'Adressfehler beim Auslesen einer Simatic S7-200'
:-D
Hallo Kolbaschedder; Danke für die "Prodave-Import Unit". Mit dieser funktioniert die Sache fantastisch. Warum es vorher den Addresfehler gegeben hat, weiss ich noch nicht. Ich versuch es noch herauszufinden. Auch allen anderen die mir Tips gegeben haben - Vielen Dank Gruss Schwigi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz