Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   'Adressfehler beim Auslesen einer Simatic S7-200' (https://www.delphipraxis.net/96768-adressfehler-beim-auslesen-einer-simatic-s7-200-a.html)

schwigi 30. Jul 2007 18:32


'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

Gruber_Hans_12345 31. Jul 2007 07:54

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

schwigi 2. Aug 2007 19:30

Re: 'Adressfehler beim Auslesen einer Simatic S7-200'
 
Hallo,

hier ist der komplette Code:


Delphi-Quellcode:
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.
Danke deine Hilfe

Das mit den DELPHI Tags wurde schon erwähnt. Nächstes Mal bitte selber einpflegen. Mfg, Jelly

Robert Marquardt 2. Aug 2007 20:31

Re: 'Adressfehler beim Auslesen einer Simatic S7-200'
 
Probier mal
Delphi-Quellcode:
res2 := as200_vs_field_read(null, max_buffer, buffer[0] );
Hantiert as200_vs_field_read wirklich mit Bytes? Da waere ich mir nicht so sicher. Verlaengere mal das Array buffer auf 80 Bytes.
null ist ein selten daemlicher Name und auch bereits in Delphi belegt.

schwigi 6. Aug 2007 11:17

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 ?

kolbaschedder 6. Aug 2007 11:40

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

schwigi 7. Aug 2007 18:20

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 05:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz