二进制 -> ASCII转换
此FP指令将s2_BinaryData指定的区域中存储的16位/32位二进制数据转换为ASCII代码。转换方法由s1_Format的控制字符串指定。转换结果存储在d_AsciiData指定的区域中。
输入
引号中设置的控制和格式字符串
存储二进制数据的起始地址
要转换的数字量:0~65535
ASCII数据中的起始位置:0~255
输出
存储ASCII数据的起始地址
控制代码中的位置 |
描述 |
s1_Format |
16位PLC |
32位PLC |
|
---|---|---|---|---|---|
转换方向 |
|||||
+ |
正向(仅适用于带有说明符x、X的十六进制数字) |
'+%4X' |
● |
● |
|
如果加号被省略:反(默认设置) |
'%4X' |
● |
● |
||
% |
格式字符串说明符(必需) |
● |
● |
||
填充格式 |
|||||
0 |
填充零 |
'%06x' |
- |
● |
|
+ |
添加加号 |
'%+4d' |
- |
● |
|
- |
左对齐 |
'%-6d' |
- |
● |
|
˽ |
(空格)添加空格代替加号 |
'%˽4d' |
- |
● |
|
# |
对十六进制数插入0x |
'%#4X' |
- |
● |
|
始终对实数增加小数点 |
'%#8.0f' |
- |
● |
||
8 |
ASCII数据元素的宽度 |
'%08d' |
● |
● |
|
无宽度
|
'%d,' |
- |
● |
||
小数点之后的精确度 |
|||||
.5 |
小数点之后的任何数字 |
'%8.5f' |
- |
● |
|
I |
双长度说明符 例如:说明符i和l = Ii -> DINT |
'+%4ld' |
● |
● |
|
格式说明符 |
|||||
i |
INT |
'%10i' |
● |
● |
|
u |
UINT |
'%10u' |
- |
● |
|
d |
INT |
'%6d' |
● |
● |
|
x |
十六进制小写 |
'+%4x' |
● |
● |
|
X |
十六进制大写 |
'+%4X' |
● |
● |
|
b |
BCD |
'+%5b' |
- |
● |
|
f |
浮点数 |
'+%-6.2f' |
- |
● |
|
e |
指数1.23e10 |
'+%9.3e' |
- |
● |
|
E |
指数大写,1.23E10 |
'+%9.3E' |
- |
● |
|
g |
浮点或指数 |
'+%12g' |
- |
● |
|
G |
浮点或指数大写 |
'+%9.3G' |
- |
● |
|
|
'+%8dPANA' |
- |
● |
● 适用于16位/32位PLC
示例:'+%4X'
将二进制值以正方向转换为宽度为四个字符的大写值(适用于16位/32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
16#12A |
'˽12A' |
示例:'%4X'
将二进制值以反方向转换为宽度为四个字符的大写值(适用于16位/32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
16#B2A |
'˽B2A' |
示例:'%06d'
将二进制值转换为宽度为六个字符、十进制值、带三个前导零的值(适用于32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
16#100 |
'000100' |
示例:'%+4d'
将二进制值转换为宽度为四个字符、十进制值、添加+号的值(适用于32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
100 |
'+100 ˽ ˽' |
示例:'%-6d'
将二进制值转换为宽度为六个字符、左对齐的值(适用于32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
100 |
'100˽ ˽ ˽' |
示例:'%˽4d'
将二进制值转换为宽度为四个字符、带一个前导空格的值(适用于32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
100 |
'˽100' |
示例:'%#8.0f'
将二进制值转换为宽度为八个字符、类型为浮点数、带四个前导空格的值(适用于32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
123.45678 |
'˽ ˽ ˽ ˽123.' |
示例:'%8.3f'
将二进制值转换为宽度为八个字符、精确到小数点之后三个字符的值(适用于32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
123.45599 |
'˽123.456' |
示例:'+%10u'
将二进制值转换为宽度为10个字符、带七个前导空格、格式为无符号整数的值(适用于32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
-100 |
'˽ ˽ ˽ ˽ ˽ ˽ ˽100' |
示例:'%06d'
将二进制值转换为宽度为六个字符、带三个前导空格的值(适用于16位/32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
100 |
'˽ ˽ ˽100' |
说明符之前的值的允许范围:
说明符d、ld、i、li之前,1–15 |
说明符X之前,1–4 |
说明符lX之前,1–8 |
如果未指定宽度,则增加逗号,例如'%d,'
(适用于32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
100 |
'100,' |
FP_BIN_TO_ASCII:假定需要最小宽度
FP_ASCII_TO_BIN和FP_ASCII_CHECK:需要逗号分隔符
示例:'+%4ld'
将二进制值转换为宽度为四个字符的值,转换结果需要DINT或DWORD(适用于16位/32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
100 |
'˽100' |
示例: '+%6i'
将二进制值以正方向转换为宽度为六个字符、带三个前导空格、格式为有符号整数的值 (适用于16位/32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
-100 |
'˽ ˽ ˽-100' |
示例:'+%6d'
将二进制值以正方向转换为宽度为六个字符、带三个前导零的值(适用于16位/32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
100 |
'000100' |
示例:'+%4X'
将二进制值以正方向转换为宽度为四个字符、十六进制的大写值(适用于16位/32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
16#12A |
'˽12A' |
示例:'+%5b'
将二进制值转换为宽度为五个字符、类型为BCD数据的值(适用于32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
16#123 |
'˽123' |
示例:'+%-6.2f'
将二进制值转换为宽度为六个字符、左对齐、精确到小数点之后两位数字的值(适用于32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
1.2345 |
'1.23˽' |
示例:'+%9.3e'
将二进制值转换为宽度为9个字符、精确到小数点之后的3位数字、指数小写的值(适用于32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
1234.5678 |
'1.235e+03' |
示例:'1.235E+03'
将二进制值转换为宽度为9个字符、精确到小数点之后的3位数字、指数大写的值(适用于32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
1234.5678 |
'1.235E+03' |
示例:'+%12g'
将二进制值转换为宽度为12个字符、类型为浮点数的值(适用于32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
1234.5678 |
'˽ ˽ ˽ ˽ ˽1234.57' |
示例:'+%9.3G'
将二进制值转换为宽度为九个字符、精确到小数点之后的三个字符、类型为浮点数、指数大写的值(适用于32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
1234 |
'˽ ˽ ˽1.E+03' |
对于FP_BIN_TO_ASCII:任何字符串可增加到转换
示例:'+%8dPANA'
将二进制值转换为宽度为八个字符、十进制、增加'PANA'的值(适用于32位PLC)
二进制数据 |
ASCII数据中的转换结果 |
---|---|
100 |
'˽ ˽ ˽ ˽ ˽100PANA' |
如果由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;
iArray1: ARRAY [0..1] OF INT:=[1234,-56];
iAscii1: ARRAY [0..4] OF WORD:=[5(16#FFFF)];
END_VAR
当变量bStart从FALSE变为TRUE时,执行此函数。它将两个16位单元转换为2 x 4十进制ASCII数据。偏移量 = 1 ASCII字符(8位)。
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 10 ;
NETWORK_BODY
B(B_VARIN,,'%4d',10,5,12,7,);
B(B_VARIN,,iArray1,10,6,12,8,);
B(B_VARIN,,2,10,7,12,9,);
B(B_VAROUT,,iAscii1,25,5,27,7,);
B(B_CONTACT,,bStart,7,4,9,6,R);
B(B_COMMENT,,Converts two 16-bit units to 2x4 decimal ASCII data. Offset = 1 ASCII character (8-bit).,5,1,38,3,);
B(B_F,FP_BIN_TO_ASCII!,,12,3,25,10,,?DEN?hs1_Format?ds2_BinaryData?dn_Conversions?dn_AsciiDataStartPosition?AENO?cd_AsciiData);
B(B_VARIN,,1,10,8,12,10,);
B(B_COMMENT,,Result iAscii1: 'x1234 -56x',28,8,41,9,);
L(9,5,12,5);
L(1,5,7,5);
L(1,0,1,10);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF DF(bStart) then
FP_BIN_TO_ASCII(s1_Format := '%4d',
s2_BinaryData := iArray1,
n_Conversions := 2,
d_AsciiData => iAscii1);
END_IF;