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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: IP_USEND und IP_URCV

  1. #11
    Registriert seit
    25.06.2008
    Ort
    Blomberg/Lippe
    Beiträge
    1.293
    Danke
    51
    Erhielt 130 Danke für 124 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Dann musst du das so ungefähr machen:
    Code:
    STRING_TO_BUF_1(REQ := ONBOARD_INPUT_BIT0, BUF_FORMAT := FALSE, BUF_OFFS := DINT#2, BUF_CNT := INT_TO_DINT(LEN(sToServer)), SRC := sToServer, BUFFER := abSendData);
    sToServer := STRING_TO_BUF_1.SRC;
    abSendData := STRING_TO_BUF_1.BUFFER;
    
    IP_USEND_1(REQ := STRING_TO_BUF_1.DONE, ID := IP_CONNECT_1.ID, SD_1 := abSendData);
    abSendData := IP_USEND_1.SD_1;
    
    
    sToServer := CONCAT(BYTE_TO_STRING(BYTE#16#1B, '%c'), 'LON');
    sToServer := CONCAT(sToServer, BYTE_TO_STRING(BYTE#16#0D, '%c'));
    Ob du jetzt Intel- oder Motorola-Format hast, weiß ich ja nicht.

    abSendData ist ein ARRAY[0..?] OF BYTE.

    In den ersten beiden Bytes musst du natürlich noch die Länge eintragen der nachfolgenden Bytes.
    Geändert von Mobi (20.05.2016 um 17:27 Uhr)
    Gruß
    Mobi


    „Das Einfache kompliziert zu machen ist alltäglich. Das Komplizierte einfach zu machen –
    das ist Kreativität“ (Charles Mingus).

  2. Folgender Benutzer sagt Danke zu Mobi für den nützlichen Beitrag:

    vmolchanov (23.05.2016)

  3. #12
    vmolchanov ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    11.09.2015
    Ort
    Bremen
    Beiträge
    13
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Daumen hoch

    Danke, Mobi!

    Da ich eine konstante Zeile übersenden will ([ESC]LON[CR]), kann ich die Konvertierung sparen (glaube ich):
    Code:
    (*bytes 05 [ESC]LON[CR]*)
    abSendData[1] := INT_TO_BYTE(0);
    abSendData[2] := INT_TO_BYTE(5);  (*Länge der Nachricht*)
    abSendData[3] := BYTE#16#1B;       (*[ESC]*)
    abSendData[4] := BYTE#16#4C;       (*L*)
    abSendData[5] := BYTE#16#4F;        (*O*)
    abSendData[6] := BYTE#16#4E;        (*N*)
    abSendData[7] := BYTE#16#0D;        (*[CR]*)
    abSendData ist ARRAY[1..7] OF BYTE.
    Leider bekomme ich den Fehler:
    0x0062 Datentyp von Sender und Empfänger sind ungleich.
    Wie kann es sein? Welches Typ? Wir senden und empfangen ja einfach Bytes!

    Zurück zu deinem Beispiel: Wenn ich noch die Länge (5 in meinem Fall) in den ersten 2 Bytes angeben soll, würde ich so vorgehen:
    Code:
    sToServer := CONCAT(BYTE_TO_STRING(BYTE#16#1B, '%c'), 'LON');
    sToServer := CONCAT(sToServer, BYTE_TO_STRING(BYTE#16#0D, '%c'));         (*sToServer hat hier den Wert "N" in der Watch-Liste. Komisch...)
    
    STRING_TO_BUF_1(REQ  := ONBOARD_INPUT_BIT0, BUF_FORMAT := FALSE, BUF_OFFS := DINT#2, BUF_CNT  := INT_TO_DINT(LEN(sToServer)), SRC := sToServer, BUFFER :=  abSendData);
    sToServer := STRING_TO_BUF_1.SRC;
    abSendData := STRING_TO_BUF_1.BUFFER;
    abSendData[0] := INT_TO_BYTE(0);
    abSendData[1] := INT_TO_BYTE(5);  (*6 macht keinen Unterschied*)
    
    IP_USEND_1(REQ := STRING_TO_BUF_1.DONE, ID := IP_CONNECT_1.ID, SD_1 := abSendData);
    abSendData := IP_USEND_1.SD_1;
    Hier: abSendData ist ARRAY[0..7] OF BYTE (2 BYTES für Länge, 5 BYTES für Massage, 1 BYTE für Null-Zeichen). Ist es richtig? Komisch, dass in der Watch-Liste die STRING Variable sToServer als nur "N" gezeigt wird. Ich hoffe, dass es nur ein Darstellungsproblem. Der Fehler ist wieder:
    0x0062 Datentyp von Sender und Empfänger sind ungleich.
    Geändert von vmolchanov (23.05.2016 um 08:24 Uhr)

  4. #13
    Registriert seit
    25.06.2008
    Ort
    Blomberg/Lippe
    Beiträge
    1.293
    Danke
    51
    Erhielt 130 Danke für 124 Beiträge

    Standard

    Ein Array beginnt immer bei 0. Also musst du bei deiner Version auch bei 0 beginnen. Und die INT_TO_BYTE(5) würde ich dann ins Index 0 machen und die INT_TO_BYTE(0) ins Index 1.
    Ein NULL-Zeichen brauchst du nicht, da du ja die Länge der Nutzdaten angibst.
    Gruß
    Mobi


    „Das Einfache kompliziert zu machen ist alltäglich. Das Komplizierte einfach zu machen –
    das ist Kreativität“ (Charles Mingus).

  5. #14
    vmolchanov ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    11.09.2015
    Ort
    Bremen
    Beiträge
    13
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Finally I have a solution for my problem: TCP/IP connection with camera (in my case Keyence SR-1000W) and data exchange (triggering the camera and receiving a scanned barcode or error message). The solution is based on FB IP_CONTROL from OSCAT-library. Unfortunately, application example from the OSCAT-documentation required debugging and some corrections, see below.

    So, the following libraries were used:
    oscat_network_121
    oscat_basic_333 (required by the former)
    The libraries and documentation are to be downloaded for free from www.oscat.de, added to the project and compiled (relative simple: right-click on the library, open as separate project, make; though, I had to do it several times before it worked). Without compilation, one receives many errors saying that types used are not known.

    Now the code:
    Code:
    (* main FB *)
    IP_CONTROL_1(IP := IP4,
                PORT := IP_C.C_PORT,
                IP_C := IP_C,
                TIME_OUT := TIME_1,
                S_BUF := S_BUF_1,
                R_BUF := R_BUF_1);
    IP_C := IP_CONTROL_1.IP_C;
    S_BUF_1 := IP_CONTROL_1.S_BUF;
    R_BUF_1 := IP_CONTROL_1.R_BUF;
    
    
    CASE state OF
    00: (* auf Freigabe warten *)
          IF bTrigger THEN
            bTrigger := FALSE;
            state := 10;
                IP_STATE := BYTE#1; (* Anmelden *)
          END_IF;
    10:    (* Warten auf Zugriffsfreigabe zum Verbindung aufbauen und Datensenden *)
          IF IP_STATE = BYTE#3 THEN    (* Zugriff erlaubt ? *)
            sOutput := '';
            sError := '';
            TIME_1 := T#5000ms;
            (* IP Datenverkehr einrichten *)
            IP_C.C_PORT := wPort;
            (* Port-Nummer eintragen *)
            IP4_DECODE_1(STR:='192.168.37.1');
            IP_C.C_IP := IP4_DECODE_1.IP4_DECODE;    (* IP eintragen *)
      (* Mode:                                                            *)
      (*  0: TCP + ACTIVE  + PORT + IP                                    *)
      (*  1: UDP + ACTIVE  + PORT + IP                                    *)
      (*  2: TCP + PASSIVE + PORT + IP                                    *)
      (*  3: UDP + PASSIVE + PORT + IP                                    *)
      (*  4: TCP + PASSIVE + PORT                                         *)
      (*  5: UDP + PASSIVE + PORT                                         *)
            IP_C.C_MODE := BYTE#00;  (*BYTE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)        
            IP_C.C_ENABLE := TRUE;     (* Verbindungsaufbau freigeben *)
            IP_C.TIME_RESET := TRUE; (* Zeitüberwachung rücksetzen *)
            IP_C.R_OBSERVE := FALSE; (* Datenempfang überwachen *)
            
            R_BUF_1.SIZE := INT_TO_UINT(0); (* Empfangslänge rücksetzen *)
            (* Sendedaten eintragen: in meinem Fall [ESC]LON[CR] *)
            S_BUF_1.BUFFER[0] := BYTE#16#1B;
            S_BUF_1.BUFFER[1] := BYTE#16#4C;
            S_BUF_1.BUFFER[2] := BYTE#16#4F;
            S_BUF_1.BUFFER[3] := BYTE#16#4E;
            S_BUF_1.BUFFER[4] := BYTE#16#0D;
            S_BUF_1.SIZE := INT_TO_UINT(5); (* Sendelänge eintragen *)
    
            timer(IN := FALSE, 
                PT := TIME_1);
        
            state := 30;
          END_IF;                    (*missed!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
    30:
        timer(IN := TRUE, 
                PT := TIME_1);
        IF timer.Q THEN
            sError := 'Timeout';
            sOutput := '';
            IP_STATE := BYTE#4;    (* Abmelden – Zugriff wieder für andere freigeben *)
               state := 00;
        END_IF;    
    
        (* Fehlerauswertung durchführen *)
        IF IP_C.ERROR <> INT_TO_DWORD(0) THEN
            sError := 'ERROR occured';
            IP_STATE := BYTE#4;    (* Abmelden – Zugriff wieder für andere freigeben *)
            state := 0;
        ELSIF S_BUF_1.SIZE = INT_TO_UINT(0) AND R_BUF_1.SIZE >= INT_TO_UINT(5) THEN    (* Empfangene Daten auswerten *)
                bConvert := TRUE;
                state := 40;
        END_IF;
    40:
        IF BUF_TO_STRING_1.DONE THEN
            IF EQ_STRING(LEFT(sOutput, 5), 'ERROR') THEN
                sOutput := '';
            END_IF;            
            bConvert := FALSE;
            IP_STATE := BYTE#4;    (* Abmelden – Zugriff wieder für andere freigeben *)
               state := 00;
        ELSIF BUF_TO_STRING_1.ERROR THEN
            sOutput := '';
            IP_STATE := BYTE#4;    (* Abmelden – Zugriff wieder für andere freigeben *)
               state := 00;
        END_IF;
    END_CASE;
    
    (* IP_FIFO Zyklisch aufrufen *)
    IP_FIFO_1(FIFO:=IP_C.FIFO,
                STATE:=IP_STATE,
                ID:=IP_ID_1);
    IP_C.FIFO:=IP_FIFO_1.FIFO;
    IP_STATE := IP_FIFO_1.STATE;
    IP_ID_1:=IP_FIFO_1.ID;
    
    BUF_TO_STRING_1(REQ:=bConvert,
                    BUF_FORMAT:=TRUE,
                    BUF_OFFS:=DINT#0,
                    BUF_CNT:=UINT_TO_DINT(R_BUF_1.SIZE),
                    BUFFER:=R_BUF_1.BUFFER,
                    DST:=sOutput);
    R_BUF_1.BUFFER := BUF_TO_STRING_1.BUFFER;
    sOutput := BUF_TO_STRING_1.DST;
    My corrections are marked bold (missing call of the main FB, missing end-if, type conversions...). I added: readable IP-address, a custom timer (the build-in timer was disabled by IP_C.R_OBSERVE := FALSE; ), and a conversion of the received barcode to a readable string. Since I hate that one should always guess the types of the variables used in examples (naming some part of variables after FB is also misleading IMHO), below is the list of my variables:
    Code:
    state    INT
    IP_C    oscat_IP_C
    wPort    WORD
    IP4    DWORD
    R_BUF_1    oscat_NETWORK_BUFFER
    S_BUF_1    oscat_NETWORK_BUFFER
    IP4_DECODE_1    IP4_DECODE
    IP_STATE    BYTE
    IP_CONTROL_1    IP_CONTROL
    FREIGABE    BOOL
    IP_FIFO_1    IP_FIFO
    IP_ID_1    BYTE
    TIME_1    TIME
    sError    STRING
    sOutput    STRING
    BUF_TO_STRING_1    BUF_TO_STRING
    bConvert    BOOL
    bTrigger    BOOL
    timer    TON
    My first week of learning PC WORX finishes here...
    Geändert von vmolchanov (24.05.2016 um 13:23 Uhr)

  6. #15
    Registriert seit
    25.06.2008
    Ort
    Blomberg/Lippe
    Beiträge
    1.293
    Danke
    51
    Erhielt 130 Danke für 124 Beiträge

    Standard

    Das alles hättest du mit den FBs aus PC Worx auch hinbekommen.
    Spricht man jetzt in Bremen neuerdings englisch oder ist dein deutsch auf einmal verschwunden?
    Gruß
    Mobi


    „Das Einfache kompliziert zu machen ist alltäglich. Das Komplizierte einfach zu machen –
    das ist Kreativität“ (Charles Mingus).

  7. #16
    vmolchanov ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    11.09.2015
    Ort
    Bremen
    Beiträge
    13
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich habe gestern 1,5 Stunden mit Phoenix Support telefoniert. Trotz aller Mühen hat es uns nicht gelungen, den Aufnahmebefehl an die Kamera zu schicken. Der Berater hat selbst entfernt alles auf neu in FBD programmiert - nix da. Ich glaube, ich könnte es letztendlich schaffen aber die Zeit brauche ich für die nächsten Aufgaben.

    Deutsch ist für mich eine Fremdsprache genauso wie Englisch. Ich habe meinen Beitrag erst auf Englisch geschrieben und wollte es dann nicht extra übersetzen. Ich glaube, ich habe hier schon einige Beiträge auf Englisch gesehen, und ich gehe davon aus, dass hier alle Englisch verstehen.

  8. #17
    Registriert seit
    25.06.2008
    Ort
    Blomberg/Lippe
    Beiträge
    1.293
    Danke
    51
    Erhielt 130 Danke für 124 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Um was für eine Kamera/Barcodereader handelt es sich? Wenn ich eine besorgt bekomme, werde ich es auf jeden Fall versuchen, auch wenn es 5 Stunden dauert. Aber bis jetzt habe ich alles hinbekommen.

    Bei den englischen Beiträgen sind meistens die gesamten Threads auf englisch. Bei 64.448 Mitglieder in diesem Forum und einer unbekannten Anzahl Gästen, kannst du davon ausgehen, dass nicht alle englisch können. Die meisten suchen bei Problemen auf deutsch und kommen dann z.B. von Google hier hin. Viele suchen auch extra auf deutsch, damit sie eventuelle Lösungen einfacher verstehen und umsetzen können. Wenn du beim nächsten Mal wieder ein Problem hast, dann mach es doch so wie der User emilg und frage gleich direkt auf englisch. Dann haben wir nicht diesen Misch-Masch.
    Gruß
    Mobi


    „Das Einfache kompliziert zu machen ist alltäglich. Das Komplizierte einfach zu machen –
    das ist Kreativität“ (Charles Mingus).

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 02.08.2008, 13:21

Stichworte

Lesezeichen

Berechtigungen

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