AWK(GAWK)

2020年3月 5日 (木)

ダイソーReVOLTES単3 JIS C8708:2019充放電試験途中経過

ダイソーReVOLTES単3によるJIS C8708:2019充放電試験
やっと45サイクルを終えました。
50サイクルごとの0.2C放電による放電カーブ 、最初のまで
あともう一息。

Aa1

このグラフは1cyc~49cycで行う、0.5C充放電での
充放電時間の変化です。
右目盛の青線は充放電比になります。

ところどころ凸状になって効率が上がっているところが
見えます。
これ、どうやら仕事をしている時の室温の影響のようで、
30サイクルのところから月曜が始まり、月・火・水・木と
4日分が見えています。
暖房を入れてるものだから室温が上昇して「電池が元気に」
というところでしょう。

充電はまだ「132分充電(1割増し充電)」を維持。
「-ΔV」検出には至っていません。

放電は「2時間:120分」を越えています。

ReVOLTES、充電放電とも「絶好調」というところでしょうか。

 

充放電実行中、実験回路からこんなデータが出力
されます。

#Start
#D 0.2C 0cyc 0/8 0h00m 1.294V
#Break
#Start
#D 0.2C 0cyc 0/8 0h00m 1.293V
#D 0.2C 0cyc 0/8 4h03m 1.000V
#D-Wait 0cyc 0/8 1h00m 1.167V
#Next
#C 0.5C 1cyc 1/8 2h12m 1.549V
#C-Wait 1cyc 1/8 0h20m 1.440V
#D 0.5C 1cyc 1/8 1h59m 1.000V
#D-Wait 1cyc 1/8 0h10m 1.177V
#C 0.5C 2cyc 1/8 2h12m 1.557V
#C-Wait 2cyc 1/8 0h20m 1.449V
#D 0.5C 2cyc 1/8 2h01m 1.000V
#D-Wait 2cyc 1/8 0h10m 1.176V
#C 0.5C 3cyc 1/8 2h12m 1.562V
#C-Wait 3cyc 1/8 0h20m 1.454V
#D 0.5C 3cyc 1/8 2h01m 1.000V
#D-Wait 3cyc 1/8 0h10m 1.173V
#C 0.5C 4cyc 1/8 2h00m 1.535V
#C 0.5C 4cyc 1/8 2h01m 1.539V
#C 0.5C 4cyc 1/8 2h02m 1.543V
#C 0.5C 4cyc 1/8 2h03m 1.546V
#C 0.5C 4cyc 1/8 2h04m 1.549V

これを「GAWK」で処理して0.5C充放電の部分
(#C #Dの行)をピックアップして放電時間(分)
と充電時間を得ます。
d/cは充放電比率です。

#cyc d-cg chg  d/c
  1 119 132 90.2%
  2 121 132 91.7%
  3 121 132 91.7%
  4 123 132 93.2%
  5 123 132 93.2%
  6 122 132 92.4%
  7 122 132 92.4%
  8 122 132 92.4%
  9 123 132 93.2%
 10 124 132 93.9%

これをGNU-PLOTでグラフ化。

awkはこんなスクリプト。 (表示の関係で全角スペースにしてます)

BEGIN{
  print "#cyc d-cg chg  d/c";
}
#loop
{
  if(($1 == "#Start")   ||   # 無視する文字
    ($1 == "#Break")   ||
    ($1 == "#Next")   ||
    ($1 == "#D-Wait")  ||
    ($1 == "#C-Wait")  ||
    ($1 == "#Batt")   ||
    ($1 == "#cyc")    ||
    ($1 == "#")     ||   # #だけ
    ($1 ~ /^#[0-9]+$/)  ||   # #10,#11,#12...
    ($1 ~ /^[0-9.V]+$/) ||   # 1.23Vを除去
    ($1 ~ /^[0-9/]+$/)  ||   # 2020/01/02を除去
    ($3 == "50cyc")   ||   # 50cyc除去
    ($3 == "0cyc")){       # 0cyc除去
      next;          # 次レコードへ
  }
  cy1 = $3 + 0;         # 新サイクル
  split($4, cn8, "/");      # 1/8,2/8...→50,100...
  cn50 = cn8[1];         # 1,2,3...
  split($5, hm, /[hm]/);     # 時分
  tm = 60 * hm[1] + hm[2];    # 分値に
  if(cyc1 != cy1){        # cyc変化で出力
    dataprint();        # 前に取得したデータで結果出力
  }
  cyc1 = cy1;          # 次回出力チェックのサイクル
  cyn50 = cn50;
  if($1 == "#C")   tmc = tm;  # 充電時間
  if($1 == "#D")   tmd = tm;  # 放電時間
}
#おわり
END{
  dataprint();        # 最終サイクルの結果出力
}

#データ出力
function dataprint(){
  if((cyc1 != 0) &&     # 0cycは出力しない
    (cyn50 != 0) &&     # 1/8検出前は出力しない
    (tmc  != 0)){      # 充電時間=0なら出力しない
    printf("%4d %4d %4d %5.1f%\r\n",
      50*(cyn50-1)+cyc1,   # サイクル
      tmd, tmc,        # 放電,充電時間(分)
      (tmd / tmc) * 100);   # 充放電率 (100%)
  }
}

サイクル値が変わった(1cyc→2cycになった時)に
直前の充放電データを出力しています。
  実験装置は、1分ごとに出力するような
  モードがあるので、次のサイクルで前の
  結果を出力するという処理にしてます。


GNU-PLOTのはこんなの。

set title "ダイソー ReVOLTES(1300mAh) JIS C8708:2019 充放電実験"
set y2tics
set xrange [0:60]
set yrange [60:160]
set y2range [50:100]
set xlabel "充放電サイクル"
set ylabel "充放電時間(分)"
set y2label "放電度(%)"
set grid
set xtics 10
set ytics 10
set y2tics 10
set key left bottom
plot "t1.txt" index 0 using 1:2 with lines lw 2 ti "0.5C放電時間(分)" ,\
   "t1.txt" index 0 using 1:3 with lines lw 2 ti "0.5C充電時間(分)" ,\
   "t1.txt" index 0 using 1:4 with lines lw 2 ti "充放電比 D/C(%)" axes x1y2


2020年3月30日:ダイソーReVOLTE単3 JIS C8708:2019充放電試験途中経過 -ΔV検出開始
電池あれこれ まとめ

| | コメント (2)

2020年1月14日 (火)

メモ:awk(gawk)で「arcsin」

※エクセルでの文章はキライ!
エクセルで図と文を混ぜて書いて「ハイ、これが仕様書」っと渡させるとちょいとイライラします。
そんなときは「こちらの環境が悪いのか見にくいのでpdfにして送り直してちょ」と返答するようにしています。
まぁ↑は置いておいて・・・

数式処理の確認も、エクセルを使うと簡単にグラフ化できたりと便利なのは間違いないんですが、私の場合、「あまりしたくない感」が勝ってしまいます。
そんな場合、何を使うかというと「awk(gawk)」。

テキストエディターでスクリプトを書いて、コマンドプロンプトで実行。
リダイレクトで結果をテキストファイルに。
グラフ化したいなら、その結果をエクセルに食わせるという具合。

先日のこと、逆三角関数arcsin、arccosを使った処理の検証をしようとしたところ、・・・awk(gawk)には「asin()、acos()」関数は実装されていなかった。・・・あれま。

三角関数sin、cos、atan2、それにsqrtは実装されてますんで、これらを使ってどうにかしなくちゃなりません。
三角関数の変換式を検索しながら、awk(gawk)に関連付けて探すと、発見!
これ↓。
function asin(x) { return atan2(x, sqrt(1-x*x)) }
function acos(x) { return atan2(sqrt(1-x*x), x) }

asin()とacos()が得られました。
簡単にテスト。

BEGIN{
 PAI = atan2(0, -1)  # パイは数字指定じゃなくatan2で
 for(i=-1;i<+1;i+=0.1){ #-1~+1を0.1ピッチで
  printf("%+4.1f %+7.2f %+7.2f\n",
    i, asin(i)*180/PAI, acos(i)*180/PAI);
 }
}
function asin(x) { return atan2(x, sqrt(1-x*x)) }
function acos(x) { return atan2(sqrt(1-x*x), x) }

で、その結果
-1.0 -90.00 +180.00
-0.9 -64.16 +154.16
-0.8 -53.13 +143.13
-0.7 -44.43 +134.43
-0.6 -36.87 +126.87
-0.5 -30.00 +120.00
-0.4 -23.58 +113.58
-0.3 -17.46 +107.46
-0.2 -11.54 +101.54
-0.1 -5.74 +95.74
-0.0 -0.00 +90.00
+0.1 +5.74 +84.26
+0.2 +11.54 +78.46
+0.3 +17.46 +72.54
+0.4 +23.58 +66.42
+0.5 +30.00 +60.00
+0.6 +36.87 +53.13
+0.7 +44.43 +45.57
+0.8 +53.13 +36.87
+0.9 +64.16 +25.84
+1.0 +90.00 +0.00

 

| | コメント (2)

2019年3月 1日 (金)

DOS版OrCADの部品ライブラリをBSch3VのLB3ファイルに

先日来、GAWKの「正規表現」でお騒がせしていますが、

 

部品ライブラリの変換ツールが動き始めています。

 

   ※まだまだ手直しするところは残ってますが・・・

 

 

で、作業を進めていて、出来ないことや苦手なところが

 

判明。

 

 

 

グラフィックパーツのFILL:黒塗りが未対応。

 

   *OrCADはfillポイントを座標で指定。

 

   LB3は円や四角のパラメータで指定。

 

 

 

 

ヒステリシス記号のベクトルデータが出ない。
     * OrCADではシンボル定義文字HYSTERESISで

 

   描いている。

 

 

 

 

ベクトルでの文字入れが不安定。

 

 

 

 

ARC(円弧)の処理が不安定。
       * OrCADはXY座標,LB3は角度で処理。

 

 

 

 

ピン指定の細かいところがちょいと。

 

 

 

 

ざっと、こんなところ。

 

 

LB3にしたときの変換がうまくいかない例

 

  ※LCoVで編集中の画面をコピー

 

・シュミット記号のベクトルデータが出ない。

 

 ビットマップでの形は出ている。

 

10

 

 

・文字位置が微妙
13


・FILL:黒塗りつぶしができない
12

・円弧のベクトルデータ、始点終点が部品枠外になった

 

 場合でも、出てしまう。

 

    OrCADでの元データ作成時の手抜きが原因
11

 

 

 

 

 

 

「ちゃんといったなぁ」というのがトランス類。

 

円弧の処理が気になっていたのです。

 

OrCADでの円弧は、中心座標、半径、始点座標、終点座標

 

で指定します。

 

LB3は、中心座標、半径、始点の角度、終点の角度で指定

 

と、元データの座標を角度に直さなくてはならないのです。

 

その時、角度の基準が「3時の位置が0度」で、0度→360度の

 

増加方向が反時計回り。

 

この時、始点と終点を逆にしちゃうと、60度の円弧が300度に

 

なってしまったりと、びっくりな絵が出てきます。


トランスの変換例。
21

 

 

もうひとつ。

 

22

ただ、古いOrCADの部品だと、ベクトルデータを入れてなくって

 

ビットマップだけのがあります。

 

元データがビットマップだけですと、こんな具合になっちゃいます。
23

ベクトルデータが無いとちょいとさみしい・・・・


「GAWK」のスクリプトですんで、あれこれ手を入れてもらうことは

 

可能かと。

 

650行ほどのファイルです。

 

     アップロード、ちょいと待ってくださいな。

 

 

Vectorの 「gawk 3.1.5 for Windows」 で実行確認してます。

 

 

 

GAWKをダウンロードしてもらって、コマンドプロンプトで

 

実行する環境を整えておいてください。




説明書なしで「libsv3.awk」だけアップロードしておきました。

 

・場所:http://act-ele.c.ooco.jp/jisaku/libsv3/libsv3.htm   ←説明入り

 

 

・ファイル:http://act-ele.c.ooco.jp/jisaku/libsv3/libsv3.zip


DOS版OrCADの部品ライブラリー(.LIBファイル)を「DECOMP.EXE」で

 

部品ソースファイル(テキスト)に変換してから、今回のツールに

 

食わせます。

 

 

 

 

 

 

| | コメント (5) | トラックバック (0)

2019年2月20日 (水)

「gawk」の正規表現・・・続き:文字の順番を入れ替える

もう一つ、gawkの処理で「簡単に!」を実現したののが
「負論理記号」。

例えば「74138」。

X1
部品ライブラリの「ピン名称」、Bsch3Vだと「¥G¥2」のよう
¥が先に来て負論理のupper barが次文字の上に出ます。

+PIN,N:A,DF:FFFFFFFF,L:L1,T:,M:1,-PIN
+PIN,N:B,DF:FFFFFFFF,L:L2,T:,M:2,-PIN
+PIN,N:C,DF:FFFFFFFF,L:L3,T:,M:3,-PIN
+PIN,N:\G\2\A,DF:FFFFFFFF,L:L5,T:N,M:4,-PIN
+PIN,N:\G\2\B,DF:FFFFFFFF,L:L6,T:N,M:5,-PIN
+PIN,N:G1,DF:FFFFFFFF,L:L7,T:,M:6,-PIN
+PIN,N:\Y\0,DF:FFFFFFFF,L:R1,T:N,M:15,-PIN
+PIN,N:\Y\1,DF:FFFFFFFF,L:R2,T:N,M:14,-PIN
+PIN,N:\Y\2,DF:FFFFFFFF,L:R3,T:N,M:13,-PIN
+PIN,N:\Y\3,DF:FFFFFFFF,L:R4,T:N,M:12,-PIN
+PIN,N:\Y\4,DF:FFFFFFFF,L:R5,T:N,M:11,-PIN
+PIN,N:\Y\5,DF:FFFFFFFF,L:R6,T:N,M:10,-PIN
+PIN,N:\Y\6,DF:FFFFFFFF,L:R7,T:N,M:9,-PIN
+PIN,N:\Y\7,DF:FFFFFFFF,L:R8,T:N,M:7,-PIN

ところが、OrCADだと「G¥2¥」となって、
文字の後ろに¥があると、その文字の上にバーが付くのです。

'74LS138'
{X Size =}   7      {Y Size =}   9      {Parts per Package =}   1
L1      1         IN  'A'
L2      2         IN  'B'
L3      3         IN  'C'
L6      6         IN  'G1'
L7      4 DOT     IN  'G\2\A\'
L8      5 DOT     IN  'G\2\B\'
R1     15 DOT     OUT 'Y\0\'
R2     14 DOT     OUT 'Y\1\'
R3     13 DOT     OUT 'Y\2\'
R4     12 DOT     OUT 'Y\3\'
R5     11 DOT     OUT 'Y\4\'
R6     10 DOT     OUT 'Y\5\'
R7      9 DOT     OUT 'Y\6\'
R8      7 DOT     OUT 'Y\7\'
T0     16         PWR 'VCC'
B0      8         PWR 'GND'

単純な文字の入れ替えなんですが、うまい表現が思いつきません。
と同じように、¥の検出で、その直前の文字列の最後尾を1文字
抜き出し、¥を挿入後に抜いた文字を加えるという処理をして
います。
これ、どうにかスマートにする手法って無いでしょかね。

| | コメント (1) | トラックバック (0)

2019年2月11日 (月)

gawkの関数:「length」でつまづく!

MS-DOS時代の「jgawk」なら大丈夫なのに、Vectorでダウンロードした
gawk(3.1.5)」でアウト。
「正規表現」 は関係ありません。
おかしな挙動をしたのが「length」。
文字のバイト数を返す関数。
gawkで使うと、おかしなことが起こったんです。
検証のため、こんなテストプログラムを実行。

{
    n = length($0);           # 入力文字列のバイト数
    printf("n:%d\n", n)     # いったん確認
    r1 = "";                    # バッファをクリア
    for(i = 1; i <= n; i++){    # 入力文字数でloop
        c1 = substr($0, i, 1);     # 1文字取り出し
        r1 = r1 c1;                 # バッファに文字として結合
        printf("%s:%d\n",r1,length(r1));   # バッファの文字列とバイト数を表示
    }
}

これがgawkだと、
12345  ←入力文字
n:5    合ってる
1:1    ところが、増えていくはずが・・・
12:1
123:1
1234:1
12345:1   5文字ループしたのに「1」

abcdefg
   7文字入力
n:7    合ってる
a:1    ところが・・・
ab:1
abc:1
abcd:1
abcde:1
abcdef:1
abcdefg:1  やはり1のままで違ってる

正しい値は・・・
行末の数字が1234・・・と+1ずつ増加しなくちゃなりません。
で、正しい答えを出す方法。

gawkのままで
 1:     r1 = r1 c1 "";           # 空文字を結合
 2:     printf("%s:%d\n",r1,length(r1 ""));   同じく
 3:     起動オプションに -W ctype=ASCIIを加える

   ctype=SJISだとダメ。

jgawkだとそのままでok

むちゃ悩んだぞ~~~っと。
どうしたものか。

※結果・・・
gawkのバージョンを上げるということで対応。(4.1.4に)
ここからダウンロード。
Free download of the version 4.1.4 (Aug 2016)
(Version 4.1.4)

Win32 executable

Version in English Version in English


※ところが・・・
4.1.4では日本語がアウト。
起動オプションも見当たらず。

 

| | コメント (4) | トラックバック (0)

2019年2月10日 (日)

「gawk」の正規表現・・・続き

の続きで、gawkの正規表現で悩んでいます。

・やりたいこと
OrCADの部品ライブライーソースファイルの中に出てくる
こんな文字列(「'xxxx'」というふうに「'」で区切られている)内の
「スペース」を「_」(下線記号)に変えたい。

・例 文字列
  'VOLTAGE REGULATOR'
  L1  3  SHORT   IN  'PLUS INPUT'
    R1  'C2' CLK  OUT 'CLK OUT'

・なぜか
gawkの「スペースで文字列を文字単位に」分割するという
機能、「'」で区切られた文字列内にスペースがあると、
そこで切られてしまいす。
「'  '」内のスペース、これを「_」(下線記号)に変えて、
分割されないようにしたいわけで。

・条件
1行に複数個の「'  '」が出現することもある。

・試したのはこんな処理
    while(1){                                 # 「'  '」がいくつもあるかもしれないので
        match($0, /'[^']*'/);
        if(RSTART == 0)     break;     # 「'  '」がなければおわり
        s1 = substr($0, 1, RSTART-1);             # 「'  '」の左側
        s2 = substr($0, RSTART, RLENGTH);   # 「'  '」の部分
        s3 = substr($0, RSTART+RLENGTH);   # 「'  '」の右側
        gsub("'", "@", s2)      # 「'  '」部分の「']をいったん@に
        gsub(" ", "_", s2)       # 「'  '」部分スペースを「_」に
        $0 = s1 s2 s3            # あらたな$0
    }   
    gsub("@", "'", $0)         # @を「'」に変えて元に戻す

「'  '」が複数個出るかもということで、「']をいったん@に変えて、
1行の先頭から処理するようにしました。
gawkらしく、もっとスマートな方法は?
   ※Cだとチカラ技で処理を進めるですが、gawkの書式はパズルです。
     1文字ずつ読み出して「'」が来たらスペースを「_」にというほうが
     良いかな。

そういや、こういった記述にも対応しないと。
R1    24   OUT 'QA''' ← QA'が信号名で 二つの「''」で
文字としての「'」を示すわけでして・・・。

 

| | コメント (3) | トラックバック (0)

2019年2月 9日 (土)

「gawk」の正規表現で

2019年2月 5日:昔の回路図データを紙にプリントしたい!
の記事に対するCPU.BACHさんのコメントに関して・・・
「LIBSX」という「OrCAD」の部品ライブラリソースファイルを、
水魚堂さんの回路図エディタ「CE」の部品ライブラリに変換
するツールがあります。
これ、MS-DOS時代のツールでして「MS-C」で作ったんです
が、これを手直しして「BSch3V」用の部品ライブラリ「LB3」
変換ツールに出来ないものかと、ちょいと試行錯誤してみ
ました。
で、ツールですがCでコンパイルするんじゃなく、「gawk」を
使ってみました。
  ※MS-DOS時代からjgawkはあれこれと使っています。
そこで、OrCAD部品ソースに出てくる文字列処理での
「正規表現」につまずいちゃいました。
部品ソース内にこんな行が出てきます。

'7400'  ←部品名
{X Size =}  4 {Y Size =} 4 {Parts per Package =}  4 ★
L1      1   4   9  12         IN  'I0'  ←ピン指定
L3      2   5  10  13         IN  'I1'
R2      3   6   8  11 DOT     OUT 'O'
T0     14  14  14  14         PWR 'VCC'
B0      7   7   7   7         PWR 'GND'

★部分で部品の大きさとパッケージ内の個数を示しています。
前処理としてコメント文字列である「 {xxx} 」を消して、
数字「4 4 4」だけを残したいのですが、この↓正規表現
ではうまくいきません。

   gsub(/{.*}/, "", $0)

{ }に囲まれた文字列という正規表現なのですが、
   {xxx} yyy {xxx} zz が
   1   2      3    4

残したいyyyまで消えて、最後尾のzzしか残らない
のです。
「/{.*}/」だと、{ }のくくりを、2と3を飛ばして「1~4」にし
ちゃっています。
ほんとは、1~2で処理。続いて3~4で処理と{ }を含
めて{ }内の文字列を消して欲しいのです。
しかたなく、↓のようなスクリプトでもって{ }を消して
います。
1文字ごと読み出して { 出現でコピーをオフ、} 検出以降
にコピー再開。

  ※こりゃawkのスクリプトじゃないぞ(笑)

#####   コメントを取り除く      #####
#   読み出したデータの中から「コメントフィールド」を取り除く
#   OrCADのライブラリソースのコメントは「{...}」となっている
#   直接バッファを操作して「{}」とコメントを取ってしまう
#   gsub(/{.*}/, "", $0)だと
#   「{xxx} yyy {xxx} zz」が yyyまで消えてzzしか残らない
function rmvcmnt(s,  c,f)
{
    r_bff = "";
    f = 0;              # 1で文字コピー禁止
    for(i = 1; i <= length(s); i++){
        c = substr(s, i, 1);                # 1文字取り出し
        if(c == "{")        f = 1;          # 「{」以降はコピーしない
        else if(c == "}")   f = 0;          # コピー再開
        else if(f == 0){                    # 文字連結
            r_bff = r_bff c;                # {xxx}以外の文字はコピー
        }
    }
    return r_bff;       # コメント削除した1行
}

正規表現を使っての何か良い手順はありませんかね?

※参考
ファイルから読み出した1行は「$0」に入る。
function rmvcmnt(s,  c,f)の s は関数への引数。
その次にスペースをあけてのc,fは関数内部だけの局所変数。

ほかにも、「 { } 」で囲まれたこんなコメントがあります。

      {000000000011111111112}
      {.....................}
      {012345678901234567890}
{  0.0}##...................
{  0.1}#.##.................
{  0.2}#...##...............
{  0.3}#.....##.............
{  0.4}#.......##...........
{  0.5}#.........##.........
{  0.6}#...........##.......
{  0.7}#.............##.....
{  0.8}#...............##...
{  0.9}#.................##.
{  1.0}#...................#
{  1.1}#.................##.
{  1.2}#...............##...
{  1.3}#.............##.....
{  1.4}#...........##.......
{  1.5}#.........##.........
{  1.6}#.......##...........
{  1.7}#.....##.............
{  1.8}#...##...............
{  1.9}#.##.................
{  2.0}##...................

これも行の中から消してしまいたいわけでして。

{X Size =}  、 {Y Size =}、{Parts per Package =}は
固定文字列なんで3つを個別にgsubで先に処理。
その後、「{  2.0}」などを正規表現で削除かな。

こんな具合に。

#    コメント文 {xxx} を消す
   gsub("{X Size =}", "", $0);                # コメント削除               
    gsub("{Y Size =}", "", $0);
    gsub("{Parts per Package =}", "", $0);
    gsub(/{.*}/, "", $0);                    # 残りの{...}を全部
   :

 

 

 

| | コメント (4) | トラックバック (0)