カウンタカードやD/A変換カードのインターフェース関数の例を次に示す。 RTMATXにはパソコンのI/Oポートをアクセスする関数,16進数表記, 整数のビット操作関数が準備されているので,それらを用いれば, I/Oカードのインターフェース関数をRTMATXの関数として記述できる。 もちろん,C言語で関数を記述しリンクすることも簡単にできる。
カウンタ(CONTEC, CNT24-4(PC))のモード設定関数,初期値設定関数,
初期化関数の例を次に示す。
// カウンタのモード設定 Func void count_mode(port) Integer port; { Outportb(CNT_COM, port + 1); Outportb(CNT_DAT, MODE_CNT); }
// カウンタの初期値設定 Func void count_set(port, data) Integer port; Integer data; { Outportb(CNT_COM, port); Outportb(CNT_DAT, rem(data, 0x100)); data = data / 0x100; Outportb(CNT_DAT, rem(data, 0x100)); data = data / 0x100; Outportb(CNT_DAT, rem(data, 0x1000)); }
// カウンタの初期化 Func void count_init() { Integer i, ch_port; void count_mode(), count_set(); for (i = 1; i <= CNT_CH; i++) { ch_port = 5 * (i - 1); count_mode(ch_port); count_set(ch_port, 0); } }
Func Integer count_get(ch) Integer ch; { Integer ch_port; Integer d1, d2, d3, data; ch_port = 5 * (ch - 1); Outportb(CNT_COM, 0x14); Outportb(CNT_DAT, 0x7); Outportb(CNT_COM, ch_port); d1 = Inportb(CNT_DAT); d2 = Inportb(CNT_DAT); d3 = Inportb(CNT_DAT); data = d3*0x10000 + d2*0x100 + d1; if (data > 0x800000) { data = data - 0xffffff - 1; } return data; }
D/A変換(CONTEC)の出力関数の例を次に示す。
Func void da_conv(da_port, da_data) Index da_port; Matrix da_data; { Integer i, data_i; Real data; for (i = 1; i <= length(da_port); i++) { data = da_data(i); if (data >= 10.0) { data = 9.9951; } else if (data <= -10.0) { data = -10.0; } data_i = Integer(4096.0 * (data + 10.0) / 20.0); if (rtIsTesting() == 0) { Outport(PORTNO_da, data_i*0x10 + da_port(i)-1); } } }
D/A変換器へ0[v]に設定する関数の例を次に示す。
Func void da_zero() { Integer i; Index da_port; Matrix da_data; void da_conv(); da_port = Z(DA_CH, 1); da_data = Z(DA_CH, 1); for (i = 1; i <= DA_CH; i++) { da_port(i) = i; da_data(i) = 0.0; } da_conv(da_port, da_data); }