カウンタカードや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);
}