| Autor |
Beitrag |
Omid 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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
      

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)
|
Verfasst: 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
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: 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  weil sonst nicht nachvollziehbar mhh...
hier habe ich mal ne Info uber das ganze.
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
SvenAbeln
      
Beiträge: 334
Erhaltene Danke: 3
|
Verfasst: 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 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: 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 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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:
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 public 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:
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_adr_table: Array[0..15] of byte; SPS_name:Array[0..256] of Char; RW_Byte:Array[0..256] of byte; RW_Word:Array[0..512] of 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. |
ALF hat folgendes geschrieben : | 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 Narses: Zitat kenntlich gemacht.
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Mi 14.04.10 16:49
Kannst Du mir mal sagen was Du hier machst?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var .... .... RW_Byte:Array[0..256] of byte; ..... implementation Begin ...... ...... ...... for M := 0 to 512 do 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
      
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.
|
Verfasst: 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 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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.
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
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: 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
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 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Fr 16.04.10 08:17
Delphi-Quelltext 1: 2:
| Timer1.Enabled:= True; Timer1.Enabled:= False; |
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: 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
So würde ich es umsetzen
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Omid 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: Sa 17.04.10 10:27
Omid hat folgendes geschrieben : | | ....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
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 
Hält's aus hier
Beiträge: 14
|
Verfasst: 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
|
|
|