DAQ-Xシリーズ アナログ入出力ユニット Pythonサンプルプログラム

ソフトウェアマニュアル にPythonのサンプルコードは記載しておりません。
また、ソフトウェアパックにもPythonのサンプルプログラムは含まれておりませんので、Pythonで使用される場合は以下を参考にしてください。

サンプルプログラム

簡易アナログ入力のサンプル

import sys
from ctypes import *

ydx = windll.LoadLibrary('ydx.dll')

# オープン
id = c_int()
result = ydx.YdxOpen(0, b'AIO-64/4/1B-USC', 0, byref(id))
# result = ydx.YdxOpen(0, b'AIO-60/4/1B-USC', 0, byref(id))
if result != 0:
  print("オープンできませんでした。(code = {0})".format(result))
  sys.exit()

# 入力
CHANNEL_NUM = 6   # 6チャネル
input_values = (c_float * CHANNEL_NUM)()
result = ydx.YdxAiInputVolt(id, 0, CHANNEL_NUM, byref(input_values))
if result != 0:
  print("入力に失敗しました。(code = {0})".format(result))
else:
  ## 表示
  for channel in range(CHANNEL_NUM):
    if channel == CHANNEL_NUM - 1:
      print("      CH{0}".format(channel))
    else:
      print("      CH{0}".format(channel), end='')
  for input_value in input_values:
    print('{: >8.3f}V'.format(input_value), end='')

# クローズ
result = ydx.YdxClose(id)
if result != 0:
  print("クローズに失敗しました。(code = {0})".format(result))

簡易アナログ出力のサンプル

import sys
from ctypes import *

ydx = windll.LoadLibrary('ydx.dll')

# オープン
id = c_int()
result = ydx.YdxOpen(0, b'AIO-64/4/1B-USC', 0, byref(id))
# result = ydx.YdxOpen(0, b'AIO-04/4/1B-USC', 0, byref(id))
if result != 0:
  print("オープンできませんでした。(code = {0})".format(result))
  sys.exit()

# 出力
output_values = (c_float * 4)(1.2, 3.4, 5.6, 7.8)
result = ydx.YdxAoOutputVolt(id, 0, 4, 0, byref(output_values))
if result != 0:
  print("出力に失敗しました。(code = {0})".format(result))
else:
  print("出力しました。")

# クローズ
result = ydx.YdxClose(id)
if result != 0:
  print("クローズに失敗しました。(code = {0})".format(result))

高機能アナログ入力のサンプル

def ai_polling():
  # データバッファの設定
  result = ydx.YdxAiSetBuffer(id, 0)    # FIFOバッファ
  # result = ydx.YdxAiSetBuffer(id, 1)  # リングバッファ
  if result != 0:
    print("YdxAiSetBuffer: Error (code = {0})".format(result))
    return

  # チャネルの設定
  CHANNEL_NUM = 6   # 6チャネルを有効にする
  for channel in range(CHANNEL_NUM):
    result = ydx.YdxAiSetChannel(id, channel, 1)  # サンプリングをおこなう
    if result != 0:
      print("YdxAiSetChannel: Error (code = {0})".format(result))
      return

  # サンプリングクロックの設定
  result = ydx.YdxAiSetClock(id, 0)   # 内部クロック
  if result != 0:
    print("YdxAiSetClock: Error (code = {0})".format(result))
    return

  # 内部クロック周期の設定
  period = c_double(1000)
  result = ydx.YdxAiSetClockInternal(id, period)    # 1000uSec
  if result != 0:
    print("YdxAiSetClockInternal: Error (code = {0})".format(result))
    return

  # サンプリング開始条件の設定
  result = ydx.YdxAiSetStartCondition(id, 0, 0)   # ソフトウェア
  if result != 0:
    print("YdxAiSetStartCondition: Error (code = {0})".format(result))
    return

  # サンプリング停止条件の設定
  result = ydx.YdxAiSetStopCondition(id, 0, 0)    # サンプル数
  if result != 0:
    print("YdxAiSetStopCondition: Error (code = {0})".format(result))
    return

  # サンプリング停止条件(サンプル数)の設定
  result = ydx.YdxAiSetStopSampleNum(id, 10)
  if result != 0:
    print("YdxAiSetStopSampleNum: Error (code = {0})".format(result))
    return

  # データをクリア
  result = ydx.YdxAiClearData(id)
  if result != 0:
    print("YdxAiClearData: Error (code = {0})".format(result))
    return

  # アナログ入力動作を開始
  result = ydx.YdxAiStart(id)
  if result != 0:
    print("YdxAiStart: Error (code = {0})".format(result))
    return

  print("入力開始 ...")

  YDX_STATUS_BUSY = 0x00000001              # 動作中
  YDX_STATUS_SAMPLE_NUM = 0x00000002        # 監視サンプル数
  YDX_STATUS_START_TRIG = 0x00000004        # 開始条件成立済み
  YDX_STATUS_STOP_TRIG = 0x00000008         # 停止条件成立済み
  YDX_STATUS_SAMPLE_CLOCK_ERR = 0x00010000  # サンプリングクロックエラー発生
  YDX_STATUS_OVERRUN_ERR = 0x00020000       # オーバランエラー発生
  YDX_STATUS_HARDWARE_ERR = 0x00040000      # ハードウェアエラー発生
  YDX_STATUS_COMMUNICATE_ERR = 0x00080000   # 通信エラー発生

  # 動作終了待ち
  # 動作中ステータスがOFFになるまでポーリング
  status = c_int(YDX_STATUS_BUSY)
  sample_count = c_int()
  repeat_count = c_int()

  while (status.value & YDX_STATUS_BUSY) != 0:
    # ステータスの取得
    result = ydx.YdxAiGetStatus(id, byref(status), byref(sample_count), byref(repeat_count))
    if result != 0:
      print("YdxAiGetStatus: Error (code = {0})".format(result))
      return

    if ((status.value & YDX_STATUS_COMMUNICATE_ERR) != 0):
      print("Communicate Error!")
      return
    if ((status.value & YDX_STATUS_HARDWARE_ERR) != 0):
      print("Hardware Error!")
      return
    if ((status.value & YDX_STATUS_OVERRUN_ERR) != 0):
      print("Hardware Error!")
      return
    if ((status.value & YDX_STATUS_SAMPLE_CLOCK_ERR) != 0):
      print("Sample Clock Error!")
      return

  print("入力終了")
  print(" サンプル数={0}".format(sample_count.value))
  print(" リピート回数={0}".format(repeat_count.value))

  # データの読み出し
  input_values = (c_float * (sample_count.value * CHANNEL_NUM))() # データ個数は、サンプル数 * 有効チャネル数
  result = ydx.YdxAiGetDataVolt(id, byref(sample_count), byref(input_values))
  if result != 0:
    print("YdxAiGetDataVolt: Error (code = {0})".format(result))
    return

  ## 表示
  for channel in range(CHANNEL_NUM):
    if channel == CHANNEL_NUM - 1:
      print("      CH{0}".format(channel))
    else:
      print("      CH{0}".format(channel), end='')
  for i, input_value in enumerate(input_values):
    if i % CHANNEL_NUM == CHANNEL_NUM - 1:
      print('{: >8.3f}V'.format(input_value))
    else:
      print('{: >8.3f}V'.format(input_value), end='')
 # for input_value in enumerate(input_values):
 #   print('{: >8.3f}'.format(input_value), end='')

import sys
from ctypes import *

ydx = windll.LoadLibrary('ydx.dll')

# オープン
id = c_int()
result = ydx.YdxOpen(0, b'AIO-64/4/1B-USC', 0, byref(id))
# result = ydx.YdxOpen(0, b'AIO-60/4/1B-USC', 0, byref(id))
if result != 0:
  print("オープンできませんでした。(code = {0})".format(result))
  sys.exit()

# 連続アナログ入力
ai_polling()

# クローズ
result = ydx.YdxClose(id)
if result != 0:
  print("クローズに失敗しました。(code = {0})".format(result))

高機能アナログ出力のサンプル

def ao_polling():
  # データバッファの設定
  result = ydx.YdxAoSetBuffer(id, 0)    # FIFOバッファ
  # result = ydx.YdxAoSetBuffer(id, 1)  # リングバッファ
  if result != 0:
    print("YdxAoSetBuffer: Error (code = {0})".format(result))
    return

  # チャネルの設定
  CHANNEL_NUM = 4   # 4チャネルを有効にする
  for channel in range(CHANNEL_NUM):
    result = ydx.YdxAoSetChannel(id, channel, 1)  # サンプリングをおこなう
    if result != 0:
      print("YdxAoSetChannel: Error (code = {0})".format(result))
      return

  # サンプリングクロックの設定
  result = ydx.YdxAoSetClock(id, 0)   # 内部クロック
  if result != 0:
    print("YdxAoSetClock: Error (code = {0})".format(result))
    return

  # 内部クロック周期の設定
  period = c_double(1000)
  result = ydx.YdxAoSetClockInternal(id, period)    # 1000uSec
  if result != 0:
    print("YdxAoSetClockInternal: Error (code = {0})".format(result))
    return

  # データの設定
  SAMPLE_NUM = 1000   # サンプリング回数
  output_data = (c_float * (SAMPLE_NUM * CHANNEL_NUM))()  # データ個数は、サンプリング回数 * 有効チャネル数
  for i in range(SAMPLE_NUM * CHANNEL_NUM):
    output_data[i] = i * 0.002
  result = ydx.YdxAoSetDataVolt(id, SAMPLE_NUM, byref(output_data))
  if result != 0:
    print("YdxAoSetDataVolt: Error (code = {0})".format(result))
    return

  # サンプリング開始条件の設定
  result = ydx.YdxAoSetStartCondition(id, 0, 0)   # ソフトウェア
  if result != 0:
    print("YdxAoSetStartCondition: Error (code = {0})".format(result))
    return

  # サンプリング停止条件の設定
  result = ydx.YdxAoSetStopCondition(id, 0, 0)    # データ終了
  if result != 0:
    print("YdxAoSetStopCondition: Error (code = {0})".format(result))
    return

  # アナログ出力動作を開始
  result = ydx.YdxAoStart(id)
  if result != 0:
    print("YdxAoStart: Error (code = {0})".format(result))
    return

  print("出力開始 ...")

  YDX_STATUS_BUSY = 0x00000001              # 動作中
  YDX_STATUS_SAMPLE_NUM = 0x00000002        # 監視サンプル数
  YDX_STATUS_START_TRIG = 0x00000004        # 開始条件成立済み
  YDX_STATUS_STOP_TRIG = 0x00000008         # 停止条件成立済み
  YDX_STATUS_SAMPLE_CLOCK_ERR = 0x00010000  # サンプリングクロックエラー発生
  YDX_STATUS_OVERRUN_ERR = 0x00020000       # オーバランエラー発生
  YDX_STATUS_HARDWARE_ERR = 0x00040000      # ハードウェアエラー発生
  YDX_STATUS_COMMUNICATE_ERR = 0x00080000   # 通信エラー発生

  # 動作終了待ち
  # 動作中ステータスがOFFになるまでポーリング
  status = c_int(YDX_STATUS_BUSY)
  sample_count = c_int()
  repeat_count = c_int()
  not_out_num = c_int()

  while (status.value & YDX_STATUS_BUSY) != 0:
    # ステータスの取得
    result = ydx.YdxAoGetStatus(id, byref(status), byref(sample_count), byref(repeat_count), byref(not_out_num))
    if result != 0:
      print("YdxAoGetStatus: Error (code = {0})".format(result))
      return

    if ((status.value & YDX_STATUS_COMMUNICATE_ERR) != 0):
      print("Communicate Error!")
      return
    if ((status.value & YDX_STATUS_HARDWARE_ERR) != 0):
      print("Hardware Error!")
      return
    if ((status.value & YDX_STATUS_SAMPLE_CLOCK_ERR) != 0):
      print("Sample Clock Error!")
      return

  print("出力終了")
  print(" 出力済みサンプル数={0}".format(sample_count.value))
  print(" 動作済みリピート回数={0}".format(repeat_count.value))
  print(" 未出力サンプル数={0}".format(not_out_num.value))

import sys
from ctypes import *

ydx = windll.LoadLibrary('ydx.dll')

# オープン
id = c_int()
result = ydx.YdxOpen(0, b'AIO-64/4/1B-USC', 0, byref(id))
# result = ydx.YdxOpen(0, b'AIO-04/4/1B-USC', 0, byref(id))
if result != 0:
  print("オープンできませんでした。(code = {0})".format(result))
  sys.exit()

# 連続アナログ出力
ao_polling()

# クローズ
result = ydx.YdxClose(id)
if result != 0:
  print("クローズに失敗しました。(code = {0})".format(result))

デジタル入出力のサンプル

import sys
from ctypes import *

ydx = windll.LoadLibrary('ydx.dll')

# オープン
id = c_int()
result = ydx.YdxOpen(0, b'AIO-64/4/1B-USC', 0, byref(id))
# result = ydx.YdxOpen(0, b'AIO-60/4/1B-USC', 0, byref(id))
# result = ydx.YdxOpen(0, b'AIO-04/4/1B-USC', 0, byref(id))
if result != 0:
  print("オープンできませんでした。(code = {0})".format(result))
  sys.exit()

# OUT0出力をON
output_values = (c_int * 1)(1)
result = ydx.YdxDoOutputBit(id, 0, 1, byref(output_values))
if result != 0:
  print("出力に失敗しました。(code = {0})".format(result))
else:
  print("出力しました。")

# IN0-3の入力
input_values = (c_int * 4)()
result = ydx.YdxDiInputBit(id, 0, 4, 1, byref(input_values))
if result != 0:
  print("入力に失敗しました。(code = {0})".format(result))
else:
  print("入力しました。")
  for i, input_value in enumerate(input_values):
      print(' IN{}: {}'.format(i, input_value))

# クローズ
result = ydx.YdxClose(id)
if result != 0:
  print("クローズに失敗しました。(code = {0})".format(result))

関連情報

製品情報
ソフトウェアマニュアル