Hi,
die VI's musst du dir selber basteln! Und um zu wissen, wo was steht musst du natürlich die Datenstruktur in der SPS kennen. Meist wird für so ne Übergabe vereinbart "wir nehmen den Datenbaustein 60 für Eingänge, den DB61 für Ausgänge, DB62 für Fehlermeldungen der SPS" o.ä. Das ist ja für jede Aufgabe anders...also nur die Adressen kann man angeben, den Rest muss man sich selber zurechtschrauben. Du bildest dir im LV die Datenstruktur z.B. als boolesches Array ab, dieses beschreibst du mit deinen Daten (LV->SPS und SPS->LV). Das Cluster ist meine Datensammlung (Ausgänge), die übertrag ich dann auf das boolesche Array und das gleiche mach ich auch mit den Eingängen, die von der SPS kommen. Wenn du die Datenstruktur mal verinnerlicht hast, ist's nicht mehr schwer. Man muss manchmal halt ein bisschen außenrum arbeiten, z.B. weil man von den übertragenen Daten das Zweierkomplement bilden muss, um ne "Klartextanzeige" zu erhalten.
Gruss
A.
PS: Warum zitierst du eigentlich immer komplett den vorhergehenden Post? Die Threads werden dadurch nicht grade übersichtlicher! Das macht ja Sinn, wenn man Teile (!) zitiert die "viel weiter oben" mal aufgetaucht sind, aber ganze Antworten und dann auch noch direkt unten drunter...das ist meiner Meinung nach nicht so prickelnd! Nicht vor Wut schnauben, bitte...
PPS: Jetzt hast du's schnell geändert...du Schuft!
PPPS: #DIs (48) = Anzahl digitaler Eingänge von der SPS (Endschalter erreicht, Trigger für Messung, usw.)
und # SPS-Meldungen (96) = Anzahl von Fehlermeldungen (Bit0 = Fehler x, Bit1 = Fehler y, usw.)
Achso, jetzt steige ich langsam durch. Was ich noch nicht ganz verstanden habe, ist:
- wieso Du das "Reshape Array" verwendest,
- wie das mit den analogen Signalen funktioniert (was das mit dem "geteilt durch 1000" bedeutet,...) und
- woher der Cluster bei "Integers an SPS" kommt, bzw. was da drin steht.
Gruß Markus
PS: Mit dem Zitieren hast Du natürlich recht. Oft vergesse ich es und mache es dann später weg. Sorry.
Hi Markus,
ich musste erst mal überlegen...das ist jetzt ca. 4 Jahre her, da wusste ich einiges nicht mehr so genau...
Der Reihe nach:
1. Das "Reshape":
Ich kriege die Daten aus der DLL als U8-Werte, d.h. ein Array of U8 mit z.B. immer 40 Elementen. Die ersten 2 Elemente sind Digitale Eingänge (2x 8Bit), die nächsten 14 repräsentieren analoge Eingänge (bei denen high und low-Bytes sortiert werden müssen und manche mit 1/1000 skaliert werden müssen), die nächsten 4 sind wieder DI (werden oben angefügt) und die restlichen sind ebenfalls DI, allerdings in nem separaten Block, der Fehlermeldungen repräsentiert. 2+14+4=20, d.h. ich hab noch 20 Byte (also 20x 8 Bit = 160 Bit) für die Fehlermeldungen oder weitere Daten (Reserve). Ich brauch hier aber nur noch 96 Bit, die ich vorher für Fehlermeldungen definiert habe.
Die Verteilung der 96 Fehlerbits siehst du im Bild hier:
[
attachment=4712]
Im ersten Schritt werden die 20 Byte (20x U8) in boolesches 2D-Array gewandelt (20x8x1Bit). Dann werden diese Elemente des 2D per Reshape in ein 1D mit 96 Elementen überführt, der Rest wird verworfen, weil ich's nicht brauche. Das Abscheiden erfolgt, damit ich genauso viele Elemente hab wie im vordefinierten Array of Cluster "Fehlerliste SPS", dann kann man per Autoindexing in das jeweilige "Data"-Feld im Cluster schreiben! Den Inhalt der Fehlerliste siehst du im Hilfefenster!
2. "geteilt durch 1000"
siehe oben, dient der Skalierung
3. Integers an SPS
Die SPS verfügt über eine nachgeordnete numerische Steuerung, diese kann nur mit Integerzahlen rechnen. Zum Arbeiten benötigt sie einige Parameter, die stehen in dem Cluster, siehe nachfolgendes Bild! Das Cluster hab ich mir selber erstellt, es wird über ein Konfigmenü (LV-FP) befüllt und dann der SPS übergeben.
[
attachment=4713]
So, genug erzählt...ich musste mich schon an viel mehr Details erinnern, als ich eigentlich wollte...Wichtig ist eigentlich nur: Du vereinbarst mit der SPS-Seite die Datenstruktur und die Adresse, den Rest muss man dann zusammenbauen oder aufdröseln...
Gruss
Achim
Hallo Achim,
Danke für die ausführliche Hilfe. Jetzt ist mir so manches klarer geworden. Ich war aber auch hartnäckig.....
Gruß Markus
Edit:
Noch etwas: Wo finde ich in den oberen Bildern die DLL? Im SPS Serv, oder im Run, Init oder Close?
Hi,
der SPS Serv besteht aus einer Case Struktur mit angeschlossenem Enum: Init, Run, Close
Meine Programme sehen eigentlich meist so aus:
Stacked Sequence 1: Initialisierung (HW, Variablen, etc.)
Stacked Sequence 2: eigentliches Programm (meist State Machine)
Stacked Sequence 3: Aufräumen (Referenzen schließen, Treiber schließen, usw.)
Der SPS Serv wird entsprechend in allen drei Sequenzschritten aufgerufen, dabei werden folgende Zustände angesteuert:
1: Init: OpenDriver, InitBoard, SetHostState
2: Run Acquisition: ExchangeIO
3: Close: ExitBoard, Close Driver
Die grade aufgezählen Elemente sind jeweils VIs die in der Reihenfolge der Aufzählung aufgerufen werden. In jedem dieser VIs erfolgt über einen "Call library function node" der Aufruf der DLL, natürlich mit anderen Parametern! Diese Beschaltung war aber schon vorgegeben aus dem erwähnten Beispiel-VI!
Tschö...
A.
OK. Jetzt klingt das logisch für mich.:lol:Vielen Dank für Deine Hilfe.
Schönes Wochenende.
Gruß Markus
' schrieb:Hi Markus,
die DLL kriegt man "vorverdrahtet" in nem Beispiel, dass muss man dann entsprechend aufbohren. Es gibt ein Init, ein Run, und ein Close, genauso wie bei den NI-Karten. Hier mal ne Vorgehensweise in Bildern...
Die gezeigten VI's liegen vor bzw. nach dem oben schon gezeigten eigentlichen Kommunikations-VI (schreiben in LV -> read/write dll -> lesen nach LV)
Gruss
Achim
Hi,
ich hab hier die Original CD von Hilscher fuer die Karte CIF 50-DPS vor mir liegen. Ich kann aber kein Beispiel VI auf der CD finden. Kann es sein das Hilscher das Beispiel von der CD heruntergenommen hat? Oder verstehe ich was falsch. Kann einer das Beispiel VI reinstellen oder mir schicken? Waere super.
Gruß Daniel
Hi,
ich glaube mich zu erinnern, dass ich das damals bei denen angefordert habe...
Guckst du hier:
Sehr geehrter Herr ...,
anbei sende ich ihnen die gezippte Datei zu dem mir zur Verfügung stehenden LabVIEW-Treiber.
Bitte beachten Sie, dass der Treiber nicht von Hilscher erstellt wurde und auch nicht supportet wird.
Den Treiber müssten Sie sich selbst für Ihre Gegebenheiten anpassen.
Im einem beiliegenden Dokument finden Sie in der Fußnote einen Ansprechpartner aus Spanien.
Mit freundlichen Grüßen
Ralf Schoßland
- Vertrieb / Sales -
Tel. 06190 / 99 07 - 46
E-Mail: rschosslandAThilscherDOTcom
------------------------------------------------
Hilscher Gesellschaft für Systemautomation mbH
Rheinstr. 15, 65795 Hattersheim
Sitz der Gesellschaft: Hattersheim
Geschäftsführer: Hans-Jürgen Hilscher
Registergericht: Amtsgericht Frankfurt/Main
Handelsregister: Frankfurt B 26873
http://www.hilscher.com
[
attachment=10198](VI's LV 5.1)
' schrieb:Hi,
ich glaube mich zu erinnern, dass ich das damals bei denen angefordert habe...
Die Treiber sind zwar ausführlicher aber die Art der Implementation eher sehr direkt und LabVIEW Benützerunfreundlich.
Die dem Post
Siemens CP5611 angehängten VIs sind hier etwas LabVIEW freundlicher, meiner ganz unbescheidenen Meinung nach.
Rolf Kalbermatter
Hallo Achim,
seit kurzem arbeite ich mit LV 8.5 und soll nun die Kommunikation mit einer Hilscher Karte (Profibus 8k) realisieren. Beim stöbern im Forum bin ich hier gelandet.
Scheinbar habe ich von Fa. Hilscher die selben VI's bekommen von denen du geschrieben hast. Mit Hilfe von NI sind diese nun lauffähig für 8.5
Das ersetzen der "Code Interface Nodes" durch "Call Library Function Nodes" hat auch geklappt.
Wie oben auch von dir beschrieben, habe ich eine kleine Sepquenz geschrieben, um I/O-Daten auszulesen. Open , Init, SetHostState, ExchangeIO, Exit und Close.
Problem dabei ist, dass ich keine Daten eingelesen bekomme.
Scheinbar übergebe ich nicht die richtigen Parameter, oder ich lasse mir nicht die richtigen Parameter anzeigen.
Hast du vielleicht ein Beispiel für die Parameterübergabe?
Oder welche Parameter auf jeden Fall übergeben werden müssen?
Vielen Dank im Voraus
Gruß
Torsten