Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
控制matlab脚本(暂停、重置)_Matlab_Loops_Controls - Fatal编程技术网

控制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'

我试图创建一个matlab脚本(m文件),该脚本应由外部VBA脚本控制

对于一定数量的循环,每次(即使参数改变,但在这种情况下不是问题)matlab脚本都应执行相同的操作。 如果我看得对,我可以在VBA中使用matlab函数,如下所示:

我的主要问题是如何实现这个问题的matlab部分…目前我的控制部分如下所示:

  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,谢谢,我下载了正确的文件…我将它们解压缩到我的循环脚本所在的目录中。请您指出,为了发送正确的命令,第二个脚本必须是什么样子。