根据FMCOS 2.0手册中的描述,选择文件(SELECT)命令,有两种使用方法,分别时按文件标识符选择(P1=00)和按目录名选择(P1=04)。
其中P1=00时,表示选择当前目录下基本文件或子目录文件;P1=04时,表示选择当前目录的平级目录、当前目录的子目录。
在实际开发中笔者观察到,SELECT命令P1=00时,会存在一些手册中未描述的异常反应。
现在以FM1208-10(7K+1K M1)卡片做示范,卡片内文件结构如下:
3F00(MF)
┗1000(一级DF),目录名01 10 00 FF FF
┗1000(二进制)(无法选择,无法读取)
┗2000(二级DF),目录名02 20 00 FF FF(正常选择)
┗1001(一级DF),目录名01 10 01 FF FF
┗1000(二级DF),目录名02 10 00 FF FF(正常选择)
┗0020(二进制)(正常选择,正常读取)
┗1100(二进制)(正常选择,正常读取)
┗1100(一级DF),目录名01 11 00 FF FF
┗1100(二级DF),目录名02 11 00 FF FF(只能用目录名选择)
┗0010(二进制)(正常选择,正常读取)
┗1111(二进制)(正常选择,正常读取)
现象一:SELECT命令会无条件地选中当前DF本身
在3F00\1000中 ,执行select 1000,会选中3F00\1000本身,而不会选中3F00\1000\1000(二进制)。
在3F00\1001中,执行select 1001命令,会选中3F00\1001本身,而不会返回6A82(文件找不到)状态码。
在3F00\1100中,执行select 1100,会选中3F00\1100本身,而不会选中3F00\1100\1100(二级DF)。
现象二:如果当前DF下没有要找的文件,SELECT命令会选中与当前DF同级的其他DF
在3F00\1000中,执行select 1001,会选中3F00\1001,而不会返回6A82(文件找不到)状态码。
在3F00\1100中,执行select 1000,会选中3F00\1000,而不会返回6A82(文件找不到)状态码。
在3F00\1001中,执行select 1100,会选中3F00\1001\1100(二进制),这是正常且符合预期的表现。
现象三(正常现象):SELECT命令【不会】选中与当前DF同级的其他EF
在3F00\1100中,执行select 1111,会返回6A82(文件找不到)状态码,这是正常且符合预期的表现。
补充:
一 、子目录与父目录的文件标识符相同,可以使用目录名选择子目录。前提是子目录的目录名有别于父目录;
注意,这个特性只能在一部分卡片上实现,目前发现有的卡片不支持这个特性——这意味着子目录与父目录的文件标识符相同,子目录永远无法被选中。
二、EF与父目录的文件标识符相同,EF无法被选中。
因此,设计FMCOS文件结构时,应注意合理规划文件标识符。特别是应避免使用父目录的文件标识符、父目录平级目录的文件标识符。
新建DF时,目录名一定要起一个有意义的名字,而且所有DF的目录名不要设置为相同的。