PDA

Просмотр полной версии : Структура+константы (?) введённые через панель, при старте программы



In_Da_Cher_A
27.03.2024, 21:40
привет
столкнулся вот с таким вот решением в программе, и не пойму как мне сделать то, что мне надо сделать (каламбурчик)
есть ПЛК, который Слейв. Есть Панель Мастер.
Есть два аналоговых датчика-входных сигнала, параметры диапазона каждого канала для которых задаются с панели - начало и конец диапазона.
есть вот такой код

(*Уставки*)
IF NOT FIRST_SCAN THEN
(*Уставки FLOAT*)
MB0000_FLT := PT_Input.Lo_Limit;
MB0002_FLT := PT_Input.Hi_Limit;
MB0004_FLT := FT_R1.Lo_Limit;
MB0006_FLT := FT_R1.Hi_Limit;
MB0008_FLT := PT_Input_Min_Pressure;
MB0010_FLT := PT_Input_Max_Pressure;
MB0012_FLT := FT_R1_Weigth_Pulse;
.................................................. .....
FIRST_SCAN := TRUE;
ELSE
(*Уставки FLOAT*)
PT_Input.Lo_Limit := MB0000_FLT;
PT_Input.Hi_Limit := MB0002_FLT;
FT_R1.Lo_Limit := MB0004_FLT;
FT_R1.Hi_Limit := MB0006_FLT;
PT_Input_Min_Pressure := MB0008_FLT;
PT_Input_Max_Pressure := MB0010_FLT;
FT_R1_Weigth_Pulse := MB0012_FLT;

МВхххх_FLT - это имя переменной и её адрес в слейве.
нас интересует РТ - давление и Расход FT
которые "сделаны" через структуру

TYPE AIN :
STRUCT
Hi_Limit: REAL := 50.0;
Lo_Limit: REAL := 0.0;
Value: REAL;
Status: REAL;
Error: BOOL;
END_STRUCT
END_TYPE
вот это присвоение значений для Hi и Lo - важно, так как при перезагрузке ПЛК происходит "обнуление" введённых через панель настроек канала Давления и Расхода и установка вот на эти 0 и 50, которые заданы в структуре получается как по-умолчанию.
при этом, в глобальных переменных всё это объявлено следующим образом

VAR_GLOBAL RETAIN PERSISTENT
(*Аналоговые сигналы*)
PT_Input: AIN; (*Параметры датчика давления*)
FT_R1: AIN; (*Параметры расходомера*)
......................
(*Уставки REAL*)
PT_Input_Min_Pressure: REAL := 0.5; (*Минимальное давление на входе*)
PT_Input_Max_Pressure: REAL := 5.0; (*Максимальное давление на входе *)
FT_R1_Weigth_Pulse: REAL := 30.0; (*Расходомер R1. Вес импульса - имп/л*)

мне надо, чтобы сохранялась возможность ввести начало - конец диапазона и это осталось в ПЛК до "следующего" ввода инженером.
То есть, введеённая 1 раз цифра, осталась в памяти, до следующего принудительного изменения через панель и не сбрасывалась на дефолтные, заданные, через структуру, которая в принципе мне только мешает, так как давление и расход конечно же не могут быть вообще одинаковыми по шкале
с уставками Min_Pressure и Max_Pressure и вес импульса мне понятно, я вбил там то, что мне надо и это останется.
Но вот, что мне сделать со структурой, я не понимаю.
и почему вот этот FIRST_SCAN со своим IF.....ELSE мне обнуляет при перезапуске введённые значения
это место я вообще не могу понять, какое-то кольцо сделано

Если убрать из структуры присовения значений


Hi_Limit: REAL;
Lo_Limit: REAL;

то где мне сделать эти присвоения значений своих (!) для КАЖДОГО датчика - для давления отдельно, для расхода отдельно
?
на ходу я попытался заснуть их в VAR_GLOBAL RETAIN PERSISTENT также, как Уставки


FT_R1.Lo_Limit: REAL := 0.0;
FT_R1.Hi_Limit: REAL := 100.0;

но КДС гворит это ошибка

как решить эту задачку?

при этом ввод через панель должен остаться, как и структура, чтобы не менять код слишком серьёзно, на это нет ни времени, ни возможности, система не моя, я просто "мимо проходил", но эта шаблонная заготовка неизвестного codemeister-а ему облегчила работу, но в реальной жизни приносит боль и страдания заказчику, вынужденного потом после вынужденных блекаутов восстанавливать настройки каналов

In_Da_Cher_A
27.03.2024, 21:49
то есть, если FIRST_SCAN := TRUE;
то мы пишем наши Лимиты, которые взяты из Структуры AIN в адреса, которые улетают в панель для отображения
PT_Input.Lo_Limit := MB0000_FLT;
PT_Input.Hi_Limit := MB0002_FLT;
FT_R1.Lo_Limit := MB0004_FLT;
FT_R1.Hi_Limit := MB0006_FLT;
потом FIRST_SCAN обнуляется
IF NOT FIRST_SCAN THEN
и идёт уже обратное присвоение Лимитов от Панели, где стоит оператор и вводит их заново и они остаются до следующего отключения питания или ресета ПЛК
MB0000_FLT := PT_Input.Lo_Limit;
MB0002_FLT := PT_Input.Hi_Limit;
MB0004_FLT := FT_R1.Lo_Limit;
MB0006_FLT := FT_R1.Hi_Limit;

где мне здесь разорвать это присвоение, но сохранить ввод с панели в дальнейшую "константу"?

kondor3000
27.03.2024, 22:46
где мне здесь разорвать это присвоение, но сохранить ввод с панели в дальнейшую "константу"?

Например, есть структура COMPRESSOR, она входит в массив структур
compressors :ARRAY [1..7] OF COMPRESSOR; Смотри скрин 74781
Чтобы присвоить переменной в структуре число, ставите например compressors[1], ставите точку, выбираете переменную из структуры, например
compressors[1].P_1st и присваиваете из переменной Var1 в неё число. Саму переменную Var1, можете пометить в RETAIN или VAR_GLOBAL RETAIN PERSISTENT

Можете менять переменную Var1 с панели, главное, чтобы в неё нигде больше ничего не записывалось ( убираете запись в эту переменную),
а так же убираете запись в переменную структуры compressors[1].P_1st из других мест.

In_Da_Cher_A
27.03.2024, 23:21
то есть надо сделать вот так?


VAR_GLOBAL RETAIN PERSISTENT
......................
(*Уставки REAL*)
F_Var1: REAL := 0.0; (*начало*)
F_Var2: REAL := 100.0; (*конец *)
.........................

и потом далее в тексте


(*Уставки*)
FT_R1.Lo_Limit:= F_Var1; (*присваиваем Лимитам значения констант*)
FT_R1.Hi_Limit:= F_Var2;

IF NOT FIRST_SCAN THEN
(*Уставки FLOAT*)
.................
MB0004_FLT:= FT_R1.Lo_Limit; (*присваиваем Лимитам новые значения при необходимости*)
MB0006_FLT:= FT_R1.Hi_Limit;
................
.................................................. .....
FIRST_SCAN := TRUE;
ELSE
(*Уставки FLOAT*)
....................
F_Var1:= MB0004_FLT; (*отправляем в панель константы при рестарте*)
F_Var2:= MB0006_FLT;
...............

и аналогично для давления
ну и соответственно убрать из описания структуры присвоение значений лимитов по дефолту
и больше никто не пишет там ничего