Applies To:
  • CitectSCADA  Confirmed in V7, but applicable to previous builds

Summary:
When CitectSCADA writes a value to a string tag using the MELSECQ driver it can be seen in the PLC that 'junk' values get written out as well.

Eg If the string "ABCDEFGHIJKLMNO" is written to a string tag, and then later the value "12345" is written to the same tag then when the value is examined in the PLC it is found to be "12345.GHIJKLMNO".

 

Solution:
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'.

 

Keywords: