Delphi で USB I/O (Y2 Corporation) を使う 2018/08/04

株式会社ワイツー様(リンクは、こちら)の USB I/O を Delphi から使ってみました。
非絶縁タイプであれば、I/O 1点当たりのコストパフォーマンスが非常に良いです。

最新のドライバでは、Windows 10 にも対応しています。
最新の Ydu.dll では、YduOpen に接続モードが追加されています。


サンプルコード(関連部分のみ)

  //*********************************** USB I/O ***********************************
  
  const YDU_RESULT_SUCCESS         = 0;            // 正常終了
  const YDU_RESULT_ERROR           = $CE000001;    // エラー
  const YDU_RESULT_NOT_OPEN        = $CE000002;    // オープンされていない
  const YDU_RESULT_ALREADY_OPEN    = $CE000003;    // オープン済み
  const YDU_RESULT_INVALID_UNIT_ID = $CE000004;    // ユニットIDが不正
  const YDU_RESULT_INVALID_EPNO    = $CE000005;    // EP指定が不正(内部エラー)
  const YDU_RESULT_CANNOT_OPEN     = $CE000006;    // デバイスがオープンできなかった
  const YDU_RESULT_EXT_BOARD_OVER  = $CE000007;    // 拡張ボード数上限オーバー
  const YDU_RESULT_PARAMETER_ERROR = $CE000008;    // 引数不正
  const YDU_RESULT_MEM_ALLOC_ERROR = $CE000009;    // メモリ確保エラー
  const YDU_RESULT_MODELNAME_ERROR = $CE00000A;    // 型名指定が不正

  const YDU_RESULT_FATAL_ERROR     = $CEFFFFFF;    // 致命的エラー

  const DEVICE_CLOSED = 0;
  const DEVICE_OPENED = 1;

  // Ydu.dll プロトタイプ
  // 新バージョン(接続モードが追加されてる)
  function YduOpen (wUnitID: WORD; lpszModelName: AnsiString; wMode: WORD):longint; stdcall;external 'Ydu.dll';
  
  // 旧バージョン(WinXP + Delphi 2007あたり)
  // function YduOpen (wUnitID: WORD; lpszModelName:LPCTSTR; wMode : WORD): longint; stdcall; external 'Ydu.dll';
  
  function YduClose(wUnitID: WORD):boolean; stdcall; external 'Ydu.dll';
  function YduDioOutput(wUnitID: WORD; var byData: BYTE; wStart: WORD; wCount: WORD): longint; stdcall; external 'Ydu.dll';
  function YduDioInput (wUnitID: WORD; var byData: BYTE; wStart: WORD; wCount: WORD): longint; stdcall; external 'Ydu.dll';

  //*******************************************************************************


// 読込部分
var
  InputAry : array [0..191] of BYTE;
  YduResult : LongInt;
  intOpenFlag : integer;
begin
  // オープン(ユニットID, 型番, モード)
  YduResult := YduOpen(0, 'DIO-N192/00A-U', 0);
  
  if YduResult = YDU_RESULT_SUCCESS then
     intOpenFlag := DEVICE_OPENED;
  // 読込
  if intOpenFlag = DEVICE_OPENED then begin
    YduResult := YduDioInput(0, InputAry[0], 0, 192);
    // クローズ
    YduClose(0);
  end;
end;