プリント基板設計・シミュレーション

TOP > アポロレポート > コラム > 第59回 プログラミングについて(ガーバフォーマット等)
コラム
2024/02/28

第59回 プログラミングについて(ガーバフォーマット等)

アポロレポート

 長いことプログラムを書いていると色々な形式のファイルに出会います。特に私は基板CAD関係のプログラムに携わっていたものですから、これに関係するファイルの形式に出会う機会が多かったと思います。

 基板CADを扱って最初に出会うのが、ガーバーフォーマットというものです。この業界では、この名前の形式は極々当たり前のものなのですが、実はこの形式の歴史について、私はさっぱり分かりません。今でこそASCIIコードで受け渡しすることが多くなりましたが、10年程前まではEBCDECコードで行なうのが一般的だったので、多分IBMのマシンが絡んでいるのではないかと推測されます。が、推測の域を脱しません。ガーバーフォーマットは、おおよそ次のような形式です。

 G90*G01*D10*D02*X10Y20*D01*X40Y20 ...

 これは、テキスト形式の単純な描画データを表現するもので、フォトプロッタを動作させる目的に主に使用されています。G90 は絶対座標値であることを意味し、G01 は指定された座標までを直線移動することを意味します。D10 は10番のアパーチャ(光で図を描画するので、光を出す穴のこと)を選択、D02 はシャッタークローズ、X..Y..は座標値、D01 はシャッターオープンを意味します。これだけ説明すると、上の例がどんなことを意味しているかは理解できると思います。

 ガーバーフォーマットの次に基板CADで出会うのは、基板に穴を開けるNCマシン用のデータです。このフォーマットの正式な名称は聞いたことがないのですが、次のようなものです。

 G90*G01*T1*X10Y20*X20Y20...

 殆どガーバーフォーマットと同じです。アパーチャ選択にDコードを使わずに、Tコード(多分ツールの意味)を使っているところが大きな違いです。昔は穴開けデータはそれほど大きなものではないので、紙テープでデータの受け渡しを行なっていました。ですのでテープを扱いやすいように、データの先頭や、ツールの交換の前後にヌル文字を入れていたものです。紙テープは人間が見ても慣れてしまえばどのようなデータなのかが分かるため、切り貼りして編集などもしていたようです。面白いのは、紙テープの先頭に、このテープの内容が何であるかを示すのに、人間が読める文字列をいれていたことでした。要するに、テープの先頭に ABCDE という文字をそのままパンチするのです。
 
 例えば、Aという文字をパンチするにはこの文字を次の形にすると、

 0 ...o...
 1 ..o.o..
 2 .o...o.
 3 o.....o
 4 ooooooo
 5 o.....o
 6 o.....o
 7 o.....o

 f8 14 12 11 12 14 f8 のデータ(16進数)をパンチする訳です。

 基板CADで特有なものはこれら2つのフォーマットのデータですが、それら以外にも図をペンプロッタに描画するためのフォーマットがあります。多分現在ではペンプロッタのフォーマットと言えばHPGLフォーマットが一般的だと思いますが、10年程前までは、カルコンプフォーマットというのが一般的でした。ペンプロッタはカルコンプ社(アメリカの会社)が世界を席巻していましたので、これが一般的だったのです。
 カルコンプフォーマットには様々なバージョンがあるのですが、どれもバイナリ形式のものです。例えば、CALCOMP921フォーマットを16進数で表現すると、

01 E8 00 00 01 E4 00 00 1F 19 19 1F 00 00 00 00 00 00 0F ......

となります。これでは何がなんだか分からないと思います。ここでは突っ込んだ説明はしませんが、感心することはデータを小さくするための仕組みです。通常、座標値はXとYの値で示されます(直交座標)が、(100、200)から(101、200)に直線を描画するとします。いまプロッタの解像度が0.01であるとすると、絶対座標値で表現すれば、

 X10000 Y20000 ここから
 X10100 Y20000 ここに直線を引く

となりますが、相対座標値では、

 X10000 Y20000 ここから
 X100   Y0     ここに直線を引く

ということになります。すべての座標値を相対座標値で表現すれば、必要な文字数(本当はビット数)は少なくても済むことになります。ここまでは誰でも気が付くのですが、このフォーマットの場合、XまたはYの変化量が0のときには記述をしません。また、ペンプロッタに描画する場合、長い線を描画する確率は非常に少ないので、一度に表現できる座標値の変化量を最大で3文字(3x8=24ビット)までとしているのです。ですので、3文字で表現できない長い線を描画するときには、複数の線をつなげて描画させるようにするのです。
 
 座標値の前に座標値の符号とバイト数を示す1バイトの情報を次のように定義するとします(実際は違う値ですが)。

 7654 3210
 | |  | |Yのバイト数(2ビット)
 | |  |
 | |  Yの符号
 | Xのバイト数(2ビット)
 Xの符号

すると、X100 Y0は、

 10 64

と16進数で表現することができることになります。

 次にペンプロッタ用のフォーマットで有名なHPGLフォーマットですが、どうして最近はこのフォーマットの方が一般的になったかというと、10年程前だったかHP社がカット紙を使った低価格のペンプロッタを発売し、それが大量に売れたのが大きな原因です。この成功のおかげでHP社のプロッタがカルコンプ社のプロッタを圧倒し、世界の標準を変えてしまったのです。もう1つ考えられることは、このフォーマットがテキスト形式だったからだということです。HPGLフォーマットは次のような形式です。

 IN;PA;IP0,0,16800,11880;SC0,16800,0,11880;PU;
 SP3;PA5400,-150;PD;AA5400,-160,180,45;
 PA9400,-170;AA9400,-160,180,45;
        :
        :

 細かい説明は特にはしませんが、見ているとなんとなく理解できる形式だと思います。テキスト形式の場合は、やはりバイナリの形式と比べるとどうしても大きなデータとなってしまいます(バイナリの形式に無駄が多いときは別ですが)。

 プリンタのフォーマットではCANONのレーザーショット用のLIPSがあります(私はこれしか経験したことがありませんので悪しからず)。基本的にはバイナリの形式なのですが、データの殆どがアスキー文字になるように設計されているところが感心させられるところです。例えば整数値の表現は、

 上位バイト                最下位バイト
 01□□□□□□  01□□□□□□ .... 001S□□□□
                         |
                         符号

のようになっていて、□の中に有効な値を入れるようになっています。この形式だと、□の中がどんな値であっても、40h~7Fhにしかならないので、ASCII文字として表現できることになります。また最下位バイトか否かを5ビット目で判断しているのでデータを順に読んでいけば1つの値として判定することができることになります。

 DXFフォーマットといえば、現在では図形データをCAD間でやり取りするときに使用される汎用の形式になっていますが、これは AutoCAD 用のデータ受け渡し用のテキスト形式のフォーマットです。あまりにも AutoCAD が売れたためにこのフォーマットが標準のようになってしまいました。あくまでも AutoCAD 用ですので、AutoCADの状態設定情報までが、このフォーマットに含まれています。DXFフォーマットは次のような形式です。

  0
 SECTION
  2
 HEADER
  9
 $ACADVER
  1
 AC1012
  9
 $DWGCODEPAGE
  3
 dos932
  9
 $INSBASE
  10
 0.0
  20
 0.0
  30
 0.0

最初の行にグループコードといって値の意味を表す整数値、その次の行に値という2行が1組になっている形式です。単純で拡張しやすい形式ですが、この形式は非常に大きなデータになってしまいます。

 今回紹介したデータのフォーマット以外にもファイルの形式には様々なものがあります。プログラミング言語のソースの形式もデータのフォーマットと考えられます。C言語は、

 #include <stdio.h>
 main()
 {
  printf("ABCDE\n");
 }

FORTRANは、

   WRITE(6,100)
100 FORMAT(1H,'abcde')
   END

など、表現の方法には際限がありません。いずれにせよ、データを読み込むときにはそのフォーマットに合った方法で行なわなければなりません。

 ファイルの入出力プログラムを作る場合に注意しなければならないのは、出力は極力必要最小限の命令を使用することです。読み込むプログラムは当然のことですが汎用とするのであれば、そのフォーマットのすべてを網羅しなければなりません。
 例えば、DXFフォーマットのデータの入出力プログラムを作るとしたら、書き出すプログラムを必要最小限の命令で構成しておけば、殆どのDXFフォーマットを読み込むプログラムで問題は生じませんが、使用頻度の低い命令を使ったときにはその命令をサポートしていない可能性があるので読み込めない可能性があります。逆に、読み込むプログラムはできる限り多くの(出来ればすべての)命令をサポートしておかないと、読み込めない可能性が生じるのです。

 自分でファイルの形式を設計するときに注意することは、形式の曖昧さをなくすことと、入出力の行ないやすさを考慮することです。実のところ、自分でもかなりいい加減にやってしまうことがあるので、偉そうなことは言えませんが、親切な形式にしたいものです。

 それではまた次回。


そのお悩み、
アポロ技研に話してみませんか?

アポロ技研でワンランク上の物創りへ!
そのお悩み、アポロ技研に話してみませんか?