В этом примере рассматривается набор стандартных ситуаций, когда связи между артефактами проектирования и требованиями устаревают после перемещения или переименования одного или нескольких артефактов. Вместо того, чтобы удалять разорванные связи и создавать новые, мы хотим обновить существующие связи, чтобы сохранить историю создания/изменения и другие свойства (описание, ключевые слова, комментарии,..). Показано использование следующих API:
slreq.find чтобы получить информацию о требованиях к Simulink ® и ссылках
find для поиска требуемой записи в данном наборе ReqSet
getLinks для запроса всех исходящих ссылок в LinkSet
source краткая информация об источнике ссылки
destination краткая информация о назначении ссылки
slreq.Link для целевой информации «as stored», которая отличается от «as resolved» Link.destination()
slreq.LinkSet для обновления назначений ссылок при перемещении целевого документа
slreq.ReqSet для обновления ранее импортированного набора при перемещении исходного документа
updateFromDocument для обновления ранее импортированных ссылок из обновленного документа
slreq.LinkSet преобразование существующих «прямых связей» в «ссылочные связи»
slreq.show используется для просмотра исходного или целевого конца данного slreq.Link
В нескольких местах мы также используем наследие rmi API, унаследованные из части интерфейса управления требованиями (RMI) вышедшего из обращения продукта SLVnV.
Перед началом работы убедитесь в чистоте начального состояния, выполнив команду slreq.clear команда. Затем введите slreqCCProjectStart для открытия примера проекта Cruise Control. При этом коллекция связанных файлов артефактов будет распакована в новую подпапку MATLAB/Projects папка.
slreq.clear(); slreqCCProjectStart();
Мы сосредоточимся на небольшой части графика зависимостей этого проекта: откройте crs_plant.slx модель Simulink, которая имеет несколько ссылок на внешний документ Microsoft ® Wordcrs_reqs.docx.
open_system('crs_plant');
Перейдите по одной из ссылок, чтобы открыть связанный документ.
rmi('view', 'crs_plant/status', 1);

Документ Word откроется в соответствующем разделе:

Вот как использовать API командной строки и проверять наличие ссылок из crs_plant.slx кому crs_reqs.docx.
linkSet = slreq.find('type', 'LinkSet', 'Name', 'crs_plant'); links = linkSet.getLinks(); disp('Original Links to Word document:');
Original Links to Word document:
for i = 1:numel(links) linkTarget = links(i).getReferenceInfo(); if contains(linkTarget.artifact, 'crs_req.docx') source = links(i).source; disp([' found link from ' strrep(getfullname([bdroot source.id]),newline,'') ... ' to crs_req.docx']); end end
found link from crs_plant/Vehicle1/vehiclespeed to crs_req.docx
found link from crs_plant/throttDrv to crs_req.docx
found link from crs_plant/status to crs_req.docx
found link from crs_plant/throttleCC to crs_req.docx
Откройте редактор требований Simulink путем ввода slreq.editor в командной строке MATLAB. Будут загружены два набора требований: crs_req.slreqx и crs_req_func_spec.slreqx. Первый набор требований - это набор привязок, импортированных из crs_req.docxвторой был создан вручную в редакторе требований Simulink. Если закрыть документ Word и перейти по той же ссылке из crs_plant/status В блоке ввода соответствующая импортированная привязка подсвечивается в редакторе требований, поскольку операция навигации находит соответствующую привязку в загруженном импортированном наборе требований.

По-прежнему можно использовать кнопку Показать в документе для просмотра связанного требования в контексте исходного документа.
slreq.editor(); rmidotnet.MSWord.application('kill'); rmi('view', 'crs_plant/status', 1);
Предположим, что получена обновленная версия документа потребности с именем crs_req_v2.docx. Теперь нам нужны ссылки в crs_plant.slx для нацеливания на соответствующие разделы обновленного документа. В данном примере мы создадим копию исходного документа в той же папке с измененным именем. Затем мы используем slreq.LinkSet API для пакетного обновления всех ссылок в данном LinkSet для подключения к более новой копии документа:
copyfile(fullfile(pwd, 'documents/crs_req.docx'), fullfile(pwd, 'documents/crs_req_v2.docx')); linkSet.updateDocUri('crs_req.docx', 'crs_req_v2.docx');
Теперь можно перейти по той же ссылке и подтвердить открытие соответствующей версии внешнего документа. Если мы повторим все ссылки, как раньше, это подтвердит, что все 4 ссылки обновлены по назначению:
rmi('view', 'crs_plant/status', 1); % updated document opens links = linkSet.getLinks(); disp('Links to Word document after update:');
Links to Word document after update:
for i = 1:numel(links) source = links(i).source; linkTarget = links(i).getReferenceInfo(); if contains(linkTarget.artifact, 'crs_req.docx') warning(['link from ' source.id ' still points to crs_req.docx']); % should not happen elseif contains(linkTarget.artifact, 'crs_req_v2.docx') disp([' found link from ' strrep(getfullname([bdroot source.id]),newline,' ')... ' to crs_req_v2.docx']); end end
found link from crs_plant/Vehicle1/vehicle speed to crs_req_v2.docx
found link from crs_plant/throttDrv to crs_req_v2.docx
found link from crs_plant/status to crs_req_v2.docx
found link from crs_plant/throttleCC to crs_req_v2.docx
Как показано выше, когда импортированные привязки доступны в редакторе требований, при навигации по ссылке выбирается соответствующий объект привязки. Однако мы только что обновили ссылки для новой версии документа crs_req_v2.docx, и для этого документа нет импортированных ссылок. Навигация из блока Simulink в присутствии редактора требований позволяет перейти непосредственно к внешнему документу Word.

Чтобы избежать этой несогласованности, необходимо обновить ранее импортированные ссылки для связи с обновленным именем документа. Мы используем slreq.ReqSet API для выполнения этой задачи. Кроме того, поскольку в обновленном документе могут быть изменены Требования, мы должны использовать updateFromDocument API для извлечения обновлений для ссылочных элементов, хранящихся на стороне требований Simulink. После этого при переходе из модели Simulink будет найдена соответствующая импортированная привязка.

Найдите набор требований с импортированными привязками. Обновите расположение исходного файла и найдите узел импорта верхнего уровня.
reqSet = slreq.find('type', 'ReqSet', 'Name', 'crs_req'); reqSet.updateSrcFileLocation('crs_req.docx', 'crs_req_v2.docx'); importNode = reqSet.find('CustomId', 'crs_req_v2');
Обновите импортированные ссылки из исходного файла. Закройте Microsoft Word. Затем перейдите к обновленной ссылке в редакторе требований.
importNode.updateFromDocument(); rmidotnet.MSWord.application('kill'); rmi('view', 'crs_plant/status', 1);
Отмените изменения данных связи, чтобы избежать запросов при закрытии проекта. Закройте проект (также очистите изменения пути MATLAB). Закройте Microsoft Word.
slreq.clear();
prj = simulinkproject(); prj.close();
rmidotnet.MSWord.application('kill'); Как показано в примере использования 1 выше, требуются дополнительные усилия для поддержания «прямых ссылок» на внешние документы при перемещении или переименовании документов. Лучшим рабочим процессом является преобразование существующих «прямых связей» в «ссылки», которые являются ссылками, указывающими на импортированные References в *.slreqx файлы и больше не дублировать информацию о расположении или имени исходного документа. При использовании этой опции связь внешнего исходного документа сохраняется только в наборе требований, в котором размещены импортированные ссылки.
Чтобы продемонстрировать этот рабочий процесс, перезапустите его с той же начальной точки, снова открыв определение требований для модели Cruise Control в новой подпапке. Скопируйте модель Simulink в папку и откройте ее.
slreqCCProjectStart(); copyfile(fullfile(pwd, 'documents/crs_req.docx'), fullfile(pwd, 'documents/crs_req_v2.docx')); open_system('crs_plant');
Найти crs_plant набор ссылок и crs_req набор требований с импортированными привязками.
linkSet = slreq.find('type', 'LinkSet', 'Name', 'crs_plant'); reqSet = slreq.find('type', 'ReqSet', 'Name', 'crs_req');
Затем мы используем slreq.LinkSet API для обновления всех прямых ссылок в crs_plant.slmx. Затем создайте массив всех ссылок в наборе ссылок.
linkSet.redirectLinksToImportedReqs(reqSet); links = linkSet.getLinks();
После обновления LinkSet таким образом, закольцовывать все ссылки для подтверждения отсутствия «прямых» ссылок на crs_req.docx файл.
disp('Check for links to original external document:');Check for links to original external document:
counter = 0; for i = 1:numel(links) linkTarget = links(i).getReferenceInfo(); if contains(linkTarget.artifact, 'crs_req.docx') source = links(i).source; warning(['link from ' source.id ' still points to crs_req.docx']); counter = counter + 1; end end disp([' Total ' num2str(counter) ' links to external document']);
Total 0 links to external document
Перейдите от модели Simulink к обновленной привязке.
rmi('view', 'crs_plant/status', 1);
Теперь, когда все ссылки указывают на импортированные ссылки, а не на внешний документ, данные отслеживания остаются непротиворечивыми после переименования документа, пока узел Импорт обновляется для нового имени внешнего документа. Как и в случае использования 1, мы будем делать вид, что имеется обновленная версия документа внешних требований, путем повторного сохранения нашего документа Word с новым именем. Затем выполняется необходимое обновление для узла Import с использованием тех же API, что и ранее. Теперь, поскольку ссылки основаны на импортированных ссылках и не хранят информацию об импортированном документе, навигация из модели Simulink приводит нас к обновленной ссылке, как после выполнения всех шагов варианта использования 1.

Теперь ссылка связана с обновленным внешним документом, кнопка [Показать в документе] открывает обновленный (переименованный) документ, и дальнейшая корректировка на стороне LinkSet не требуется.
Найдите набор требований с импортированными привязками. Обновите расположение исходного файла и найдите узел импорта верхнего уровня.
reqSet = slreq.find('type', 'ReqSet', 'Name', 'crs_req'); reqSet.updateSrcFileLocation('crs_req.docx', 'crs_req_v2.docx'); importNode = reqSet.find('CustomId', 'crs_req_v2');
Обновите импортированные ссылки из исходного файла. Затем перейдите к обновленной ссылке в редакторе требований.
importNode.updateFromDocument();
rmi('view', 'crs_plant/status', 1);
Отмените изменения данных связи, чтобы избежать запросов при закрытии проекта. Закройте проект (также очистите изменения пути MATLAB). Закройте Microsoft Word.
slreq.clear();
prj = simulinkproject(); prj.close();
rmidotnet.MSWord.application('kill'); Теперь предположим, что мы ветвим существующий проект со связанными артефактами, и нам нужно создать новый набор переименованных артефактов со всеми связями отслеживания, как в исходном проекте. Как и ранее, мы будем извлекать проект круиз-контроля из определения требований для модели круиз-контроля в новую подпапку и преобразовывать «прямые ссылки» в «ссылочные ссылки», как это было сделано в примере использования 2 выше. Затем мы продолжаем создавать «новые версии» связанных артефактов, повторяя каждый с _v2. имя.
После создания переименованных копий модели Simulink, импортированного внешнего документа и набора требований с импортированными требованиями возникает одна проблема: переименованная модель связана со ссылками в исходном наборе требований, а не в переименованном наборе требований. На панели Подробно (Details) в разделе Связи (Links) связи отображаются как неразрешенные, поскольку исходная модель не загружена.

Откройте проект круиз-контроля и откройте crs_plant модель. Найти набор ссылок для crs_plant и набор требований crs_req.
slreqCCProjectStart(); open_system('models/crs_plant.slx'); linkSet = slreq.find('type', 'LinkSet', 'Name', 'crs_plant'); reqSet = slreq.find('type', 'ReqSet', 'Name', 'crs_req');
Преобразуйте прямые связи в ссылочные. Создайте переименованные копии файлов и сохраните их.
linkSet.redirectLinksToImportedReqs(reqSet); mkdir(fullfile(pwd, 'copied')); save_system('crs_plant', fullfile(pwd, 'copied/crs_plant_v2.slx')); reqSet.save(fullfile(pwd, 'copied/crs_req_v2.slreqx')); copyfile('documents/crs_req.docx', 'copied/crs_req_v2.docx');
Свяжите переименованный набор требований с переименованным документом. Найдите узел импорта верхнего уровня.
reqSet.updateSrcFileLocation('crs_req.docx', fullfile(pwd, 'copied/crs_req_v2.docx')); importNode = reqSet.find('CustomId', 'crs_req_v2');
Убедитесь, что содержимое переименованного набора требований соответствует содержимому переименованного документа, обновив импортированные ссылки. Перейдите от переименованной модели Simulink к элементу в переименованном наборе требований. Выделен старый элемент в исходном наборе требований, что является неправильным.
importNode.updateFromDocument();
rmi('view', 'crs_plant_v2/status', 1);
Аналогично варианту использования 1, мы можем использовать LinkSet.updateDocUri(OLD, NEW) API для обновления ссылок в crs_plant_v2.slmx для использования переименованного набора требований crs_req_v2.slreqx в качестве целевого объекта ссылки вместо исходного crs_req.slreqx. После этого снова перейдите из блока в переименованной модели. Будет выбрано требование в переименованном наборе требований, и связи на панели Подробно (Details) в разделе Связи (Links) внизу справа будут разрешены.

Найдите набор ссылок для новой копии модели, crs_plant_v2. Обновите имя набора требований, связанного с новой копией модели. Перейдите от переименованной модели Simulink к элементу в переименованном наборе требований. На этот раз он выделяет правильный элемент.
linkSet = slreq.find('type', 'LinkSet', 'Name', 'crs_plant_v2'); linkSet.updateDocUri('crs_req.slreqx', 'crs_req_v2.slreqx');
rmi('view', 'crs_plant_v2/status', 1);
Удаление открытых наборов требований и наборов связей и закрытие открытых моделей и проектов без сохранения изменений. Закройте Microsoft Word.
slreq.clear(); bdclose('all'); prj = simulinkproject(); prj.close(); rmidotnet.MSWord.application('kill');