-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathksread3.m
3493 lines (2986 loc) · 128 KB
/
ksread3.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
function [KSX, Header] = ksread3(file,dataBlockNo)
%--------------------------------------------------------------------------
%% ksread3
% 共和標準データファイルフォーマットKS2をMATLABで読み込みためのスクリプトファイルです。
%
% 使用法:
% KSX = ksread3('FileName');
% [KSX,Header] = ksread3('FileName');
% KSX = ksread3('FileName',OptNo);
% [KSX,Header] = ksread3('FileName',OptNo);
%
% 引数
% FileName ... 対象データファイル(拡張子含む:KS2 or E4A)
% E4Aファイルを指定した場合,2つ目の引数は無視されます
% OptNo(option) ... ブロックデータの読み込み番号または,KS2とE4Aファイルの同時読み込みモード
% OptNoを指定しない場合,自動的にブロック
% 番号は1になります。
% '-1'を指定した場合,'Filename'で指定した
% ファイル名と同名のE4Aファイルを同時に読み込みます
% 同名のE4Aファイルが無い場合,KS2のみ読み込みます
% 戻り値
% KSX ... 時間データ含めた抽出した集録データ。
% [M,(time)+N]の多次元配列。
% Header ... CH情報(Cell配列)
%
%
% 実行時プロンプト表示情報
% ファイルID データを集録した製品の型式です
% バージョン KS2のバージョンです
% 最大データブロック数 データのブロック数です
% 指定データブロック番号 BlockNoで指定したブロック数です
% 集録CH数 アナログCH数とデジタルCH数を足したCH数です
% 個別集録CH数 アナログCH数です
% サンプリング周波数(Hz) データ集録時のサンプリング周波数です
% データ集録数 1CH当たりの集録データ数です
%
% その他:
% いくつかのグローバル変数で処理方法が異なります。
%
%
% global g_CsvFormat; %ヘッダ情報のフォーマットの旧式・標準を切り替えます 0:旧タイプ 1:標準タイプ
% 旧タイプ:DAS-200AのVer01.05以前のCSV変換形式
% 標準タイプ:Ver01.06での新たなCSV変換形式
% global g_IndexType; %データのインデックスを切り替えます 0:時間 1:番号
% global g_StartNumber; %データのインデックスの開始番号を切り替えます 0:0始まり 1:1始まり
% global g_LanguageType; %表示言語を切り替えます 0:日本語 1:英語
%
%
% Copyright 2016 Kyowa ELECTRONIC INSTRUMENTS CO.,LTD.
% version 1.03 2016/02/19
%
% Date 13/12/25
% ver1.00 新規リリース
% CAN情報読み込みに対応
% Date 14/01/24
% ver1.01 E4Aの読み込みに対応
%
% Date 14/06/20
% ver1.02 ファイルポインタの処理を修正
% EDX-200Aで集録した際の集録開始カウンタ値がない場合の処理を追加
% float型のデータ処理を修正
% CANデータ処理のSigned型の不具合を修正
% Date 16/02/19
% ver1.03 KS2ファイルの集録開始カウンタ値の取得部を修正
% CSV標準タイプ時,E4AとKS2を同時に読み込んだ際に測定CH数がNaNになる不具合を修正
%
%
%--------------------------------------------------------------------------
% initalized variable
%
global g_NtbFlag; %測定器がNTBかを示すフラグ
global g_Ks2VerNum; %KS2のVer情報
global g_CsvFormat; %ヘッダ情報形式の旧タイプ・標準タイプを切り替えます
%0:旧タイプ 1:標準タイプ
%旧タイプ:DAS-200Aの初期保存形式
%標準タイプ:Ver01.06で追加された新たなCSV保存形式
global g_IndexType; %読み込んだ集録データ行列の先頭列に付加するデータ形式を切り替えます
%0:時間 1:番号
global g_StartNumber; %読み込んだ集録データ行列の先頭列に付加するデータの先頭の開始番号を切り替えます。
%0:0始まり 1:1始まり
global g_LanguageType; %本スクリプト実行時のコマンドプロンプト上に表示する言語を切り替えます
%0:日本語 1:英語
g_CsvFormat = 0; %旧タイプ
g_IndexType = 0; %時間
g_StartNumber = 0; %0始まり
%g_LanguageType = 0; %日本語
g_LanguageType = 1; %English
tblInfo = [];
delm = '.';
tblInfo.Error{1} = 'MATLAB:ksread3:FileName';
tblInfo.Error{2} = 'MATLAB:ksread3:Argument';
tblInfo.Error{3} = 'MATLAB:ksread3:Argument';
tblInfo.Error{11} = 'MATLAB:ksread3:FileExist';
tblInfo.Error{12} = 'MATLAB:ksread3:AbnormalBlockNo';
tblInfo.Error{13} = 'MATLAB:ksread3:AbnormalBlockNo';
tblInfo.Error{14} = 'MATLAB:ksread3:FileExtension';
tblInfo.Error{15} = 'MATLAB:ksread3:FileExist';
tblInfo.Error{16} = 'MATLAB:ksread3:MeasurementParameter';
tblInfo.Error{17} = 'MATLAB:ksread3:FileExist';
tblInfo.Error{21} = 'MATLAB:ksread3:OutOfMemory';
tblInfo.Error{22} = 'MATLAB:ksread3:Error Ocurred';
tblInfo.err.message = '';
tblInfo.err.identifier = '';
tblInfo.err.stack = [];
% MATLABのversionチェック
vers = version;
tblInfo.MATLAB_Ver = str2double(vers(1:3));
tblInfo.HeadSeek = 256; % 固定長ヘッダ部の大きさ
tblInfo.InfoSeek = 6;
tblInfo.FixCH = 16;
tblInfo.CmpExt = 'ks2';
tblInfo.CmpMachine1 = 'EDX-1500A';
tblInfo.CmpMachine2 = 'PCD-300A';
tblInfo.CmpMachine10 = 'UDAS-100A';
% ver1.01 MATLABのVer(R2008以降)によって言語切り替えが困難のため,パラメータで設定する
tblInfo.CmpLang = 'jhelp';
if g_LanguageType == 0
tblInfo.Lang = 'jhelp';
else
tblInfo.Lang = 'Dummy';
end
% (1)引数が指定されていない場合
if nargin < 1 || isempty(file)
error(makeDispMessage(1,tblInfo));
exit;
elseif nargin < 2
dataBlockNo = 1;
elseif nargin > 2
% (2)引数の数が適切でない
strMsgBuf = makeDispMessage(2,tblInfo);
error(strMsgBuf);
exit;
end
[tbls,num] = split_str(file,delm);
% (3)拡張子が無い
if num < 2
tblInfo.err = tbls;
strMsgBuf = makeDispMessage(3,tblInfo);
error(strMsgBuf);
exit;
end
tblInfo.ext = lower(tbls{2}); % 取得した拡張子
%2番目の引数が負なら
if(dataBlockNo < 0)
ReadBoth = 1;
dataBlockNo = 0;
tblInfo.dataBlockNo = dataBlockNo;
else
ReadBoth = 0;
tblInfo.dataBlockNo = dataBlockNo;
end
%拡張子がKS2なら
if(strcmpi(tblInfo.CmpExt, tblInfo.ext) == 1)
%KS2ファイルの読み込み
fid = fopen(file,'r');
% (11)ファイルが存在しない場合
if fid < 0
strMsgBuf = makeDispMessage(11,tblInfo);
error(strMsgBuf);
exit;
end
% (14)拡張子が異なる
if(strcmpi(tblInfo.CmpExt, tblInfo.ext) == 0)
strMsgBuf = makeDispMessage(14,tblInfo);
error(strMsgBuf);
exit;
end
%KS2よりテキスト情報の取得
tblInfo = getInfo(fid,tblInfo);
%ブロック番号のチェック
if isnumeric(dataBlockNo) < 1
% (13)指定されたブロックNoが数値ではない場合
strMsgBuf = makeDispMessage(13,tblInfo);
error(strMsgBuf);
exit;
else
% (12)指定されたブロックNoが不正な場合
if dataBlockNo > tblInfo.BlockNo
strMsgBuf = makeDispMessage(12,tblInfo);
error(strMsgBuf);
exit;
else
end
end
%オプションに同時読み込みが設定されていなかったら
if(ReadBoth == 0)
ReadMode = 0;
%同時読み込みなら
else
%ファイル名の拡張子をKS2→E4Aに置換
file((strfind(file, '.') + 1):end) = 'e4a';
%E4Aファイルが存在するか事前に確認する
e4afid = fopen(file,'r');
%ファイル名の拡張子をE4A→KS2に置換
file((strfind(file, '.') + 1):end) = 'ks2';
%E4Aファイルがないなら
if(e4afid<0)
ReadMode = 0;
%E4Aファイルがあるなら
else
ReadMode = 2;
fclose(e4afid);
end
end
%拡張子がE4Aなら
elseif(strcmpi('e4a', tblInfo.ext) == 1)
ReadMode = 1;
%KS2ファイルでもE4Aファイルではない場合
else
% (17)KS2ファイルでもE4Aファイルでもない場合
strMsgBuf = makeDispMessage(17,tblInfo);
error(strMsgBuf);
exit;
end
%もしE4Aのみファイル読み込むなら
if(ReadMode == 1)
[KSX, Header, ErrNo] = e4read(file);
if(ErrNo ~= 0)
strMsgBuf = makeDispMessage(ErrNo,tblInfo);
error(strMsgBuf);
exit;
end
return;
end
%コマンドウィンドウに集録条件の表示
%makeDispMessage(100,tblInfo);
%KS2のバージョン番号の取得
VerStr = split_str(tblInfo.version,delm);
g_Ks2VerNum = str2double(cell2mat(VerStr(2)));
%KS2の集録開始カウンタ値の取得
if(strcmpi(tblInfo.machine, 'EDX-200A') == 1)
tblInfo.DataReadBody = (tblInfo.HeadSeek + tblInfo.variableHeader+tblInfo.dataHeader + 2);
%集録データ部のボディ部バイト数までポインタを移動
fseek(fid, tblInfo.DataReadBody,'bof');
%ボディ部バイト数を取得
tblInfo.DataBodyByte = fread(fid, 1,'int64=>double');
%データフッタ部までポインタを移動
fseek(fid, (tblInfo.DataReadBody + tblInfo.DataBodyByte + 8),'bof');
%オフセット用のバイト数を設定
OffsetSeek = (tblInfo.DataReadBody + tblInfo.DataBodyByte + 8);
%集録開始カウンタ値を探査(0x12 0x19)
while(1)
[parent, child] = checkFlag(fid, OffsetSeek, 0); %ver1.03
%データフッタ部の項目が無いなら読み込み終了
if(isempty(parent) == 1)
tblInfo.StCnt = 0;
break;
end
[SeekByte, ~]= makeSeek(fid, parent, child);
if(parent == 18)
if(child == 32)
tblInfo.StCnt = fread(fid,1,'uint64');
break;
end
end
%大分類,小分類,項目フラグ,データ型の4バイト分を加算する
OffsetSeek = OffsetSeek + 4;
%ボディバイト数の型のサイズ分シーク位置を更新
if (child == 25)
OffsetSeek = OffsetSeek + 8;
elseif (child == 26)
OffsetSeek = OffsetSeek + 4;
elseif (child == 28)
OffsetSeek = OffsetSeek + 4;
elseif (child == 30)
OffsetSeek = OffsetSeek + 4;
elseif (child == 31)
OffsetSeek = OffsetSeek + 2;
elseif (child == 32)
OffsetSeek = OffsetSeek + 2;
end
%ボディバイト数分シーク位置を更新
OffsetSeek = OffsetSeek + SeekByte; %ver1.03
end
else
tblInfo.StCnt = 0;
end
%E4AとKS2を読みこむなら
if(ReadMode == 2)
%ファイル名の拡張子をKS2→E4Aに置換
file((strfind(file, '.') + 1):end) = 'e4a';
%E4Aのヘッダ情報の取得
tblInfoE4a = e4readHeader(file);
%KS2とE4Aの集録条件が一致しているか確認
if(tblInfo.StCnt ~= tblInfoE4a.StCnt)
%(16)測定条件が異なるためKS2とE4Aファイルの互換性が無い
strMsgBuf = makeDispMessage(16,tblInfo);
error(strMsgBuf);
exit;
end
if(tblInfo.Hz ~= tblInfoE4a.Fs)
%(16)測定条件が異なるためKS2とE4Aファイルの互換性が無い
strMsgBuf = makeDispMessage(16,tblInfo);
error(strMsgBuf);
exit;
end
%E4Aファイルのを読み込むためのメモリが不足していたら
try
%CANデータ行列をNaNで初期化
e4X(1:tblInfoE4a.e4XLen-tblInfoE4a.StCnt,1:tblInfoE4a.TransChStsNum) = NaN;
catch
strMsgBuf = makeDispMessage(21,tblInfo);
error(strMsgBuf);
exit;
end
clear e4X;
end
%各セルデータの初期化
tblfileID = cell(1,tblInfo.chAll+1);
tblfileID(:,:) = {''};
%tblfileID(1,1) = {'[ID番号]'};
tblfileID(1,1) = {'[ID No.]'};
tblfileTitle = cell(1,tblInfo.chAll+1);
tblfileTitle(:,:) = {''};
%tblfileTitle(1,1) = {'[タイトル]'};
tblfileTitle(1,1) = {'[Title]'};
tblfileCh_num = cell(1,tblInfo.chAll+1);
tblfileCh_num(:,:) = {''};
%tblfileCh_num(1,1) = {'[測定CH数]'};
tblfileCh_num(1,1) = {'[Number of Channels]'};
tblfileSf = cell(1,tblInfo.chAll+1);
tblfileSf(:,:) = {''};
%tblfileSf(1,1) = {'[サンプリング周波数(Hz)]'};
tblfileSf(1,1) = {'[Sampling Frequency (Hz)]'};
tblfileDigi_ch = cell(1,tblInfo.chAll+1);
tblfileDigi_ch(:,:) = {''};
%tblfileDigi_ch(1,1) = {'[デジタル入力]'};
tblfileDigi_ch(1,1) = {'[Digital Input]'};
tblfileTime = cell(1,tblInfo.chAll+1);
tblfileTime(:,:) = {''};
%tblfileTime(1,1) = {'[測定時間(sec)]'};
tblfileTime(1,1) = {'[Time (sec)]'};
%ID番号
fseek(fid,0,'bof');
header_array = fread(fid,20,'uchar');
header_array(end-2:end,:)=[]; %"(0x22)と終端2文字CRLF(0D,0A)の削除
header_array(1,:)=[]; %先頭の"(0x22)の削除
for n=1:size(header_array,1)
if(header_array(end,1)==32)
header_array(end,:)=[];
else
break;
end
end
if(isempty(header_array)==0)
tblfileID(1,2)={native2unicode(header_array)'};
end
clear header_array;
%タイトル
fseek(fid,30,'bof');
header_array = fread(fid,44,'uchar');
header_array(end-2:end,:)=[]; %終端2文字CRLF(0D,0A)と”(0x22)
header_array(1,:)=[];
for n=1:size(header_array,1)
if(header_array(end,1)==32)
header_array(end,:)=[];
else
break;
end
end
if(isempty(header_array)==0)
tblfileTitle(1,2)={native2unicode(header_array)'};
end
clear header_array;
%測定チャンネル数
fseek(fid,74,'bof');
header_array = fread(fid,8,'uchar');
header_array(end-1:end,:)=[]; %集録CH数〜サンプリング周波数までは”(0x22)が無い
for n=1:size(header_array,1)
if(header_array(end,1)==32)
header_array(end,:)=[];
else
break;
end
end
if(isempty(header_array)==0)
tblfileCh_num(1,2)={str2double(native2unicode(header_array)')};
end
clear header_array;
%サンプリング周波数
fseek(fid,90,'bof');
header_array = fread(fid,16,'uchar');
header_array(end-2:end,:)=[]; %終端2文字CRLF(0D,0A)と”(0x22)
for n=1:size(header_array,1)
if(header_array(end,1)==32)
header_array(end,:)=[];
else
break;
end
end
if(isempty(header_array)==0)
tblfileSf(1,2)={str2double(native2unicode(header_array)')};
end
clear header_array;
%可変長ヘッダ部のバイト数の抽出
fseek(fid,176,'bof');
header_array = fread(fid,14,'uchar'); %可変長ヘッダ部〜可変長フッタ部までは”(0x22)が無い
header_array(end-1:end,:)=[];
for n=1:size(header_array,1)
if(header_array(end,1)==32)
header_array(end,:)=[];
else
break;
end
end
if(isempty(header_array)==0)
var_Header=str2double(native2unicode(header_array)');
end
clear header_array;
%ディジタル入力CH数
%可変長ヘッダ部先頭から0x01と0x2Cが連続した2バイトを探す
for n=1:var_Header
fseek(fid,256+n-1,'bof');
if(fread(fid,1,'uchar')== 1)
fseek(fid,256+n,'bof');
if(fread(fid,1,'uchar')== 44)
fseek(fid,4,'cof');
lsb_b=fread(fid,1,'uchar');
msb_b=fread(fid,1,'uchar');
if((lsb_b == 255 && msb_b == 255) || (lsb_b == 0 && msb_b == 0))
tblfileDigi_ch(1,2)={'OFF'};
elseif((1<=lsb_b && lsb_b<=10) && msb_b==0)
tblfileDigi_ch(1,2)={'ON('};
tblfileDigi_ch(1,2)={strcat(cell2mat(tblfileDigi_ch(1,2)),num2str(lsb_b),')')};
else
tblfileDigi_ch(1,2)={'OFF'};
end
break;
end
end
end
% 集録CANCH数0を設定
tblInfo.CanChNum = 0;
[strRcvBuf,tblHeader, tblInfo.CanChNum] = DataRead12(fid,tblInfo);
% 展開する配列サイズが現在使用可能なメモリ空間以上の場合
if strRcvBuf == 999
strMsgBuf = makeDispMessage(21,tblHeader);
error(strMsgBuf);
exit;
elseif strRcvBuf == 111
% edit at 2008/01/25 メモリ以外のエラーが発生した場合
strMsgBuf = makeDispMessage(22,tblHeader);
error(strMsgBuf);
exit;
end
KSX = strRcvBuf;
clear strRcvBuf;
%CAN-CH番号分測定CH数を加算
tblfileCh_num(1,2)={(tblInfo.CanChNum + tblInfo.chAll)};
%CANデータがある場合の処理
if (tblInfo.CAN ~= 0)
if(tblInfo.chAll ~= 0)
tblfileID( tblInfo.chAll+2:tblInfo.CanChNum+tblInfo.chAll+1)={''};
tblfileTitle( tblInfo.chAll+2:tblInfo.CanChNum+tblInfo.chAll+1)={''};
tblfileCh_num( tblInfo.chAll+2:tblInfo.CanChNum+tblInfo.chAll+1)={''};
tblfileDigi_ch( tblInfo.chAll+2:tblInfo.CanChNum+tblInfo.chAll+1)={''};
tblfileSf( tblInfo.chAll+2:tblInfo.CanChNum+tblInfo.chAll+1)={''};
tblfileTime( tblInfo.chAll+2:tblInfo.CanChNum+tblInfo.chAll+1)={''};
end
end
%測定時間の算出 データ/Chをサンプリング周期で割る
tblfileTime(1,2)={cell2mat(tblHeader(end,2))/cell2mat(tblfileSf(1,2))};
%チャンネル数が1CHの場合,試験日時で3セル扱うのに対し,他は2セルとなるため空の3セル目を追加
if(tblInfo.chAll<=1)
tblfileID(:,3)={''};
tblfileTitle(:,3)={''};
tblfileCh_num(:,3)={''};
tblfileDigi_ch(:,3)={''};
tblfileSf(:,3)={''};
tblfileTime(:,3)={''};
Header = [tblfileID;tblfileTitle;tblfileCh_num;tblfileDigi_ch;tblfileSf;tblHeader;tblfileTime];
else
Header = [tblfileID;tblfileTitle;tblfileCh_num;tblfileDigi_ch;tblfileSf;tblHeader;tblfileTime];
end
%旧タイプ
if g_CsvFormat == 0
%NTB以外
if g_NtbFlag == 0
Header=cat(1,Header(1:2,:),Header(end-2,:),Header(3:end,:));
Header=cat(1,Header(1:6,:),Header(end-1:end,:),Header(7:end,:));
Header=cat(1,Header(1:11,:),Header(15:17,:));
%NTB
else
Header=cat(1,Header(1:2,:),Header(end-2,:),Header(3:end,:));
Header=cat(1,Header(1:6,:),Header(end-1:end,:),Header(7:end,:));
Header(19:end,:)=[];
end
%標準タイプ
else
%NTB以外
if g_NtbFlag == 0
Header=cat(1,Header(1:2,:),Header(end-2,:),Header(3:end,:));
Header=cat(1,Header(1:6,:),Header(end-1:end,:),Header(7:end,:));
Header=cat(1,Header(1:4,:),Header(6:9,:),Header(11:17,:),Header(10,:));
%NTB
else
Header=cat(1,Header(1:2,:),Header(end-2,:),Header(3:end,:));
Header=cat(1,Header(1:6,:),Header(end-1:end,:),Header(7:end,:));
Header=cat(1,Header(1:4,:),Header(6:9,:),Header(11:18,:),Header(10,:));
end
end
fclose(fid);
clear tblfileCh_num
clear tblfileDigi_ch
clear tblfileID
clear tblfileSf
clear tblfileTime
clear tblfileTitle
clear tblHeader
%E4AとKS2を読み込むなら
if(ReadMode == 2)
[e4X, e4Header] = e4read(file);
%E4Aのデータ行列の長さを取得
[e4M,~] = size(e4X);
%KS2のデータ行列の長さを取得
[ksM,ksN] = size(KSX);
%E4Aのデータ数がKS2より少ないなら
if(e4M < ksM)
%KS2のデータ数分まで前値保持する
%最終行のデータを取得
MatrixV= e4X(e4M,:);
%最終行をKS2の長さ分コピー
e4X = vertcat(e4X,MatrixV(ones(1,ksM-e4M),:));
end
%E4Aのヘッダ情報の項目列を削除する
%旧タイプの場合
if(g_CsvFormat == 0)
%ID番号の削除
e4Header(1,2)={''};
%タイトルの削除
e4Header(2,2)={''};
%試験日時の削除
e4Header(3,2:3)={''};
%KS2の測定CH数の置き換え
Header(4,2)= {(cell2mat(Header(4,2)) + cell2mat(e4Header(4,2)))};
%測定CH数の削除
e4Header(4,2)={''};
%サンプリング周波数の削除
e4Header(6,2)={''};
%集録データ数の削除
e4Header(7,2)={''};
%測定時間の削除
e4Header(8,2)={''};
%標準タイプの場合
else
%ID番号の削除
e4Header(1,2)={''};
%タイトルの削除
e4Header(2,2)={''};
%試験日時の削除
e4Header(3,2:3)={''};
%KS2の測定CH数の置き換え
Header(4,2)= {(cell2mat(Header(4,2)) + cell2mat(e4Header(4,2)))}; %ver1.03
%測定CH数の削除
e4Header(4,2)={''};
%サンプリング周波数の削除
e4Header(5,2)={''};
%集録データ数の削除
e4Header(6,2)={''};
%測定時間の削除
e4Header(7,2)={''};
end
%KS2の集録CH数の合計が1CHの場合,KS2のヘッダ情報の試験日時の3列目をE4A試験日時の2列目にコピー
if(ksN == 2)
e4Header(3,2) = Header(3,3);
Header(:,3)=[];
end
%E4AのヘッダとKS2のヘッダを結合
Header = horzcat(Header,e4Header(:,2:end));
%E4AデータとKS2データを結合
KSX = horzcat(KSX,e4X(:,2:end));
end
fileName_saved = file;
fileName_saved((strfind(fileName_saved, '.') + 1):end) = 'mat';
disp(['file ', fileName_saved, ' saved!'])
save(fileName_saved, 'Header', 'KSX')
%--------------------------------------------------------------------------
%% makeDispMessage - エラーメッセージの生成
% 引数
% pos ... エラー時の番号
% 戻り値
% strSndBuf ... 対象の文字列
function strSndBuf = makeDispMessage(pos,tblInfo)
if strcmp(tblInfo.Lang,tblInfo.CmpLang)
switch pos
case 1
strMsgBuf = tblInfo.Error{1};
strMsgBuf = sprintf('%s:ファイル名を拡張子付で入力して下さい。', strMsgBuf);
strMsgBuf = sprintf('%s\n例 : X = ksread3(''filename'');', strMsgBuf);
strMsgBuf = sprintf('%s\nor [X,H] = ksread3(''filename'');', strMsgBuf);
strMsgBuf = sprintf('%s\nor X = ksread3(''filename'',OptNo);', strMsgBuf);
strMsgBuf = sprintf('%s\nor [X,H] = ksread3(''filename'',OptNo);\n', strMsgBuf);
strMsgBuf = sprintf('%s\nX ... 抽出したデータ配列', strMsgBuf);
strMsgBuf = sprintf('%s\nH ... CH情報\n', strMsgBuf);
strMsgBuf = sprintf('%s\nfilename ... 対象データファイル(拡張子も含む)', strMsgBuf);
strMsgBuf = sprintf('%s\nOptNo(option) ... データブロック番号\n', strMsgBuf);
strMsgBuf = sprintf('%s またはE4Aファイルの同時読み込み(-1を指定し,''filename''がKS2ファイルの場合)', strMsgBuf);
case 2
strMsgBuf = tblInfo.Error{2};
strMsgBuf = sprintf('%s:指定されたオプションの数が不正です。', strMsgBuf);
case 3
strMsgBuf = tblInfo.Error{3};
strMsgBuf = sprintf('%s:拡張子が指定されていません。:(%s)', strMsgBuf,tblInfo.err);
case 11
strMsgBuf = tblInfo.Error{11};
strMsgBuf = sprintf('%s:指定されたファイルが存在しないか、ファイル名が間違っています。', strMsgBuf);
case 12
strMsgBuf = tblInfo.Error{12};
strMsgBuf = sprintf('%s:指定されたブロック番号は不正です。', strMsgBuf);
case 13
strMsgBuf = tblInfo.Error{13};
strMsgBuf = sprintf('%s:指定されたブロック番号が数値ではありません。', strMsgBuf);
strMsgBuf = sprintf('%s\nブロック番号には数値を指定してください。', strMsgBuf);
case 14
strMsgBuf = tblInfo.Error{14};
strMsgBuf = sprintf('%s:指定されたファイルは%sファイルではありません。', strMsgBuf, tblInfo.CmpExt);
case 15
strMsgBuf = tblInfo.Error{15};
strMsgBuf = sprintf('%s:指定されたファイルに対応したE4Aファイルが存在しません。', strMsgBuf);
case 16
strMsgBuf = tblInfo.Error{16};
strMsgBuf = sprintf('%s:指定されたE4AファイルとKS2ファイルの集録条件が異なります。', strMsgBuf);
strMsgBuf = sprintf('%s\nE4AファイルとKS2ファイルを確認してください。', strMsgBuf);
case 17
strMsgBuf = tblInfo.Error{17};
strMsgBuf = sprintf('%s:KS2ファイルかE4Aファイルを指定してください。', strMsgBuf);
case 21
strMsgBuf = tblInfo.Error{21};
strMsgBuf = sprintf('%s:\n', strMsgBuf);
strMsgBuf = sprintf('%s対象ファイルをオープンするためには、現在メモリが足りません。', strMsgBuf);
strMsgBuf = sprintf('%s\nHELP MEMORYとタイプしてオプションを確認してください。', strMsgBuf);
case 22
strMsgBuf = sprintf('%s:\n%s\n%s\n', tblInfo.Error{22}, tblInfo.err.message, tblInfo.err.identifier);
case 31
strMsgBuf = sprintf('データ集録数 = %d',tblInfo.LngHeight);
disp(strMsgBuf);
strMsgBuf = '';
case 32
strMsgBuf = sprintf('Please wait ... データ変換中(%sファイル)',tblInfo.ext);
case 100
strMsgBuf = sprintf('ファイルID = %s',tblInfo.machine);
strMsgBuf = sprintf('%s\nバージョン = %s', strMsgBuf,tblInfo.version);
strMsgBuf = sprintf('%s\n最大データブロック数 = %d', strMsgBuf,tblInfo.BlockNo);
strMsgBuf = sprintf('%s\n指定データブロック番号 = %d', strMsgBuf,tblInfo.dataBlockNo);
strMsgBuf = sprintf('%s\n集録CH数 = %d', strMsgBuf,tblInfo.chAll);
strMsgBuf = sprintf('%s\n個別集録CH数 = %d', strMsgBuf,tblInfo.ch);
strMsgBuf = sprintf('%s\nサンプリング周波数(%s) = %d', strMsgBuf,tblInfo.HzChar,tblInfo.Hz);
disp(strMsgBuf);
strMsgBuf = '';
otherwise
end
else
switch pos
case 1
strMsgBuf = tblInfo.Error{1};
strMsgBuf = sprintf('%s:Please insert a file name with extensions.',strMsgBuf);
strMsgBuf = sprintf('%s\nexp: X = ksread3(''filename'');', strMsgBuf);
strMsgBuf = sprintf('%s\nor X = ksread3(''filename'',OptNo);', strMsgBuf);
strMsgBuf = sprintf('%s\nor [X,H] = ksread3(''filename'',OptNo);\n', strMsgBuf);
strMsgBuf = sprintf('%s\nX ... extracted data array', strMsgBuf);
strMsgBuf = sprintf('%s\nH ... CH\n', strMsgBuf);
strMsgBuf = sprintf('%s\nfilename ... data file(include extension)', strMsgBuf);
strMsgBuf = sprintf('%s\nOptNo(option) ... Data block No. \n', strMsgBuf);
strMsgBuf = sprintf('%s Or both KS2 and E4A file Read-mode(If specified value is -1 and specified ''filename'' is KS2 file)\n', strMsgBuf);
case 2
strMsgBuf = tblInfo.Error{2};
strMsgBuf = sprintf('%s:Intended the number of option is incorrect.', strMsgBuf);
case 3
strMsgBuf = tblInfo.Error{3};
strMsgBuf = sprintf('%s:The file which is intended is no extension.(%s)', strMsgBuf,tblInfo.err);
case 11
strMsgBuf = tblInfo.Error{11};
strMsgBuf = sprintf('%s:The file which is intended is nonexistent of filen name is incorrect.', strMsgBuf);
case 12
strMsgBuf = tblInfo.Error{12};
strMsgBuf = sprintf('%s:Intended block No. is incorrect.', strMsgBuf);
case 13
strMsgBuf = tblInfo.Error{13};
strMsgBuf = sprintf('%s:Intended block No. is not numeric.', strMsgBuf);
strMsgBuf = sprintf('%s\nPlease intend numeric on the block No.', strMsgBuf);
case 14
strMsgBuf = tblInfo.Error{14};
strMsgBuf = sprintf('%s:Specified file is not %s file.', strMsgBuf, tblInfo.CmpExt);
case 15
strMsgBuf = tblInfo.Error{15};
strMsgBuf = sprintf('%s:Specified file is not existent.', strMsgBuf);
case 16
strMsgBuf = tblInfo.Error{16};
strMsgBuf = sprintf('%s:Measurement parameter E4A file and KS2 file is diffrent.', strMsgBuf);
strMsgBuf = sprintf('%s\nPlease check E4A file and KS2 file.', strMsgBuf);
case 17
strMsgBuf = tblInfo.Error{17};
strMsgBuf = sprintf('%s:Specified KS2 file of E4A file.', strMsgBuf);
case 21
strMsgBuf = sprintf('%s:%s\n%s\n', tblInfo.Error{21}, tblInfo.err.message, tblInfo.err.identifier);
strMsgBuf = sprintf('%s\nThere is insufficient memory spece.', strMsgBuf);
strMsgBuf = sprintf('%s\nPlease confirm the option by typing HELP MEMORY', strMsgBuf);
case 22
strMsgBuf = sprintf('%s:\n%s\n%s\n', tblInfo.Error{22}, tblInfo.err.message, tblInfo.err.identifier);
case 31
strMsgBuf = sprintf('Scanning Data Length / CH = %d',tblInfo.LngHeight);
disp(strMsgBuf);
strMsgBuf = '';
case 32
strMsgBuf = sprintf('Please wait ... translate data(%s file)',tblInfo.ext);
case 100
strMsgBuf = sprintf('FileID = %s',tblInfo.machine);
strMsgBuf = sprintf('%s\nVersion = %s', strMsgBuf, tblInfo.version);
strMsgBuf = sprintf('%s\nThe number of max. data block = %d', strMsgBuf, tblInfo.BlockNo);
strMsgBuf = sprintf('%s\nA number of max. data block = %d', strMsgBuf, tblInfo.dataBlockNo);
strMsgBuf = sprintf('%s\nThe number of max. recording CH. = %d', strMsgBuf, tblInfo.chAll);
strMsgBuf = sprintf('%s\nThe number of recording CH. = %d', strMsgBuf, tblInfo.ch);
strMsgBuf = sprintf('%s\nRecording frequency(%s) = %d', strMsgBuf, tblInfo.HzChar,tblInfo.Hz);
disp(strMsgBuf);
strMsgBuf = '';
otherwise
end
end
strSndBuf = strMsgBuf;
%--------------------------------------------------------------------------
%% テキスト部の情報取得
% 引数
% fid ... ファイルポインタオブジェクト
% tblInfo ... 構造体変数
% 戻り値
% info ... 情報を追加した構造体変数
function info = getInfo(fid,tblInfo)
delm = ' ';
i = 1;
while 1
line = fgetl(fid);
if (i <= 2)
tbls = split_str(line(2:(length(line)-1)),delm);
if i == 1
tblInfo.machine = tbls{1}; % 名前
else
tblInfo.version = tbls{1}; % バージョン
if strcmp(tblInfo.version,'01.00.00')
i = i + 1;
end
end
elseif (i > 2) && (i <= 16)
if i == 7
tbls = split_str(line(2:(length(line)-1)),delm);
strRcvBuf = tbls{1};
else
strRcvBuf = line;
end
if i == 4
tblInfo.chAll = str2double(strRcvBuf);
elseif i == 5
tblInfo.ch = str2double(strRcvBuf);
elseif i == 6
token = str2double(strRcvBuf);
if token == 0
token = 1;
end
tblInfo.Hz = token;
elseif i == 7
tblInfo.HzChar = strRcvBuf;
elseif i == 10
tblInfo.BlockNo = str2double(strRcvBuf);
elseif i == 11 % KS1->0,KS2->1
check = strcmp(tblInfo.ext,tblInfo.CmpExt);
if check == 0
tblInfo.CAN = 0;
else
token = strRcvBuf(2:length(strRcvBuf));
if isempty(token)
token = 0;
else
token = str2double(token(1:(length(token)-1)));
if length(token) < 1
token = 0; % tokenが空の場合
end
end
tblInfo.CAN = token;
end
elseif i == 13
tblInfo.variableHeader = str2double(strRcvBuf);
elseif i == 14
tblInfo.dataHeader = str2double(strRcvBuf);
end
else
break;
end
i = i + 1;
end
info = tblInfo;
%--------------------------------------------------------------------------
%% DataRead - データを読み込む手順を行う
% 引数
% f ... ファイルポインタオブジェクト
% tblInfo ... ヘッダ各種情報を格納した構造体変数
% 戻り値
% strSndBuf ... 抽出した集録データ
% tblHeader ... CH情報
function [strSndBuf, tblHeader, CanChNum] = DataRead12(f,tblInfo)
global g_NtbFlag; %測定器がNTBかを示すフラグ
global g_CsvFormat; %ヘッダ情報のフォーマットの旧式・標準を切り替えます 0:旧タイプ 1:標準タイプ
global g_IndexType; %データのインデックスを切り替えます 0:時間 1:番号
% initalized variable
lngSeek = tblInfo.HeadSeek; % テキスト部バイト数
delta = 0; % データの読み飛ばし量
tblCoeff = zeros(1,tblInfo.ch,'double'); % 工学値変換係数A edit at 2012/09/28 single→doubleに変更 動作はどちらでも正常
tblOffset = zeros(1,tblInfo.ch,'double'); % 工学値変換係数B edit at 2012/09/28 single→doubleに変更 動作はどちらでも正常
tblName = {}; % チャネル名
tblNo = {}; % チャネルNo
tblUnit = {}; % 単位文字列
tblrange = {}; % レンジ
tblCoeff_disp = {}; % 校正係数
tblOffset_disp = {}; % オフセット
tblLowPass = {}; % ローパスフィルタ
tblHighPass = {}; % ハイパスフィルタ
tblDigiFilter = {}; % ハイパスフィルタ
tblfileDate ={}; % 試験日時
tblfileData_num = {}; % データ/ch
tblChMode = {}; % CHモード
tblGaugeFactor = {}; % ゲージ率
tblZeroMode = {}; % ZERO値のモード
tblZeroNum = {}; % ZERO値
blkLMT = tblInfo.BlockNo; % 最大ブロック数
dataBlockNo = tblInfo.dataBlockNo; % 引数で指定したブロック番号
flgDebug = 0; % 情報表示を操作するフラグ(0:非表示,1:表示)
g_NtbFlag = 0; % 測定器がNTBかを示すフラグ
tblInfo.checkArray = []; % チェック用配列(depend printInfoAbove)
cell_data = cell(1,tblInfo.chAll+1); % ディジタルCHを含む全チャンネル
cell_data(:,:)={''}; % 空データで初期化する
%可変長ヘッダ部情報
[parent,child] = checkFlag(f,lngSeek,delta);
while parent < 3
[smlSeek,strCharBuf] = makeSeek(f,parent,child);
[delta,strRcvBuf,flgCoeff,tblInfo] = printInfoAbove(f,tblInfo, parent,child,...
smlSeek,strCharBuf, tblCoeff,tblOffset,...
delta,flgDebug,cell_data);
[parent,child] = checkFlag(f,lngSeek,delta);
switch flgCoeff
case 1, tblCoeff = strRcvBuf; % 工学値変換係数A
case 2, tblOffset = strRcvBuf; % 工学値変換係数B
case 3, tblNo = strRcvBuf; % CH番号
case 4, tblName = strRcvBuf; % CH名称
case 5, tblUnit = strRcvBuf; % 単位
case 6, tblrange = strRcvBuf; % レンジ
case 7, tblCoeff_disp = strRcvBuf; % 校正係数
case 8, tblOffset_disp = strRcvBuf; % オフセット
case 9, tblLowPass = strRcvBuf; % ローパスフィルタ
case 10, tblHighPass = strRcvBuf; % ハイパスフィルタ
case 11, tblDigiFilter = strRcvBuf; % デジタルフィルタ
case 12, tblChMode = strRcvBuf; % CHモード
case 13, tblGaugeFactor = strRcvBuf; % ゲージ率
case 14, tblZeroMode = strRcvBuf; % ZERO値のモード
end
end
%データ部情報
for i = 1:blkLMT
[parent,child] = checkFlag(f,lngSeek,delta);
flags = parent;
while flags <= parent
switch i
case dataBlockNo
flgDebug = 1;
end
[smlSeek,strCharBuf] = makeSeek(f,parent,child);
[delta,strRcvBuf,flgCoeff,tblInfo] = printInfoAbove(f,tblInfo, parent,child,...
smlSeek,strCharBuf, tblCoeff,tblOffset,...
delta,flgDebug,cell_data);
[parent,child] = checkFlag(f,lngSeek,delta);
switch flgCoeff
case 9 % 試験日時
tblfileDate = strRcvBuf;
case 10 % データ数/ch
tblfileData_num = strRcvBuf;
end
if flags < parent
flags = parent;
elseif parent > 18
break;
end
switch flgCoeff
case 3, strSndBuf = strRcvBuf;
case 111
strSndBuf = 111;
tblHeader = tblInfo;
CanChNum = tblInfo.CanChNum;
return