Это старая версия документа!
PID управление 3х клапаном
Ниже приведу пример текущей настройки для управления 3-х ходовым клапаном с помощью PID регулятора в моей конфигурации openHAB.
Из оборудования установлен 3-х ходовой актуатор ESBE на контуре теплых полов.
Управлением открытия/закрытия занимается контроллер MegaD, задействованы 2 релейных выхода. Для них созданы соответствующие Items.
1. Установлен Add-on PID Controller, который соответственно рассчитывает выходное значение в зависимости от температуры уставки и текущей температуры подачи и записывает его в Item tp_pid. Настройки по коэффициентами пока выбраны следующие: P=10, I=0.5, D=80, D-T1=300
Код правила для расчета PID:
configuration: {}
triggers:
- id: 09519cc5-516c-42a4-857f-e3ed9eacec19
label: PID Controller Trigger
configuration:
input: tp_flowpipe
setpoint: tp_setpoint
kp: 10
kd: 80
kdTimeConstant: 300
ki: 0.5
loopTime: 120000
type: pidcontroller.trigger
conditions:
- inputs: {}
id: "2"
configuration:
itemName: boiler_flame
state: ON
operator: =
type: core.ItemStateCondition
- inputs: {}
id: "3"
configuration:
itemName: boiler_status
state: ON
operator: =
type: core.ItemStateCondition
actions:
- inputs: {}
id: "1"
configuration:
itemName: tp_pid
type: core.ItemCommandAction
2. Следующее правило запускается по cron каждые 3 минуты, и в зависимости от текущего значения PID управляет 3-х ходовым клапаном.
Код правила управления 3-х ходовым клапаном:
configuration: {}
triggers:
- id: "1"
configuration:
cronExpression: 0 0/3 * * * ? *
type: timer.GenericCronTrigger
conditions: []
actions:
- inputs: {}
id: "2"
configuration:
type: application/javascript
script: >-
/*
Items to control 3p Actuator
three_way_close - close relay
three_way_open - open relay
*/
function rotateActuator (pidValue) {
var actionTimerCorrection = 2 // Maybe 1 to any reasonable value, decreasing rotation time
var actionTimerMax = 15000 // milliseconds, maximum 15 sec
var actionTimerMin = 1000 // milliseconds, minimum 1 sec
console.log('PID: ' + pidValue)
var actionItem3pActuator = null
var action = null
var actionTimer = 0
action = (pidValue > 0) ? 'open' : 'close';
action3pActuator = items.getItem('three_way_' + action)
actionTimer = Math.round( Math.abs( pidValue ) / actionTimerCorrection ) * 500
// Limit to actionTimerMax if it more
actionTimer = (actionTimer > actionTimerMax) ? actionTimerMax : actionTimer;
if (actionTimer >= actionTimerMin)
{
console.log ('Actuator action: ' + action3pActuator.name + ' for ' + actionTimer + ' (' + actionTimer/1000 + ' sec)')
console.info(action3pActuator.name + ' send command ON')
action3pActuator.sendCommand('ON')
setTimeout(() => {
console.info(action3pActuator.name + ' send command OFF')
action3pActuator.sendCommand('OFF')
}, actionTimer);
}
else
{
console.info('actionTimer: ' + actionTimer/1000 + ' < ' + actionTimerMin/1000 + ' sec - nothing to do with 3p actuator')
}
}
rotateActuator(items.tp_pid.state)
type: script.ScriptAction