ASCII data check
This FP instruction checks whether the ASCII codes stored in the area specified by s2_AsciiData can be converted correctly using the conversion method specified by s1_Format.
If the results are correct, the system variable sys_bIsEqual and the output d_IsValid turns on.
If the results are incorrect, the system variable sys_bIsEqual and the output d_IsValid turns off.
Input
Control and format string set in inverted commas
Starting address for storing ASCII data
Quantity of numbers to be converted: 0–65535
Starting position in ASCII data: 0–255
Output
TRUE, if ASCII data consits of binary numbers that can be converted into the desired format
s1_Format: e.g. +%08lX
Position in the example |
Description |
s1_Format |
ASCII data |
Comment |
|
---|---|---|---|---|---|
+ | forward (only for hexadecimal numbers) |
'+%4X' |
'2AB' |
forward direction (only available with specifier x, X) |
|
if plus sign is omitted: reverse (default setting) |
'%4X' |
'B2A' |
reverse direction |
||
% |
format string specifier (mandatory) |
||||
padding format |
|||||
0 |
fill with zeros |
'%06x' |
'000100' |
width six characters, decimal value with three leading zeros (not allowed for specifier i, d, mandatory for specifier x, X) |
|
8 |
width of the ASCII data element |
'%06d' |
'100' |
width six characters with three leading spaces Permissible range for the value before the specifier:
|
|
I |
double length specifier e.g. specifier i with l = Ii -> DINT |
'+%4Id' |
'100' |
width four characters, requires DINT or DWORD for the converted result |
|
format specifier |
|||||
i |
INT |
'%6i' |
'-100' |
width six characters, three leading spaces, signed integer |
|
d |
INT |
'%6d' |
'000100' |
width six characters, decimal value with three leading zeros |
|
X |
hexadecimal upper case |
'%4X' |
'12A' |
width four characters, hexadecimal number in upper case |
s1_Format: e.g. +%#12.5lxBCD
Position in the example |
Description |
s1_Format |
ASCII data |
Comment |
|
---|---|---|---|---|---|
+ |
forward (only for hexadecimal numbers) |
'+%4X' |
'2AB' |
forward direction (only available with specifier x, X or b) |
|
if plus sign is omitted: reverse (default setting) |
'%4X' |
'B2A' |
reverse direction |
||
% |
format string specifier (mandatory) |
||||
padding format |
|||||
0 |
fill with zeros |
'%06d' |
'000100' |
width six characters, decimal value with three leading zeros |
|
+ |
add a plus sign |
'%+4d' |
'+100' |
width four characters, decimal value, + sign added |
|
- |
left alignment |
'%-6d' |
'100' |
width six characters, decimal value, left aligned |
|
(space) add a space instead of plus sign |
'%4d' |
'100' |
width four characters, decimal value with leading spaces |
||
# |
insert 0x for hexadecimal numbers |
'%#4X' |
'0X64' |
width four characters, numerical value in hexadecimal format starting with 0X |
|
append always a decimal point for real number |
'%#8.0f' |
'123.' |
width eight characters, floating-point number, four leading spaces |
||
12 |
width of the ASCII data element (with or without comma) |
'%012d' |
'000000000100' |
width 12 characters with nine leading zeros |
|
no width:
|
'%d,' |
100, |
no width is specified, comma is appended |
||
precision after decimal point |
|||||
.5 |
any digit after decimal point |
'%8.3f' |
'123.456' |
width eight characters, three characters precision after decimal point |
|
double length specifier |
|||||
I |
double the length of the specifier e.g. specifier i with l = Ii -> DINT |
'+%4Iu' |
'100' |
width four characters, requires DINT or DWORD for the converted result |
|
format specifier |
|||||
i |
INT |
'%10i' |
'-100' |
width 10 characters, six leading spaces, signed integer |
|
u |
UINT1) |
'%10u' |
'100' |
width 10 characters, seven leading spaces, unsigned integer |
|
d |
INT |
'%6d' |
'000100' |
width six characters, decimal value with three leading zeros |
|
x |
hexadecimal lower case |
'%4x' |
'12a' |
width four characters, hexadecimal number in lower case |
|
X |
hexadecimal upper case 1) |
'%4X' |
'12A' |
width four characters, hexadecimal number in upper case |
|
b |
BCD |
'%5b' |
'123' |
width five characters, BCD data |
|
f |
floating |
'%-6.2f' |
'1.23' |
width six characters, left aligned, precision two digits after decimal point |
|
e |
exponential 1.23e10 |
'%9.3e' |
'1.235e+03' |
width 9 characters, precision 3 digits after decimal point, exponential lower case |
|
E |
exponential upper case 1.23E10 1) |
'%9.3E' |
'1.235E+03' |
width 9 characters, precision 3 digits after decimal point, exponential upper case |
|
g |
floating or exponential 1) |
'%12g' |
'1234.57' |
width 12 characters, floating-point number |
|
G |
floating or exponential upper case1) |
'%#9.3G' |
'1.E+03' |
width nine characters, precision three characters after decimal point |
|
|
'%8dPANA' |
'100PANA' |
width eight characters, decimal number, 'PANA' is appended |
1) The FP instructions FP_ASCII_TO_BIN and FP_ASCII_CHECK do not differentiate between upper and lower case
if there is an error in the control string specified by sFormat.
if forward direction (+) is specified in sFormat when the format is decimal.
if the number of ASCII characters per converted unit specified by n_Conversions exceeds 4 for 16-bit data or 8 for 32-bit data when hexadecimal format is specified by s1_Format.
if 0 is specified for the no. of 16- or 32-bit (1- or 2-word) units to be converted in n_Conversions.
if the number of 16- or 32-bit decimal numbers to be converted specified by n_Conversions exceeds the area for storing ASCII data.
if the converted result exceeds the area.
if there is an error in the control string specified by sFormat.
if forward direction (+) is specified in sFormat when the format is decimal.
if the number of ASCII characters per converted unit specified by n_Conversions exceeds 4 for 16-bit data or 8 for 32-bit data when hexadecimal format is specified by s1_Format.
if 0 is specified for the no. of 16- or 32-bit (1- or 2-word) units to be converted in n_Conversions.
if the number of 16- or 32-bit decimal numbers to be converted specified by n_Conversions exceeds the area for storing ASCII data.
if the converted result exceeds the area.
All input and output variables used for programming this function have been declared in the POU header. The same POU header is used for all programming languages.
VAR
bStart: BOOL:=FALSE;
sExample1: STRING[32]:='*1234,5678,';
bIsAsciiValid: BOOL:=FALSE;
END_VAR
When bStart is set to TRUE, the instruction checks whether the data connected at s2_AsciiData can be converted to decimal data when the format string is '%d'.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 8 ;
NETWORK_BODY
B(B_VARIN,,'%d~',26,2,28,4,);
B(B_VARIN,,2,26,4,28,6,);
B(B_VARIN,,1,26,5,28,7,);
B(B_F,Adr_Of_VarOffs_I!,,14,2,23,6,,?D@'Var'?DOffs?CAdr);
B(B_VARIN,,sExample1,12,3,14,5,);
B(B_VARIN,,2,12,4,14,6,);
B(B_VAROUT,,bIsAsciiValid,41,2,43,4,);
B(B_F,FP_ASCII_CHECK!,,28,0,41,7,,?DEN?hs1_Format?ds2_AsciiData?dn_Conversions?dn_AsciiDataStartPosition?AENO?cd_IsValid);
B(B_CONTACT,,bStart,5,1,7,3,);
L(23,4,28,4);
L(1,2,5,2);
L(7,2,28,2);
L(1,0,1,8);
END_NETWORK_BODY
END_NET_WORK
END_BODY
If (bStart) then
FP_ASCII_CHECK(s1_Format := '%d,',
s2_AsciiData := Adr_Of_VarOffs(Var := sExample1, Offs := 2),
n_Conversions := 2,
n_AsciiDataStartPosition := 1,
d_IsValid => bIsAsciiValid);
End_if;