オムロンPLCと安川電機PLCとの通信

工場設備などで使用されているPLCとの通信(PLCデバイスメモリ読み書き)は、弊社案件では良く行う内容です。
三菱PLCかキーエンスPLCと通信することが大半で、これは社内ライブラリに実装済みです。
今回、オムロンPLCと安川電機PLCと通信する必要があり、折角なので社内ライブラリに実装し、どのPLCでも共通インターフェイスでアクセス出来るようにする予定です。

他社設備のPCソフトを更新

検査設備などの他社作成PCソフトだけを更新したいというご要望がよくあります。
更新したい理由は色々で、最新のOSやPCに更新したい・機能追加をしたい・品質が低いので作り直したいなど。

大概の場合、元ソフトのソースコードが無いので、仕様書や電気図面などを参考にしたり、元ソフトを色々いじって目でコピーすることなります。

特に問題になるのが設備と独自の通信を行っている場合です。
一般的な通信インターフェイス(RS232C・TCP・GPIBなど)で設備と通信している場合は、通信を中継するソフトを作成して通信内容を調査すればなんとか対応可能です。
特殊なドライバ経由で通信を行っている場合は一番大変。途中のDLLを中継して調べられればラッキーですが、簡単にはいかないですね。
それでも色々な方法を駆使して調べますけど。

他のソフト会社は、このような案件はリスクが高いので引き受けてもくれなかったり、高額だったりするでしょうが、私はこのような案件が大好きですので、ご要望があればご連絡おまちしております。

キーボード入力タイプのバーコードリーダ

工場向けの案件でキーボード入力タイプ(HID)のバーコードリーダを使用することがあります。

キーボードフックを使用してバーコード入力を取得するようにしていたのですが、取得したキーコードでは押されたキーが分かるだけなので、実際にはShiftキーやCtrlキーとのコンビネーションによって、キーコードから文字に変換する必要があります。
今までこの実装を適当に行っており、Shiftキーによる変換があまりできておらず、正しく読めない記号がありました。
今回、実装を見直しまして、ほぼ全てのパターンを網羅できたと思います。

以下がShiftキーを考慮した文字変換です。

return KeyCode switch {
    (int)Keys.Multiply => '*',
    (int)Keys.Separator => '|',
    (int)Keys.Add => '+',
    (int)Keys.Subtract => '-',
    (int)Keys.Decimal => '.',
    (int)Keys.Divide => '/',
    (int)Keys.Oemplus => shift ? '+' : ';',
    (int)Keys.Oemcomma => shift ? ' shift ? '=' : '-',
    (int)Keys.OemPeriod => shift ? '>' : '.',
    (int)Keys.Oem1 => shift ? '*' : ':',
    (int)Keys.Oem2 => shift ? '?' : '/',
    (int)Keys.Oem3 => shift ? '`' : '@',
    (int)Keys.Oem4 => shift ? '{' : '[',
    (int)Keys.Oem5 => shift ? '|' : '\\',
    (int)Keys.Oem6 => shift ? '}' : ']',
    (int)Keys.Oem7 => shift ? '~' : '^',
    (int)Keys.Oem102 => shift ? '_' : '\\',
    (int)Keys.NumPad0 => '0',
    (int)Keys.NumPad1 => '1',
    (int)Keys.NumPad2 => '2',
    (int)Keys.NumPad3 => '3',
    (int)Keys.NumPad4 => '4',
    (int)Keys.NumPad5 => '5',
    (int)Keys.NumPad6 => '6',
    (int)Keys.NumPad7 => '7',
    (int)Keys.NumPad8 => '8',
    (int)Keys.NumPad9 => '9',
    (int)Keys.D0 => '0',
    (int)Keys.D1 => shift ? '!' : '1',
    (int)Keys.D2 => shift ? '"' : '2',
    (int)Keys.D3 => shift ? '#' : '3',
    (int)Keys.D4 => shift ? '$' : '4',
    (int)Keys.D5 => shift ? '%' : '5',
    (int)Keys.D6 => shift ? '&' : '6',
    (int)Keys.D7 => shift ? '\'' : '7',
    (int)Keys.D8 => shift ? '(' : '8',
    (int)Keys.D9 => shift ? ')' : '9',
    >= (int)Keys.A and <= (int)Keys.Z => shift ? (char)KeyCode : (char)(KeyCode + 0x20),
    _ => char.ConvertFromUtf32(KeyCode)[0]
};

I/Oユニット

先日の案件でSUS株式会社のI/OユニットSiOtを使用しました。

いつもはコンテックのI/Oユニットを使用していますが、今回は配線が楽なのと、メーカからスイッチBOXも購入出来るのでSiOtを使用してみました。
I/Oの配線はコネクタ式なので、購入したスイッチBOXを差し込むだけで配線完了です。

PCソフトからイーサネット通信で入力/出力が可能になっています。コマンドは簡単なのですぐに実装可能です。
通信時間が遅いので、同じ出力状態の場合は再送しないようになど細工は必要です。

コンテックと比較してメリットもデメリットもあるので、案件によって使い分けようと思います。
たぶん、PLCと接続する場合はコンテックが良く、ランプ・スイッチ・センサなどに直接接続する場合はSUSが良いと思われます。

ライセンス用のUSBドングル

先日の案件でユーザごとにライセンス認証を行うためにUSBドングル対応を行いました。

市販のUSBドングルを使用する方法ではなく、普通のUSBメモリで認証を行う機能を社内ライブラリに実装しました。
USBメモリの固有情報+秘密キーから作成した認証用ファイルをUSBメモリに入れておくことで実現しています。

簡単な方法ですが、十分な効果があります。

弊社が作成するソフトは工場で使用するものが大半なのでライセンス管理は普段行っていませんが、今後必要な場合には、この方法で簡単に対応出来るようになりました。

VB6で使用できるDLLをC#で作成

先日の案件で、依頼元が作成しているVB6ソフトに通信機能を実装してほしいとのご要望がありました。
しかし、今さらVB6での開発は行いたくないため、C#で通信機能を実装したDLLを作成し、VB6からDLLを
呼び出してもらうようにしました。

この結果、弊社のC#共通ライブラリを使用して効率良く開発が行えました。
特にVB6はスレッドが使用出来ないことがネックになるのですが、C#でDLLを作成することでスレッドも使用できますので、
通信の受信待ちなどをVB6のスレッドを気にせず、別スレッドで非同期に待てるので、とても実装が楽になります。

今回、初めてVB6で使用できるCOM形式のC#DLLを作成しましたので、調査必要な箇所も多かったですが、
詰まることもほぼ無く開発出来ました。

工場の設備などでは年期のはいったVB6ソフトがよく使われています。改造依頼も良くあります。
このような依頼内容の場合は、今後もこの方法が有効であると分かりました。

帳票印刷ツール

先日行いました案件で、ユーザ様からのご要望で帳票印刷ツール「シーオーリポーツ」を使用しました。

あらかじめ印刷レイアウトを付属ソフトで作成しておき、印刷するアプリからは各印刷要素の文字設定・画像設定・表示有無などをコード上から行って印刷が可能です。

印刷レイアウトをコード上で作成・保守する手間が省けるため大幅な工数削減になります。
とくに、あとから頻繁に印刷レイアウトが変更になるような案件では重宝しそうです。

工場向けの案件では印刷することは減ってきておりますが、検査結果をPDFファイルで残しておきたいなどのご要望はありますので、そのような場合に使用できそうです。

温湿度計

弊社で作成する検査ソフトや計測ソフトなどは、結果情報として室温も一緒に測定して残しておくような場合が良くあります。

この場合の室温は厳密な測定値ではなく、一般的な温度計で測定した結果で良いのですが、なかなかベストな機器がなくいつも悩んでいました。
工業用などではあるのですが、高機能で高価な製品ばかりです。
安価なものになると基板剥き出しでRS232Cの結線を行うものばかりになり、このままお客様に収めるには見た目がいまいちです。

そんな中、switchbotの温湿度計を見つけました。安価(2000円くらい)で見た目も良いです。

通信は「Bluetooth LE」を使用します。
まだ案件で使用したことはないのですが、今後のために1台購入して試してみたところ、温度と湿度が測定でき問題なさそうです。
以前にも他のswitchbot製品と通信したことはあるので、実装は簡単に行えました。

今後の温湿度計の部材選定では一番使用することになりそうです。

かんたん見積

ご希望の依頼内容を入力頂くと、最短1時間以内に「かんたん見積金額」をご連絡する「かんたん見積」サービスを開始致しました。
無料で見積をさせて頂きますので、初めてのシステム開発でも気兼ね無く安心してご依頼頂けると考えております。

「工場の生産ラインで使用する検査ソフトを作成したい」、「研究に使用する画像処理ソフトを作成したい」、「既存設備のソフトに機能追加を行いたい」など、ご要望がございましたら、まずは「かんたん見積」で見積のご依頼をお願い致します。

アライメントの画像処理

ウェハなどの対象ワークの検査を行う前に、位置や傾きのアライメント(位置合わせ)を行うことが良くあります。
アライメントを画像処理で行う場合、調整する4点を求めて射影変換を行うことが多いです。

今回行った案件では、2点だけ求めて簡易なアライメントを行うため、アフィン変換を使用しました。

社内ライブラリで内部的にアフィン変換を使用することはありましたが、ライブラリのAPIとして外部から実行出来るようになっていなかったので、今回APIに追加を行いました。1点から3点の任意点数でアフィン変換が行えるようになっています。