Не сохраняются уставки

Обнаружилась тут одна проблема на нашем WB 6.7. У нас есть 4 уставки, которые должны сохраняться в ПЛК. Но почему они не сохраняются. Усиавки меняем через MQTT протокол, и они меняются, но после перезагрузки ПЛК уставки сбрасываются по умолчанию. Причем через модбас rtu шлюз если передавать уставки сохраняются.

Вот wb правило:

defineVirtualDevice(“vdev”, {
cells: {
minP: {
type: “value”,
value: 1,
min: 0,
max: 250,
forceDefault: false,
readonly: false
},
maxP: {
type: “value”,
value: 40,
min: 0,
max: 250,
forceDefault: false,
readonly: false
},
minT: {
type: “value”,
value: 5,
min: 0,
max: 30,
forceDefault: false,
readonly: false
},
maxT: {
type: “value”,
value: 20,
min: 0,
max: 30,
forceDefault: false,
readonly: false
}
}
});

Вот так например, пожалуй самый надежный способ:

//05_18_test_02.js
var scriptName = "05_18_test_02";

var ps = new PersistentStorage("storage_"+scriptName, {global: false});// Определим объект-хранилище.

var minP = Number(ps["minP"]);
var maxP = Number(ps["maxP"]);

//Элементы виртуального устройства
//управления
var deviceCells = { 
  minP: {
    type: "value",
    value: minP,
    min: 0,
    max: 250,
    forceDefault: true,
    readonly: false
  },
  maxP: {
    type: "value",
    value: maxP,
    min: 0,
    max: 250,
    forceDefault: true,
    readonly: false
  },
};

//Создаем устройство
defineVirtualDevice("VD_"+scriptName, {
    title:"VD "+scriptName,
    cells: deviceCells
  });


defineRule("MinP change", { //название правила 
whenChanged: "VD_"+scriptName+"/minP", //при изменении поля запишем значение в хранилище
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("VD_"+scriptName+"/minP", newValue); //Это лог. Он попадает в /var/log/messages
    ps["minP"] = newValue;
  }
});

defineRule("MaxP change", { //название правила 
whenChanged: "VD_"+scriptName+"/maxP", //при изменении поля запишем значение в хранилище
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("VD_"+scriptName+"/maxP", newValue); //Это лог. Он попадает в /var/log/messages
    ps["maxP"] = newValue;
  }
});

К сожалению с таким правилом значению по умолчанию будут NaN, что наверное может сыграть злую шутку при каком то либо сбросе ПЛК. А самое главное что уставки забиваешь также через MQTT а они не сохраняются и опять переходят в NaN

Ну, это же можно провериь а момент определения из хранилища и записать нужное-дефолтное.

Каким образом? Срабатывает ли правило при таком изменении?

к примеру пишу в топик через MQTT Explorer /devices/VD-dev/controls/maxP какое то значение. Проверяю в веб сервисе контроллера в каналах MQTT что уставки изменились, да они там меняются, но после пропадания питания включаем ПЛК и там будут значения NaN (которые изначально у нас были при создании правила). А вот если записываю эти уставки через mbgate rtu всё хорошо сохраняется.

Тут надо логику пониимать. Зпись в топик без /on меняет значения только в интерфейсе. Именно поэтому и спросл про запись в лог.

1 лайк

будет ли так работать?

defineVirtualDevice(“vdev”, {
cells: {
minP: {
type: “value”,
value: 1,
min: 0,
max: 250,
forceDefault: false,
readonly: false
},
maxP: {
type: “value”,
value: 40,
min: 0,
max: 250,
forceDefault: false,
readonly: false
},
minT: {
type: “value”,
value: 5,
min: 0,
max: 30,
forceDefault: false,
readonly: false
},
maxT: {
type: “value”,
value: 20,
min: 0,
max: 30,
forceDefault: false,
readonly: false
}
}
});

defineRule(“MinP change”, { //название правила
whenChanged: “vdev/minP”, //при изменении поля запишем значение в хранилище
then: function (newValue, devName, cellName) { //выполняй следующие действия
log.info(“vdev/minP”, newValue); //Это лог. Он попадает в /var/log/messages
ps[“minP”] = newValue;
}
});

defineRule(“MaxP change”, { //название правила
whenChanged: “vdev/maxP”, //при изменении поля запишем значение в хранилище
then: function (newValue, devName, cellName) { //выполняй следующие действия
log.info(“vdev/maxP”, newValue); //Это лог. Он попадает в /var/log/messages
ps[“maxP”] = newValue;
}
});

defineRule(“MinT change”, { //название правила
whenChanged: “vdev/minT”, //при изменении поля запишем значение в хранилище
then: function (newValue, devName, cellName) { //выполняй следующие действия
log.info(“vdev/minT”, newValue); //Это лог. Он попадает в /var/log/messages
ps[“minT”] = newValue;
}
});

defineRule(“MaxT change”, { //название правила
whenChanged: “vdev/maxT”, //при изменении поля запишем значение в хранилище
then: function (newValue, devName, cellName) { //выполняй следующие действия
log.info(“vdev/maxT”, newValue); //Это лог. Он попадает в /var/log/messages
ps[“maxT”] = newValue;
}
});

Сохранять - будет. Но без

forceDefault: true

и явного указания value:
при запуске - не будет определяться.
Я про вот это:

var minP = Number(ps["minP"]);
var maxP = Number(ps["maxP"]);

Ну и если скрпт целиком - не видно определения хранилища.