Я хочу отметиться =) Мне понравилась идея!
Хочу предложить решение чуток поизящнее в плане того, чтобы его было удобно заполнять и расширять в будущем и чтобы оно выглядело нагляднее.
Можно объявить МАССИВ структур в виде константы (я надеюсь, что в 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 на нужное (сколько штук сопоставлений будет) и дописать строки в константу-массив.