Ansteuerung eines SMS Modems über TCP

tiego

Level-1
Beiträge
51
Reaktionspunkte
0
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Zuletzt bearbeitet:
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
 
Zurück
Oben