2022年1月10日月曜日

町工場DXの一環としてVB6プログラムをVB.NETに移行しようとした(そして断念した)話

 今回のテーマは製缶板金加工ではなくソフトウェア開発の話です。

しかも成功ではなく断念した話なのですが、世間でさかんにDXが叫ばれている中、これから同じような状況に遭遇する方達がいるのではないか、トライしたツール情報など何かお役に立てばと思い記事を書こうと考えました。

弊社で使用しているベンディングロール(ロール曲げを行う機械)には、4つのパラメータ(降伏点、板厚、曲げ径、板幅)を入力すると、曲げの可否等を演算してくれるソフトがあります。弊社では機械を5台所有しておりますので、ソフトウェアもそれぞれ用に5種類購入してありました。(正確にはメインのプログラムが1つあり、いわゆるアドインのような形で各機械ごとの演算機能が追加されます。)

このようなソフトウェア構成ですので、例えば「この製品はどの機械で曲げられるのか?」を調べたい時に、いちいち5個の機械ごとに入力して確かめなければならず、非効率的だと感じていました。また、将来的には業務ソフトと連携させて自動で演算させるところまで進めたいという希望もありました。

そこでまず、どのように実装できる可能性があるのか見当を付けるために、リバースエンジニアリングをしてみることにしました。

この演算ソフトはEXEファイルですので中身を知ることはできません。そこで、まずは無償版の逆アセンブラをいくつか試してみました。

EXEからネイティブコードへ逆アセンブリできたのは以下の3つです。

1)VB Decompiler

https://www.vb-decompiler.org/products/jp.htm

2)snowman

http://derevenets.com/index.html

3)Ghidra

https://ghidra-sre.org/

https://www.bioerrorlog.work/entry/ghidra-beginner


※その他、JEBも試しましたが起動すらできませんでした。原因を調べる時間がもったいないので断念です。

https://www.pnfsoftware.com/jeb/community-edition


さて、ネイティブコードへ逆アセンブリした結果、このソフトウェアはVisual Basic 6.0で書かれていることがわかりました。前述のツールのうち、1)VB Decompilerは有償版(VB Decompiler Business License $229)でソースコードにデコンパイルまでできるとのこと。さっそく購入して試してみることにしました。

その結果、Visual Basic 6.0のソースコードらしきものを生成することができました。もしこのソースを自分でコンパイルすることができれば、DLL化して別のプログラムから呼び出すすることもできるでしょう。そうすれば自動化も可能になります。

しかしここで問題が1つ生じます。弊社は製缶板金業を営む町工場ですので、本格的なソフトウェア開発環境が整っているわけではありません。具体的には、Visual Basic 6.0のコンパイルに必要な古いバージョンのVisual Studio(6.0)を持っていないのです(持っているのは最新の無償版だけ)。調べてみたところ、Visual Studio 6.0を手に入れるには、年間10万円以上のMSDNサブスクリプション契約が必要とのことでした。

Visual Basic 6.0 (VB6) のダウンロードについて | 民主主義に乾杯 (python.ms)

そこで、Visual Basic 6.0からVisual Basic .NETへ変換できないかと考えます。Visual Basic .NETであれば、無償版の最新Visual Studioでコンパイルできるからです。

調べてみると、有償の変換ツール(サービス)がいくつかありましたが価格が載っておらず、代わりに「100人月を40人月に減らす」といった謳い文句が載っておりました。IT業界のことはよくわかりませんが、仮に1人月80万円とすると4,800万円のコストダウンに繋がるようなツール(サービス)です。少なくとも数百万円であろうと想像しました。

そこで何とか無償のツールが無いかと探していたところ、gmStudioというソフトウェアの評価版を見つけました。

VB6 to .NET | ASP to .NET | Tools - Great Migrations

評価版では11,000行までというリミットはありますが、とりあえず変換ができるかできないかの判断には使えます。

早速ダウンロードしてトライしてみたところ、空っぽのアウトプットが生成されてしまいました。エラーログを確認したところ、

Content: 140 As String * 5

Expecting identifier of variable being defined 140

RecNo  Content of record

1196         Dim 140 As String * 5

といった文法エラーが発生しておりました。VB Decompilerでデコンパイルしたソースコードには、変数名140のようなソースが含まれてしまっていたようです。

VB Decompilerのメーカーに問い合わせたところ、「Webサイトで謳われているように、ネイティブコードからのデコンパイルの成功率は最高75%で、残念ながらデコンパイルがうまくいかないケースがある」とのことでした。

(変数名が数字にならないようにするぐらいならすぐに改修できるのではないか・・・?)と思いながらも、デコンパイルが上手くいかないのであればリバースエンジニアリング自体をあきらめるしかありません。仕方なく、別の方法で解決することにした、というお話でした。

もし時間ができたらまた記事を書こうと思いますが、概略としてはPythonのAppiumを使ってRPAプログラムを書きました。そして、それを応用して実装したのがロール曲げ自動判定ページです。製缶板金業以外の方には役に立たないと思いますが、一応リンクを張っておきます。

ロール曲げ可否自動判定 (yamajusano.com)

また、せっかくProバージョンのVB Decompilerを購入したので、もし「このEXEをデコンパイルしてみてくれないか」といったご要望があればご相談ください。(ただし著作権等の問題があるものはご遠慮ください。)

最後に、町工場のようなアナログ世界の方こそDXによる伸びしろは大きいと考えています。ITを生かして町工場のDXを一緒にやりたいという方、社員としてでも、パートナー企業としてでも、ご興味がありましたらお気軽にお声をお掛けください。


0 件のコメント:

コメントを投稿