What is happening is that there is no
actual STRING type defined in MELSECQ. Instead the
customer was using an array of INTS such as Dx[n]
(eg D600[26]). Citect actually needs to convert the data from
characters to an array of integers which is the reason why it's not
padded out.
As you can see below, Citect's string as specified to be null
terminated.
So when Citect writes out to the PLC it writes <string
converted to array of int> + null termination + characters
already in the buffer.
Citect is designed so that when it reads such a value from the
PLC such that anything after the "." will be ignored.
If a third party driver/tool is going read the value from the
PLC then either it needs to be able to 'understand' the null
termination string, or Cicode is needed to pad any write to the
string (array of ints) with white space.
For example:
//Example of a wrapper for the TagWrite Cicode function that
pads the value being written to the 'string' tag
//[NOTE]: This code has not been formally tested, and is
provided as a starting point that could be used to engineer a
workaround
INT
FUNCTION TagWritePaddedString ( STRING tag
, STRING
strValue
)
INT
returnCode =- 1 ;
INT requiredStringLength;
INT currentStringLength;
INT numCharsPadding;
INT
Counter;
STRING padding;
INT tagWriteReturnCode;
STRING fullString;
requiredStringLength = TagInfo (tag
, tag 14
);
currentStringLength = StrLength (strValue
)
;
IF requiredStringLength <> 0 THEN
strValue; strValue; strValue; strValue; strValue; ; strValue;
strValue; strValue; strValue; ; strValue; strValue; strValue; ;
strValue; strValue; ; strValue; ; strValue; strValue; strValue;
strValue; ; strValue; strValue; strValue; ; strValue; strValue; ;
strValue; ; strValue; strValue; strValue; ; strValue; strValue; ;
strValue; ; strValue; strValue; ; strValue; ; strValue; ; strValue;
strValue; strValue; strValue; ; strValue; strValue; strValue; ;
strValue; strValue; ; strValue; ; strValue; strValue; strValue; ;
strValue; strValue; ; strValue; ; strValue; strValue; ; strValue; ;
strValue; ; strValue; strValue; strValue; ; strValue; strValue; ;
strValue; ; strValue; strValue; ; strValue; ; strValue; ; strValue;
strValue; ; strValue; ; strValue; ; strValue; ; strValue; strValue;
strValue; strValue; ; strValue; strValue; strValue; ; strValue;
strValue; ; strValue; ; strValue; strValue; strValue; ; strValue;
strValue; ; strValue; ; strValue; strValue; ; strValue; ; strValue;
; strValue; strValue; strValue; ; strValue; strValue; ; strValue; ;
strValue; strValue; ; strValue; ; strValue; ; strValue; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; strValue; strValue; ;
strValue; strValue; ; strValue; ; strValue; strValue; ; strValue; ;
strValue; ; strValue; strValue; ; strValue; ; strValue; ; strValue;
; strValue; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; ; strValue; strValue; strValue; strValue; ; strValue;
strValue; strValue; ; strValue; strValue; ; strValue; ; strValue;
strValue; strValue; ; strValue; strValue; ; strValue; ; strValue;
strValue; ; strValue; ; strValue; ; strValue; strValue; strValue; ;
strValue; strValue; ; strValue; ; strValue; strValue; ; strValue; ;
strValue; ; strValue; strValue; ; strValue; ; strValue; ; strValue;
; strValue; strValue; strValue; ; strValue; strValue; ; strValue; ;
strValue; strValue; ; strValue; ; strValue; ; strValue; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; strValue; ; strValue;
; strValue; ; strValue; ; strValue; ; strValue; strValue; strValue;
; strValue; strValue; ; strValue; ; strValue; strValue; ; strValue;
; strValue; ; strValue; strValue; ; strValue; ; strValue; ;
strValue; ; strValue; strValue; ; strValue; ; strValue; ; strValue;
; strValue; ; strValue; strValue; ; strValue; ; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; strValue; strValue;
strValue; ; strValue; strValue; strValue; ; strValue; strValue; ;
strValue; ; strValue; strValue; strValue; ; strValue; strValue; ;
strValue; ; strValue; strValue; ; strValue; ; strValue; ; strValue;
strValue; strValue; ; strValue; strValue; ; strValue; ; strValue;
strValue; ; strValue; ; strValue; ; strValue; strValue; ; strValue;
; strValue; ; strValue; ; strValue; strValue; strValue; ; strValue;
strValue; ; strValue; ; strValue; strValue; ; strValue; ; strValue;
; strValue; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; strValue; ; strValue; ; strValue; ; strValue; ; strValue;
; strValue; strValue; strValue; ; strValue; strValue; ; strValue; ;
strValue; strValue; ; strValue; ; strValue; ; strValue; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; strValue; ; strValue;
; strValue; ; strValue; ; strValue; ; strValue; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; strValue; strValue; ; strValue; strValue; ; strValue; ;
strValue; strValue; ; strValue; ; strValue; ; strValue; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; strValue; ; strValue;
; strValue; ; strValue; ; strValue; ; strValue; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; strValue; ; strValue; ; strValue; ; strValue; ; strValue;
; strValue; ; strValue; ; strValue; strValue; strValue; strValue; ;
strValue; strValue; strValue; ; strValue; strValue; ; strValue; ;
strValue; strValue; strValue; ; strValue; strValue; ; strValue; ;
strValue; strValue; ; strValue; ; strValue; ; strValue; strValue;
strValue; ; strValue; strValue; ; strValue; ; strValue; strValue; ;
strValue; ; strValue; ; strValue; strValue; ; strValue; ; strValue;
; strValue; ; strValue; strValue; strValue; ; strValue; strValue; ;
strValue; ; strValue; strValue; ; strValue; ; strValue; ; strValue;
strValue; ; strValue; ; strValue; ; strValue; ; strValue; strValue;
; strValue; ; strValue; ; strValue; ; strValue; ; strValue;
strValue; strValue; ; strValue; strValue; ; strValue; ; strValue;
strValue; ; strValue; ; strValue; ; strValue; strValue; ; strValue;
; strValue; ; strValue; ; strValue; strValue; ; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; strValue; ; strValue;
; strValue; ; strValue; ; strValue; ; strValue; ; strValue;
strValue; strValue; ; strValue; strValue; ; strValue; ; strValue;
strValue; ; strValue; ; strValue; ; strValue; strValue; ; strValue;
; strValue; ; strValue; ; strValue; strValue; ; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; strValue; ; strValue;
; strValue; ; strValue; ; strValue; ; strValue; ; strValue;
strValue; ; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; ; strValue; ; strValue; strValue; strValue; ; strValue;
strValue; ; strValue; ; strValue; strValue; ; strValue; ; strValue;
; strValue; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; strValue; ; strValue; ; strValue; ; strValue; ; strValue;
; strValue; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; ; strValue; ; strValue; strValue; ; strValue; ; strValue;
; strValue; ; strValue; ; strValue; ; strValue; ; strValue;
strValue; ; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; strValue; strValue;
strValue; ; strValue; strValue; strValue; ; strValue; strValue; ;
strValue; ; strValue; strValue; strValue; ; strValue; strValue; ;
strValue; ; strValue; strValue; ; strValue; ; strValue; ; strValue;
strValue; strValue; ; strValue; strValue; ; strValue; ; strValue;
strValue; ; strValue; ; strValue; ; strValue; strValue; ; strValue;
; strValue; ; strValue; ; strValue; strValue; strValue; ; strValue;
strValue; ; strValue; ; strValue; strValue; ; strValue; ; strValue;
; strValue; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; strValue; ; strValue; ; strValue; ; strValue; ; strValue;
; strValue; strValue; strValue; ; strValue; strValue; ; strValue; ;
strValue; strValue; ; strValue; ; strValue; ; strValue; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; strValue; ; strValue;
; strValue; ; strValue; ; strValue; ; strValue; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; strValue; strValue; ; strValue; strValue; ; strValue; ;
strValue; strValue; ; strValue; ; strValue; ; strValue; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; strValue; ; strValue;
; strValue; ; strValue; ; strValue; ; strValue; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; strValue; ; strValue; ; strValue; ; strValue; ; strValue;
; strValue; ; strValue; ; strValue; strValue; strValue; ; strValue;
strValue; ; strValue; ; strValue; strValue; ; strValue; ; strValue;
; strValue; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; strValue; ; strValue; ; strValue; ; strValue; ; strValue;
; strValue; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; ; strValue; ; strValue; strValue; ; strValue; ; strValue;
; strValue; ; strValue; ; strValue; ; strValue; ; strValue;
strValue; ; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; strValue; strValue; ;
strValue; strValue; ; strValue; ; strValue; strValue; ; strValue; ;
strValue; ; strValue; strValue; ; strValue; ; strValue; ; strValue;
; strValue; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; ; strValue; strValue; ; strValue; ; strValue; ; strValue;
; strValue; ; strValue; ; strValue; strValue; ; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; strValue; ; strValue; ; strValue; ; strValue; ; strValue;
; strValue; ; strValue; ; strValue; ; strValue; strValue; ;
strValue; ; strValue; ; strValue; ; strValue; ; strValue; ;
strValue; ; strValue; ; strValue; ;
//Length of the string read
correctly
//String is shorter than
necessary, add padding here
IF currentStringLength < requiredStringLength
THEN
numCharsPadding = requiredStringLength
- currentStringLength;
FOR Counter
= 0
TO numCharsPadding - 1 DO
padding = padding + " " ;
END
//The fully padded string, which
is the original string + white space padding
fullString = strValue +
padding;
//Write the padded string to the
tag
tagWriteReturnCode = TagWrite (tag , fullString
) ;
//If something goes wrong with
the call to TagWrite then return the error code from
TagWrite
tagfullString; tagfullString;
IF tagWriteReturnCode <> 0 THEN
returnCode = tagWriteReturnCode;
END
END
tagfullString;
tag;tagfullString;
ELSE
//Length of the
string NOT read correct (probably due to incorrect tag
name)
returnCode = 30000 ; //A large value which should not overlap the normal range
of error codes that it is possible to recieve from
TagWrite
END
STRING dp
= ""
;
RETURN returnCode;
END |
[Note]: The Cicode listing above is provided as an example of
how to pad the writes out to a 'string' tag in MELSECQ. This code
has not been formally tested, and is provided 'as is'.
|