※2019/02/10 IntToBin, IntToBinRev を変更

三共電子の音声再生ボード WAV-5F2 の 255CH 入力のテスト用に 「USB接続デジタル入出力モジュール」 USB-IO2.0(AKI) を使ってみました。2019/02/06

USB-IO の入出力数は 12 点で、設定により入力、出力が変更できます。(出力数の最大は、10点まで)
USB-IO の信号は DC5V レベルなので、DC24V/12V の WAV-5F2 に接続するには、フォトカプラ等が必要になります。

USB-IO との通信は、「バケさんの電子工作」さんの vbausbio.dll Ver.0.70 を使用させて頂きました。
入力設定については、良く分からなかったので、製品に同梱されている Km2Net Inc. のサンプルアプリを使用させて頂きました。Vector でも DL 可能です。


unit Unit4;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;

type
  TForm4 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    UpDown1: TUpDown;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form4: TForm4;
  {
     ・「バケさんの電子工作」
     http://bake-san.blogspot.com/2013/01/vbausbiodllusbio20windows7.html
     vbausbio.dll Ver.0.70 を Delphi で使うサンプルです。

     EXE と同じフォルダに dll を置くだけで動きます。
     入出力の設定は、製品に同梱のサンプルアプリで行えます。
     Vector から DL 可能です。
     https://www.vector.co.jp/soft/winnt/prog/se491872.html

     ・「秋月電子通商」
     USB接続デジタル入出力モジュール USB-IO2.0(AKI)
     http://akizukidenshi.com/catalog/g/gM-05131/
  }
  {
    '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    'VBA用の専用DLL(vbausbio.dll)用定義部
    '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '使用方法
    ' uio_findでUSB-IOを検索・初期化して,その後に
    ' uio_inp/outで読み書きしてください.
    ' uio_seldevで複数のUSB-IOを切り替えて使うことが出来ます.
    ' (uio_findを実行しなくても初めてuio_inp/outを実行するときには自動的に
    ' uio_findが呼ばれます.ただし,最初だけなのでUSB-IOが一度外されて,
    ' もう一度挿された場合などは無視されます.)
    '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    '------------------------------------------------------------------------------
    'USB-IOにPortを指定してデータを出力する
    'p3に1を指定すると,ポート1のp1にパルスを送りポート0を書き換えます
    '   Port    : Portを指定する(0,1)、パルス出力の場合はビット(0~3)
    '   OutDat  : データ(0~255)
    '   p3      : パルス出力有無(0:なし、1:あり)
    '   戻り値  : 0:正常、1:異常
    '------------------------------------------------------------------------------
    Declare Function uio_out Lib "vbausbio.dll" (ByVal Port As Long, _
     ByVal OutDat As Long, ByVal p3 As Long) As Long
}
    function uio_out(Port: integer; OutDat: integer; p3: integer): integer;
      stdcall; external 'vbausbio.dll';
{
    '------------------------------------------------------------------------------
    'USB-IOからPortを指定してデータを取得する
    'p3に1を指定すると,ポート1のp1にパルスを送りポート0から読み込みます
    '   InpDat  : 取得データ(取得したい変数を指定する)
    '   Port    : Portを指定する(0,1)、パルス出力の場合はビット(0~3)
    '   p3      : パルス出力有無(0:なし、1:あり)
    '   戻り値  : 0:正常、1:命令が書けなかった、2:データを取得できなかった
    '------------------------------------------------------------------------------
    Declare Function uio_inp Lib "vbausbio.dll" (ByRef InpDat As Byte, _
     ByVal Port As Long, ByVal p3 As Long) As Long
}
    function uio_inp(var InpDat: Byte; Port: integer; p3: integer): integer;
      stdcall; external 'vbausbio.dll';
{
    '------------------------------------------------------------------------------
    'USB-IOを検索・初期化する
    '   戻り値  : 0:正常、1:必要なドライバが無い、2:USB-IOが繋がってない
    '------------------------------------------------------------------------------
    Declare Function uio_find Lib "vbausbio.dll" () As Long
}
    function uio_find: integer; stdcall; external 'vbausbio.dll';
{
    '------------------------------------------------------------------------------
    'USB-IO用の資源を解放する
    '   戻り値  : 0
    '------------------------------------------------------------------------------
    Declare Function uio_free Lib "vbausbio.dll" () As Long
}
    function uio_free: integer; stdcall; external 'vbausbio.dll';
{
    '------------------------------------------------------------------------------
    '繋がれているUSB-IOの数が戻り値に帰ります
    '   戻り値  : 個数
    '------------------------------------------------------------------------------
    Declare Function uio_getDevs Lib "vbausbio.dll" () As Long
}
    function uio_getDevs: integer; stdcall; external 'vbausbio.dll';
{
    '------------------------------------------------------------------------------
    'USB-IOを番号で指定する
    '   p1      : 番号(0~uio_getdevsで得た個数-1) ただし0から
    '   戻り値  : 0
    '------------------------------------------------------------------------------
    Declare Function uio_selDev Lib "vbausbio.dll" (ByVal p1 As Long) As Long
}
    function uio_selDev(p1: integer): integer; stdcall; external 'vbausbio.dll';
{
    '------------------------------------------------------------------------------
    '番号を指定してVenderIDを取得する
    '   p1      : 番号(0~uio_getdevsで得た個数-1) ただし0から
    '   戻り値  : VenderID
    '------------------------------------------------------------------------------
    Declare Function uio_getVid Lib "vbausbio.dll" (ByVal p1 As Long) As Long
}
    // 0x1352: Km2Net
    function uio_getVid(p1: integer): integer; stdcall; external 'vbausbio.dll';
{
    '------------------------------------------------------------------------------
    '番号を指定してProductIDを取得する
    '   p1      : 番号(0~uio_getdevsで得た個数-1) ただし0から
    '   戻り値  : ProductID
    '------------------------------------------------------------------------------
    Declare Function uio_getPid Lib "vbausbio.dll" (ByVal p1 As Long) As Long
}
    // 0x0120: USB-IO2.0、0x0121: USB-IO2.0(AKI)
    function uio_getPid(p1: integer): integer; stdcall; external 'vbausbio.dll';
{
    '------------------------------------------------------------------------------
    'USB-IOにコマンドデータをセットし、USB-IOからデータを取得する
    '   Dat(0)  : 常に0
    '   Dat(1)  : コマンド
    '   Dat(2)  : 以降データ
    '   Dat(3)  :   :
    '  :
    '   Dat(64)
    '   戻り値  : 0:正常、1:命令が書けなかった、2:データを取得できなかった
    '------------------------------------------------------------------------------
    Declare Function uio_cmd Lib "vbausbio.dll" (ByRef Dat As Byte) As Long
}
    function uio_cmd(var Dat: Byte): integer; stdcall; external 'vbausbio.dll';
{
    '------------------------------------------------------------------------------
    'USB-IO2.0にPortを指定してデータを出力する
    '   OutDat(0): Portを指定する(1~2)
    '   OutDat(1): データ(0~255)
    '   OutDat(2): Portを指定する(1~2)
    '   OutDat(3): データ(0~255)
    '      :
    '   OutDat(7)
    '   戻り値  : 0:正常、1:異常
    '------------------------------------------------------------------------------
    Declare Function uio2_out Lib "vbausbio.dll" _
       (ByRef OutDat As Byte) As Long
}
    function uio2_out(var OutDat: Byte): integer; stdcall; external 'vbausbio.dll';
{
    '------------------------------------------------------------------------------
    'USB-IO2.0からデータを取得する
    '   inDat(0): 取得データ(Port1)
    '   inDat(1): 取得データ(Port2)
    '      :
    '   inDat(7): 取得データ(Port8)予備
    '   戻り値  : 0:正常、1:命令が書けなかった、2:データを取得できなかった
    '------------------------------------------------------------------------------
    Declare Function uio2_inp Lib "vbausbio.dll" _
         (ByRef inDat As Byte) As Long
}
    function uio2_inp(var InDat: Byte): integer; stdcall; external 'vbausbio.dll';
{
    '------------------------------------------------------------------------------
    'USB-IO2.0にデータをセットし、USB-IOからデータを取得する
    '   Dat(0)  : Portを指定する(1~2)
    '   Dat(1)  : データ(0~255)
    '   Dat(2)  : Portを指定する(1~2)
    '   Dat(3)  : データ(0~255)
    '  :
    '   Dat(7) :
    '
    '   Dat(0)  : 取得データ(Port1)
    '   Dat(1)  : 取得データ(Port2)
    '    :
    '   Dat(7) :
    '
    '   戻り値  : 0:正常、1:命令が書けなかった、2:データを取得できなかった
    '------------------------------------------------------------------------------
    Declare Function uio2_inOut Lib "vbausbio.dll" (ByRef Dat As Byte) As Long
}
    function uio2_inOut(var Dat: Byte): integer; stdcall; external 'vbausbio.dll';
{
    '------------------------------------------------------------------------------
    'USB-IO2.0にデータをセットし、USB-IOからデータを取得する
    '   Dat(0)  : Portを指定する(1~2)
    '   Dat(1)  : データ(0~255)
    '   Dat(2)  : Portを指定する(1~2)
    '   Dat(3)  : データ(0~255)
    '  :
    '   Dat(7) :
    '
    '   Dat(0)  : 取得データ(Port1)
    '   Dat(1)  : 取得データ(Port2)
    '    :
    '   Dat(7) :
    '
    '   戻り値  : 0:正常、1:命令が書けなかった、2:データを取得できなかった
    '------------------------------------------------------------------------------
    Declare Function uio2_outIn Lib "vbausbio.dll" (ByRef Dat As Byte) As Long
}
    function uio2_outIn(var Dat: Byte): integer; stdcall; external 'vbausbio.dll';
{
    '------------------------------------------------------------------------------
    'USB-IOにシステム設定データを設定する。
    '   Dat(0)  :
    '   Dat(1)  :
    '  :
    '   Dat(15) :
    '
    '   戻り値  : 0:正常、1:命令が書けなかった、2:データを取得できなかった
    '------------------------------------------------------------------------------
    Declare Function uio2_setSys Lib "vbausbio.dll" (ByRef Dat As Byte) As Long
}
    function uio2_setSys(var Dat: Byte): integer; stdcall; external 'vbausbio.dll';
{
    '------------------------------------------------------------------------------
    'USB-IOからシステム設定データを取得する。
    '   Dat(0)  :
    '   Dat(1)  :
    '  :
    '   Dat(15) :
    '
    '   戻り値  : 0:正常、1:命令が書けなかった、2:データを取得できなかった
    '------------------------------------------------------------------------------
    Declare Function uio2_getSys Lib "vbausbio.dll" (ByRef Dat As Byte) As Long
  }
    function uio2_getSys(var getDat: Byte): integer; stdcall; external 'vbausbio.dll';


implementation

{$R *.dfm}

function IntToBin(x : Integer; bits : integer) : String;
var
  i, k : integer;
begin
  result := '';
  k := x;
  for i := 0 to bits -1 do begin
    result := IntToStr(k and 1) + result;
    k := k shr 1;
  end;
end;
function IntToBinRev(x : Integer; bits : integer) : String;
var
  i, k : Integer;
begin
  result := '';
  k := x;
  for i := 0 to bits - 1 do begin
    result := result + IntToStr(k and 1);
    k := k shr 1;
  end;
end;

procedure TForm4.Button1Click(Sender: TObject);
var
  outDat : array [0..7] of Byte;
begin
  // 出力: Port1
  outDat[0] := 1; // Port1
  // 出力Data : 255 ですべてON
  outDat[1] := UpDown1.Position;
  uio2_out(outDat[0]);
  Sleep(100);

  // 出力: Port2
  outDat[0] := 2; // Port2
  outDat[1] := 4; // bit3 STB ON
  uio2_out(outDat[0]);
  Sleep(100);

  OutDat[0] := 2; // Port2
  OutDat[1] := 0; // bit3 STB OFF
  uio2_out(outDat[0]);
  Sleep(100);

  outDat[0] := 1; // Port1
  outDat[1] := 0; // bit0~7 すべてOFF
  uio2_out(outDat[0]);
end;

procedure TForm4.Button2Click(Sender: TObject);
var
  outDat : array [0..7] of Byte;
begin
  // 出力: Port2
  outDat[0] := 2; // Port2
  outDat[1] := 8; // bit4 STOP ON
  uio2_out(outDat[0]);
  Sleep(100);

  outDat[0] := 2; // Port2
  outDat[1] := 0; // bit4 STOP OFF
  uio2_out(outDat[0]);
end;

procedure TForm4.Button3Click(Sender: TObject);
begin
  uio_find;
  Memo1.Lines.Clear;
  // $1352
  Memo1.Lines.Add('VenderID = ' + uio_getVid(0).ToHexString(8));
  // $121
  Memo1.Lines.Add('ProductID = ' + uio_getPid(0).ToHexString(8));
end;

procedure TForm4.Button4Click(Sender: TObject);
var
  inDat : array[0..7] of Byte;
  i : integer;
begin
  // 入力
  uio2_inp(inDat[0]);
  Memo1.Lines.Clear;
  // inDat[0]: Port1、inDat[1]: Port2 ....の順
  // Port2 はプルアップされているので、開放で H
  for i := 0 to 7 do
    Memo1.Lines.Add(i.ToString + ':' + inDat[i].ToHexString);
end;

end.