20200728のC#に関する記事は3件です。

EPSON製のPOS機器をセットアップする

これは「C#によるPOS開発入門(的な)」と称して連載している記事の1つです。他はこちら

1. はじめに

ドライバーのインストールや使用機器の登録など、セットアップの方法はどのメーカーでもホームページに掲載されているので、読めば大体わかります。
ただ、EPSON製の機器については、カスタマイズ性の高さからセットアップの方法がそこそこ複雑です。理解するまでにかなりの時間がかかったので、この記事ではEPSON製に限って解説しようと思います。

EPSON製以外の機器を使用したい場合でも、この記事を一読すれば、セットアップの一般的な手順をなんとなく掴めると思います。

2. この記事の対象読者

  • EPSON製POS機器のセットアップが上手くいっておらず放置している人
  • 面白そうだったので感熱プリンターを買ってみたものの、動かし方が分からず途方に暮れている人

3. セットアップ

セットアップの手順

  1. POS for .NETをインストール
  2. EPSON OPOS ADK(.NET版)をインストール
  3. ADK同梱のSetupPOSで使用する機器を登録
  4. Memory Switch Setting Utilityで各種設定
  5. 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開発関連の記事を投稿しています。もし良ければこちらからどうぞ。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C#で立体を描く簡易的なプログラム

C#で立体を描くプログラム

立体を描くライブラリはたくさんありますが、今回はそれらは一切使いません。

「極力ライブラリや人の作ったものに頼らない」という考えでやっています。が、高級なことができない・・・。

立体を描くクラス

G3D.cs
using 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関数は、現在の回転角度から指定された回転角度分だけ回転させます。

実行結果

3d.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.py
import 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ファイルで右クリック→プロパティ→全般→最下段の「許可する」にチェック→OK

image.png

DLLと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)]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む