- 投稿日:2020-07-28T23:55:22+09:00
EPSON製のPOS機器をセットアップする
これは「C#によるPOS開発入門(的な)」と称して連載している記事の1つです。他はこちら
1. はじめに
ドライバーのインストールや使用機器の登録など、セットアップの方法はどのメーカーでもホームページに掲載されているので、読めば大体わかります。
ただ、EPSON製の機器については、カスタマイズ性の高さからセットアップの方法がそこそこ複雑です。理解するまでにかなりの時間がかかったので、この記事ではEPSON製に限って解説しようと思います。EPSON製以外の機器を使用したい場合でも、この記事を一読すれば、セットアップの一般的な手順をなんとなく掴めると思います。
2. この記事の対象読者
- EPSON製POS機器のセットアップが上手くいっておらず放置している人
- 面白そうだったので感熱プリンターを買ってみたものの、動かし方が分からず途方に暮れている人
3. セットアップ
セットアップの手順
- POS for .NETをインストール
- EPSON OPOS ADK(.NET版)をインストール
- ADK同梱のSetupPOSで使用する機器を登録
- Memory Switch Setting Utilityで各種設定
- CheckHealthで動作試験
Microsoft Point of Service(POS for .NET)をインストールする
ダウンロード(公式へ)
ここはインストーラーの案内通りにインストールして大丈夫ですが、オプションとなるSDKもあわせてインストールしておくと便利です。EPSON OPOS ADK(.NET版)をインストールする
EPSONではいくつかのドライバーが提供されています。
- EPSON OPOS ADK(OLE版)……C++での開発向け
- EPSON OPOS ADK(.NET版)……C#、VB.NETでの開発向け
- EPSON Advanced Printer Driver……WPS準拠、Wordやメモ帳等からの印刷向け
など…
今回は「C#による」POS開発入門なので、.NET版のEPSON OPOS ADKをインストールします。
ダウンロード(公式へ)UACの問題
ここに最大の罠が仕掛けられています。
インストール後、EPSON OPOS ADKに同梱されているSetupPOSで使用する機器をADKに登録するのですが、既定のProgram Filesフォルダ内にインストールすると、この処理がUACに阻まれてしまい、登録することが出来ません。このときに表示されるエラーも「SetupPOSの処理に失敗しました。変更した内容は保存されません。」というもので、更に公式には見当違いなFAQもあるため、原因の究明で1日潰れること必至です。
Cドライブ直下にフォルダを作り、その中にインストールすることで回避します。SetupPOSで使用する機器を登録する
インストールしたEPSON OPOS ADKに同梱されているSetupPOS(OPOS for .NET\SetupPOS\Epson.opos.tm.setpos.exe)を管理者権限で実行し、ウィンドウ上部の「追加」ボタンから機器の情報を入力していきます。
シリアル接続の場合(シリアル-USB変換器を利用する場合を含む)は、通信速度を最大の115200bpsにしておくと良いです。初期設定の19200bpsでは、画像1枚の送信にも10秒以上かかってしまうので非常に使いづらいです。
通信を速くした結果、送信データに欠損が出てしまうようなことがあった場合は、パリティ(受信したデータに欠損があるか検知する機能)を設定しましょう。と書きはしましたが、私はまだ一度もデータが欠損しているのを見たことがありません。工場などのノイズが多い環境ではよく発生するものなのでしょうか……?
(サーマルプリンターの場合)Memory Switch Setting Utilityで各種設定をする
Memory Switch Setting Utilityとは、プリンターに内蔵されている設定を記憶するためのメモリースイッチを弄るためのユーティリティです。OPOS ADKに依存せずに動作するため、SetupPOSで機器を登録していなくても設定可能です。
通信速度やパリティなどの設定は、SetupPOSで登録したものに合わせておきます。
モデルによっては、通信速度等をディップスイッチで設定するモードを備えていることがあります。Memory Switch Setting Utilityで通信速度等の項目がグレーアウトされている場合は、ディップスイッチを弄って、メモリースイッチで設定するモードに変更します。CheckHealthTestで動作試験をする
OPOS ADKには、SetupPOSで正しく機器を登録出来ているか、正しく機器をパソコンに接続出来ているかを試すための動作試験用アプリケーション「CheckHealthTest」が同梱されています(OPOS for .NET\CheckHealthTest.exe)。
ここで使用する機器が正常に動作することを確認して下さい。4. 終わりに
この記事以外にもPOS開発関連の記事を投稿しています。もし良ければこちらからどうぞ。
- 投稿日:2020-07-28T16:30:24+09:00
C#で立体を描く簡易的なプログラム
C#で立体を描くプログラム
立体を描くライブラリはたくさんありますが、今回はそれらは一切使いません。
「極力ライブラリや人の作ったものに頼らない」という考えでやっています。が、高級なことができない・・・。
立体を描くクラス
G3D.csusing System; using System.Drawing; using System.Windows.Forms; namespace _3D { class G3D { private Bitmap canvas; private Graphics g; private PictureBox pictureBox; private double x_adj, y_adj; private double x_theta = 0, y_theta = 0, z_theta = 0; public G3D(PictureBox p) { pictureBox = p; canvas = new Bitmap(p.Width, p.Height); g = Graphics.FromImage(canvas); x_adj = p.Width / 2; y_adj = p.Height / 2; } public void cuboid(double x1, double y1, double z1, double x2, double y2, double z2) { g.Clear(Color.Black); Point[] p = { point_culc(x_theta, y_theta, z_theta, x1, y1, z1), point_culc(x_theta, y_theta, z_theta, x2, y1, z1), point_culc(x_theta, y_theta, z_theta, x2, y2, z1), point_culc(x_theta, y_theta, z_theta, x1, y2, z1)}; g.DrawPolygon(Pens.White, p); Point[] p1 = { point_culc(x_theta, y_theta, z_theta, x2, y1, z1), point_culc(x_theta, y_theta, z_theta, x2, y2, z1), point_culc(x_theta, y_theta, z_theta, x2, y2, z2), point_culc(x_theta, y_theta, z_theta, x2, y1, z2)}; g.DrawPolygon(Pens.White, p1); Point[] p2 = { point_culc(x_theta, y_theta, z_theta, x1, y1, z1), point_culc(x_theta, y_theta, z_theta, x1, y2, z1), point_culc(x_theta, y_theta, z_theta, x1, y2, z2), point_culc(x_theta, y_theta, z_theta, x1, y1, z2)}; g.DrawPolygon(Pens.White, p2); Point[] p3 = { point_culc(x_theta, y_theta, z_theta, x1, y1, z2), point_culc(x_theta, y_theta, z_theta, x2, y1, z2), point_culc(x_theta, y_theta, z_theta, x2, y2, z2), point_culc(x_theta, y_theta, z_theta, x1, y2, z2)}; g.DrawPolygon(Pens.White, p3); Point[] p4 = { point_culc(x_theta, y_theta, z_theta, x1, y1, z1), point_culc(x_theta, y_theta, z_theta, x2, y1, z1), point_culc(x_theta, y_theta, z_theta, x2, y1, z2), point_culc(x_theta, y_theta, z_theta, x1, y1, z2)}; g.DrawPolygon(Pens.White, p4); Point[] p5 = { point_culc(x_theta, y_theta, z_theta, x1, y2, z1), point_culc(x_theta, y_theta, z_theta, x2, y2, z1), point_culc(x_theta, y_theta, z_theta, x2, y2, z2), point_culc(x_theta, y_theta, z_theta, x1, y2, z2)}; g.DrawPolygon(Pens.White, p5); g.DrawLine(Pens.Red, point_culc(x_theta, y_theta, z_theta, 100, 0, 0), point_culc(x_theta, y_theta, z_theta, 0, 0, 0) ); g.DrawLine(Pens.Green, point_culc(x_theta, y_theta, z_theta, 0, 100, 0), point_culc(x_theta, y_theta, z_theta, 0, 0, 0) ); g.DrawLine(Pens.Yellow, point_culc(x_theta, y_theta, z_theta, 0, 0, 100), point_culc(x_theta, y_theta, z_theta, 0, 0, 0) ); pictureBox.Image = canvas; } public void camera_change(double rotx,double roty,double rotz) { x_theta = rotx; y_theta = roty; z_theta = rotz; theta_lim(ref x_theta); theta_lim(ref y_theta); theta_lim(ref z_theta); } public void camera_step(double rotx, double roty, double rotz) { x_theta += rotx; y_theta += roty; z_theta += rotz; theta_lim(ref x_theta); theta_lim(ref y_theta); theta_lim(ref z_theta); } private void theta_lim(ref double t) { if (t > 360) { t -= 360; } if (t < 0) { t = 360 + t; } } /// <summary> /// /// </summary> /// <param name="rotx">X軸回転角度</param> /// <param name="roty">Y軸回転角度</param> /// <param name="rotz">Z軸回転角度</param> /// <param name="x">X座標</param> /// <param name="y">Y座標</param> /// <param name="z">Z座標</param> private Point point_culc(double rotx, double roty, double rotz, double x, double y, double z) { //X軸周りで回転 double X_x = x * 1; double Y_x = y * Math.Cos(rotx * (Math.PI / 180)) - z * Math.Sin(rotx * (Math.PI / 180)); double Z_x = y * Math.Sin(rotx * (Math.PI / 180)) + z * Math.Cos(rotx * (Math.PI / 180)); //Y軸周りで回転 double X_y = X_x * Math.Cos(roty * (Math.PI / 180)) + Z_x * Math.Sin(roty * (Math.PI / 180)); double Y_y = Y_x * 1; double Z_y = -X_x * Math.Sin(roty * (Math.PI / 180)) + Z_x * Math.Cos(roty * (Math.PI / 180)); //Z軸周りで回転 double X_z = X_y * Math.Cos(rotz * (Math.PI / 180)) - Y_y * Math.Sin(rotz * (Math.PI / 180)); double Y_z = X_y * Math.Sin(rotz * (Math.PI / 180)) + Y_y * Math.Cos(rotz * (Math.PI / 180)); double Z_z = Z_y * 1; return new Point((int)(X_z + x_adj), (int)(Y_z + y_adj)); } } }3D描画するクラスです。
コンストラクタは、描画するためのPictureBox
を引数に取っています。void cuboid(double x1, double y1, double z1, double x2, double y2, double z2)
cuboid
関数は、直方体の対角線上にある2点の座標を引数に取ります。
実行すれば、PictureBox
に直方体を描くことができます。void camera_change(double rotx,double roty,double rotz)void camera_step(double rotx, double roty, double rotz)
camera_change
関数とcamera_step
関数は視点を変える関数です。X,Y,Z軸の回転角度を引数に取ります。
camera_change
関数は、指定された回転角度にします。
camera_step
関数は、現在の回転角度から指定された回転角度分だけ回転させます。実行結果
- 投稿日:2020-07-28T13:00:24+09:00
pythonnetを使って.NETのDLLをpythonから呼ぶときの注意点とエラー対処方法
pythonnet - Python.NETとは
Pythonから.NET向けのDLLを呼び出すことができるライブラリです.
MITライセンスとなっており,だれでも無償で使うことができます.
https://github.com/pythonnet/pythonnet使い方
使い方はこちらの記事が大変参考になりました.
Pythonから.NETを呼び出す方法とついでにその逆もここでは簡単に紹介します.
インストール方法
pip install pythonnet
使用例
test.pyと同じディレクトリにあるABCLIb.dllを使いたい場合.
別のディレクトリにある場合は適宜パスを追加してください.clr.AddReference('./DEF/ABCLib')
など.test.pyimport clr clr.AddReference('ABCLib') from ABCTools import ABCLib abc = ABCLib()
clr
はCommon Language Runtimeの略のようです.注意点とエラーが起きたとき対処方法
私がpythonnetを使用したときにつまづいたポイントとその対象方法を紹介します.
.dllを書かない
エラー:System.IO.FileNotFoundException: Unable to find assembly 'ABCLib.dll'.
clr.AddReference
するときに拡張子'.dll'を書いているとこのエラーが発生します。
'.dll'を消してみましょう。# エラーが発生する例 clr.AddReference('ABCLib.dll') # エラーが発生しない例 clr.AddReference('ABCLib')セキュリティを許可する
エラー:System.IO.FileNotFoundException: Unable to find assembly 'ABCLib'.
外部から取得してきたdllの場合、ファイルへのアクセスがブロックされていることがあります。
アクセスを許可する設定をしてみてください。
dllファイルで右クリック→プロパティ→全般→最下段の「許可する」にチェック→OKDLLとPythonで64bit/32bitを合わせる
エラー:System.IO.FileNotFoundException: ファイルまたはアセンブリ 'ABCLib, Version=~~~~~~~~, Culture=neutral, PublicKeyToken=null'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。
DLLとPythonのbitが合っていないと読み取ることができませんでした。
- Pythonのbitの調べ方
import sys print(sys.version)出力3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)]
- DLLのbitの調べ方
こちらの記事を参考にさせていただきました。EXE、DLLが32bitなのか64ビットなのか確認する方法 - Qiita