Internet PLC Forum
General => Technical support => Topic started by: gstavaris on January 31, 2007, 05:03:48 AM
-
Hi support
I am trying to use MDS100 with labview programming enviroment.
MDS100 is working fine without sending address prefix "@F0"
How can I bypass FCS code? or how can I calculate myself FCS code?
I have try to sent the following command but it does not working
@F0?P0101hello world 00* + carriage return
I found somewhere that 00* is wildcard for FCS is that right?
thanks a lot
giannis
-
wildcard FCS is supported on all the PLC, but may not be implemented on MDS100.
You can calculate FCS by following the C or VBASIC examples. The C examples can be found on the PLC's user manual:
http://www.tri-plc.com/MD-man.pdf
For VB6 example, please check:
http://www.tri-plc.com/applications/VBsample.htm
-
Note that in calculating the FCS and converting to ASCI, the symbols :, ;, <, etc. between the digit "9" and character "A" are not used. need to check if number is between 58 and 64 decimal, then add 7 (think thats the number).
-
The FCS is computed on the ASCII code, not binary number. So all characters from '@' till the last character before the FCS and '*' are invovled in the FCS XOR computation.
-
I'll disagree, here's the "C" code that accepts the PLC FCS and has
for ( j = 1; ( j <= k ) ; j++)
{
result ^= ReadArray[j]; //XOR operation
}
fcs_high = 48 +(result>> 4);
/*If it's more than "9" then make it Alpha*/
if (fcs_high > 57) fcs_high = fcs_high + 7;
fcs_low = 48 + (result & 0b00001111);
/*If it's more than "9" then make it Alpha*/
if (fcs_high > 57) fcs_high = fcs_high + 7;
and here's the code that calculates the FCS that is accepted by the PLC
for ( j = 1; (ReadArray[j] == 0 ) || ( j <= 18 ) ; j++)
{
result ^= ReadArray[j]; //XOR operation
}
fcs_high = 48 +(result >> 4);
/*If it's more than "9" then make it Alpha*/
if (fcs_high > 57) fcs_high = fcs_high + 7;
fcs_low = 48 + (result & 0b00001111);
//If it's more than "9" then make it Alpha
if (fcs_low > 57) fcs_low = fcs_low + 7;
ReadArray[19] = fcs_high; // Bit 19 - FCS high digit
ReadArray[20] = fcs_low; // Bit 20 - FCS low digit
Both have been working well for some months now.
It wasn't until I added a PC into the RS-485 to monitor what was being sent from the PLC and not accepted by the PIC on the other end, and then using TLSERVER FCS calculator that I saw what was happening. The example in the manual happens to use a data string that calculates to a FCS that the digits are 9 or less. This convention is used by other equipment also.
-
Well, the FCS is computed from XOR'ing all the characters involved which is what's shown in your routine too.
However, the computed FCS result is a 8 bit binary number which need to be converted into two ASCII characters (00 to FF) to represent the number. An example routine is shown below as htoa2() function.
/*------------------------------------------------------------------------*/
/* convert the number "value" into a x-byte ASCII characters to */
/* represent the value in Hex code */
/*------------------------------------------------------------------------*/
int htoax(long value, unsigned char *string, unsigned char digit)
{
register int temp;
register unsigned char i;
for (i=0;i<digit;i++) { /* No of digit to represent variable */
temp = value % 16; /* compiler only supports 16-bit logical AND */
if (temp < 0) temp += 16;
if (temp < 10) string[digit-1-i]=temp+0x30;
else string[digit-1-i]=temp+0x37;
value = value>>4;
}
return(1);
}
/*-----------------------------------------------------------------------*/
int htoa4(unsigned int value, char *string)
{
htoax(value, string, 4);
}
/*-----------------------------------------------------------------------*/
int htoa2(unsigned char value, unsigned char *string)
{
htoax(value, string, 2);
}
-
We are in agreement now, the factor of 7 to jump over the symbols is there. :) The example in the manual should be adjusted to reflect that the non-alpha-numeric symbols are not used. I spent considerable time on this issue, not knowing whether it was an issue with RS-485 (first time user), programming the PLC, hardware or software of the PIC embedded system.