PDA

Просмотр полной версии : Вопрос к знатокам ST



Вова13
12.09.2022, 09:19
Добрый день, вопрос к знатокам языка ST
Стоит задача преобразовать значение на входе ФБ (значение-ID номер датчика, который зашит в регистре и считывается по modbus rnu) и преобразовать его в Заводской номер датчика,для последующего использования а программе.

Так как знаний моих в ST маловато ,прошу помочь
_____________________________________________

Input-DWORD;
Заводской_номер-STRING

;if (Input=10091474) THEN Заводской_номер:='52580';
END_IF
if (Input=10091464) THEN Заводской_номер:='52585';
END_IF
if (Input=10090645) THEN Заводской_номер:='52597';
END_IF
if (Input=10089558) THEN Заводской_номер:='52599';
END_IF
if (Input= 10089559) THEN Заводской_номер:='52604';
END_IF

и таких строк 150.
Вопрос: как сделать, что бы при подключении датчика с номером, которого нет в списке ,Выход "Заводской номер" выдавал значение (например "Нет в списке")
Спасибо.

Спорягин Кирилл
12.09.2022, 09:21
Делать через оператор case.

Спорягин Кирилл
12.09.2022, 09:30
Другой вариант.

Заводской_номер := "Нет в списке";

if (input = 1) then Заводской_номер := 1; end_if
if (input = 2) then Заводской_номер := 2; end_if
...
if (input = 3) then Заводской_номер := 3; end_if

Если ни один if не сработает, то Заводской_номер будет иметь значение "Нет в списке".

Вова13
12.09.2022, 09:42
Другой вариант.

Заводской_номер := "Нет в списке";

if (input = 1) then Заводской_номер := 1; end_if
if (input = 2) then Заводской_номер := 2; end_if
...
if (input = 3) then Заводской_номер := 3; end_if

Если ни один if не сработает, то Заводской_номер будет иметь значение "Нет в списке".

Спасибо,так работает.

Вова13
12.09.2022, 09:42
Делать через оператор case.

Буду изучать CASE

Cs-Cs
13.09.2022, 07:30
Я хочу отметиться =) Мне понравилась идея!
Хочу предложить решение чуток поизящнее в плане того, чтобы его было удобно заполнять и расширять в будущем и чтобы оно выглядело нагляднее.
Можно объявить МАССИВ структур в виде константы (я надеюсь, что в MasterSCADA это есть).
Важно: мои примеры - для CodeSys v 2.3!

Мои идеи такие:
а) Делаем структуру с полями "InputVal" и "SerialVal"

TYPE DataType :
STRUCT
InputVal : STRING;
SerialVal : STRING;
END_STRUCT
END_TYPE
б) Объявляем константу MAX_DATA, которая будет равна числу элементов массива. Константу я применяю для того, чтобы в будущем в разных местах программы не исправлять длину массива данных.
в) Объявляем константой массив структур и сразу его объявляем, записываю красиво в столбик. На CodeSys 2.3 это может выглядеть так:

VAR
InputCode : STRING;
ZavodNomer : STRING;
iPos : WORD;
END_VAR
VAR CONSTANT
MAX_DATA : WORD := 3;
SERIAL_DATA : ARRAY [1..MAX_DATA] OF DataType :=
(InputVal := '10091474', SerialVal := '52580'),
(InputVal := '10091464', SerialVal := '52585'),
(InputVal := '10090645', SerialVal := '52597')
;
END_VAR
Объявление массива можно продолжить, и, если расставить табуляции, то получится красивая табличка сопоставления "Входное значение" = "Серийник"
г) Дальше сначала назначаем нашей переменной значение "Нет в списке", а потом в цикле проходим по нашему массиву и, если находим нужное значение - завершаем цикл.

ZavodNomer := 'Нет в списке';

FOR iPos := 1 TO MAX_DATA DO
IF (SERIAL_DATA[iPos].InputVal = InputCode) THEN
ZavodNomer := SERIAL_DATA[iPos].SerialVal;
EXIT;
END_IF;
END_FOR;

Плюс моего решения - то, что все данные сопоставления находятся в наглядном месте и то, что это сопоставление можно лего дополнить: надо всего лишь поменять значение MAX_DATA на нужное (сколько штук сопоставлений будет) и дописать строки в константу-массив.

Вова13
13.09.2022, 14:53
Добрый день. Повторил Ваш пример в CodeSys (попутно почитал, как создать структуру).В плане кода это действительно выглядит более красиво. Возможно у меня получится понять как в МС создать структуру и воссоздать Ваш вариант.Спасибо
62617

Cs-Cs
13.09.2022, 14:55
Вова13 Пожалуйста! Я, к сожалению, работаю с CodeSys, а MasterSCADA не знаю. А задачка стала интересной!