FP_SD_READ

从SD卡读取数据

此FP指令从SD卡上s1_FullFileName指定的文件中读取n_NumberOfDataToRead指定的数据数。s2_dutRead处的DUT FP_SD_READ_DUT指定读取参数。结果存储在d_Start指定的区域中。ASCII代码需要8位(1个字节)来表示1个BCD字符。转换为ASCII后,数据长度将是源数据长度的两倍。

参数

输入

s1_FullFileName (STRING)

文件名

n_NumberOfDataToRead (WORD, INT, UINT)

要读取的数据数

  • 0–65535(16位数据)

  • 0–32767(32位数据)

  • 0–1999(字符串)

输入/输出

s2_dutRead (FP_SD_READ_DUT)

读取格式、读取模式、指针位置等

输出

d_Start (ANY)

起始地址

指针模式

如果已在s2_dutRead处的FP_SD_READ_DUT中选择了指针模式(wMode=2wMode=3),则读取从指针的位置开始。读取后,指针移至读取已完成的位置。下一次的读取操作将从该位置开始。指针位置也可由DUT中的udiBytePosition指定。在下例中,箭头指示有效的指针位置:

16位INT数据(BIN格式文件):

ASCII数据(CSV格式文件):

在CSV文件中,指针始终移动到空格、逗号或换行符旁边的位置。跳过数据末尾的空格、逗号和换行符。

标注

  • 也请参阅有关SD卡访问的注意事项。

  • 在SD存储卡指令的触发器EN变为TRUE后,SD存储访问活动标志(sys_bIsSDMemoryAccessActive)变为TRUE,并保持为TRUE直到执行完成。在此期间,无法执行其他SD存储卡指令。

  • 执行指令时,SD存储访问完成标志(sys_blsSDMemoryAccessDone)为FALSE,指令完成后变为TRUE并保持TRUE

  • 在完成指令执行之前,请勿从输出区域读取数据。

  • 字符串中两个连续的双引号("")被读作一个字符(")。一个双引号本身被忽略。

  • 在CSV文件中,空字段(例如带有连续逗号的部分)被视为要读取的数据数的一部分,但不存储数据。

错误标志

sys_bIsSDMemoryAccessError(变为TRUE并保持为TRUE)
  • FALSE:指令完成且没有错误时

  • TRUE:指令完成但有错误时

  • 使用sys_iSDMemoryAccessErrorCode评估错误代码。

sys_bIsOperationErrorHold(变为TRUE并保持为TRUE)
  • 如果使用索引寄存器指定的区域超出限制。

sys_bIsOperationErrorNonHold(对于一次扫描变为TRUE)
  • 如果使用索引寄存器指定的区域超出限制。

示例

POU头

所有用于编程此函数的输入和输出变量已在POU头中声明。所有编程语言使用相同的POU头。

	VAR
		bStart: BOOL:=FALSE;
			(*activates the instruction*)
		sFile_Test_Csv: STRING[32]:='\Test.csv';
		dutFpReadTest_csv: FP_SD_READ_DUT;
		sStringRead: STRING[32]:='';
		iStringLengthRead: INT:=0;
	END_VAR

POU本体

当变量bStartFALSE变为 TRUE且系统变量sys_bIsSDMemoryAccessActive不是TRUE时,执行此函数。

LD本体

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
        ACTIVE_NETWORK := 0 ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 3 ;
        NETWORK_BODY
B(B_COMMENT,,ø^Read string ASCII data from SD card memory - ASCII value,3,0,58,3,);
L(1,0,1,3);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 4 ;
        NETWORK_BODY
B(B_CONTACT,,bStart,2,1,4,3,R);
B(B_CONTACT,,sys_bIsSDMemoryAccessActive,10,1,12,3,N);
B(B_F,E_MOVE!,,17,0,23,4,,?DEN?D?AENO?C);
B(B_VARIN,,10,15,2,17,4,);
B(B_VAROUT,,dutFpReadTest_csv.wFormat,23,2,25,4,);
L(1,2,2,2);
L(4,2,10,2);
L(12,2,17,2);
L(1,0,1,4);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 7 ;
        NETWORK_BODY
B(B_VARIN,,sFile_Test_Csv,15,3,17,5,);
B(B_VAROUT,,sStringRead,30,3,32,5,);
B(B_VARIN,,dutFpReadTest_csv,15,5,17,7,);
B(B_CONTACT,,bStart,2,1,4,3,R);
B(B_CONTACT,,sys_bIsSDMemoryAccessActive,10,1,12,3,N);
B(B_F,FP_SD_READ!,,17,1,30,7,,?DEN?Ds1_FullFileName?Dn_NumberOfDataToRead?Ds2_dutRead?As2_dutRead?AENO?Cd_Start);
B(B_VARIN,,iStringLengthRead,15,4,17,6,);
L(1,2,2,2);
L(4,2,10,2);
L(12,2,12,3);
L(12,3,17,3);
L(1,0,1,7);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

ST本体

eneral">(* Read string ASCII data from SD card memory - ASCII value *)
IF DF(bStart)And not sys_bIsSDMemoryAccessActive then
    dutFpReadTest_csv.wFormat:=10;
    FP_SD_READ(s1_FullFileName := sFile_Test_Csv,
               n_NumberOfDataToRead := iStringLengthRead,
               s2_dutRead := dutFpReadTest_csv,
               d_Start => sStringRead);
END_IF;

最后更新日期: 2024-03-07此页面上的反馈松下热线