从SD卡读取数据
此FP指令从SD卡上s1_FullFileName指定的文件中读取n_NumberOfDataToRead指定的数据数。s2_dutRead处的DUT FP_SD_READ_DUT指定读取参数。结果存储在d_Start指定的区域中。ASCII代码需要8位(1个字节)来表示1个BCD字符。转换为ASCII后,数据长度将是源数据长度的两倍。
输入
文件名
要读取的数据数
值:
0–65535(16位数据)
0–32767(32位数据)
0–1999(字符串)
输入/输出
读取格式、读取模式、指针位置等
输出
起始地址
如果已在s2_dutRead处的FP_SD_READ_DUT中选择了指针模式(wMode=2或wMode=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文件中,空字段(例如带有连续逗号的部分)被视为要读取的数据数的一部分,但不存储数据。
FALSE:指令完成且没有错误时
TRUE:指令完成但有错误时
使用sys_iSDMemoryAccessErrorCode评估错误代码。
如果使用索引寄存器指定的区域超出限制。
如果使用索引寄存器指定的区域超出限制。
所有用于编程此函数的输入和输出变量已在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
当变量bStart从FALSE变为 TRUE且系统变量sys_bIsSDMemoryAccessActive不是TRUE时,执行此函数。
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
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;