9/6/2017 10:06 AM | |
Posts: 1 Rating: (0) |
Hi, I'm using TRCV_C instruction for receiving a string value from a server. I could set up the instruction correctly but the issue is coming when I receive the string data. The received value has not the two first characters. i.e. If I send from the server 'HELLO' I just receive 'LLO' Any idea? Thanks. Juan L. ------------------------------------------------------------------------------------------ |
Last edited by: The Helping Hand at: 9/6/2017 11:05:12 AMNew subject after splitting |
|
9/6/2017 11:22 PM | |
Joined: 7/7/2010 Last visit: 9/26/2024 Posts: 15238 Rating: (2418)
|
Using all the information already provided, I recommend a few ways. 1. (Simple way but less efficient) Sort of like Smiffy's approach to set up a string to hold the received data buffer of characters (not a string, but a sequence of characters). Use that buffer and append 1 character at a time (in a loop) to the existing string, after first setting the string to '' (null or empty). This method is simple to explain, but because of the loop, wastes time. 2. Use Smiffy's approach which does require a little knowledge of s7 strings and the max length and actual length bytes in the front of the characters making up the string. This method is more technical to explain, and _can_ use a loop, but does not have to. Using the concat statement he mentioned applies to #1 above as well. 3. Use the standard Siemens approved approach. Cheat and everything just works. Set up your string like normal, but the DB it goes in must be standard (not optimized). In the TRCV, the P#DB1.DBB2 BYTE [max length of the string] is your key. If the longest valid string is never larger than say 50 bytes, you set up your string as string[50]. In your TRCV, it tells you how many bytes were received. That piece of data overwrites the actual length byte in the string as follows (per OpisOm's post and image above): DB1.DBB1 := TRCV.LEN; // SCL MOVE [from TRCV.LEN to DB1.DBB1] // LAD or FBD See attached image for screenshot of LAD version that may not work exactly for your situation but should be an example for how to do it without looping or string concatenation. It's really a nice efficient cheat. You point to the beginning of the actual data found inside the string for the receive block to start stuffing characters into (by pointing 2 bytes past the beginning of the string starting point), and then when the receive block says NDR, grab the # of characters received in the RVCD_LEN output parameter, and stuff that into the byte reserved by the string tag for the string's "actual" length. I learned this from the users on this forum when Portal was in its infancy (and crashed constantly!). It has been my go-to approach for handling string communications ever since.
|
science guy |
|
This contribution was helpful to2 thankful Users |
Follow us on