Компания MathWorks объявила о выпуске нового продукта — Simulink PLC Coder. Данный продукт позволяет автоматически генерировать согласно стандарту IEC 61131 код для программируемых логических контроллеров (ПЛК) и программируемых контроллеров автоматизации. Это нововведение позволяет использовать модельно-ориентированное проектирование для промышленного и силового оборудования, управляемого ПЛК.
С помощью Simulink PLC Coder, инженеры могут автоматически генерировать код для промышленных систем управления, включая замкнутые системы и системы контроля с обратной связью. Автоматическая генерация кода, неотъемлемая часть Модельно-ориентированного проектирования, помогает устранить ошибки, связанные с традиционным ручным написанием кода и уменьшает время разработки и валидации.
Simulink PLC Coder генерирует исходный код в структурированном текстовом формате из моделей Simulink, диаграмм Stateflow, и кода Embedded MATLAB, а затем использует интегрированную среду разработки (IDE) от поставщика средств промышленной автоматизации, для компиляции кода и запуска его на контроллерах ПЛК.
Для генерации кода необходима программа Matlab начиная с версии 2010a. Разрабатывать будем программу для ПЛК Siemens SIMATIC STEP 7.
Создаем файл модели, в котором будем создавать математическую модель. Для этого нам понадобится библиотека plclib, поэтому из командной строки Matlab запускаем ее.
Создаем математическую модель системы управления с дискретным ПИД регулятором (рисунок 1). На рисунке 2 приведена внутренняя структура блока pid_feedforward.
![image](http://xmages.net/storage/10/1/0/6/4/upload/3464cbb8.jpg)
Рисунок 1 — Математическая модель системы управления
![image](http://xmages.net/storage/10/1/0/a/e/upload/963aa5f6.jpg)
Рисунок 2 — Внутренняя структура блока pid_feedforward
![image](http://xmages.net/storage/10/1/0/6/a/upload/94b6a54a.jpg)
Рисунок 3 — Переходный процесс системы
Выбираем блок pid_feedforward, нажимаем правую клавишу мыши и выбираем Subsystem Parametrs. В этом окне отмечаем «Treat as atomic unit» и нажимаем кнопку Ок.
На функциональном блоке нажимаем правую клавишу мыши и выбираем PLC Coder / Options.
Выбираем в какой тип ПЛК будет сгенерирован код (Target IDE) и нажимаем клавишу Generate code.
Сгенерированный код для SIMATIC STEP 7
(*
*
* File: plc.scl
*
* IEC 61131-3 Structured Text (ST) code generated for Simulink model «plc.mdl»
*
* Model version: 1.1
* Simulink PLC Coder version: 1.1 (R2010b) 03-Aug-2010
* ST code generated on: Fri Jun 03 18:52:23 2011
*
* Target IDE selection: Siemens SIMATIC Step 7 5.4
* Test Bench included: No
*
*)
FUNCTION_BLOCK FB1
VAR_INPUT
ssMethodType: INT;
In3: REAL;
In2: REAL;
In3_c: REAL;
END_VAR
VAR_OUTPUT
Out1: REAL;
END_VAR
VAR
Integrator_DSTATE: REAL;
Filter_DSTATE: REAL;
rtb_et: REAL;
rtb_Sum: REAL;
c_rtb_FilterCoeffi: REAL;
END_VAR
CASE ssMethodType OF
2:
(* InitializeConditions for DiscreteIntegrator: '/Integrator' *)
Integrator_DSTATE := 0;
(* InitializeConditions for DiscreteIntegrator: '/Filter' *)
Filter_DSTATE := 0;
3:
(* Sum: '/Sum' incorporates:
* Inport: '/In1'
* Inport: '/In2'
*)
rtb_et := In3 — In2;
(* Gain: '/Filter Coefficient' incorporates:
* DiscreteIntegrator: '/Filter'
* Gain: '/Derivative Gain'
* Sum: '/SumD'
*)
c_rtb_FilterCoeffi := ((-1.26102994076046 * rtb_et) — Filter_DSTATE) * 0.178109803713032;
(* Sum: '/Sum' incorporates:
* DiscreteIntegrator: '/Integrator'
* Gain: '/Proportional Gain'
*)
rtb_Sum := ((1.7018012505578 * rtb_et) + Integrator_DSTATE) + c_rtb_FilterCoeffi;
(* Outport: '/Out1' incorporates:
* Inport: '/In1'
* Sum: '/Sum1'
*)
Out1 := In3 + rtb_Sum;
(* Update for DiscreteIntegrator: '/Integrator' incorporates:
* Gain: '/Integral Gain'
* Sum: '/Sum2'
* Sum: '/SumI1'
* Sum: '/SumI3'
* Update for Inport: '/In1'
* Update for Inport: '/In3'
*)
Integrator_DSTATE := (((In3_c — In3) — rtb_Sum) + (0.208461637073455 * rtb_et)) + Integrator_DSTATE;
(* Update for DiscreteIntegrator: '/Filter' *)
Filter_DSTATE := Filter_DSTATE + c_rtb_FilterCoeffi;
END_CASE;
END_FUNCTION_BLOCK
Следующим этапом является создание проекта в Siemens SIMATIC Step 7 и вставки в редактор SCL сгенерированного кода.
Результатом компиляции кода является создание функционального блока.
![image](http://xmages.net/storage/10/1/0/e/c/upload/9374f61d.jpg)
Рисунок 4 — Функциональный блок FB1
С помощью OPC сервера осуществим обмен между ПЛК и Matlab. При использовании реального железа используем Simatic Net OPC Server, при использовании симулятора ПЛК (PLC-Sim) необходимо использовать SCADA-систему WinCC и WinCC OPC Server.
![image](http://xmages.net/storage/10/1/0/2/3/upload/f24306e8.jpg)
Рисунок 5 — Обмен данными между ПЛК и Matlab
![image](http://xmages.net/storage/10/1/0/b/9/upload/2003f82f.jpg)
Рисунок 6 — Сравнение работы ПИД регуляторов
Более подробно с Simulink PLC Coder можно ознакомиться в документации Matlab, или на сайте www.mathworks.com/products/sl-plc-coder.
С помощью Simulink PLC Coder, инженеры могут автоматически генерировать код для промышленных систем управления, включая замкнутые системы и системы контроля с обратной связью. Автоматическая генерация кода, неотъемлемая часть Модельно-ориентированного проектирования, помогает устранить ошибки, связанные с традиционным ручным написанием кода и уменьшает время разработки и валидации.
Simulink PLC Coder генерирует исходный код в структурированном текстовом формате из моделей Simulink, диаграмм Stateflow, и кода Embedded MATLAB, а затем использует интегрированную среду разработки (IDE) от поставщика средств промышленной автоматизации, для компиляции кода и запуска его на контроллерах ПЛК.
Для генерации кода необходима программа Matlab начиная с версии 2010a. Разрабатывать будем программу для ПЛК Siemens SIMATIC STEP 7.
Создаем файл модели, в котором будем создавать математическую модель. Для этого нам понадобится библиотека plclib, поэтому из командной строки Matlab запускаем ее.
Создаем математическую модель системы управления с дискретным ПИД регулятором (рисунок 1). На рисунке 2 приведена внутренняя структура блока pid_feedforward.
![image](http://xmages.net/storage/10/1/0/6/4/upload/3464cbb8.jpg)
Рисунок 1 — Математическая модель системы управления
![image](http://xmages.net/storage/10/1/0/a/e/upload/963aa5f6.jpg)
Рисунок 2 — Внутренняя структура блока pid_feedforward
![image](http://xmages.net/storage/10/1/0/6/a/upload/94b6a54a.jpg)
Рисунок 3 — Переходный процесс системы
Выбираем блок pid_feedforward, нажимаем правую клавишу мыши и выбираем Subsystem Parametrs. В этом окне отмечаем «Treat as atomic unit» и нажимаем кнопку Ок.
На функциональном блоке нажимаем правую клавишу мыши и выбираем PLC Coder / Options.
Выбираем в какой тип ПЛК будет сгенерирован код (Target IDE) и нажимаем клавишу Generate code.
Сгенерированный код для SIMATIC STEP 7
(*
*
* File: plc.scl
*
* IEC 61131-3 Structured Text (ST) code generated for Simulink model «plc.mdl»
*
* Model version: 1.1
* Simulink PLC Coder version: 1.1 (R2010b) 03-Aug-2010
* ST code generated on: Fri Jun 03 18:52:23 2011
*
* Target IDE selection: Siemens SIMATIC Step 7 5.4
* Test Bench included: No
*
*)
FUNCTION_BLOCK FB1
VAR_INPUT
ssMethodType: INT;
In3: REAL;
In2: REAL;
In3_c: REAL;
END_VAR
VAR_OUTPUT
Out1: REAL;
END_VAR
VAR
Integrator_DSTATE: REAL;
Filter_DSTATE: REAL;
rtb_et: REAL;
rtb_Sum: REAL;
c_rtb_FilterCoeffi: REAL;
END_VAR
CASE ssMethodType OF
2:
(* InitializeConditions for DiscreteIntegrator: '/Integrator' *)
Integrator_DSTATE := 0;
(* InitializeConditions for DiscreteIntegrator: '/Filter' *)
Filter_DSTATE := 0;
3:
(* Sum: '/Sum' incorporates:
* Inport: '/In1'
* Inport: '/In2'
*)
rtb_et := In3 — In2;
(* Gain: '/Filter Coefficient' incorporates:
* DiscreteIntegrator: '/Filter'
* Gain: '/Derivative Gain'
* Sum: '/SumD'
*)
c_rtb_FilterCoeffi := ((-1.26102994076046 * rtb_et) — Filter_DSTATE) * 0.178109803713032;
(* Sum: '/Sum' incorporates:
* DiscreteIntegrator: '/Integrator'
* Gain: '/Proportional Gain'
*)
rtb_Sum := ((1.7018012505578 * rtb_et) + Integrator_DSTATE) + c_rtb_FilterCoeffi;
(* Outport: '/Out1' incorporates:
* Inport: '/In1'
* Sum: '/Sum1'
*)
Out1 := In3 + rtb_Sum;
(* Update for DiscreteIntegrator: '/Integrator' incorporates:
* Gain: '/Integral Gain'
* Sum: '/Sum2'
* Sum: '/SumI1'
* Sum: '/SumI3'
* Update for Inport: '/In1'
* Update for Inport: '/In3'
*)
Integrator_DSTATE := (((In3_c — In3) — rtb_Sum) + (0.208461637073455 * rtb_et)) + Integrator_DSTATE;
(* Update for DiscreteIntegrator: '/Filter' *)
Filter_DSTATE := Filter_DSTATE + c_rtb_FilterCoeffi;
END_CASE;
END_FUNCTION_BLOCK
Следующим этапом является создание проекта в Siemens SIMATIC Step 7 и вставки в редактор SCL сгенерированного кода.
Результатом компиляции кода является создание функционального блока.
![image](http://xmages.net/storage/10/1/0/e/c/upload/9374f61d.jpg)
Рисунок 4 — Функциональный блок FB1
С помощью OPC сервера осуществим обмен между ПЛК и Matlab. При использовании реального железа используем Simatic Net OPC Server, при использовании симулятора ПЛК (PLC-Sim) необходимо использовать SCADA-систему WinCC и WinCC OPC Server.
![image](http://xmages.net/storage/10/1/0/2/3/upload/f24306e8.jpg)
Рисунок 5 — Обмен данными между ПЛК и Matlab
![image](http://xmages.net/storage/10/1/0/b/9/upload/2003f82f.jpg)
Рисунок 6 — Сравнение работы ПИД регуляторов
Более подробно с Simulink PLC Coder можно ознакомиться в документации Matlab, или на сайте www.mathworks.com/products/sl-plc-coder.