В этом примере показов, как реализовать онлайн модели прогнозирующее приложение контроллера с помощью клиента OPC, поставляемого с OPC Toolbox™.
Пример использует сервер Matrikon™ Simulation OPC, чтобы симулировать поведение промышленного процесса в операционной системе Windows ®.
Загрузите и установите сервер и установите его работающим либо как сервис, либо как приложение.
Этому примеру нужен OPC Toolbox.
if ~mpcchecktoolboxinstalled('opc') disp('The example needs OPC Toolbox.') end
The example needs OPC Toolbox.
Используйте команды OPC Toolbox для подключения к серверу симуляции OPC Matrikon.
if mpcchecktoolboxinstalled('opc') % Clear any existing opc connections. opcreset % Flush the callback persistent variables. clear mpcopcPlantStep; clear mpcopcMPCStep; try h = opcda('localhost','Matrikon.OPC.Simulation.1'); connect(h); catch ME disp('The Matrikon(TM) OPC Simulation Server must be running on the local machine.') return end end
На практике объект будет представлять собой физический процесс, и теги OPC, определяющие его вводы-выводы, уже будут созданы на сервере OPC. Однако в этом случае, поскольку используется сервер OPC симуляции, поведение объекта должно быть моделировано. Для этого вы задаете теги для переменных, управляемых и измеренных объектом, и создаете функцию обратного вызова (mpcopcPlantStep
), чтобы симулировать реакцию объекта на изменения в манипулируемых переменных. Необходимы две группы OPC, одна для представления двух манипулированных переменных, которые будут считываться симулятором объекта, а другая для записи обратно двух измеренных выходов объекта, хранящих результаты симуляции объекта.
if mpcchecktoolboxinstalled('opc') % Build an opc group for 2 plant inputs and initialize them to zero. plant_read = addgroup(h,'plant_read'); imv1 = additem(plant_read,'Bucket Brigade.Real8', 'double'); writeasync(imv1,0); imv2 = additem(plant_read,'Bucket Brigade.Real4', 'double'); writeasync(imv2,0); % Build an opc group for plant outputs. plant_write = addgroup(h,'plant_write'); opv1 = additem(plant_write,'Bucket Brigade.Time', 'double'); opv2 = additem(plant_write,'Bucket Brigade.Money', 'double'); plant_write.WriteAsyncFcn = []; % Suppress command line display. end
Создайте модель объекта управления.
plant_model = ss([-.2 -.1; 0 -.05],eye(2,2),eye(2,2),zeros(2,2)); disc_plant_model = c2d(plant_model,1);
Мы предполагаем отсутствие несоответствия модели, управляемый горизонт 6 шагов и горизонт предсказания 20 шагов.
mpcobj = mpc(disc_plant_model,1,20,6); mpcobj.weights.ManipulatedVariablesRate = [1 1];
-->The "Weights.ManipulatedVariables" property of "mpc" object is empty. Assuming default 0.00000. -->The "Weights.ManipulatedVariablesRate" property of "mpc" object is empty. Assuming default 0.10000. -->The "Weights.OutputVariables" property of "mpc" object is empty. Assuming default 1.00000.
Создайте внутреннюю структуру объекта MPC, чтобы объект MPC не перестраивался во время каждого выполнения обратного вызова.
state = mpcstate(mpcobj); y1 = mpcmove(mpcobj,state,[1;1]',[1 1]');
-->Assuming output disturbance added to measured output channel #1 is integrated white noise. -->Assuming output disturbance added to measured output channel #2 is integrated white noise. -->The "Model.Noise" property of the "mpc" object is empty. Assuming white noise on each measured output channel.
Создайте две группы OPC, одну для чтения двух измеренных выходов объекта, а другую для записи двух манипулированных переменных.
if mpcchecktoolboxinstalled('opc') % Build an opc group for MPC inputs. mpc_read = addgroup(h,'mpc_read'); impcpv1 = additem(mpc_read,'Bucket Brigade.Time', 'double'); writeasync(impcpv1,0); impcpv2 = additem(mpc_read,'Bucket Brigade.Money', 'double'); writeasync(impcpv2,0); impcref1 = additem(mpc_read,'Bucket Brigade.Int2', 'double'); writeasync(impcref1,1); impcref2 = additem(mpc_read,'Bucket Brigade.Int4', 'double'); writeasync(impcref2,1); % Build an opc group for mpc outputs. mpc_write = addgroup(h,'mpc_write'); additem(mpc_write,'Bucket Brigade.Real8', 'double'); additem(mpc_write,'Bucket Brigade.Real4', 'double'); % Suppress command line display. mpc_write.WriteAsyncFcn = []; end
Создайте две группы OPC на основе одного и того же внешнего таймера OPC, чтобы инициировать выполнение симуляции объекта и выполнения MPC при изменении содержимого временного тега OPC.
if mpcchecktoolboxinstalled('opc') gtime = addgroup(h,'time'); time_tag = additem(gtime,'Triangle Waves.Real8'); gtime.UpdateRate = 1; gtime.DataChangeFcn = {@mpcopcPlantStep plant_read plant_write disc_plant_model}; gmpctime = addgroup(h,'mpctime'); additem(gmpctime,'Triangle Waves.Real8'); gmpctime.UpdateRate = 1; gmpctime.DataChangeFcn = {@mpcopcMPCStep mpc_read mpc_write mpcobj}; end
Логгирование измеренных выходов объекта из тегов 'Bucket Brigade.Money' и 'Bucket Brigade.Money'.
if mpcchecktoolboxinstalled('opc') mpc_read.RecordsToAcquire = 40; start(mpc_read); while mpc_read.RecordsAcquired < mpc_read.RecordsToAcquire pause(3) fprintf('Logging data: Record %d / %d',mpc_read.RecordsAcquired,mpc_read.RecordsToAcquire) end stop(mpc_read); end
if mpcchecktoolboxinstalled('opc') [itemID, value, quality, timeStamp, eventTime] = getdata(mpc_read,'double'); plot((timeStamp(:,1)-timeStamp(1,1))*24*60*60,value) title('Measured Outputs Logged from Tags Bucket Brigade.Time,Bucket Brigade.Money') xlabel('Time (secs)'); end