BC8150 RS232 Kommunikation Byte-weise

peacekeeper03

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute
Ich habe mir einen BC8150 zugelegt, da er sehr Preisgünstig ist und eine Serielle schnittstelle besitzt.
Will mit dem BC ein I2C 7-Segment Display ansteuern (über ein Modem I2C - PC Modem / RS232 Interface).
Leider klappt das nicht.

Habe ein Excel Makro mit dem das sehr gut Funktioniert.
Hat jemand einen Tipp für mich wie ich die Bytes über die RS232 auf das Modem senden kann?

Es soll über die RS232 4 Byte Kommandos gesendet werden.

65dez sagt dem Modem die Zahl der Bytes nach der Slave Adresse. (Im Beispiel 2 Bytes) 112dez ist die Slave Adresse.
0dez ist das Config Register im Display Slave 119dez steht für die maximale Helligkeit (23dez für die niedrigste)

Habe kurz mit Beckhoff geschrieben, die mir sagen außer RTU und ADS kann die Schnittstelle nix.
Habe ich wirklich keine Chance diese doch sehr simple Aufgabe mit dem BC8150 zu lösen?

Lg Jörg
 

Anhänge

  • BC8150 RS232 zu 7 Segment Display auf I2C Modem.zip
    276,9 KB · Aufrufe: 8
Normalerweise braucht man die TwinCAT PLC Serial Communication Library (kostenpflichtig) für die RS232 Kommunikation, die steht ja auch als Zubehör für den BC8000 mit dabei .....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Lib wollte er mir mit dem BX8000 verkaufen.
Beckhoff meine der BC8150 kann das nicht mit der on board rs232.
Dazu brauche ich die Kl6031.

Hört sich aber etwas komisch an die 4 Kommandos nicht über die obboard Schnittstelle senden zu können.

EDIT: Hab jetzt nichmal die Beschreibung der ComLib gelesen und die unterstützt die Hardware scheinbar nicht.
Der BX8000 hat eine LIB in der er die Schnittstelle emulieren kann.
 
Zuletzt bearbeitet:
Schau doch mal in die TcSystemBCxx50, da gibt es Serial Communication interface, in der Doku wirst du dazu nichts finden, aber ein kleiner Tipp, in der BX Doku steht das und noch ein "aber", die serielle Schnittstelle ist nur einmal auf dem BC8150, du musst halt über diese programmieren und kannst sie nicht gleichzeitig für die SPS nutzen. Macht das debuggen schwer. Aber wenn du fiffig bist und nicht viele Fehler beim Programmieren machst, bekommst du das schon hin. Sonst nimm einen BX8000 der hat 2 serielle Schnittstellen damit kannst du Programmieren und gleichzeitig die andere COM Schnittstelle für die SPS nutzen.
Dann viel spass schreib mal ob du es geschafft hast ;)
 
Hi Peacekeeper

Vielleicht eine kleine "alte" beispiel...

Prog Main:
Code:
PROGRAM MAIN
VAR
(*    BC8150
    Example with 1 x KL2xx4 *)
(* programming address is for example 11. If the address switch 10 then use the PLC project the RS232 interface.
Then is it not possible to debug the PLC project. A restart is not necessay*)
    ReadSlaveAddress:ReadSlaveAddress;
    FBComOpen:FB_COMPortOpen;
    FBComClose:FB_COMPortClose;
    COMConfig: ST_COMConfig;
    iHandle: INT;
END_VAR



ReadSlaveAddress(
    bRead:=TRUE ,
    bBusy=> ,
    bError=> ,
    iErrorId=> ,
    iSlaveAdress=> );
IF NOT ReadSlaveAddress.bBusy THEN
    ReadSlaveAddress(bRead:=FALSE);
END_IF


COMConfig.BaudRate :=38400;
COMConfig.dwMode:=0;
COMConfig.eCommPort:=COM1;
COMConfig.eDataBits:=EIGHT_DATABITS;
COMConfig.eParity:=EVEN;
COMConfig.eStoppBits:=ONE_STOPPBIT;


IF ReadSlaveAddress.iSlaveAdress =10 THEN
    FBComClose(
        bClose:=FALSE);
    FBComOpen(
        bOpen:=TRUE ,
        stCOMConfig:=COMConfig ,
        bBusy=> ,
        bError=> ,
        iErrorId=> ,
        iHandle=>iHandle );
    IF NOT FBComOpen.bBusy THEN
        IF NOT FBComOpen.bError THEN
            Serial;
            OUT.0:=TRUE;
        END_IF
    END_IF
ELSE
    FBComOpen(
        bOpen:=FALSE);
    FBComClose(
        bClose:=TRUE ,
        iHandle:=iHandle ,
        bBusy=> ,
        bError=> ,
        iErrorId=> );
    IF NOT FBComClose.bBusy  THEN
        Out:=0;
    END_IF
END_IF

Readslaveaddress: die switch (normal is dass fur eine BC8150 address=11 fur ADS communication...
<> 11 is keine ADS communication... verschiedene optionen.. check manual! :ROFLMAO:

prog serial:
Code:
PROGRAM Serial
VAR
    i: INT;
    DataSend: ARRAY[0..11] OF BYTE;
    fb_Timer1: TON;
    DataRec: ARRAY[0..11] OF BYTE;
    Result: INT;
    MerkerResult: INT;
END_VAR

DataSend[0]:=11;
DataSend[1]:=55;
DataSend[2]:=11;
DataSend[3]:=11;
DataSend[4]:=11;
DataSend[11]:=16#AA;


CASE i OF
    0:    F_COMPortWrite(MAIN.iHandle ,SIZEOF (DataSend), ADR(DataSend));
        i:=1;
        fb_Timer1(IN:=FALSE);
    1:    Result:=F_COMPortRead(MAIN.iHandle, 12,ADR(DataRec)+MerkerResult);
        IF Result+MerkerResult  =12 THEN
            i:=0;
            MerkerResult:=0;
            DataSend[5]:=DataRec[5]+1;
            OUT.2:=NOT OUT.2;
        ELSE
            MerkerResult:=MerkerResult+Result;
        END_IF


        fb_Timer1(PT:=t#2s,IN:=TRUE);
        IF fb_Timer1.Q THEN
            fb_Timer1(IN:=FALSE);
            i:=0;
            DataSend[5]:=DataSend[5]+1;
            OUT.2:=NOT OUT.2;
            MerkerResult:=0;
        END_IF
END_CASE
OUT.3:=NOT OUT.3;

diese beispiel sended 6 bytes... 6de byte is eine "checksum"

gruss,
Peter
 
Zuletzt bearbeitet:
Zurück
Oben