Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 24

Тема: Какой синтаксис инициализации массива структур

  1. #11

    По умолчанию

    Извините, не в своей теме вопрос: Есть массив структур, делаю инициализацию структур значенями по умолчанию. Хочу чтобы эти значения были защищены от изменения. Возможно ли такое?
    Код:
    TYPE MB_SWORD :
    STRUCT
    	iChannelIndex	: INT;
    	uiDataAddr		: UINT;
    	uiDataCount		: UINT := 1;
    	wData			: WORD;
    END_STRUCT
    END_TYPE
    Присвоенное значение хочу защитить от изменения
    uiDataCount : UINT := 1;
    Можно ли это сделать?

  2. #12
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,062

    По умолчанию

    Цитата Сообщение от RomeoVar Посмотреть сообщение
    Извините, не в своей теме вопрос: Есть массив структур, делаю инициализацию структур значенями по умолчанию. Хочу чтобы эти значения были защищены от изменения. Возможно ли такое?
    Код:
    TYPE MB_SWORD :
    STRUCT
    	iChannelIndex	: INT;
    	uiDataAddr		: UINT;
    	uiDataCount		: UINT := 1;
    	wData			: WORD;
    END_STRUCT
    END_TYPE
    Присвоенное значение хочу защитить от изменения
    uiDataCount : UINT := 1;
    Можно ли это сделать?
    Максимум, что можно сделать:

    uiDataCount : UINT(1..1) := 1;

    Тогда если ввести любой литерал, кроме 1 - компилятор выдаст ошибку.
    Но если вместо литерала присвоить переменную - то ошибок не будет, потому что это не константа, а тип с ограничением диапазона (subrange).

  3. #13

    По умолчанию

    Спасибо,
    Плохо конечно что можно изменить, но терпимо.
    А что если рецепт прикрутить? И ограничить значения минимальным/максимальным значением?
    И при загрузке заполнять переменные значениями из рецепта
    Изображения Изображения

  4. #14
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,062

    По умолчанию

    Цитата Сообщение от RomeoVar Посмотреть сообщение
    Спасибо,
    Плохо конечно что можно изменить, но терпимо.
    А что если рецепт прикрутить? И ограничить значения минимальным/максимальным значением?
    И при загрузке заполнять переменные значениями из рецепта
    Я не думаю, что это усложнение повлияет на ситуацию.

  5. #15

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    а как же примеры из оскат, создается структура, создается VAR_GLOBAL CONSTANT и в нем объявляется такой пользовательский тип данных или вопрос не в этом
    Да вся соль как раз в том, что у меня не все элементы структуры являются константами. Мне от изменений нужно защитить только некоторые (содержащие номера регистров сервопривода).

    Codesys не дает целостного механизма работы по Modbus если нужно обмениваться достаточно большим количеством переменных. Если использовать таблицу каналов, каждый канал имеет свой индекс, к нему привязана переменная. Если обмен по флагу - нужны задержки и я ХЗ как нормально проверить что все данные записаны (пробовал вешать на циклическую задачу с малым временем вызова - все-равно бывают факты пропуска).
    Если использовать "приложение" ModbusChannel вроде все хорошо, НО (огромное такое) в качестве аргумента ModbusChannel принимает iChannelIndex и нужно придумать связку Переменная -> К***** а ее нет. В переменную данные записал но хрен-то я знаю номер канала к которой привязана переменная.
    БОлее-менее OwenCommunication, там нет каналов - чисто регистры устройства. Но к переменным нужно привязать адреса регистров, чтоб можно было в цикле отправлять данные и не париться, что я собственно и сделал. Такая вот структура (примерно, прошу не пинать)
    Код:
    TYPE MB_DWORD :
    STRUCT
    	iChannelIndex	: INT;
    	uiDataAddr		: UINT;
    	uiDataCount		: UINT := 2;
    	unData			: U_DW2W;
    END_STRUCT
    END_TYPE
    И потом собираю все регистры в Массив устройства (тут уже я подумываю о FB с закрытыми свойствами, но это тож не сильно поможет). И полю uiDataAddr определяю регистр памяти устройства. Но если, случайно, эти значения изменятся.... все сломается...
    Код:
    TYPE ST_SERVO_RW :
    STRUCT
    	wInputSignal: ARRAY[0..7] OF MB_SWORD :=
    		[
    			(uiDataAddr := 500),
    			(uiDataAddr := 501),
    			(uiDataAddr := 502),
    			(uiDataAddr := 503),
    			(uiDataAddr := 504),
    			(uiDataAddr := 505),
    			(uiDataAddr := 506),
    			(uiDataAddr := 507)
    		];
    	wdwLevInSignal: MB_DWORD 	:= (uiDataAddr := 508);
    	wdwOutSignal: MB_DWORD 	:= (uiDataAddr := 510);
    	wP0_ConMode: MB_SWORD 	:= (uiDataAddr := 0);
    	wP2_EncTypeRes: MB_SWORD	:= (uiDataAddr := 2);
    	wP205_Gear: MB_SWORD 		:= (uiDataAddr := 205);
    	wP206_Gear: MB_SWORD 		:= (uiDataAddr := 206);
    	wP225_Gear: MB_SWORD 		:= (uiDataAddr := 225);
    	wP226_Gear: MB_SWORD 		:= (uiDataAddr := 226);
    	wP525_Coin: MB_SWORD 		:= (uiDataAddr := 525);
    	wP700_IntPosP: MB_SWORD 	:= (uiDataAddr := 700);
    	wP765_IntPosDZT: MB_SWORD	:= (uiDataAddr := 765);
    	wP770_IntPosSw: MB_SWORD 	:= (uiDataAddr := 770);
    	stHoming: HOME_POS_REGS;
    	stIntPos: ARRAY[0..15] OF INT_POS_REGS := 
    		[
    			(unIntPos := (uiDataAddr := 701),	wIntPosACDC := (uiDataAddr := 749), wIntPosSPD := (uiDataAddr := 733)),
    			(unIntPos := (uiDataAddr := 703), 	wIntPosACDC := (uiDataAddr := 750), wIntPosSPD := (uiDataAddr := 734)),
    			(unIntPos := (uiDataAddr := 705), 	wIntPosACDC := (uiDataAddr := 751), wIntPosSPD := (uiDataAddr := 735)),
    			(unIntPos := (uiDataAddr := 707), 	wIntPosACDC := (uiDataAddr := 752), wIntPosSPD := (uiDataAddr := 736)),
    			(unIntPos := (uiDataAddr := 709), 	wIntPosACDC := (uiDataAddr := 753), wIntPosSPD := (uiDataAddr := 737)),
    			(unIntPos := (uiDataAddr := 711), 	wIntPosACDC := (uiDataAddr := 754), wIntPosSPD := (uiDataAddr := 738)),
    			(unIntPos := (uiDataAddr := 713), 	wIntPosACDC := (uiDataAddr := 755), wIntPosSPD := (uiDataAddr := 739)),
    			(unIntPos := (uiDataAddr := 715), 	wIntPosACDC := (uiDataAddr := 756), wIntPosSPD := (uiDataAddr := 740)),
    			(unIntPos := (uiDataAddr := 717), 	wIntPosACDC := (uiDataAddr := 757), wIntPosSPD := (uiDataAddr := 741)),
    			(unIntPos := (uiDataAddr := 719), 	wIntPosACDC := (uiDataAddr := 758), wIntPosSPD := (uiDataAddr := 742)),
    			(unIntPos := (uiDataAddr := 721), 	wIntPosACDC := (uiDataAddr := 759), wIntPosSPD := (uiDataAddr := 743)),
    			(unIntPos := (uiDataAddr := 723), 	wIntPosACDC := (uiDataAddr := 760), wIntPosSPD := (uiDataAddr := 744)),
    			(unIntPos := (uiDataAddr := 725), 	wIntPosACDC := (uiDataAddr := 761), wIntPosSPD := (uiDataAddr := 745)),
    			(unIntPos := (uiDataAddr := 727), 	wIntPosACDC := (uiDataAddr := 762), wIntPosSPD := (uiDataAddr := 746)),
    			(unIntPos := (uiDataAddr := 729), 	wIntPosACDC := (uiDataAddr := 763), wIntPosSPD := (uiDataAddr := 747)),
    			(unIntPos := (uiDataAddr := 731), 	wIntPosACDC := (uiDataAddr := 764), wIntPosSPD := (uiDataAddr := 748))
    			
    		];
    END_STRUCT
    END_TYPE

  6. #16

    По умолчанию

    Вот это прикол - мне к-а-н-а-л в сообщении затерли. Оставили только К****

  7. #17
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,062

    По умолчанию

    Но если, случайно, эти значения изменятся.... все сломается...
    Очень странная фраза, на мой взгляд.
    Значения могут измениться "случайно" только из-за segfault, но тогда уже маловероятно, что какая-то соломка поможет.
    И это не особенность CODESYS - это везде так.

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

    Цитата Сообщение от RomeoVar Посмотреть сообщение
    Вот это прикол - мне к-а-н-а-л в сообщении затерли. Оставили только К****
    Это вордфильтр форума так исторически работает.

  8. #18

    По умолчанию

    вопрос.jpg
    Добрый день. Интересует вопрос о инициализации массива структур. А именно структуры содержащей элементы пользовательского типа (UNION). Когда пытаюсь инициализировать переменную( в Global Variable List обращаясь к ней через точку, как
    показано в первой части скриншота, в итоге получаю ошибку синтаксиса. Если объявлять такой массив без инициализации и работать с ним в программе, то все работает.
    Во второй части скриншота показал, что общий синтаксис инициализации массива правильный и проблема в типе данных. Подскажите, данная проблема решаема и как можно инициализировать подобный массив (интересует возможность инициализации, именно каждого элемента массива по-отдельности, а не в самой структуре).

  9. #19
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    12,062

    По умолчанию

    Цитата Сообщение от allozavr Посмотреть сообщение
    вопрос.jpg
    Добрый день. Интересует вопрос о инициализации массива структур. А именно структуры содержащей элементы пользовательского типа (UNION). Когда пытаюсь инициализировать переменную( в Global Variable List обращаясь к ней через точку, как
    показано в первой части скриншота, в итоге получаю ошибку синтаксиса. Если объявлять такой массив без инициализации и работать с ним в программе, то все работает.
    Во второй части скриншота показал, что общий синтаксис инициализации массива правильный и проблема в типе данных. Подскажите, данная проблема решаема и как можно инициализировать подобный массив (интересует возможность инициализации, именно каждого элемента массива по-отдельности, а не в самой структуре).
    Добрый день.

    Код:
    xxx_2: ARRAY [0..1] OF AI_Struct := [(a := (rRealValue := 1.0), b := 2.0), (a := (rRealValue := 3.0), b := 4.0)];

  10. #20

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Добрый день.

    Код:
    xxx_2: ARRAY [0..1] OF AI_Struct := [(a := (rRealValue := 1.0), b := 2.0), (a := (rRealValue := 3.0), b := 4.0)];
    Спасибо огромное! Вы случайно не знаете книжку, где описаны нюансы подобные этому?

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Похожие темы

  1. ПЛК 110, модбас и массивы структур.
    от lttn в разделе ПЛК (среда MasterSCADA 4D)
    Ответов: 7
    Последнее сообщение: 17.10.2019, 22:01
  2. Синтаксис Если()
    от Nikel097 в разделе Master SCADA 3
    Ответов: 2
    Последнее сообщение: 21.11.2017, 19:43
  3. Ответов: 4
    Последнее сообщение: 05.09.2012, 07:17
  4. инициализация массива структур
    от drvlas в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 16.12.2010, 18:31
  5. Ответов: 6
    Последнее сообщение: 05.04.2010, 09:06

Ваши права

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