Параллельная работа с несколькими портами

Обсуждение вопросов связанных с параллельными и распределенными вычислениями

Модератор: Admin

vertual
Пользователь
Сообщения: 1
Зарегистрирован: Сб дек 26, 2015 6:15 am

Параллельная работа с несколькими портами

Сообщение vertual » Сб дек 26, 2015 7:09 am

Приветствую.

Обычно пользуюсь матлабом для опроса SCPI приборов и построения графиков.
когда это простой цикл опросов и отрисовок, то все хорошо работает.
Можно на каждый прибор запускать свою копию матлаба и все работает никому не мешает.

Но возникла сложность, как в одной общей среде работать с несколькими приборами.
Проблема в том, что query, fscanf команды ждут ответа от порта и полностью останавливают работу программы. А если какая-то заминка с прибором, то вообще все может стать с таймаутом секунд 10.

Пробовал создавать таймеры, но к сожалению, они между собой работают по очереди и когда ожидается ответ от прибора останавливается выполнение основной программы.

Подскажите пожалуйста, как из тела основной программы запустить несколько параллельных процессов опроса приборов (или таймеров)? так что-бы они не мешали друг другу ожиданием ответа от портов. Так как будто это разные копии матлаба, но с общей средой переменных.

Конечно как вариант, назапускать копий матлаба и опросы приборов записывать в файлы, которые потом собирать в очередной копии матлаба, но как-то это совсем криво на мой взгляд.

надо типа такого

device1 = instrfind (....)
device2 = instrfind (....)
device3 = instrfind (....)

global device1
global device2
global device3
global datafile
global i

datafile = zeros (3,3)

fopen (device1)
fopen (device2)
fopen (device3)


for i=1:3

как тут сделать их параллельными?
querydevice1
querydevice2
querydevice3

end


fclose (device1)
fclose (device2)
fclose (device3)


....

ну и где 3 мфайла

querydevice1.m

function querydevice1
global device1
global datafile
global i

temp = query (device1, 'meas?')
datafile (i, 1) = str2single (temp)
end


querydevice2.m

function querydevice2
global device2
global datafile
global i

temp = query (device2, 'meas?')
datafile (i, 2) = str2single (temp)
end


тут они объявлены как функции, так как в реалии это более сложны программы требующие локальной среды.