DAQ-Xシリーズ デジタル入出力ユニット Pythonサンプルプログラム
ソフトウェアマニュアル にPythonのサンプルコードは記載しておりません。
また、ソフトウェアパックにもPythonのサンプルプログラムは含まれておりませんので、Pythonで使用される場合は以下を参考にしてください。
サンプルプログラム
簡易デジタル入出力のサンプル
import sys
from ctypes import *
ydx = windll.LoadLibrary('ydx.dll')
# オープン
id = c_int()
result = ydx.YdxOpen(0, b'DIO-16/16C-USC', 0, byref(id))
# result = ydx.YdxOpen(0, b'DIO-16/16D-UBC', 0, byref(id))
# result = ydx.YdxOpen(0, b'DIO-16/16D-USC', 0, byref(id))
if result != 0:
print("オープンできませんでした。(code = {0})".format(result))
sys.exit()
# OUT0-15の出力
output_values = (c_int * 16)(1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1)
result = ydx.YdxDoOutputBit(id, 0, 16, byref(output_values))
if result != 0:
print("出力に失敗しました。(code = {0})".format(result))
else:
print("出力しました。")
# IN0-15の入力
input_values = (c_int * 16)()
result = ydx.YdxDiInputBit(id, 0, 16, 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))
高機能デジタル入力のサンプル
def di_polling():
# データバッファの設定
result = ydx.YdxDiSetBuffer(id, 0) # FIFOバッファ
# result = ydx.YdxDiSetBuffer(id, 1) # リングバッファ
if result != 0:
print("YdxDiSetBuffer: Error (code = {0})".format(result))
return
# サンプリングクロックの設定
result = ydx.YdxDiSetClock(id, 0) # 内部クロック
if result != 0:
print("YdxDiSetClock: Error (code = {0})".format(result))
return
# 内部クロック周期の設定
period = c_double(1000)
result = ydx.YdxDiSetClockInternal(id, period) # 1000uSec
if result != 0:
print("YdxDiSetClockInternal: Error (code = {0})".format(result))
return
# サンプリング開始条件の設定
result = ydx.YdxDiSetStartCondition(id, 0, 0) # ソフトウェア
if result != 0:
print("YdxDiSetStartCondition: Error (code = {0})".format(result))
return
# サンプリング停止条件の設定
result = ydx.YdxDiSetStopCondition(id, 0, 0) # サンプル数
if result != 0:
print("YdxDiSetStopCondition: Error (code = {0})".format(result))
return
# サンプリング停止条件(サンプル数)の設定
result = ydx.YdxDiSetStopSampleNum(id, 100)
if result != 0:
print("YdxDiSetStopSampleNum: Error (code = {0})".format(result))
return
# データをクリア
result = ydx.YdxDiClearData(id)
if result != 0:
print("YdxDiClearData: Error (code = {0})".format(result))
return
# デジタル入力動作を開始
result = ydx.YdxDiStart(id)
if result != 0:
print("YdxDiStart: 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.YdxDiGetStatus(id, byref(status), byref(sample_count), byref(repeat_count))
if result != 0:
print("YdxDiGetStatus: 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_int * sample_count.value)()
result = ydx.YdxDiGetData(id, byref(sample_count), byref(input_values))
if result != 0:
print("YdxDiGetData: Error (code = {0})".format(result))
return
## 表示
for input_value in input_values:
print(" " + hex(input_value)[2:].zfill(4), end='')
import sys
from ctypes import *
ydx = windll.LoadLibrary('ydx.dll')
# オープン
id = c_int()
result = ydx.YdxOpen(0, b'DIO-16/16C-USC', 0, byref(id))
# result = ydx.YdxOpen(0, b'DIO-16/16D-UBC', 0, byref(id))
# result = ydx.YdxOpen(0, b'DIO-16/16D-USC', 0, byref(id))
if result != 0:
print("オープンできませんでした。(code = {0})".format(result))
sys.exit()
# 連続デジタル入力
di_polling()
# クローズ
result = ydx.YdxClose(id)
if result != 0:
print("クローズに失敗しました。(code = {0})".format(result))
高機能デジタル出力のサンプル
def do_polling():
# データバッファの設定
result = ydx.YdxDoSetBuffer(id, 0) # FIFOバッファ
# result = ydx.YdxDoSetBuffer(id, 1) # リングバッファ
if result != 0:
print("YdxDoSetBuffer: Error (code = {0})".format(result))
return
# チャネルの設定
CHANNEL_NUM = 16 # 16チャネルを有効にする
for channel in range(CHANNEL_NUM):
result = ydx.YdxDoSetChannel(id, channel, 1) # 高機能デジタル出力モード
if result != 0:
print("YdxDoSetChannel: Error (code = {0})".format(result))
return
# サンプリングクロックの設定
result = ydx.YdxDoSetClock(id, 0) # 内部クロック
if result != 0:
print("YdxDoSetClock: Error (code = {0})".format(result))
return
# 内部クロック周期の設定
period = c_double(1000)
result = ydx.YdxDoSetClockInternal(id, period) # 1000uSec
if result != 0:
print("YdxDoSetClockInternal: Error (code = {0})".format(result))
return
# データの設定
SAMPLE_NUM = 1000 # サンプル数
output_values = (c_int * SAMPLE_NUM)()
for i in range(SAMPLE_NUM):
output_values[i] = i
result = ydx.YdxDoSetData(id, SAMPLE_NUM, byref(output_values))
if result != 0:
print("YdxDoSetData: Error (code = {0})".format(result))
return
# サンプリング開始条件の設定
result = ydx.YdxDoSetStartCondition(id, 0, 0) # ソフトウェア
if result != 0:
print("YdxDoSetStartCondition: Error (code = {0})".format(result))
return
# サンプリング停止条件の設定
result = ydx.YdxDoSetStopCondition(id, 0, 0) # データ終了
if result != 0:
print("YdxDoSetStopCondition: Error (code = {0})".format(result))
return
# デジタル出力動作を開始
result = ydx.YdxDoStart(id)
if result != 0:
print("YdxDoStart: 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.YdxDoGetStatus(id, byref(status), byref(sample_count), byref(repeat_count), byref(not_out_num))
if result != 0:
print("YdxDoGetStatus: 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'DIO-16/16C-USC', 0, byref(id))
# result = ydx.YdxOpen(0, b'DIO-16/16D-UBC', 0, byref(id))
# result = ydx.YdxOpen(0, b'DIO-16/16D-USC', 0, byref(id))
if result != 0:
print("オープンできませんでした。(code = {0})".format(result))
sys.exit()
# 連続デジタル出力
do_polling()
# クローズ
result = ydx.YdxClose(id)
if result != 0:
print("クローズに失敗しました。(code = {0})".format(result))