控制matlab脚本(暂停、重置)
我试图创建一个matlab脚本(m文件),该脚本应由外部VBA脚本控制 对于一定数量的循环,每次(即使参数改变,但在这种情况下不是问题)matlab脚本都应执行相同的操作。 如果我看得对,我可以在VBA中使用matlab函数,如下所示: 我的主要问题是如何实现这个问题的matlab部分…目前我的控制部分如下所示:控制matlab脚本(暂停、重置),matlab,loops,controls,Matlab,Loops,Controls,我试图创建一个matlab脚本(m文件),该脚本应由外部VBA脚本控制 对于一定数量的循环,每次(即使参数改变,但在这种情况下不是问题)matlab脚本都应执行相同的操作。 如果我看得对,我可以在VBA中使用matlab函数,如下所示: 我的主要问题是如何实现这个问题的matlab部分…目前我的控制部分如下所示: function processRun(run,reset) while run ~= 0 % Loop until external reset of 'run'
function processRun(run,reset)
while run ~= 0 % Loop until external reset of 'run' to '0'
if reset ~= 0
doReset; % Reset the parameters for the processing
reset = 0;
disp('I did a reset');
end
disp('I am processing');
[run,reset] = doProcess;
pause(1)
end
start.m:
run = 1;
reset = 0;
while run ~= 0 % Loop until external reset of 'run' to '0'
if reset ~= 0
doReset(); % Reset the parameters for the processing
reset = 0;
disp('I did a reset');
end
disp('I am processing');
doProcess();
pause(1)
end
disp('I am done');
重置部分在通过脚本更改值时工作得非常好,但是当我手动尝试将“run”或“reset”的值更改为工作区中的任何其他值时,什么都不会发生…我的脚本不会中止,如果成功,重置也不会停止。。。
在我看来,脚本似乎无法识别工作区中的任何更改
随后,应通过VBA脚本设置或取消设置变量“运行”和“重置”。
我不能手动中止循环,有什么合理的原因吗
谢谢你的建议
欢迎你,坡斯伦
编辑:
run = 1;
reset = 0;
while run ~= 0 % Loop until external reset of 'run' to '0'
if reset ~= 0
doReset(); % Reset the parameters for the processing
reset = 0;
disp('I did a reset');
end
disp('I am processing');
doProcess();
pause(1)
end
disp('I am done');
脚本似乎在启动前加载变量一次,在运行时再也不会加载……是否有可能显式访问工作区变量
编辑2:
run = 1;
reset = 0;
while run ~= 0 % Loop until external reset of 'run' to '0'
if reset ~= 0
doReset(); % Reset the parameters for the processing
reset = 0;
disp('I did a reset');
end
disp('I am processing');
doProcess();
pause(1)
end
disp('I am done');
我使用Matlab2010b,目前没有额外的工具箱
编辑3:
run = 1;
reset = 0;
while run ~= 0 % Loop until external reset of 'run' to '0'
if reset ~= 0
doReset(); % Reset the parameters for the processing
reset = 0;
disp('I did a reset');
end
disp('I am processing');
doProcess();
pause(1)
end
disp('I am done');
我发现,在Matlab中有几个“工作空间”或RAM。如果我的函数正在运行,变量将存储在“base”(?)工作区中,而不是matlab工作区,您可以在该工作区中单击并更改每个值。因此,我必须访问这个不祥的“基本”空间,并将标志“run”更改为零。您的脚本是脚本m文件还是函数 如果它是一个函数,您将失去工作区变量的作用域,这就是它不起作用的原因。我会将您的代码转换为如下函数:
function processRun(run,reset)
while run ~= 0 % Loop until external reset of 'run' to '0'
if reset ~= 0
doReset; % Reset the parameters for the processing
reset = 0;
disp('I did a reset');
end
disp('I am processing');
[run,reset] = doProcess;
pause(1)
end
然后,每次从VBA调用函数时,都可以设置run和reset的值
如果有脚本,请尝试从顶部删除运行和重置行,并在运行脚本之前在工作区中设置它们的值。我认为您正在通过运行脚本文件来覆盖您的工作区值。我认为您的问题只是您的循环阻止了外部接口的执行。循环运行时,您无法访问其他接口 我想做一件类似的事情——允许外部程序(Ruby或另一个matlab实例)控制matlab循环。到目前为止,最灵活的解决方案是使用UDP。有一个很棒的工具箱叫做PNET for matlab,我想VB也一定有一个套接字库。我只需在两侧打开一个UDP端口,并使用简单的文本命令来控制和提供反馈
obj.conn = pnet('udpsocket', 9999);
command = '';
while run ~= 0
nBytes = pnet(obj.conn, 'readpacket');
if nBytes > 0
command = pnet(obj.conn, 'read', nBytes, 'string');
end
switch command
case '--reset--'
doReset(); % Reset the parameters for the processing
reset = 0;
disp('I did a reset');
case '--abort--'
run = 0;
disp('Going to abort');
case '--echo--'
pnet(obj.conn, 'write', '--echo--');
pnet(obj.conn, 'writepacket', remoteAddress, remotePort);
end
doProcess();
end
通过这种方式,我可以构建自己的可扩展控制接口,而不用担心从循环中阻塞,它可以跨平台和跨语言工作,可以在机器内或跨网络工作
更新:
要在两个UDP客户端之间进行对话,您需要设置两个免费的UDP端口,这两个端口都是客户端(这个示例都在matlab中,假设obj是一个结构,在我的示例中,它是一个围绕pnet功能的类):
抱歉,我没有足够的代表发表评论,因此我将在此处引用:
@亚当·利德贝特:谢谢,这很有道理。我唯一遇到的问题是,当run=1作为param启动脚本时,如何暂停(重置后,然后恢复)脚本…–poeschlorn 2月25日7:17 如果要在重置设置为1后中断循环,然后等待循环再次继续
run=1
,这与重新开始差不多
function processRun()
run = 1;
while run ~= 1
run = doProcess();
end
如果doProcess()
还是我遗漏了什么?代码本身就是m文件的全部内容。我在理解你的代码时有一个小问题…如果我看得对,我必须调用函数processRun(…)一次?然后我可以在工作区中更改我的值?如果你没有函数定义,我想你可能会在脚本中覆盖你的工作区变量。请参阅我对原始答案的编辑。在我看来,reset
变量被重置为0,当且仅当由于某种原因,它在上一次检查和当前检查之间的时间跨度内被更改为1时。这就是你的VBA脚本的原因,我认为没有逻辑问题。对我来说是个谜。谢谢,这很有道理。我唯一的问题是如何暂停(重置后,然后恢复)脚本时,它已经开始运行=1作为参数…哇,这是绝对可怕的。你能告诉我在哪里可以找到PNET图书馆吗?Mathworks似乎没有完整的工具箱,但一些非官方的工具箱已经准备好加载…你能告诉我你正在使用哪一个吗?是的,我正在使用已经从心理物理学工具箱中预编译的pnet:,你可以下载它并提取目录,或者刮取svn——工具箱本身已经找到——您可以使用TCP(可靠但开销更大)或UDP(无连接且速度更快);UDP更容易设置。注意,如果您有仪器控制工具箱,也可以在Matlab中直接使用UDP。我更喜欢PNET,因为您不仅可以发送简单的数据类型,甚至可以发送matlab oop对象,否则将几乎不可能通过网络序列化和发送(matlab本身的弱点)。还有一个matlab java接口替代PNET Hi,谢谢,我下载了正确的文件…我将它们解压缩到我的循环脚本所在的目录中。请您指出,为了发送正确的命令,第二个脚本必须是什么样子。