Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 4 von 4

Thema: Ansteuerung eines SMS Modems über TCP

  1. #1
    Registriert seit
    04.09.2012
    Beiträge
    38
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Guten Tag,

    Ich müsste ein SMS Modem über TCP IP von einem Wago 750-841 Ansteuern.

    der String der zu übertragen wäre ist folgendermaßen aufgebaut:
    Username#Password#105#01;Callnumber;Message:

    mein Ansatz war den Funktionsblock von Wago "Ethernet_Client" zu verwendet.
    leider schaffe ich es aber nicht den String von oben in ein Array[1...1500] of Byte umzuwandeln.

    Kann mir jemand bitte weiterhelfen.


    Danke
    Zitieren Zitieren Ansteuerung eines SMS Modems über TCP  

  2. #2
    Registriert seit
    11.07.2004
    Beiträge
    1.597
    Danke
    10
    Erhielt 213 Danke für 183 Beiträge

    Standard

    Variablen:
    Code:
        Sendestring: STRING;
        ZielArray: ARRAY [1..1500] OF BYTE;
        i: DINT;
        pString:    POINTER TO STRING;
        pAbs: POINTER TO BYTE;
    Code:
    Code:
        pString:=ADR(Sendestring);
    
        FOR i := 1 TO LEN(Sendestring) DO
            pAbs:= pString+ i-1;
            ZielArray[i]:=pAbs^;
        END_FOR
    Alternativ in der Bibliotheksverwaltung die SysLibMem.lib einbinden und dann SysMemCpy benutzen

  3. #3
    tiego ist offline Benutzer
    Themenstarter
    Registriert seit
    04.09.2012
    Beiträge
    38
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke.

    ich komme damit aber leider nicht ganz klar.

    Code:
        pString:=ADR(MESSAGE);
    
        FOR i := 1 TO LEN(MESSAGE) DO
            pAbs:= pString+ i-1;
            ZielArray[i]:=pAbs^;
        END_FOR
    Message ist der String den ich eingebe;
    ZielArray wäre die ausgabe die ich in "POINTER TO ARRAY[1..1500] OF BYTE;" erhalten müsste.

    wie wandle ich das so um das ich ein "POINTER TO ARRAY[1..1500] OF BYTE;" erhalte?
    der Baustein "ETHERNET_WRITE" benötigt dies aber.

    "ich habe die Zielarray mit "ADR" auf die POINTER TO ARRAY gesetzt und nun läufts.

    nun habe ich aber eine weitere bitte bzw. frage:
    ich müsste ein

    TYPE typEthernet_BUFFER :
    STRUCT
    Index : INT;
    Data : ARRAY[1..1500] OF BYTE;
    END_STRUCT
    END_TYPE

    in Strings umwandeln.

    der Aufbau sollte folgendermaßen sein:

    Index 1 = String Index 1
    Data (Index 1) = String Daten Index 1

    Index 2 = String Index 2
    Data (Index 2) = String Daten Index 2

    Index 3 = String Index 3
    Data (Index 3) = String Daten Index 3

    Leider habe ich keinen Plan wie man so etwas löst.

    danke für eure Hilfen.
    Geändert von tiego (28.03.2013 um 18:15 Uhr)

  4. #4
    tiego ist offline Benutzer
    Themenstarter
    Registriert seit
    04.09.2012
    Beiträge
    38
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    jetzt melde ich mich nochmals.
    den SMS Modem kann man auch den Befehl zum Abrufen von SMS zusenden.

    dazu müsste man dem Modem "READ/ALL" Schicken.
    das ist ja kein Problem aber ich erhalte im "utRECEIVE_BUFFER" des Ethernet_Client keine werte.

    macht der FB Ethernet_Client nicht die Funktion erst senden danach auf etwas zu empfangen warten und dies in dem "utRECEIVE_BUFFER" Schreiben?

    FB Ethernet_Client


    Code:
    IF xOpen_Client THEN
    
        CASE Status OF
            0:(*Initialize functionblocks*)
                GetConfig(EN:=FALSE );
                GetConfig(EN:=TRUE );
                status:=1;
                utERROR:=0;
                wSocket:=0;
                closeState:=0;
                xCLIENT_OPEN:=FALSE;
    
                IF xTCP_PROTOCOL THEN
                    Protocol        := IPPROTO_TCP; (*TCP*)
                    ProtocolType    := SOCK_STREAM;
                ELSE
                    Protocol        := IPPROTO_UDP;(*UDP*)
                    ProtocolType    := SOCK_DGRAM;
                END_IF
    
            1:(*check ethernet stack*)
                GetConfig(EN:=TRUE );
                IF GetConfig.ENO THEN
                    IF GetConfig.IP_ADR<>0 THEN
                        status:=4;(*stack initialized*)
                    ELSE
                        status:=0;(*try again*)
                    END_IF
                END_IF
    
    
            4:(*open connection*)
                MyEthernetRead(    EN:= 0, SOCKET:=0 ,  DATA:=EthernetBuffer );
                MyEthernetClose(EN:= 0);
                MyEthernetOpen(EN:=0);
    
                MyEthernetOpen(EN:=1 , TYP:=ProtocolType     , PROTO:=Protocol , IP_ADR:= IP_ADDRESS(sIP), PORT:=wPort );
    
                status:=5;
    
            5:(*wait for server response according to client  request to open the connection*)
                MyEthernetOpen(EN:=1, TYP:=ProtocolType, PROTO:=Protocol, IP_ADR:= IP_ADDRESS(sIP), PORT:=wPort );
                IF  MyEthernetOpen.ENO = 1 THEN
                    IF MyEthernetOpen.ERROR = 0 THEN
                        Status  := 10; (*socket available*)
                        xCLIENT_OPEN:=TRUE;
                        wSOCKET    :=MyEthernetOpen.socket;
                    ELSE
                        Status := 0; (*no socket available, try it again *)
                    END_IF;
                    utERROR:=MyEthernetOpen.ERROR;
                END_IF
    
    
            10:(* Monitor ethernet port for new data *)
    
                 MyEthernetRead(    EN:= 1, SOCKET:=MyEthernetOpen.SOCKET ,  DATA:=EthernetBuffer );
                MyEthernetRead(    EN:= 0, SOCKET:=0 ,  DATA:=EthernetBuffer );
    
                utERROR:=MyEthernetREAD.ERROR;
                IF(MyEthernetRead.ERROR<>0) THEN  (* Error reading the socket, close it *)
                    Status:=40;
                ELSIF (MyEthernetRead.LEN_OUT <>0) THEN  (* Process the data received via the ethernet port *)
                    Status:=20;
                    ELSIF (iBytes_TO_SEND > 0 AND xSTART_SEND) THEN  (* Process the data put in the send_buffer *)
                    status:=30;
                    MyEthernetWrite(    EN:= 0 , DATA:=EthernetBuffer );
                END_IF
    
            20:    (* Copy the data received via the ethernet port to the receive buffer*)
    
                FOR i := 1 TO MyEthernetRead.LEN_OUT DO
                    utReceive_buffer.index :=(utReceive_buffer.index MOD 1500)+1;
                    utReceive_buffer.data[utReceive_buffer.index] := EthernetBuffer[i];
                END_FOR
                Status:=10;
    
            30: (* Process the data in the send buffer *)
    
                EthernetBuffer :=ptSEND_BUFFER^;
                MyEthernetWrite(    EN:= 1,SOCKET:= MyEthernetOpen.SOCKET,
                                    LEN_IN:=iBYTES_TO_SEND,DATA:=EthernetBuffer );
    
                IF MyEthernetWrite.eno THEN
                    IF(MyEthernetWrite.ERROR <>0) THEN
                        Status:=40;(* Error writing to the socket, close it *)
                    ELSE
                        Status:=10; (* Comms complete, read more data *)
                    END_IF;
                    xSTART_SEND:=FALSE;
                    utERROR:=MyEthernetWrite.ERROR;
                END_IF
    
            40:    (* Close the client *)
    
                MyEthernetClose(EN:= 1, SOCKET:= MyEthernetOpen.SOCKET);
                IF MyEthernetClose.eno THEN
                    MyEthernetClose(EN:= 0);
                    xCLIENT_OPEN:=FALSE;
                    Status := 0; (* Try to open the server again *)
                END_IF
        
        END_CASE;
    ELSE
        CASE CloseState OF
        0:
            MyEthernetClose(EN:= 0);
            MyEthernetClose(EN:= 1, SOCKET:= MyEthernetOpen.SOCKET);
            CloseState:=1;
        1:
            MyEthernetClose(EN:= 1, SOCKET:= MyEthernetOpen.SOCKET);
            IF MyEthernetClose.eno THEN
                MyEthernetClose(EN:= 0);
                CloseState:=2;
            END_IF
        2:
            Status := 0;
            utERROR:=0;
            xCLIENT_OPEN:=FALSE;
        END_CASE
    END_IF

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 12.11.2012, 09:13
  2. Ansteuerung eines SINAMICS G120 über SPS
    Von MEK69 im Forum Antriebstechnik
    Antworten: 9
    Letzter Beitrag: 20.12.2011, 15:04
  3. Antworten: 4
    Letzter Beitrag: 28.12.2010, 13:34
  4. Ansteuerung eines Stellgliedes
    Von Zoni im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 04.03.2008, 16:23
  5. Antworten: 8
    Letzter Beitrag: 31.05.2007, 08:36

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •