ASCII数据检查
此FP指令检查是否可以使用s1_Format指定的转换方法而正确转换由s2_AsciiData指定的区域中存储的ASCII代码。
如果结果正确,系统变量sys_bIsEqual和输出d_IsValid将打开。
如果结果错误,系统变量sys_bIsEqual和输出d_IsValid将关闭。
输入
引号中设置的控制和格式字符串
存储ASCII数据的起始地址
要转换的数字量:0~65535
ASCII数据中的起始位置:0~255
输出
如果ASCII 数据包含可转换为所需格式的二进制数,则为TRUE
s1_Format:例如+%08lX
示例中的位置 |
描述 |
s1_Format |
ASCII数据 |
注释 |
|
---|---|---|---|---|---|
+ | 正(仅限十六进制数) |
'+%4X' |
'2AB' |
正方向(仅适用于说明符x、X) |
|
如果加号被省略:反(默认设置) |
'%4X' |
'B2A' |
反方向 |
||
% |
格式字符串说明符(必需) |
||||
填充格式 |
|||||
0 |
填充零 |
'%06x' |
'000100' |
宽度六个字符,十进制值,带三个前导零(不允许用于说明符i、d,必需用于说明符x、X) |
|
8 |
ASCII数据元素的宽度 |
'%06d' |
'100' |
宽度六个字符,包含三个前导空格 说明符之前的值的允许范围:
|
|
I |
双长度说明符 例如:说明符i和l = Ii -> DINT |
'+%4Id' |
'100' |
宽度四个字符,对于转换结果需要DINT或DWORD |
|
格式说明符 |
|||||
i |
INT |
'%6i' |
'-100' |
宽度六个字符,三个前导空格,带符号整数 |
|
d |
INT |
'%6d' |
'000100' |
宽度六个字符,十进制值,带三个前导零 |
|
X |
十六进制大写 |
'%4X' |
'12A' |
宽度四个字符,大写十六进制数 |
s1_Format:例如+%#12.5lxBCD
示例中的位置 |
描述 |
s1_Format |
ASCII数据 |
注释 |
|
---|---|---|---|---|---|
+ |
正(仅限十六进制数) |
'+%4X' |
'2AB' |
正方向(仅适用于说明符x、X或b) |
|
如果加号被省略:反(默认设置) |
'%4X' |
'B2A' |
反方向 |
||
% |
格式字符串说明符(必需) |
||||
填充格式 |
|||||
0 |
填充零 |
'%06d' |
'000100' |
宽度六个字符,十进制值,带三个前导零 |
|
+ |
添加加号 |
'%+4d' |
'+100' |
宽度四个字符,十进制值,+号添加 |
|
- |
左对齐 |
'%-6d' |
'100' |
宽度六个字符,十进制值,左对齐 |
|
(空格)添加空格代替加号 |
'%4d' |
'100' |
宽度四个字符,十进制值,带前导空格 |
||
# |
对十六进制数插入0x |
'%#4X' |
'0X64' |
宽度四个字符,以0X开头的十六进制格式的数值 |
|
始终对实数增加小数点 |
'%#8.0f' |
'123.' |
宽度八个字符,浮点数,四个前导空格 |
||
12 |
ASCII数据元素的宽度(带或不带逗号) |
'%012d' |
'000000000100' |
宽度12个字符,带九个前导零 |
|
无宽度:
|
'%d,' |
100, |
未指定宽度,增加逗号 |
||
小数点之后的精确度 |
|||||
.5 |
小数点之后的任何数字 |
'%8.3f' |
'123.456' |
宽度八个字符,小数点之后三个字符精确度 |
|
双长度说明符 |
|||||
I |
加倍说明符的长度 例如:说明符i和l = Ii -> DINT |
'+%4Iu' |
'100' |
宽度四个字符,对于转换结果需要DINT或DWORD |
|
格式说明符 |
|||||
i |
INT |
'%10i' |
'-100' |
宽度10个字符,六个前导空格,带符号整数 |
|
u |
UINT1) |
'%10u' |
'100' |
宽度10个字符,七个前导空格,无符号整数 |
|
d |
INT |
'%6d' |
'000100' |
宽度六个字符,十进制值,带三个前导零 |
|
x |
十六进制小写 |
'%4x' |
'12a' |
宽度四个字符,小写十六进制数 |
|
X |
十六进制大写1) |
'%4X' |
'12A' |
宽度四个字符,大写十六进制数 |
|
b |
BCD |
'%5b' |
'123' |
宽度五个字符,BCD数据 |
|
f |
浮点 |
'%-6.2f' |
'1.23' |
宽度六个字符,左对齐,精确到小数点之后的两位数字 |
|
e |
指数1.23e10 |
'%9.3e' |
'1.235e+03' |
宽度9个字符,精确到小数点之后的3位数字,指数小写 |
|
E |
指数大写,1.23E10 1) |
'%9.3E' |
'1.235E+03' |
宽度9个字符,精确到小数点之后的3位数字,指数大写 |
|
g |
浮点或指数1) |
'%12g' |
'1234.57' |
宽度12个字符,浮点数 |
|
G |
浮点或指数大写1) |
'%#9.3G' |
'1.E+03' |
宽度九个字符,精确到小数点之后的三个字符 |
|
|
'%8dPANA' |
'100PANA' |
宽度八个字符,十进制数,增加'PANA' |
1) FP指令FP_ASCII_TO_BIN和FP_ASCII_CHECK不区分大小写
如果由sFormat指定的控制字符串中有错误。
当格式为十进制时,如果在sFormat中指定正方向(+)。
当由s1_Format指定十六进制格式时,如果由n_Conversions指定的每个转换单元的ASCII字符数超过4(对于16位数据)或8(对于32位数据)。
如果在n_Conversions中对要转换的16位或32位(1或2个字)单元数指定0。
如果由n_Conversions指定的要转换的16位或32位十进制数的数量超过存储ASCII数据的区域。
如果转换结果超过区域。
如果由sFormat指定的控制字符串中有错误。
当格式为十进制时,如果在sFormat中指定正方向(+)。
当由s1_Format指定十六进制格式时,如果由n_Conversions指定的每个转换单元的ASCII字符数超过4(对于16位数据)或8(对于32位数据)。
如果在n_Conversions中对要转换的16位或32位(1或2个字)单元数指定0。
如果由n_Conversions指定的要转换的16位或32位十进制数的数量超过存储ASCII数据的区域。
如果转换结果超过区域。
所有用于编程此函数的输入和输出变量已在POU头中声明。 所有编程语言使用相同的POU头。
VAR
bStart: BOOL:=FALSE;
sExample1: STRING[32]:='*1234,5678,';
bIsAsciiValid: BOOL:=FALSE;
END_VAR
当bStart设置为TRUE时,如果格式字符串为'%d',指令检查s2_AsciiData处连接的数据是否可以转换为十进制数据。
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;