PDA

Просмотр полной версии : Двухсторонне связывание переменных в Codesys V2. Как?



vapik
14.07.2018, 09:38
Столкнулся на днях с довольно простой на вид задачей (удивительно, что только сейчас):
Необходимо сделать двухстороннее связывание внутренней переменной FB с переменной Modbus (для реализации read/write).
Испорченный высокоуровневым программированием мозг начал сразу рисовать в голове всякие observable, onValueChanged и т.д.

Но ведь есть же какое-то более простое решение, не такое дорогое (время, память), чем городить описанное выше.
Поделитесь, пожалуйста, примерами/идеями.

murdemon
14.07.2018, 11:53
In_out переменные просто в FB делаешь. И напрямую переменную с модбас запихиваешь. Она ещё и retain будет если модбас слейвом.

vapik
14.07.2018, 12:41
In_out переменные просто в FB делаешь. И напрямую переменную с модбас запихиваешь. Она ещё и retain будет если модбас слейвом.


А если между переменной структуры (user data type), объявленной в global variables и переменной Modbus в PLC Configuration?


UPD:
Экземпляр FB ниже съедает 13 байт.
Может какое-нибудь встроенное решение у Codesys есть?




FUNCTION_BLOCK TwoWayBinding

VAR_IN_OUT
plcVar: INT;
modVar: INT;
END_VAR

VAR
init: BOOL;
_lastPlcVar: INT;
_lastModVar: INT;
END_VAR

IF init THEN

IF plcVar <> _lastPlcVar THEN
modVar := plcVar;
ELSIF modVar <> _lastModVar THEN

(* TODO: Тестовая валидация *)
IF modVar > 100 THEN
modVar := 100;
END_IF;

plcVar := modVar;

END_IF;

END_IF;

init := TRUE;

_lastModVar := modVar;
_lastPlcVar := plcVar;

murdemon
14.07.2018, 13:40
Можно в FB работать с указателем на структуру. И передавать просто адрес первой переменной модбас. Ну это изврат.