BX9000: externes Gerät über RS232 steuern

Forest

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Forumsmitglieder,

ich habe mich nun auch frisch hier angemeldet, da ich mit einer Problematik nicht so richtig weiterkomme. Die Beckhoff Dokumentation bzw. im Forum hier habe ich dazu nichts direkt gefunden.

Ich arbeite seit 4 Monaten mit einem Beckhoff BX9000. Programmiert wird jetzt aktuell mit Twincat 2.11 (Build 2241).
Mein Anliegen ist es ein externes Stromnetzgerät (TopCon Quadro der Firma Regatron) mit Hilfe von RS232 zu steuern. Hierzu bietet Regatron ein LowLevel-Protocol an. Hierzu war meine Idee über einen String die benötigten Anfragen zu Senden bzw. Auszuwerten.
Ein Beispielstring wäre z.B. A5 04 E5 10 85 50 00.


Ich habe aber bereits Probleme bei der Einrichtung von der RS232-Schnittstelle. Ich wollte ein Beispiel programmieren und über die PC-Com-Schnittstelle und HTerm die gesendeten Daten auslesen:
Zunächste habe ich die TCSerialCommunication Bibliotheken installiert. Dadurch habe ich ja Zugriff auf die ComLib.
Über die Beckhoff Dokumentation BX9000de.chm habe ich dann ein Beispiel zur Seriellen Kommunikation mit Hilfe der "TcComPortBX.lbx" gefunden:

Code:
PROGRAM MAIN
VAR
(* EXAMPLE - BRIDGE between PIN 7 and 8 from X01 COM 2 Port *)
    fb_COMPortOpen_1                : FB_COMPortOpen;
    stCOMConfig_1                   : ST_COMConfig;
    hCOM                            : WORD;
    Result_R                        : INT;
    Result_W                        : INT;
    Var_M                           : ARRAY[0..9] OF BYTE:=11,22,0,33,0(6);
    Var_R                           : ARRAY[0..9] OF BYTE;
    Value                           : INT;
    Counter_V                       : BYTE; (* It is all OK, this value counts up *)
    i                               : INT;
    i_k                             : INT;
    fbTimer                         : TON;
END_VAR
 
stCOMConfig_1.cbRxBufferLen :=300;
stCOMConfig_1.cbTxBufferLen :=300;
stCOMConfig_1.dwMode :=0;
stCOMConfig_1.BaudRate :=9600;
stCOMConfig_1.eCommPort :=COM2;
stCOMConfig_1.eDataBits:=EIGHT_DATABITS;
stCOMConfig_1.eParity:=EVEN;
stCOMConfig_1.eStoppBits:=ONE_STOPPBIT;
CASE i OF
(* Open Port *)
0:  fb_COMPortOpen_1(bOpen:=TRUE , stCOMConfig:=stCOMConfig_1 );
    IF NOT fb_COMPortOpen_1.bBusy THEN
        IF NOT fb_COMPortOpen_1.bError THEN
            hCOM:=fb_COMPortOpen_1.iHandle ;
            i:=i+1;
        ELSE
            i:=100;
        END_IF
    END_IF
(* Write data*)
1:  fbTimer(IN:=FALSE);
    Result_W:=F_COMPortWrite(hCom, 4, ADR(Var_M[0]));
    IF Result_W>0 THEN
        i:=i+1;
        Var_M[2]:=Var_M[2]+1;
    ELSE
        i:=101;
    END_IF
(*Receive data*)
2:  Result_R:=F_COMPortRead(hCom, 100, ADR(Var_R[Value]));
    IF Result_R<>0 THEN
        Value:=Result_R+Value;
    END_IF
    IF Value>=4 THEN
        FOR i_k:=0 TO Value DO (*Check protocol*)
            IF Var_R[i_k-4]=11 AND Var_R[i_k-3]=22 AND Var_R[i_k-1]=33 THEN
                Counter_V:=Var_R[i_k-2];
                i:=1;
                Value:=0;
            END_IF
        END_FOR
    END_IF
    fbTimer(IN:=TRUE,PT:=t#1s); (*Watchdog receive*)
    IF fbTimer.Q THEN
        fbTimer(IN:=FALSE);
        i:=102;
    END_IF
100: ; (*ERROR open port*)
101: ; (*ERROR send data*)
102: i:=1; (*WD ERROR no data receive*)
END_CASE

Dieses lies sich auch über PLC einwandfrei übersetzen und starten. Dabei erschien auch niemals der ErrorCode i= 100, 101 oder 102.
Nur leider konnte ich über HTerm am Rechner nichts empfangen. Die Baudraten waren beide auf 9600 gesetzt.

Muss ich über den Systemmanager bei den Klemmenbelegungen noch irgendetwas ändern?
Da finde ich nur unter E/A-Geräte unter "Verschiedenes" für den BX nur "Serial Slave BC8150"
Die Beckhoff Dokumentation hilft mir nicht so richtig weiter.

Ich hoffe mir kann jemand weiterhelfen.

Mit freundlichen Grüßen,
Forest
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Lilli,

Danke für die schnelle Antwort.
Über die BX COM-Port - ComLibV2 habe ich es auch zuerst versucht gehabt. Genau über das Beispiel aus deinem Link.
Nur da gab es schon beim übersetzen 2 Fehler:
SerialLineControlADS
- Fehler 3760 (30) Fehlerhafter Initialwert
- Fehler 3760 (13) Fehlerhafter Initialwert
Dazu habe ich leider keine richtige Lösung gefunden, bzw. habe nicht verstanden wie der Initialwert zu besetzen ist.

TxD und RxD habe ich noch nicht getauscht gehabt. Muss ich mir erstmal mal nen Kabel zusammenlöten.

Gibts da nicht auch irgendwo mal ne schöne Schritt für Schritt Anweisung?

Grüße
Forest
 
Also meine Kommunikation zunächst SPS zu PC (HTerm) steht soweit :D.
Ich habe das jetzt über die ComLib gemacht:TwinCat Dokumentation/BX8000/Programmierung/Bibliotheken/ComPort
Dort habe ich auch das Beispiel aus meinem ersten Post her.

Leider komme ich gerade beim nacheinander beschreiben meiner Register nicht weiter. Meine Idee ist es:
1.Funktion/Register ansprechen
- ComPort über FB_ComPortOpen öffnen
- mit Hilfe von F_ComPortWrite die Bytes rüberschrieben (funktioniert soweit auch, dass ichs mit HTerm auslesen kann
- ComPort wieder schließen

2.Funktion/Register ansprechen
- gleiches Spiel nochmal: ComPort auf/Schreiben/ComPort zu

Ich habe nun das Problem, dass bei der 2. Funktion/Register beschreiben mein ComPort anscheinend immer noch geöffnet ist und somit das Errorflag i=100 gesetzt wird. Das Schließen des ComPorts bekomme ich aber nicht so richtig hin.
Dafür gibt’s ja den FB_ComPortClose Baustein, den ich über bClose := TRUE aktiviere und gleichzeitig das iHandle von dem FB_ComPortOpen übergebe. Leider funktioniert das bei mir nicht. Sowohl als Pointer mit ADR(fb_ComPortOpen_1.iHandle) als auch direkt über meine Variable fb_ComPortOpen_1.iHandle erhalt ich jedes mal einen Übersetzungsfehler 4025 bzw. 4000.

Ich kann auch gerne nochmal meinen aktuellen Code posten. Ansonsten bin ich für jede Hilfe Dankbar!

Viele Grüße
Forest
 
Zurück
Oben