我目前正在从事一个项目,该项目涉及Simulink中的数据采集和实时处理。我们有一些专门为这个项目购买的DAQ硬件-即National Instruments DAQ device (USB)。
我必须使用基于会话的接口。我尝试编写一个2级M-S函数,但我的问题是,我不知道应该在哪里创建与daq.createSession函数的会话,以及在哪里可以创建模拟输出。有人有代码示例或建议吗?
或者写C库会很容易吗?我可以为这个C库使用哪个Simulink块?Matlab函数?我能否使用DAQmxErrChk (DAQmxCreateAOVoltageChan(taskHandle,"Dev1/ao0","",-10.0,10.0,DAQmx_Val_Volts,NULL));Simulink白出问题中DAQmx示例的函数?
发布于 2013-04-06 20:11:37
我不能发布我对此的整个解决方案,因为它有很多行代码,这有点违反SO的规定。但是,我会尽我所能解释它是如何工作的,以便您可以做类似的事情。由于我有一组允许您在类中编写二级M-S函数的类,这无疑使我在编写这些代码时的工作变得更容易,但您当然可以在没有类的情况下做到这一点。
基本上,你最好的选择就是为你的区块创建一个遮罩。每次修改掩码参数时,Simulink将调用您的onSetup回调-您通常会在其中设置通道/注册其他M-S函数回调。正是在这个函数中,我创建了我的DAQ会话,如果还没有创建,则更新通道计数、采样率和通道模式(以及任何其他会话信息)。然后,您可以将块的UserData属性设置为您的DAQ会话接口,或者具有对您的DAQ会话的引用的某个句柄类的结构或实例。
您还需要一些方法来对传入数据进行排队。您可以从FileExchange获得一个queue类(我认为有几个),尽管我不确定这些类的速度。我创建了一个使用循环缓冲区作为其数据存储的queue类,因为在这里可能不需要完整地实现链表,而且这样可能会更快(不需要在每次有新的样本进入时删除/实例化一个类)。如果您尝试弹出一个空队列,则类会出错,如果您推入一个已满的队列,则类会发出“queue overrun”类型的错误警告。队列分别在onPostPropagationSetup和onTerminate中分配/释放。
从DAQ会话接收数据时,将调用以下函数
function onDaqDataAvailable(self, data)
self.sampleQueue.push(data.Data);
self.updateOutputStatus();
end
function updateOutputStatus(self)
if self.sampleQueue.filledLocs >= 0.5 * self.sampleQueue.queueLength
self.bOutput = true;
else
self.bOutput = false;
end
drawnow update;
end我不确定这个门槛是否真的有必要,实际上我认为它可能有点太高了,但你可以自己摆弄它。然后,在onOutputs回调中,我们有
function onOutputs(self, block)
if ~self.daqSess.IsRunning
self.daqSess.startBackground();
end
while ~self.bOutput
pause(0.1 * self.frameLength / self.sampleRate);
// Displaying number of samples in queue is useful for debugging here...
// But we should really use a scope instead
disp(self.sampleQueue.filledLocs)
self.updateOutputStatus();
end
// Displaying number of samples in queue is useful for debugging here...
// But we should really use a scope instead
//disp(self.sampleQueue.filledLocs)
samples = self.sampleQueue.pop(self.frameLength);
for nChan = 1:self.nChannels
block.OutputPort(nChan).Data = samples(:, nChan);
end
self.updateOutputStatus();
end这是代码块实际工作方式的基础。需要注意的一点是,您需要将DAQ会话的NotifyWhenDataAvailableExceeds属性设置为合理的值,以便每秒最多可以调用20次onDaqDataAvailable,但是一旦您有了一个样本队列,这就相当简单了。还要注意的是,直到模型真正准备就绪,DAQ会话才真正启动。提前启动它会导致大量队列溢出,因为作用域等打开了它们的UI。
我希望这篇文章已经对它进行了足够的解释,让您可以开发出一个类似的解决方案。
https://stackoverflow.com/questions/15850034
复制相似问题