dizhi_rj=0x0000;
for(i=0;i<=g;i++) // 从存储器1中读取数据
{
CSY_READ_DATA (vi, 1, dizhi_rj, &m);
n[i+3]=m;
dizhi_rj++;
}
其中dizhi_rj 是希望读取的存储空间地址;g是存储器中数据的个数,由上面读取的弹丸个数计算可得g=2(n+1);CSY_READ_DATA (vi, 1, dizhi_rj, &m)函数中的‘1’表示现在读取的是主寄存器,如果是‘0’,则表示读取的是辅寄存器;m为读取到的数据值;n[i]为存放数据的数组。辅存储器的读取与主存储器类似,此处不再赘述。
另外可以使用函数CSY_READ_DATA_zhu (ViSession vi, int geShu, int d_zhu[])实现对主存储器的一次性读取,核心语句为:
CSY_READ_DATA_zhu (vi, g, n1);
其中vi为仪器句柄,g同样为存储器中数据的个数,n1[i]为存放主存储器数据的数组。
辅存储器与之类似,使用CSY_READ_DATA_FU (vi, g, n2)语句即可。n2[i]为存放辅存储器数据的数组。
因为此时读取的数据是计时器记录的基准时钟信号的个数(由溢出后的余数和溢出次数组成),并不是真正的时间,需要经过换算,主存储器数据换算核心代码如下:
for(i=3;i<=g;i++) //将脉冲个数转换为时间
{
int geshu1=0,over1=0;
geshu1=n1[i];
i++;
over1=n1[i];
nn1[geshu_temp]=(geshu1+over1*65536)*zhouqi/1000000000;
geshu_temp++;
}
其中g为存储器中数据的个数,n1[i]为存放主存储器数据的数组,zhouqi为由“基频选择”控件值换算的基准脉冲的周期,nn1[]数组中存放换算后的值,单位为秒。辅存储器内数据(即二靶的数据)的换算与之类似,换算后的数据存放在nn2[]数组中。
因为数组nn1[]中存放的是相邻弹丸穿过一靶的时间间隔,nn2[]中存放的是相邻弹丸穿过二靶的时间间隔,两数组的最后一个单元存放的都是第一颗弹丸穿过一靶和二靶的时间间隔T,所以使用公式3.2.1就可以计算出各个弹丸的速度,存放入v[i]数组中。
(3.2.1)
其中, 表示第 i 个弹丸的速度;L表示靶间距离,由控件值获得;T表示首发时间间隔; 表示第i+1个弹丸与第 i 个弹丸穿过二靶的时间间隔; 表示第i+1个弹丸与第 i 个弹丸穿过一靶的时间间隔。此公式同样适用于单发的情况,当单发时, 及 均为0,公式可简化为公式3.2.2所示,计算所得即为单发弹丸的速度。
(3.2.2)
计算出各弹丸的速度后,就可以根据弹丸的种类进行不同的显示。流程框图如图3-9所示。
图3-9 数据显示的流程图
单发弹丸时只要显示弹丸速度即可,使用设置控件值函数就可以完成此功能。
连发时需要显示速度分布离散图及弹丸速度列表子面板,此面板在初始化时已经加载,但并未显示,当计算出个弹丸的速度,且判断测试类型为连发时,子面板中的表控件根据弹丸个数及对应的速度值实时的添加表的行列及行列内的数据值,保证每次有多少弹丸就显示多少行,而不是固定行数。主要代码如下:
DisplayPanel (panelXs); //显示列表子面板
for(i=1;i<=geshu;i++)
{
InsertTableRows (panel, PANEL_sudu, i, 1, VAL_CELL_NUMERIC);
SetTableCellVal (panel, PANEL_sudu, MakePoint(1,i), v[i]); 基于VXI总线枪弹杀伤力测试系统应用程序开发(10):http://www.751com.cn/jixie/lunwen_1973.html