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))