# TwinCAT Problem



## tech007 (20 August 2010)

Hallo Freunde, 

Ich bin neu in diesem Forum sowie auch für TwinCAT. Sorry ich kann nicht Deutsch sprechen. Little bitte ich kann aber nicht gut. (Hier ich habe gebenutzt google).

Ich möchte die Daten aus dem Temperaturregler durch die Beckhoff PLC lesen. Ich bin mit EtherCAT EK1100, EL6001 und EL 9010-Module. Diese Temperatur-Controller über RS242 via EL6001 Kommunikation verbunden. 

Jetzt, als Programm Ich bin mit dem Sample_PC_COM_Port, Fast Track-Programm als Hintergrund-Kommunikation. Und  die Bibliothek ist ComLib V2 Sample programme.Below herauszufinden, das  Programm mit globalen und lokalen Variablen im Anhang. 
Das Programm ist in der SPS-Steuerung läuft ohne Fehler und auch keine in Twin CAT PLC Manager, plc ist im Betriebsmodus. Die Module sind auch die Daten austauschen. Zum  Lesen der Daten aus, die Temperaturregelung I verknüpft globale  Variablen COMin_COMport AT% IB0: PcComInData und COMout_COMport AT% AB0:  PcComOutData; jeweils an Status und Kontrolle in der SPS-Manager. Ich sehe die Daten in der SPS-Manager den Austausch in diesem Parameter sowie SPS-Steuerung in globalen Variablen. Diese Daten ist etwas anderes, das ist nicht dasselbe wie Temperaturregler. 

So  können Sie Menschen helfen mir, um herauszufinden, welche Variablen,  dass ich die Verbindung mit der EL-Modul 6001 bis die Daten aus den  Temperaturregler lesen? Es ist wirklich dringend Freunde. Es wird eine große Hilfe sein. 

Hier finden Sie das Programm in der Anlage im Word-Format. 

Vielen Dank im Voraus.


----------



## witkatz (24 August 2010)

Hier ein paar evtl. Ungereimtheiten:
- Eine EL6001 hat ein anderes Prozessabbild als eine KL6001 - man muss die richtigen Datentypen für IO-Variablen verwenden. Für eine EL6001 mit den 22 Datenbyte sollten die KL6inData22B und KL6outData22B verwendet werden.
- Die Verknüpfung von Control und Status reicht nicht aus. Die Datenbytes müssen ebenfalls verknüpft werden und zwar alle 22 Byte bei der EL6001
- Das SerialLineMode muss bei der Verwendung der EL6001 auf SERIALLINEMODE_EL6_22B eingestellt sein

Gruß,
witkatz


----------



## tech007 (21 Oktober 2010)

Hello witkatz,

Danke für dein hilfe.

Aber ich muss noch arbeiten von thise thema.

Danke.


----------



## tech007 (9 November 2010)

Ich habe die Datentypen, die Sie mir gesagt.
- Ich hatte 22 Datenbytes, KL6inData22B und KL6outData22B für EL6001 genommen.
- Auch Serial Line Modus, um die SERIALLINEMODE_EL6_22B geändert.
- Ich habe auch jeden Status und Kontrolle Bytes einzeln angeschlossen und korrekt.
- Baudrate von temperatue measurment Gerät und EL6001-Modul ist auf 9600 eingestellt.
- Parität ist auch als pro Gerät Konfiguration.
- Ich kann senden und empfangen die Zeichenfolge Zeichenfolge aber ich kann nicht lesen
  die Temperatur.

Probleme sind:

1.Can Sie mir sagen, was kann probelme im Programm sein?
2.Ich  weiß nicht, wie zu beheben Präfix und Suffix, wie ich will, um die  Temperatur vom Gerät gelesen (ich glaube, dies ist der wichtigste Teil  fehlt mir).
3.Device Information: ALMEMO 5690-2


Hier finden Sie das Programm weiter unten.
-------------------------------------------------------------------
(*==================================================================
    Call the send block every second to repeat the transmission.
    Also call the block as long as it is busy to finish a transmission.
*)

    Timer(IN:=TRUE, PT:=T#10s);

    IF Timer.Q OR Send.Busy  THEN
         (* SendString:= '$02Hello World - $03'*)

    Send(  SendString:= '$02abhi$03',
            TXbuffer:= TxBuffer2,    (* see global variables *)
            Busy=> SendBusy,
            Error=> SendErrorID);

    Timer(IN:=FALSE); (* reset timer *)
END_IF

(*==================================================================
    Receive string data 
    The block receives any data strings beginning with a STX ($02) character and 
    ending with an ETX ($03) character.    
*)
    Receive(
        Prefix:= '$02',
        Suffix:= '$03',
        Timeout:= T#10s,
        ReceivedString:= ReceivedString,
        RXbuffer:= RxBuffer2,
        StringReceived=> StringReceived,
        Busy=> ReceiveBusy,
        Error=> ReceiveErrorID,
        RxTimeout=> ReceiveTimeout );

IF StringReceived THEN

        ReceiveCounter := ReceiveCounter + 1;
        LastReceivedString := ReceivedString;

END_IF



b:= STRING_TO_BYTE('LastReceivedString');





(*==================================================================
    Background communication with EL6001 terminal *)

    COMportControl(

    Mode:= SERIALLINEMODE_EL6_22B,
         pComIn:= ADR(COMin_EL6001),            (* I/O data; see global variables *)
    pComOut:= ADR(COMout_EL6001),        (* I/O data; see global variables *)
    SizeComIn:= SIZEOF(COMin_EL6001),    (* I/O data; see global variables *)
    TxBuffer:= TxBuffer2,                (* Transmit buffer; see global variables *)
    RxBuffer:= RxBuffer2,                (* Receive buffer; see global variables *)
    Error=> COMportControlError,
    ErrorID=> COMportControlErrorID );

--------------------------------------------------------------------------
*Variables : *

    Timer: TON;
    Send: SendString;
    SendBusy: BOOL;
    SendErrorID: ComError_t;

    Receive: ReceiveString;
    ReceivedString: STRING;
    LastReceivedString: STRING;
    StringReceived: BOOL:= TRUE;  (* check with update-check with another programme-make it with TRUE *)
    ReceiveBusy: BOOL;
    ReceiveError: BOOL;
    ReceiveErrorID: ComError_t;
    ReceiveTimeout: BOOL;
    ReceiveCounter: UDINT;
         Outputs : BYTE;

    COMportControl: SerialLineControl;
    COMportControlError: BOOL;
    COMportControlErrorID: ComError_t;
    SERIALLINEMODE_EL6_22B: ComSerialLineMode_t;
-----------------------------------------------------------------
Global Variables : 

    RxBuffer2: ComBuffer;    (* Receive data buffer; used with all receive function blocks *)
    TxBuffer2: ComBuffer;    (* Transmit data buffer; used with all receive function blocks *)
         COMin_EL6001 AT %IW66 : KL6InData22B;   (*Linked with EL6001TwinCAT System Manager *)
         COMout_EL6001 AT %QW66 : KL6OutData22B;(*Linked with EL6001TwinCAT System Manager *)
-----------------------------------------------------------------

Können Sie mir helfen, es zu lösen aus? Ich bin auf dieser ziemlich lang und kein erfolgreiches Ergebnis workign. Ihre Hilfe Angelegenheit viel.

Ich danke Ihnen.


----------



## witkatz (9 November 2010)

Das Seriallinemode ist hier noch falsch eingestellt. Sie deklarieren eine Variable:

```
SERIALLINEMODE_EL6_22B: ComSerialLineMode_t;
```
Der Typ ComSerialLineMode_t ist ein ENUM, dh. die Variable SERIALLINEMODE_EL6_22B hat nach der Deklaration den Wert 0, also SERIALLINEMODE_DEFAULT! So weit ich sehen konnte wird der richtige Wert im Programm nicht zugewiesen. Das ist verwirrend und falsch.

Als schnelle Abhilfe:
Löschen bitte die Deklaration der Variablen SERIALLINEMODE_EL6_22B. Sie ist unnötig. Im Aufruf des FB können Sie den ENUM-Wert direkt verwenden, das ist besser zu lesen:

```
COMportControl(
    Mode:= SERIALLINEMODE_EL6_22B,
```

Nur so als Tip: Für die Hardware-Variablen würde ich für eine EL6001 die Datentypen EL6inData22B und EL6outData22B verwenden. Das ist zwar nicht falsch, weil die Typen identisch zu KL6inData22B und KL6outData22B sind, aber Sie müssen Ihre Software dokumentieren und nach ein paar Wochen oder Monaten immer noch lesen und verstehen können. Da stolpert man schon mal über falsche Bezeichnungen.


Was Prefix, Suffix und TimeOut angeht, da müssen Sie sich an das Übertragungsprotokoll des ALMEMO 5690-2 halten. Steht in der Dokumentation nichts dazu?


Gruß,
witkatz


----------



## tech007 (11 November 2010)

Ich habe Fehler bei der Verwendung EL6InData22B und EL6OutData22B. Der Fehler war: Undefined Typen. Aber nach diesem, sprach ich mit Local Beckhoff SPS und erkennen, dass KL6InData22B und KL6OutData22B sind mit demselben Bild. Also, nicht identisch Angelegenheit.

Bezüglich Präfix und Suffix, tatsächlich falsch sind. Ich wil ändern.

Aber noch ist dies der Probe Programm zum Senden und Empfangen der Zeichenkette. Es funktioniert gut. Hauptaufgabe ich habe, ist die Temperatur über RS 232 Mitteilung Temperatur mesurment Gerät lesen.

Also, ich für die ich nur mit String-Programm empfangen, aber es funktioniert nicht.

Ich sprach mit lokaler Unterstützung Beckhoff und sie sagten, alles in Ordnung ist. Auch ist Modul (EL 6001) Einstellung der Schnittstelle
Auch scheint korrekt zu sein. Aber ich bin nicht immer Daten. Baudrate und Zeit ist auch richtig.

Ich weiß nicht, warum kann ich nicht erkennen, Daten von Temperatur mesurment (Almemo 5690-2)?!

Ich meine auch nicht im Programm, sondern auch in Twin CAT-System-Manager Ich bin nicht immer die Daten. Das ist ganz Schock für mich.
Weil Programm nur manuplate oder Kontrolle der Daten von zwei Cat-System-Manager nicht mehr.

Auch Modul scheint auch alles in Ordnung sein.

Und  ich weiß nicht, wie zu definieren Präfix oder Suffix für das Gerät aber  wenn ich dann nicht definieren technicall es ist alles in Ordnung und
Daten kommen sollte.

Können Sie mir Anregungen oder Tipps in Bezug auf dasselbe? Oder wenn Sie Beispielprojekt auf Temperatur gelesen haben, dann kann es auch
große Hilfe.

Danke.

Programme :
Listen
Read phonetically

*Dictionary - View detailed dictionary*


---------------------------------------------------
Timer(IN:=TRUE, PT:=T#1s);

IF Timer.Q OR Receive.Busy THEN

 Receive(
        Prefix:= '*',
        Suffix:= '$0D$0A',
        Timeout:= T#1s,
                   ReceivedString:= ReceivedString,
        RXbuffer:= RxBuffer2,
        StringReceived=> StringReceived,
        Busy=> ReceiveBusy,
        Error=> ReceiveErrorID,
        RxTimeout=> ReceiveTimeout );


IF StringReceived THEN

        ReceiveCounter := ReceiveCounter + 1;
        LastReceivedString := ReceivedString;

END_IF
          Timer(IN:=FALSE); (* reset timer *)

END_IF

IF StringReceived  THEN

b:= STRING_TO_BYTE('LastReceivedString');

END_IF

(*==================================================================
    Background communication with EL6001 terminal *)

    COMportControl(

    Mode:= SERIALLINEMODE_EL6_22B,
         pComIn:= ADR(COMin_EL6001),            (* I/O data; see global variables *)
    pComOut:= ADR(COMout_EL6001),        (* I/O data; see global variables *)
    SizeComIn:= SIZEOF(COMin_EL6001),    (* I/O data; see global variables *)
    TxBuffer:= TxBuffer2,                (* Transmit buffer; see global variables *)
    RxBuffer:= RxBuffer2,                (* Receive buffer; see global variables *)
    Error=> COMportControlError,
    ErrorID=> COMportControlErrorID );
-----------------------------------------------------------------
http://www.google.com/intl/en/privacy.html


----------



## witkatz (11 November 2010)

Vielleicht sind EL6inData22B und EL6OutData22B in Ihrer Version der Library nicht deklariert. Wenn Sie eine aktuelle Version downloaden und installieren, dann ist dieser Punkt erledigt. Das ist aber nur ein Schönheitsfehler.

Wichtige Frage ist, ob die Verdrahtung in Ordnung ist





TxD (EL6001) <-> RxD (ALMEMO)
RxD (EL6001) <-> TxD (ALMEMO)
GND (EL6001) <-> GND (ALMEMO)
Wird RTS und CTS verwendet? Wenn ja, sind sie auch richtig verdrahtet?


Wenn TwinCAT PLC-Projekt in Ordnung ist und ohne Fehler übersetzt wurde:
1. PLC Control:
 Project -> rebuild all (0 Errors?!)
2. System Manager:
 PLC - Configuration -> ReScan (Path korrekt -> Rescan? sonst -> Change) (pic001.gif)
3. System Manager:
  rechtsklick auf COMin_EL6001 -> Change Link (pic002.gif)
4. System Manager:
  die komplette (!) Struktur verknüpfen (pic003.gif)
 das gleiche für COMout_EL6001
5. System Manager:
  Activate Configuration and restart
6. PLC Control:
 -> Online -> Login (das richtige Runtime System?)
 -> Online -> Run
7. System Manager:
ist die EL6001 im OP-State? (pic004.gif)
kommen irgendwelche Daten (pic005.gif)? Evtl State-Word auswerten, sind Error-Flags gesetzt? http://infosys.beckhoff.com/content/1033/el600x_el602x/html/bt_el6001_cw_sw.htm?id=5676

Was die Kommunikation zu dem Temperatur-Modul angeht, da müssen Sie sich an die Beschreibung des Gerätes halten. Das kann die Klemme EL6001 nicht wissen. Das Übertragungsprotokoll des Temperatur-Scanners geht über die reine Spezifikation von RS232 hinaus. Er spricht sozusagen seine eigene Sprache, die man implementieren muss.
- Muss man die Temperatur anfragen? Mit welchem Kommando-String? Oder wird die Temperatur immer zyklisch gesendet?
- in welchem Format wird die Temperatur gesendet? Binär oder ASCII?
- Sendet das Gerät Präfix und Suffix? Wenn ja, dann muss man dem Receive-String Baustein die richtigen Werte übergeben. Wenn nicht, dann muss man diese Parameter leer lassen und timeout richtig setzen.

Gruß,
witkatz


----------



## tech007 (23 November 2010)

Ich bekam wieder dieselbe Frage.

Nun ist endlich das Programm mit kleinen Änderungen runrining.

Ich habe Strings aus der Vorrichtung, die ich erwarte. Aber ich habe Problem, dass

Ich möchte nicht, dass ganze Reihe, aber ich will einfach nur, um die Temperatur von ihm gelesen.

Ich habe einige Funktion der Zeichenfolge, aber es ist nicht geklappt hat.

Programm finden Sie unten:

----------------------------------------------------------------------------
Timer(IN:=TRUE, PT:=T#10s);

IF Timer.Q THEN
    Receive(
               	Prefix:= '< >',
		Suffix:= '< >',
                Timeout:= T#10s,
		ReceivedString:= ReceivedString,
		RXbuffer:= RxBuffer2,
		StringReceived=> StringReceived,
		Busy=> ReceiveBusy,
		Error=> ReceiveErrorID,
		RxTimeout=> ReceiveTimeout );

IF StringReceived =TRUE  THEN

		ReceiveCounter := ReceiveCounter + 1;
		LastReceivedString := ReceivedString;


 diff_string :=  FIND ('ReceivedString','LastReceivedString');
 concen := CONCAT ('ReceivedString','LastReceivedString');
 change := MID ('LastReceivedString',6,31);

END_IF
END_IF


------------------------------------------------------------------------------
Variables :
Receive: ReceiveString;
	ReceivedString: STRING;
	LastReceivedString: STRING;
	StringReceived: BOOL;  
	ReceiveBusy: BOOL;
	ReceiveError: BOOL;
	ReceiveErrorID: ComError_t;
	ReceiveTimeout: BOOL;
	ReceiveCounter: UDINT;
-------------------------------------------------------------------------


Dies ist die varibale die Zeichenfolge aus dem Gerät ie''LastReceivedString''bekommen.
Aber wie Sie sehen können, sind MID-Funktion oder CONCAT Funktion nur actining auf dieser varible Lable nicht aktuelle Daten
aus dem Gerät.

Zum Beispiel, diff_string Variable Ergebnis sollte im Idealfall Daten diffrence von den beiden varible insted der Suche nach
dass es so diffrence der Name für beide varible nicht die eigentlichen Daten.

Ich mag die temperatue Lesung aus dem ganzen Zeichenfolgen, die Länge 81 ist zu trennen. Insten dieser,
dieser String-Funktion, wird nicht auf dieser Saite eher handeln als nur Etikett LastReceviedString.

Kannst du Ahnung, wie man herausnehmen oder Auslesen nur ausgewählte Daten aus dem gesamten String? Einige Beispiel wird eine große Hilfe sein.

Ich bin mit dem gleichen Modul wie ich vor dh EK1100, EL 6010 und EL9010 erwähnt.

Danke.


----------



## trinitaucher (24 November 2010)

Du musst wissen an welcher Stelle des Strings die Daten stehen. 

Beispiel: LastReceivedString = 'xyz45.23abc'

45.23 ist die Temperatur, 'xyz' und 'abc' sollen aus dem String entfernt werden.

Du musst wissen wie viele nicht benötigten Zeichen der String enthält. Im Beispiel beginnen die Daten ab dem 4. Zeichen. Die Länges des Datensatzes ist auch wichtig. Im Beispiel 5 Zeichen (45.23).

Dann mit MID() die Daten herausnehmen:


```
VAR
sTemp : STRING;
END_VAR
------------------------
...
sTemp := MID(LastReceivedString, 5, 4);
...
```
Ergebnis: sTemp = '45.23';


----------



## tech007 (24 November 2010)

*String Problem*

Genau. Aber das Problem ist, dass es nicht tun diese Funktion mit den aktuellen Daten aus dem Gerät.
Beispiel: LastReceivedString = 'xyz45.23abc "
Hier ist LastReceivedString variabel und es Daten "xyz45.23abc '.

Code:
----------------------
VAR
sTemp: STRING;
END_VAR
------------------------
...
sTemp: = MID (LastReceivedString, 5, 4);
...

Wenn  ich benutze diese Funktion nach obigen Beispiel ist das Problem es ist  nicht die auf den Daten aus dem Gerät, das hier ist 'xyz45.23abc "trotz  ist es auf Variablenname' LastReceivedString" handeln.

Also, was bin ich immer mit diesem Ergebnis ist, = ''tRece'' nicht ''45,23''.


----------



## trinitaucher (24 November 2010)

Was empfängst du von dem Gerät? Wie sieht der String aus?


----------



## tech007 (24 November 2010)

Ich habe String aus dem Gerät über die serielle Kommunikation. Der String ist was Daten bilden Gerät per Befehl. Ich bekomme ist Datum, Uhrzeit, Temperatur etc.

Für mich ist die Temperatur ist nur wichtig, die Ich mag zum Abschluss aus dem gesamten String.

Geräteinformationen: ALMEMO 5690-2

String ist Auslesen alle 10sec und es ist wie folgt aussehen :
<LF> <CR> 2010.11.23 .....$ 2noerror $ 3 ...:+ 21,23 'C: <ETX> .......

Wann brauche dann ich kann auch senken ganz string im private message.


----------



## trinitaucher (24 November 2010)

Du musst doch nur wissen, ab welcher Stelle im String die Temperaturwerte beginnen.
Genau die Stellen überspringst du bei der Auswertung.

Oder ist der Teil vor der Temperatur variabel?


----------



## tech007 (24 November 2010)

Ich weiß, dass die Position und wie viele Zeichen ich gern lese. Aber das Problem ist, ich in der letzten Nachricht erwähnt.

Zum Beispiel:

Code:
----------------------
VAR
sTemp: STRING;
END_VAR
------------------------
...
sTemp: = MID (LastReceivedString, 5, 4);
...
Wenn  Ich benutze this Funktion nach obigen Example ist Das Problem ist es  Nicht sterben gefallen Höhle daten Aus dem GERÄT, Das hier ist  'xyz45.23abc "Trotz ist es gefallen Befehlsname" LastReceivedString  "handeln.

Auch war bin ich mit diesem Ergebnis Immer ist, = trece nicht 45,23.

Einfach, das ist nicht get mit actual datai aber nur mit variable name. Das ist komisch. Ich versuch nocheinmal.


----------



## trinitaucher (24 November 2010)

tech007 schrieb:


> Wenn  Ich benutze this Funktion nach obigen Example ist Das Problem ist *es  Nicht sterben gefallen Höhle daten Aus dem GERÄT, Das hier ist  'xyz45.23abc "Trotz ist es gefallen Befehlsname" LastReceivedString  "handeln.*


Die Übersetzung ist für mich nicht verständlich.

Kannst du Englisch?


----------



## tech007 (24 November 2010)

Yes,i can.
Can you speak english ? Then, it will be more easy and i can give better explanation.


----------



## trinitaucher (24 November 2010)

OK, let's continue in English.

Please explain your problem in detail again.
What string do you exactly get from the device? If the position of the first character from the temperature value is always the same, then it would be easy to use MID() to take out the measured value from your data.
I tried to explain it with my example.


----------



## tech007 (24 November 2010)

I sent you private message with programme and string. And the problem i have. 

Thanks for understanding.


----------



## trinitaucher (24 November 2010)

OK, you get these kind of characters from your device?:

<LF><EX$R$N$03>S$R$ ..... <EX$R$N$03>S$R$N2$

One problem could be the "special" characters. The '$' character are control characters. String functions may not work properly on them and with LEN may not be counted.

example:

```
sString := '<LE>$R$NEXR';      (* 11 written characters *)
length := LEN('sString');         (*result =>  7 (!) *)
sString2 := MID(sString, 6, 1);   (* take 6 characters from the first one on. Result =>  '<LE>$R$N' *)
                                       (* 8 characters have been taken from string. The '$' do not count*)
```
Please let us know what is exactly in your variable "LastReceivedString" after you received data from the device?
Or make a screen shot.

Or just try it out with different kinds of strings. You have to know how the string functions work on your inputs.


----------



## tech007 (24 November 2010)

You are right. It contain the special characters. 
So, it will not count the $ kind of special character.

The device string is in LastReceivedString variable but i can't say exactly as i don't know where it's ending up:

'<LF><EX$R$N$03>s$R$NX$R$N$0F01:06:09.50 01: +021.62 øC X$R$NX$R$N$12$R$N$03EX$R$N$03>s$R$N2$R$NERROR$R$NX$R$N$0F01'

To check more on this, i attach another string, then i got 
result like this (combination of two diffrent string):

'<LF><EEX$R$N$03>s$R$N2$R$NERROR$R$N<CRX$R$N$0FX$R$N23:57:54.70 01: +021.64 øC X$R$N$12$R$N$03X$R$N$03>s$R$N2$R$N'
'<LF><EX$R$N$03>X$R$N$03<CR><LF><EX$R$N$03>P18$R$NCH MEAS.VAL MAXIMUM MINIMUM AVG.VAL COUNT $R$NX'

So, i think the string is :
'<LF><EEX$R$N$03>s$R$N2$R$NERROR$R$N<CRX$R$N$0FX$R$N23:57:54.70  01: +021.64 øC X$R$N$12$R$N$03X$R$N$03>s$R$N2$R$N'

The Lenght of string is :80.
Now, the function of string are working. 

I am also not able to make stop device through command. Or i can easily fingure it out where the string is enging up. 

And this command what i am reading, first two strings data are not same. But after 3rd strings it will same. 

I tried to use string function like , MID, FIND function but this value is also changing as the string is changing always(all the strings are not same). 

Thanking you.


----------



## StructuredTrash (25 November 2010)

Looking at the received data I find lots of '$R$N' control sequences. If I remember right, this is "carriage return/line feed" which is normally used to separate strings from each other when writing them to a file or printer.
I suggest to change the prefix and suffix settings in your receive FB:
Prefix:='';
Suffix:='$R$N';
Then you should get the single lines sent by the device, making it easier to understand what the device wants to tell you in general, and it should be easy to identify and separate the line which contains time and temperature value.


----------



## tech007 (26 November 2010)

I found out the solution. But what do you say is clearly right but in this device it will hang. I tried this out before.

And worst part, was struggling to stop device via PLC.

But now, i can read it. I am fetching the data and then, which data i need i filtering out. 

It was quite tricky and logical.

Thanks for your amazing support people.


----------

