Показано с 1 по 8 из 8

Тема: Вопрос к знатокам ST

  1. #1

    По умолчанию Вопрос к знатокам ST

    Добрый день, вопрос к знатокам языка 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.
    Вопрос: как сделать, что бы при подключении датчика с номером, которого нет в списке ,Выход "Заводской номер" выдавал значение (например "Нет в списке")
    Спасибо.

  2. #2
    Пользователь
    Регистрация
    10.11.2014
    Адрес
    Санкт-Петербург
    Сообщений
    980

    По умолчанию

    Делать через оператор case.

  3. #3
    Пользователь
    Регистрация
    10.11.2014
    Адрес
    Санкт-Петербург
    Сообщений
    980

    По умолчанию

    Другой вариант.

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

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

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

  4. #4

    По умолчанию

    Цитата Сообщение от Спорягин Кирилл Посмотреть сообщение
    Другой вариант.

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

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

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

  5. #5

    По умолчанию

    Цитата Сообщение от Спорягин Кирилл Посмотреть сообщение
    Делать через оператор case.
    Буду изучать CASE

  6. #6

    По умолчанию

    Я хочу отметиться =) Мне понравилась идея!
    Хочу предложить решение чуток поизящнее в плане того, чтобы его было удобно заполнять и расширять в будущем и чтобы оно выглядело нагляднее.
    Можно объявить МАССИВ структур в виде константы (я надеюсь, что в 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 на нужное (сколько штук сопоставлений будет) и дописать строки в константу-массив.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

  7. #7

    По умолчанию

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

  8. #8

    По умолчанию

    Вова13 Пожалуйста! Я, к сожалению, работаю с CodeSys, а MasterSCADA не знаю. А задачка стала интересной!
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net

Похожие темы

  1. Вопрос к знатокам по использованию Hardella
    от Р.Александр в разделе Помощь Разработчикам
    Ответов: 2
    Последнее сообщение: 20.04.2022, 09:39
  2. Настррйка трм 212 вопрос знатокам из 2х частей
    от CyxoB в разделе Эксплуатация
    Ответов: 9
    Последнее сообщение: 05.10.2019, 22:41
  3. Вопрос к знатокам
    от Одесса в разделе Трёп (Курилка)
    Ответов: 12
    Последнее сообщение: 06.07.2018, 11:50
  4. Вопрос к знатокам
    от Одесса в разделе Контроллеры для систем отопления и ГВС
    Ответов: 0
    Последнее сообщение: 05.07.2018, 08:47
  5. СИ-8 вопрос к знатокам
    от незарегистрированный в разделе Эксплуатация
    Ответов: 3
    Последнее сообщение: 28.09.2007, 10:51

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •