PDA

View Full Version : Beckhoff KL3202 Register



rgeber
19.11.2004, 14:22
Hallo,

ich hab hier so eine niedliche kleine Beckhoff BC9000 liegen (die ist wirklich winzig), mit ein paar digitalen I/O´s und einem analogen KL3202 Modul zum Anschluss von PT-x Sensoren. Hab da nun einen PT-100 Dreileiter (eigentlich sinds ja vier, aber wurscht) angeschlossen und hatte vor mit einem SPS Programm die einfach mal Daten zu sammeln.

Vor hatte ich das mit der Funktion ReadWriteTerminalReg in der TcPLCUtilities Bibliothek. Funktiniert nicht, und Beckhoff verkündete mir, dass diese Bibliothek mit Version 2.9 von TwinCAT auch nicht mehr funzt.

Nun meine Frage: Wie komme ich mit einem SPS Programm an die Register des KL3202 Moduls ran. Kann mir nicht vorstellen, dass das sonderlich schwer ist, aber ich steh voll auf der Leitung. Wenn jemand nen Tip hat wäre ich dankbar dafür.

cu
rgeber

Zottel
19.11.2004, 15:03
Die folgende Möglichkeit ist ziemlich umständlich und fehlerträchtig, bis ich es zum Laufen bekommen habe, aber ich benutze es um eine Thermoklemme auf Platin-Rhodium umzukonfigurieren und zwar bei jedem Neustart. Der Sinn ist, daß eine Elektriker eine fabrikneue Klemme einbauen kann, ohne sich um die Konfiguration zu kümmern:

Die Klemme muß "komplex gemappt" sein, so daß das Status/Kommandoregister erreichbar ist.

In einer Schrittkette wird:
1. 16#A0 in das Kommandorgister (%QB0) geschrieben
%IB0 zurückgelesen. Wenn es gleich 16#A0 ist, weiter mit Schritt 2
2. 16#1235 in das Datenregister (%QW2) geschrieben (Inhalt für das Klemmenregister), dann 223 in Kommandorgister (%QB0) geschrieben. Die 223 enthält die Adresse des Klemmenregisters und das Befehlsbit "Klemmenregister schreiben".
Durch diesen Schritt wird das Paßwort gesetzt, um die Konfiguration ändern zu können.
3. 16#9009 in das Datenregister (%QW2) geschrieben (Inhalt für das Klemmenregister), dann 224 in Kommandorgister (%QB0) geschrieben. Die 224 enthält die Adresse des Klemmenregisters und das Befehlsbit "Klemmenregister schreiben".
Durch diesen Schritt wird das zu konfigurierende Register auf 16#9006 (Platin-Rhodium) gesetzt.
4. 0 in das Kommandorgister (%QB0) geschrieben. Dadurch gibt das Datenregister wieder den Meßwert aus.

Pro Zyklus wird höchstens ein Wert geschrieben. Durch Rücklesen wird sichergestellt, daß der Wert auch im Register steht, bevor es zum nächsten Schritt geht. Es scheint so, daß die interne Kommunikation wesentlich langsamer als die Zykluszeit ist.

Anonymous
14.09.2005, 09:06
Hallo
Genau das selbe wollte ich auch machen. Nur es funktioniert irgendwie nicht, muß ja in ein bestimmtes register was reinschreiben. wenn ich dein Programm ausführe, dann hängt sich mein Modul auf und alle register sind auf null.
Hast du vielleicht eine Lösung für mich? Ich wäre dir sehr dankbar
Gruß Serge

Zottel
14.09.2005, 10:48
Hallo
Genau das selbe wollte ich auch machen. Nur es funktioniert irgendwie nicht, muß ja in ein bestimmtes register was reinschreiben. wenn ich dein Programm ausführe, dann hängt sich mein Modul auf und alle register sind auf null.
Hast du vielleicht eine Lösung für mich? Ich wäre dir sehr dankbar
Gruß Serge
Na ja, ich hatte die private Nachricht so verstanden, daß du von hier ein fertiges Programm runtergeladen hast. Mein Beitrag war ja eher ein "Kochrezept".
Wichtig ist, daß du nicht hintereinander weg in die Register schreibst, sondern immer erst, wenn du das Ergebnis des vorigen Schritts durch Rücklesen bestätigt bekommst. Natürlich müssen die Adressen angepaßt werden.
Ich hatte eine Klemme 3311 (1 Thermoeingang) verwendet. Andere Klemmmen mögen wesentlich andere Registerbelegungen bzw. ein anderes Default-Passwort haben.
Ich muß mal schauen, wo ich es habe, dann poste ich das Programm.

Zottel
14.09.2005, 12:25
Hier mal das Programm aus TwinCat mit Copy&Paste kopiert


PROGRAM MAIN
VAR


reg1: WORD;
st1: WORD;
reg2: WORD;
st2: WORD;
Anltimer: TON;
schritt: WORD;
regnachher: WORD;
regnachher2: WORD;
avr: REAL;
erg: REAL;
END_VAR






LD %IW0
ST reg1

LD %IW2
ST st1

LD avr
MUL 0.9
ST avr
LD %IW2
MUL 0.1
ADD avr
ST avr
MUL 0.1
ST erg

LD Anltimer.Q
(*
JMPC NICHT
*)
LD st1
ADD 1
ST st1
LD TRUE
ST Anltimer.IN
LD T#2s
ST Anltimer.pt
NICHT:
LD Anltimer.Q
JMPC NICHTNULL

LD 0
ST schritt
NICHTNULL:

CAL anltimer
LD schritt
EQ 0
JMPCN ns0
LD 1
ST schritt
JMP ende
ns0:
LD schritt
EQ 1
JMPCN ns1
LD 160
ST %QB0
LD %IB0
EQ 160
JMPCN ns1

LD 16#1235
ST %QW2
LD 223
ST %QB0
LD %IW2
ST regnachher
LD 2
ST schritt
JMP ende
ns1:
LD schritt
EQ 2
JMPCN ns2

LD 224
ST %QB0
LD 16#9006
ST %QW2
LD %IW2
ST regnachher2
LD 3
ST schritt
JMP ende
ns2:
LD schritt
EQ 3
JMPCN ns3

LD 0
ST %QB0
LD %QB0
EQ 0
JMPCN ns3

LD 16#F006
ST %QW2
LD 4
ST schritt
ns3:
ende:[/code]

Anonymous
14.09.2005, 12:43
Hi.
danke fü deine antwort und fürs programm
und wie komme ich an die daten dran. habe nämlich eine KL3202, will diese auf PT100 umprogrammieren.

Gruß Serge

Zottel
14.09.2005, 13:48
Hi.
und wie komme ich an die daten dran. habe nämlich eine KL3202, will diese auf PT100 umprogrammieren.

Welche Daten? Datenblääter der Klemmen gibt's bei BeCKHOFF zum runterladen.

Anonymous
14.09.2005, 14:55
kannst du mir vielleicht auch sagen was bei mir am programm nicht stimmt.
PROGRAM INITIALISIERUNG
VAR CONSTANT
KL3202_0: WORD := 0; (* STATUS 0 => status-Maschine INIT KL3202 *)
KL3202_1: WORD := 1; (* STATUS 1 => status-Maschine INIT KL3202 *)
KL3202_2: WORD := 2; (* STATUS 2 => status-Maschine INIT KL3202 *)
KL3202_3: WORD := 3; (* STATUS 3 => status-Maschine INIT KL3202 *)

KL1501_0: WORD := 4; (* STATUS 0 => status-Maschine INIT KL1501 *)
KL1501_1: WORD := 5; (* STATUS 1 => status-Maschine INIT KL1501 *)
KL1501_2: WORD := 6; (* STATUS 2 => status-Maschine INIT KL1501 *)
KL1501_3: WORD := 7; (* STATUS 3 => status-Maschine INIT KL1501 *)
END_VAR
VAR
STAT_KL3202_1: WORD;
STAT_KL3202_2: WORD;
STAT_KL1501_1: WORD;
STAT_KL1501_2: WORD;
STAT_KL1501_3: WORD;
END_VAR


CASE STAT_KL3202_1 OF (* Temperatutsmessung 1*)
(******************************************************************************* ********************)
KL3202_0:
TMPFUEHL1_CTRL:=16#A0;
STAT_KL3202_1:=KL3202_1;
(******************************************************************************* ********************)
KL3202_1:
IF TMPFUEHL1_CTRL=16#A0 THEN
STAT_KL3202_1:=KL3202_2;
END_IF
(******************************************************************************* ********************)
KL3202_2:
TMPFUEHL1_OUT:=16#1235;
TMPFUEHL1_CTRL:=223;
STAT_KL3202_1:=KL3202_3;
(******************************************************************************* ********************)
KL3202_3:
TMPFUEHL1_OUT:=16#0106;
TMPFUEHL1_CTRL:=224;
(******************************************************************************* ********************)

END_CASE;

CASE STAT_KL3202_2 OF (* Temperatutsmessung 2 *)
(******************************************************************************* ********************)
KL3202_0:
TMPFUEHL2_CTRL:=16#A0;
STAT_KL3202_1:=KL3202_1;
(******************************************************************************* ********************)
KL3202_1:
IF TMPFUEHL2_CTRL=16#A0 THEN
STAT_KL3202_1:=KL3202_2;
END_IF
(******************************************************************************* ********************)
KL3202_2:
TMPFUEHL2_OUT:=16#1235;
TMPFUEHL2_CTRL:=223;
STAT_KL3202_1:=KL3202_3;
(******************************************************************************* ********************)
KL3202_3:
TMPFUEHL2_OUT:=16#0106;
TMPFUEHL2_CTRL:=224;
(******************************************************************************* ********************)

END_CASE;

CASE STAT_KL1501_1 OF (* Mengenzähler Prozesspumpe *)
(******************************************************************************* ********************)
KL1501_0:
MENGPRZPMP_CTR:=16#A0;
STAT_KL1501_1:=KL1501_1;
(******************************************************************************* ********************)
KL1501_1:
IF MENGPRZPMP_CTR=16#A0 THEN
STAT_KL1501_1:=KL1501_2;
END_IF
(******************************************************************************* ********************)
KL1501_2:
MENGPRZPMP_OUT:=16#1235;
MENGPRZPMP_CTR:=223;
STAT_KL1501_1:=KL1501_3;
(******************************************************************************* ********************)
KL1501_3:
MENGPRZPMP_OUT:=16#0100;
MENGPRZPMP_CTR:=224;
(******************************************************************************* ********************)
END_CASE;

CASE STAT_KL1501_2 OF (* Mengenzähler Filtersystem *)
(******************************************************************************* ********************)
KL1501_0:
MENGFLTSYS_CTR:=16#A0;
STAT_KL1501_1:=KL1501_1;
(******************************************************************************* ********************)
KL1501_1:
IF MENGFLTSYS_CTR=16#A0 THEN
STAT_KL1501_1:=KL1501_2;
END_IF
(******************************************************************************* ********************)
KL1501_2:
MENGFLTSYS_OUT:=16#1235;
MENGFLTSYS_CTR:=223;
STAT_KL1501_1:=KL1501_3;
(******************************************************************************* ********************)
KL1501_3:
MENGFLTSYS_OUT:=16#0100;
MENGFLTSYS_CTR:=224;
(******************************************************************************* ********************)
END_CASE;

CASE STAT_KL1501_3 OF (* Mengenzähler Entsorgungsmenge *)
(******************************************************************************* ********************)
KL1501_0:
ENTSOGMENG_CTR:=16#A0;
STAT_KL1501_1:=KL1501_1;
(******************************************************************************* ********************)
KL1501_1:
IF ENTSOGMENG_CTR=16#A0 THEN
STAT_KL1501_1:=KL1501_2;
END_IF
(******************************************************************************* ********************)
KL1501_2:
ENTSOGMENG_OUT:=16#1235;
ENTSOGMENG_CTR:=223;
STAT_KL1501_1:=KL1501_3;
(******************************************************************************* ********************)
KL1501_3:
ENTSOGMENG_OUT:=16#0100;
ENTSOGMENG_CTR:=224;
(******************************************************************************* ********************)
END_CASE;


wäre dir sehr dankbar. habe dieses nach deiner anleitung geschrieben

Zottel
14.09.2005, 15:03
Sorry, ich glaube ich bin ziemlich hilfsbereit. Aber für mich ist das ein "altes Programm", ich habe keinen BC9000 und keine solche Klemme auf dem Tisch liegen und du schreibst in einer anderen Sprache, so daß ich mich erst reindenken muß. Das ist dauert mir ehrlich gesagt zu lange.

Anonymous
14.09.2005, 15:25
ich danke dir trotzdem, probiere mal dein Programm aus. vielleicht kann ich das so umbauen, dass es auf meiner klemme funktioniert.
gruß Serge

Onkel Dagobert
14.09.2005, 16:03
Hallo Serge,


...will diese auf PT100 umprogrammieren...
Ist denn PT100 nicht die default-Einstellung? Bei der KL3202-0028 (Klimabereich) ist es auf jeden Fall so. Welche Steuerung verwendest du?

Gruß, Onkel

Anonymous
14.09.2005, 16:45
Benutze das BC 9000.
Da hast du eigentlich recht. es sei denn es baut später irgendjemand eine gebrauchtes Modul ein, das schon umgestellt ist. Muß mal überlegen, ob ich diese INITIALISIERUNG so zusagen weglasse. irgendwie funktioniert es nicht.
Gruß Serge

Onkel Dagobert
14.09.2005, 16:55
Hallo Serge,

ich hatte mir unter Step7 einen Baustein geschrieben, mit dem ich einzelne Parameter überprüfen und ggf. ändern kann. Der Ablauf ist durch eine Schrittkette realisiert. Vielleicht hilft es dir.


Das angegebene Register wird auf den angegebenen Wert überprüft und ggf.
geändert.

+
N0 Initialisierungsschritt
|
N1 Register lesen
|
N2 Antwort von Klemme + Registerinhalt
|
+------------------------------------------+
| |
N3_1 negativ N3_2 positiv
| - Codewort senden |
| - Antwort abwarten |
| |
N4 Codewort lesen |
| - Antwort abwarten |
| |
N5 Codewort ist gesetzt |
| - Schreibschutz ist aufgehoben |
| |
N6 Neuen Registerwert schreiben |
| - Antwort abwarten |
| |
N7 Codewort zurücksetzen |
| (Codewort=0) |
| |
N8 Schreibschutz prüfen |
| (Codewort lesen) |
| |
N9 Register lesen |
| - Antwort abwarten |
| |
N10 Antwort von Klemme + Registerinhalt |
| |
N11 positiv |
| |
+------------------------------------------+
|
N19 Klemme auf Prozessdatenaustausch
|
N20 ENDE



- keine Schleife !
- negatives Ergebnis bei TIME_OUT

Gruß, Onkel