Autor Beitrag
Omid Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 12.04.10 04:28 
Hi

@ Luchie und Xion

Narses hat recht. das ist alles (Eingabe). Die Funktion E_field_read gehoert Pradve.dll von siemens. Da habe ich nur die Funktion aufgerufen.
Das hat auch mit der Anlage nicht zu tun. Hier lese ich nur ein Byte! Was im Dll passiert weiss ich nicht.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mo 12.04.10 08:44 
Da ist was faul...warum braucht die Funktion 6Sekunden für ein byte...gibts zu der DLL andere Demo-Anwendungen? Brauchen die auch so lange? Evtl funktioniert was nicht und 6 Sekunden ist der TimeOut.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Mo 12.04.10 12:24 
Ich verstehe nur nicht, warum er uns die initialierung der Schnittstelle nicht zeigt!
So viel ich weis gibt es da ein Protokoll für das ganze, bevor ich das so aufrufen kann.
Zu mal ein weiterer Aufruf nur Sinn macht, wenn ich die Daten auch verarbeitet habe!
Egal ob es nur ein Byte ist, ne ganze DBtabelle oder Messdaten.

Irgendwie ist das nicht ganz Durchsichtig?
Kann sein das ich mich irre :gruebel: weil sonst nicht nachvollziehbar mhh...

hier habe ich mal ne Info uber das ganze. :wink:

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
SvenAbeln
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Mo 12.04.10 13:55 
Müssen load_tool und Unload_Tool; wirklich bei jedem Zugriff neu aufgerufen werden, reicht es nicht diese nur einmal beim Start und Ende des Programms aufzurufen?
Vielleicht verbraucht dies schon deine ganze Zeit.

Zu deinen Threads und der Accessviolation:
  • Warum sind deine OnlineClick und OfflineClick identisch?
    du startest dort jedes mal einen neuen Thread, die nie wieder gestoppt werden.
  • Da der ganze Austausch über globale Variablen läuft ist das nicht Threadsafe
    • Alle Threads laden die Daten auf die selbe globale Varibale
    • Ein Thread kann jederzeit Unload_Toll aufrufen und damit einem anderen Thread die Verbindung kappt.

Du solltest dir eine Private Eigenschaft FThread: TmyThread; in deinem Form machen, dann kannst du immer wieder auf deinen Thread zugreifen und ihn anhalten oder weiterlaufen lassen (suspend/resume/terminate)
Omid Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 13.04.10 04:41 
Hallo,
@ Alf
das Protokoll und die Port zugreife sind alle im dll eingepackt.
@ SevenAblen
Es wahr ein Fehler in Offlineclick . Habe es geändert. Das hat aber sich nichts geändert. Mit dem Onlineclick starte ich mein Thread und mit Offlinclick beende ich das.

@ Xion

Hier liegt wahrscheinlich das Problem.. Es stimmt nicht mit License key. Obwohl ich die License Key installiere, findet Automation License Manager das auf die platte nicht. Etwas stimmt nicht.

Ich werde mich bei Siemens erkundigen.

Ich danke euch alle. Ich habe vieles bei euere hinweise über Delphi gelernt.

Omid
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Di 13.04.10 09:37 
Deine DLL alleine nützt Dir gar nichts, wenn Du die Inintialisierung nicht richtig machst!
Schau Dir mal den lnk und diesen lnk dazu an.
Ich befürchte, das Du es so oder in ähnlicher Form nicht gemacht hast.

Zumal Du uns Deine Form1, wo die Initiallisierung stattfinden muss, nie gezeigt hast!
Das meine ich mit Protokoll!

Gruss ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Omid Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 14.04.10 06:52 
Hi
@ Alf
sorry, ich dachte meine form1 ist nicht so wichtig. Hier wird nur die Form2 aufgerufen. Hier die Code:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Ende: TButton;
    lesen: TButton;
    procedure EndeClick(Sender: TObject);
    procedure lesenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.EndeClick(Sender: TObject);
begin
close;
end;
procedure TForm1.lesenClick(Sender: TObject);
begin
Form2.show;
end;

end.


die Initialisierung wird in PVar aufgerufen:
code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
unit pvar;
 interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

Var
  //-------------------------------------SPS
  sps_adr_table: Array[0..15of byte;
  SPS_name:Array[0..256of Char;
  RW_Byte:Array[0..256of byte;
  RW_Word:Array[0..512of word;
  Res_R,Res_w:longint;
  amount: longint;
  m:integer;
 implementation

  Begin
     Sps_adr_table[0]:=2;
     Sps_adr_table[1]:=0;
     Sps_adr_table[2]:=2;
     Sps_adr_table[3]:=0;
     Sps_adr_table[4]:=0;
     Strcopy(sps_name,'S7ONLINE');
     for M:=0 to 512 do RW_byte[M]:=0;
     M:=0;
end.

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
Deine DLL alleine nützt Dir gar nichts, wenn Du die Inintialisierung nicht richtig machst!
Schau Dir mal den lnk und diesen lnk dazu an.

der lnk habe ich angeschaut. Fast habe ich das gleiche gemacht.

Mein Programm funktioniert. ich kann die Daten von der sps lesen. No Problem.
Ich brauche 6 ms Um ein Byte zu lesen. Das ist das Problem. Warscheinlich liegt an meine Prodave.
omid

Moderiert von user profile iconNarses: Zitat kenntlich gemacht.
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Mi 14.04.10 16:49 
Kannst Du mir mal sagen was Du hier machst?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var
....
.... 
RW_Byte:Array[0..256of byte; //256 (257)
.....  
implementation
Begin     
......
......
......
 for M := 0 to 512 do   //512 (513)?
     RW_byte[M]:=0;

 M := 0;
end.

Du bist Dir wirklich sicher das es Daten sind die Du auch wirklich anfordest!!!
Kann ich nicht glauben :?
Ich sehe nur zusammen copierten Code ohne Zusammenhang, Keine Verarbeitung der Daten, noch eine Fehlerbehandlung die hier dringend anzuraten ist!
Und sage mir nicht, steht alles in der DLL/Prodave.pas drin!
Ich will Dir nicht's in Abrede stellen aber
wenn es so simple ist, frage ich mich, warum andere es so kompliziert schreiben! :?
Was Deine Zeitangaben betreffen, hast Du beide Schnittstellen angepast! 38400?

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Chemiker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 194
Erhaltene Danke: 14

XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit, Win 10, Win 11
BDS 2006, RAD Studio 2009+C++, Delphi 13, VS 2010 Prof.
BeitragVerfasst: Mi 14.04.10 23:42 
Hallo Omid,

zudem ist es wichtig mit welcher S7 man arbeitet. Bei einer S7/200 gibt es erhebliche Schwierigkeiten.

Bis bald Chemiker
Omid Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 15.04.10 00:08 
Hallo Alf

Ich bin ein delphi Anfänger, bitte vergiss das nicht. Seit ca 2 Wochen bin ich dabei. Eigentlich war ich begeistert, weil mein Programm funktionierte. Wenn ich in der Anlage nicht so schnell etwas ändern wollte, wäre okay gewesen. Das ist aber nicht.
Im Unit Pvar habe ich mein Variabel sowie die SPS Adressen definiert

Die RW_Byte gebe ich die E_Field_read Funktion von dll. Hier bekomme ich meine daten.
ausblenden Delphi-Quelltext
1:
E_field_read(Abbyte,Anzahl,RW_byte);					


Ich kann aus ein DB 256 Byte lesen oder in DB schreiben.
In der For schleife initialisiere ich die Felder. Hier ist ein Fehler. Die Schleife muss bis 256 laufen. Danke.
Um die Baurate muss ich mich nicht kümmern. (MPI )

Es muss nicht immer alles so kompliziert sein. Du hast recht, manche mache es so komplizieret.
PS.
Kennst du dich bitte mit Libnodave aus?

Gruss Omid
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 15.04.10 05:26 
Libnodave ist leider etwas komplizerter, aber der Support ist super!
Zumal es dort auch nen Tool gibt zum Testen von Verbindungen und so.
Empfehlen kann ich es Dir, weil das Forum dort sehr gut ist was libnodave betrifft.
Weil es ja Doch etwas anderes ist.

@Chemiker hat Dir ja auch noch was geschrieben, wo ich nicht nachgefragt habe z.B.! Du siehst alles was damit zu tun hat ist wahrscheinlich dort besser Aufgehoben.

Delphi ist natürlich hier besser :wink:

Was nun aber Deine permanente Abfrage betrifft, so würde ich sagen ist der Ansatz falsch.
Nicht das Connect um Daten zu lesen muss Du in einer Schleife legen, sonder das Datenlesen!
Erst wenn das lesen und verarbeiten der Daten fertig ist und Du keine Daten mehr benötigst kannst Du Res_R:=Unload_Tool aufrufen.

Was Du jetzt machst, ist ja jedesmal das s7online Protokoll zu initialisieren und das kostet Zeit!
Hat Dir @SvenAbeln Auch schon geschrieben.

Was Dein Port betrifft, so solltest Du nicht die MPI an Dein Port anpassen, sondern den Port an das MPI.

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Omid Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 16.04.10 07:47 
Hallo Alf,

ich arbeite mit eine S7 300. CPU 315 2DP.

So soll meine Dlephi Programm Ablaufen.

1- Ich gebe erst die Parameter für Produktion.
2- Delphi macht Berechnungen und passt die Parameter für die Maschine (Sollwerte)
3- Die Sollwerte werden in die SPS Datenbaustein geschrieben
4- Delphi macht eine Form_Soll_Ist auf in dem die Sollwerte und die Istwerte dargestellt werden.
Eine Regelung wird hier nicht gemacht. Der Operator kann die Istwerte ändern und an die Sollwertre anpassen ( Drehzahl Vorgaben).

Für Position 3 spielt die Zeit um die daten in SPS zu schreiben keine rolle. Hier läuft die Produktion noch nicht. Hier kann ich die Verbindung aufbauen. Daten rein schreiben. Verbindung beenden.

Für Position 4 soll die daten ständig aktualisiert werden bis die Anlage ausgeschaltet oder mit andren Parameter produziert wird .
Ich soll hier die Verbindung aufbauen und die daten ständig aktualisieren. die Verbindung soll bei beenden von Form_soll_ist abgebaut werden.

Eigentlich war die Idee mit dem Timer gut. Der Timer macht aber das ganze Programm Träger. Kann man der Timer per ButtonClick aktivieren, wenn man ihn braucht? Zum Beispiel in Form_Soll_ist?

Gruss Omid
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Fr 16.04.10 08:17 
ausblenden Delphi-Quelltext
1:
2:
Timer1.Enabled:= True; // aktivieren
Timer1.Enabled:= False; // deaktivieren

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Fr 16.04.10 09:05 
Hi alles klar. :)

Da Du in Pos4 in "echtzeit arbeitest" solltest Du dies nicht mit Timer machen sondern mit Threads
Und genau hier kommt das, was andere schon geschrieben haben.

1.Hauptform starten und Initialisierung der Schnittstelle/Prüfen.
Dabei werden noch keine Daten gelesen oder geschrieben.
2.Dann "ButtonDatenSchreiben"
=>(neue Form mit den Eingabemasken als Thread starten!! Daten anpassen "ButtonOK" berechnen/Prüfen wenn ok, =>Fertige Daten ans HauptFormular geben Anzeigen lassen) ist alles Ok dann!
3."ButtonDaten senden" ist alles OK dann
4."ButtonProzess Starten" und Datenlesen (Wieder als Thread!!!) Empfangene Daten ans Hauptformular geben Anzeigen lassen.
Hier kannst Du jetzt auch Korrekturen für ist/soll vornehmen. Wobei sich die Frage stellt, sollen die Korrekturen an den Prozess geendet werden?????? oder werden nur die soll Werte korregiert!

5."ButtonProzess Beenden".

6.Programm Beenden Verbindung trennen.

Warum so, weil Du jetzt im HauptFormular die gesendeten Daten und die Empfangen Daten siehst und vergleichen kannst. Übersichtlicher!!

Ist jetzt erst mal nur ne Vorlage für ein Prozess. Die Optische Vorlage musst Du natürlich entscheiden wie es aussehen soll :wink:

So würde ich es umsetzen 8)

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Omid Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 17.04.10 09:19 
Hallo Alf,
Vielen Dank für die ausführliche Beschreibung. Nach deiner Vorlage werde ich es probieren.
Die Korrektur an meine Ist/sollwerte wird ändere gemacht. Der Operator ändert eine Drehzahl per Schalter in der Anlage. Dieser Wert wird von SPS an Delphi weiter gegeben. Der Operator gleicht die Istwert mit Sollwert.

Gruß
Omid
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Sa 17.04.10 10:27 
user profile iconOmid hat folgendes geschrieben Zum zitierten Posting springen:
....Der Operator ändert eine Drehzahl per Schalter in der Anlage. ......

Oha, ist aber nicht gerade Automatisiert!
Oder ist die Steuerung der Drehzahl nicht intigriert, im System?
Na ja, kann ja noch kommen :wink:

Du hast auch nicht gesagt was für einen MPI. Intern oder Extern.
Den Hinweis von mir 38400, bezog sich auf eine externe. Also die MPI nicht an den Port anpassen, sondern versuchen den Port an die MPI anzupassen. Ist zwar etwas mühselig, aber hat den Vorteil, das Du die Externe MPI nicht zustark ausbremmst!?

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Omid Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: So 18.04.10 07:03 
Hi Alf

Die Anlage wurde so konzipiert. Das habe ich aber nicht geplant. Ich mach die Steuerung, wobei die Planung und die Verkabelung vorhanden war. Ich verwende Externe MPI. Auf dem Umsetzer ist ein Schalter. 38400 und 19200. mit 38.4 ist ca. 1 Sekund schneller. Das ist immer noch die alte Version von meinem Programm. Ich habe deine letzte Anweisungen noch nicht eingesetzt. (Zeit Mangel.
Ich muss das Programm anderes schreiben.

Gruß Omid