FP_ASCII_CHECK

ASCII数据检查

此FP指令检查是否可以使用s1_Format指定的转换方法而正确转换由s2_AsciiData指定的区域中存储的ASCII代码。

  • 如果结果正确,系统变量sys_bIsEqual和输出d_IsValid将打开。

  • 如果结果错误,系统变量sys_bIsEqual和输出d_IsValid将关闭。

注释

FP指令FP_ASCII_TO_BINFP_ASCII_CHECK不区分大小写

参数

输入

s1_Format (STRING)

引号中设置的控制和格式字符串

s2_AsciiData (BOOL, INT, UINT, WORD, DINT, UDINT, DWORD, REAL, DATE, TOD, DT, STRING)

存储ASCII数据的起始地址

n_Conversions (WORD, INT, UINT)

要转换的数字量:0~65535

n_AsciiDataStartPosition (INT)

ASCII数据中的起始位置:0~255

输出

d_IsValid (BOOL)

如果ASCII 数据包含可转换为所需格式的二进制数,则为TRUE

控制代码s1_Format的每个数字的说明:

控制代码中的位置

描述

s1_Format

16位PLC

32位PLC

转换方向

     

+

正向(仅适用于带有说明符xX的十六进制数字)

'+%4X'

如果加号被省略:反(默认设置)

'%4X'

%

格式字符串说明符(必需)

 

填充格式

     

0

填充零

'%06x'

-

+

添加加号

'%+4d'

-

-

左对齐

'%-6d'

-

˽

(空格)添加空格代替加号

'%˽4d'

-

#

对十六进制数插入0x

'%#4X'

-

始终对实数增加小数点

'%#8.0f'

-

8

ASCII数据元素的宽度

'%08d'

无宽度

  • FP_BIN_TO_ASCII:假定需要最小宽度

  • FP_ASCII_TO_BINFP_ASCII_CHECK:需要逗号分隔符

'%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'

-

  • 对于FP_BIN_TO_ASCII:任何字符串均可增加到转换,例如'PANA'

  • 对于FP_ASCII_TO_BINFP_ASCII_CHECK:仅允许使用逗号

'+%8dPANA'

-

适用于16位/32位PLC

控制字符串s1_Format的示例

  • 示例:'+%4X'将二进制值以正方向转换为宽度为四个字符的大写值(适用于16位/32位PLC)

    本例的有效ASCII数据:'˽12A'

  • 示例:'%4X'将二进制值以反方向转换为宽度为四个字符的大写值(适用于16位/32位PLC)

    本例的有效ASCII数据: '˽B2A'

  • 示例:'%06d'将二进制值转换为宽度为六个字符、十进制值、带三个前导零的值(适用于32位PLC)

    本例的有效ASCII数据: '000100'

  • 示例:'%+4d'将二进制值转换为宽度为四个字符、十进制值、添加+号的值(适用于32位PLC)

    本例的有效ASCII数据: '+100 ˽ ˽'

  • 示例:'%-6d'将二进制值转换为宽度为六个字符、左对齐的值(适用于32位PLC)

    本例的有效ASCII数据: '100˽ ˽ ˽'

  • 示例:'%˽4d'将二进制值转换为宽度为四个字符、带一个前导空格的值(适用于32位PLC)

    本例的有效ASCII数据: '˽100'

  • 示例:'%#8.0f'将二进制值转换为宽度为八个字符、类型为浮点数、带四个前导空格的值(适用于32位PLC)

    本例的有效ASCII数据: '˽ ˽ ˽ ˽123.'

  • 示例:'%8.3f'将二进制值转换为宽度为八个字符、精确到小数点之后三个字符的值(适用于32位PLC)

    本例的有效ASCII数据: '˽123.456'

  • 示例:'+%10u'将二进制值转换为宽度为10个字符、带七个前导空格、格式为无符号整数的值(适用于32位PLC)

    本例的有效ASCII数据: '˽ ˽ ˽ ˽ ˽ ˽ ˽100'

  • 示例:'%06d'将二进制值转换为宽度为六个字符、带三个前导空格的值(适用于16位/32位PLC)

    本例的有效ASCII数据: '˽ ˽ ˽100'

    说明符之前的值的允许范围:

    '˽ ˽ ˽ ˽ ˽100PANA'

    如果未指定宽度,则增加逗号,例如'%d,' (适用于32位PLC)

    本例的有效ASCII数据: '100,'

    • FP_BIN_TO_ASCII:假定需要最小宽度

    • FP_ASCII_TO_BINFP_ASCII_CHECK:需要逗号分隔符

  • 示例:'+%4ld'将二进制值转换为宽度为四个字符的值,转换结果需要DINTDWORD(适用于16位/32位PLC)

    本例的有效ASCII数据: '˽100'

  • 示例: '+%6i'将二进制值以正方向转换为宽度为六个字符、带三个前导空格、格式为有符号整数的值 (适用于16位/32位PLC)

    本例的有效ASCII数据: '˽ ˽ ˽-100'

  • 示例:'+%6d'将二进制值以正方向转换为宽度为六个字符、带三个前导零的值(适用于16位/32位PLC)

    本例的有效ASCII数据: '000100'

  • 示例:'+%4X'将二进制值以正方向转换为宽度为四个字符、十六进制的大写值(适用于16位/32位PLC)

    本例的有效ASCII数据: '˽12A'

  • 示例:'+%5b'将二进制值转换为宽度为五个字符、类型为BCD数据的值(适用于32位PLC)

    本例的有效ASCII数据: '˽123'

  • 示例:'+%-6.2f'将二进制值转换为宽度为六个字符、左对齐、精确到小数点之后两位数字的值(适用于32位PLC)

    本例的有效ASCII数据: '1.23˽'

  • 示例:'+%9.3e'将二进制值转换为宽度为9个字符、精确到小数点之后的3位数字、指数小写的值(适用于32位PLC)

    本例的有效ASCII数据: '1.235e+03'

  • 示例:'1.235E+03'将二进制值转换为宽度为9个字符、精确到小数点之后的3位数字、指数大写的值(适用于32位PLC)

    本例的有效ASCII数据: '1.235E+03'

  • 示例:'+%12g'将二进制值转换为宽度为12个字符、类型为浮点数的值(适用于32位PLC)

    本例的有效ASCII数据: '˽ ˽ ˽ ˽ ˽1234.57'

  • 示例:'+%9.3G'将二进制值转换为宽度为九个字符、精确到小数点之后的三个字符、类型为浮点数、指数大写的值(适用于32位PLC)

    本例的有效ASCII数据: '˽ ˽ ˽1.E+03'

  • 对于FP_BIN_TO_ASCII:任何字符串可增加到转换

    示例:'+%8dPANA'将二进制值转换为宽度为八个字符、十进制、增加'PANA'的值(适用于32位PLC)

    本例的有效ASCII数据: '˽ ˽ ˽ ˽ ˽100PANA'

错误标志

sys_bIsOperationErrorHold(变为TRUE并保持为TRUE)
  • 如果由sFormat指定的控制字符串中有错误。

  • 当格式为十进制时,如果在sFormat中指定正方向(+)。

  • 当由s1_Format指定十六进制格式时,如果由n_Conversions指定的每个转换单元的ASCII字符数超过4(对于16位数据)或8(对于32位数据)。

  • 如果在n_Conversions中对要转换的16位或32位(1或2个字)单元数指定0。

  • 如果由n_Conversions指定的要转换的16位或32位十进制数的数量超过存储ASCII数据的区域。

  • 如果转换结果超过区域。

sys_bIsOperationErrorNonHold(对于一次扫描变为TRUE)
  • 如果由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头中声明。 所有编程语言使用相同的POU头。

	VAR
		bStart: BOOL:=FALSE;
		sExample1: STRING[32]:='*1234,5678,';
		bIsAsciiValid: BOOL:=FALSE;
	END_VAR

POU本体

bStart设置为TRUE时,如果格式字符串为'%d',指令检查s2_AsciiData处连接的数据是否可以转换为十进制数据。

LD本体

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

ST本体

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;

最后更新日期: 2025-01-10此页面上的反馈松下热线