Страница 52 из 699 ПерваяПервая ... 242505152535462102152552 ... ПоследняяПоследняя
Показано с 511 по 520 из 6985

Тема: CODESYS V3.5. Вопросы и ответы

  1. #511

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Str:STRING:='Line1$R$NLine2';
    Опять же большое спасибо!

    Другой вопрос - по реализации конечных автоматов в CDS.

    Суть вопроса - как производить некое действие (показ визуализации в моем случае) однократно при наступлении заданного события (перехода КА в определенный статус)?

    Пример - есть два статуса КА - State1 и State2. Когда КА в первом, то пользователь должен видеть Vis1, для Статуса2 - Vis2. Но из Vis1 можно перейти в VisN посредством нажатия кнопки, например.

    Тогда имеем примерно такой код:
    Case System.State OF
    State1:
    <код, связанный со статусом>
    VisuElems.CurrentVisu:='Vis1';
    State2:
    <код, связанный со статусом>
    VisuElems.CurrentVisu:='Vis2';
    END_CASE

    Проблема тут в том, что это код будет выполнятся постоянно благодаря парадигме CDS и из Vis1 мы никогда не перейдем в VisN, поскольку VisN будет в следующем цикле затерта Vis1.
    Эта же проблема делает очень затруднительной отладку в симуляции, когда нельзя вручную выбрать визуализацию.
    Решение, которое напрашивается - это блокировка навроде:

    Case System.State OF
    State1:
    <код, связанный со статусом>
    IF DrawOnlyOnce = True Then
    VisuElems.CurrentVisu:='Vis1';
    DrawOnlyOnce :=False;
    END_IF
    State2:
    <код, связанный со статусом>
    VisuElems.CurrentVisu:='Vis2';
    END_CASE

    Но это какой-то громоздкий и неправильный выход.

    Как надо в этом случае поступать?

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

    По умолчанию

    Цитата Сообщение от SokolovA Посмотреть сообщение
    Но это какой-то громоздкий и неправильный выход.

    Как надо в этом случае поступать?
    По-моему, вполне разумная реализация. Я бы, наверное, сделал чуть иначе:

    IF VisuElems.CurrentVisu='Vis1' OR VisuElems.CurrentVisu='Vis2' THEN
    Case System.State OF
    State1:
    <код, связанный со статусом>
    VisuElems.CurrentVisu:='Vis1';
    State2:
    <код, связанный со статусом>
    VisuElems.CurrentVisu:='Vis2';
    END_CASE
    END_IF

  3. #513

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    По-моему, вполне разумная реализация. Я бы, наверное, сделал чуть иначе:
    Спасибо, сделал вот так:
    Error:
    StateIdle();
    StateError();
    IF DEBUG.Enabled=FALSE THEN
    IF VisuElems.CurrentVisu<>Vis.Error.Name THEN
    VisuElems.CurrentVisu:=Vis.Error.Name;
    END_IF
    END_IF

    И отладке не мешает и достаточно компактно.

    Следующие вопросы по GUI:
    1. Визуализация, в ней N однотипных объектов (Rectangle). Цвет и текст меняется динамически, соответственно я создаю массив из N структур; структура содержит переменные для хранения параметров каждого объекта. Доступа к объектной модели визуализации и ее контролам нет, правильно?
    ТЗ предусматривается выделение активного объекта (рамочкой например). Собственно вопрос - выделяю я первый объект, он меняет статус (с Normal на Alarm State), выделяю второй... а как сбросить выделение первого, если в Event On_Click и прочее никаких аргументов не передается и вообще понятие Event Handler в CDS, как я понимаю, отсутствует?
    2. Как изменить размер и тип шрифта в ComboBox Integer?

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

    По умолчанию

    Цитата Сообщение от SokolovA
    Доступа к объектной модели визуализации и ее контролам нет, правильно?
    Верно.

    Цитата Сообщение от SokolovA
    Собственно вопрос - выделяю я первый объект, он меняет статус (с Normal на Alarm State), выделяю второй... а как сбросить выделение первого, если в Event On_Click и прочее никаких аргументов не передается
    Если есть какое-то изящное решение, я о нем не в курсе. Очевидный вариант - для каждого прямоугольника в Event On_Click написать ST-код, который будет сбрасывать выделение со всех остальных.


    Цитата Сообщение от SokolovA
    и вообще понятие Event Handler в CDS, как я понимаю, отсутствует?
    Оно, в принципе, есть, но используется в более узком контексте. Прикладываю пример от 3S. Больше примеров можно найти на http://store.codesys.com/.

    Цитата Сообщение от SokolovA
    2. Как изменить размер и тип шрифта в ComboBox Integer?
    16-12-2015 7-43-33.png

    Шрифт и тип менять не советую - на СПК в этом случае он может отображаться иначе, чем в редакторе CODESYS.
    Вложения Вложения

  5. #515

    По умолчанию

    Цитата Сообщение от SokolovA Посмотреть сообщение
    Собственно вопрос - выделяю я первый объект, он меняет статус (с Normal на Alarm State), выделяю второй... а как сбросить выделение первого, если в Event On_Click и прочее никаких аргументов не передается и вообще понятие Event Handler в CDS, как я понимаю, отсутствует?
    2. Как изменить размер и тип шрифта в ComboBox Integer?
    В действиях каждого объекта объекта вызываете сначала функцию, которая меняем все объекты с Alarm State на Normal, вторым действием ставите активному объекту Alarm State. Таким образом функция для всех объектов будет одна и та же.

  6. #516

    По умолчанию

    Цитата Сообщение от RV9WFJ Посмотреть сообщение
    В действиях каждого объекта объекта вызываете сначала функцию, которая меняем все объекты с Alarm State на Normal, вторым действием ставите активному объекту Alarm State. Таким образом функция для всех объектов будет одна и та же.
    Вопрос как определить активный объект? Нет ни аналога this ни какого-либо еще указателя на объект.

    Еще про Retain-переменные.
    1. При компиляции получаю вот такие вот ворнинги:
    [WARNING] Stacker v1: Globals [Device: PLC Logic: Application](Line 34): C0244: No VAR_PERSISTENT-list is part of the application to enter instance path for variable Globals.Config

    Globals - это список с глобальными переменными, структура Config в нем объявлена вот так:
    VAR_GLOBAL PERSISTENT RETAIN
    Config: ConfigStruct;

    В этом же Globals есть блоки:
    VAR_GLOBAL CONSTANT PERSISTENT RETAIN
    VAR_GLOBAL PERSISTENT RETAIN
    VAR_GLOBAL

    2. Есть массив структур RackData 3х8, состоящий из переменных: BYTE, BYTE, BYTE, ENUM, BYTE, BYTE, WSTRING, BOOL.
    При операции Login в симуляции получаю такую ошибку:
    [ERROR] Stacker v1: Globals [Device: PLC Logic: Application](Line 7): C0103: Out of retain memory: Variable 'RackData', 4176 bytes (Largest contiguous memory gap 4064) (Incremental compilation may produce fragmented memory. Perform "Build, Clean" to force a reallocation of all data and code.)
    Build complete -- 1 errors, 8 warnings : no download possible!

    Что за блоки по 4 кб и почему ему не хватает памяти? На СПК110 ее должны быть мегабайты!

  7. #517

    По умолчанию

    Цитата Сообщение от SokolovA Посмотреть сообщение
    Вопрос как определить активный объект? Нет ни аналога this ни какого-либо еще указателя на объект.
    А зачем? В каждом объекте есть событие OnClick и т.д. в них и записываем вызов функции и изменение битовой переменной Alarm, главное последовательность не перепутать.
    Еще про Retain-переменные.
    1. При компиляции получаю вот такие вот ворнинги:
    [WARNING] Stacker v1: Globals [Device: PLC Logic: Application](Line 34): C0244: No VAR_PERSISTENT-list is part of the application to enter instance path for variable Globals.Config
    Лучше напишите что у вас в строке 34 написано. А то такой винегрет, что ничего не понятно. К чему например это VAR_GLOBAL CONSTANT PERSISTENT RETAIN? Константа она и есть константа.
    Что за блоки по 4 кб и почему ему не хватает памяти? На СПК110 ее должны быть мегабайты!
    А тут привет Овну, они зачем-то ограничили Retain 4мя кБ. В новой прошивке обещали исправить, но это когда еще будет :-)

  8. #518

    По умолчанию

    Цитата Сообщение от RV9WFJ Посмотреть сообщение
    А тут привет Овну, они зачем-то ограничили Retain 4мя кБ.
    Например, гарантированностью записи энергетическим возможностям конденсаторов БП.

  9. #519

    По умолчанию

    Цитата Сообщение от RV9WFJ Посмотреть сообщение
    А зачем? В каждом объекте есть событие OnClick и т.д. в них и записываем вызов функции и изменение битовой переменной Alarm, главное последовательность не перепутать.
    Не допер про последовательность, спасибо!

    Цитата Сообщение от RV9WFJ Посмотреть сообщение
    Лучше напишите что у вас в строке 34 написано.
    Config: ConfigStruct;

    ConfigStruct выглядит так:
    TYPE ConfigStruct :
    STRUCT
    ParkPositionX:BYTE:=0;
    ParkPositionY:BYTE:=0;
    ImpulseCountPerLevelX:BYTE:=4;
    ImpulseCountPerLevelY:BYTE:=4;
    DriveHorizontalBrakeReleaseDelay:TIME:=T#3000MS;
    DriveVorizontalBrakeReleaseDelay:TIME:=T#3000MS;
    END_STRUCT
    END_TYPE


    Цитата Сообщение от RV9WFJ Посмотреть сообщение
    А тут привет Овну, они зачем-то ограничили Retain 4мя кБ. В новой прошивке обещали исправить, но это когда еще будет :-)
    Как это обойти? AlarmStorage занимает в Retain место? Можно строки объявить фиксированной длины типа WSTRING[20] или в STRING писать русский текст?

    Я от Овна вообще в шоке, в железке за такие деньги 4 кб. Конденсаторы в БП? Ну сделайте как 10 лет назад делали в ПЛК - SD-слот для карточки, на скорость в этом случае пофигу, GUI может обновляться и раз в секунду.

  10. #520

    По умолчанию

    Доброго вечера!
    Решил заморочиться передачей данных не через конфигурацию, а через библиотеку. Пытаюсь разобраться в правильном ли я направлении. Создал структуру
    Код:
    TYPE test :
    STRUCT
    	x1				:DWORD;
    	x2				:WORD;
    	x3				:WORD;
    	x4				:REAL;
    	x5				:REAL;
    END_STRUCT
    END_TYPE
    В переменных указал
    Код:
    buf_read_pr		:read_pr200;
    
    	from_pr			:POINTER TO test;
    	Buffer			:ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)
    В теле программы

    Код:
    		from_pr:=ADR(Buffer);
    		buf_read_pr:=from_pr^;
    		x11:=test.x1;
    ................
    		x15:=test.x5;
    Если я правильно понимаю данную конструкцию, то полученный массив байт копируется в указанную структуру, после чего из неё уже присваиваю значения переменным. Но что-то мне подсказывает, что код неправильный. Ткните в нужном направлении...
    Подозреваю, что

Страница 52 из 699 ПерваяПервая ... 242505152535462102152552 ... ПоследняяПоследняя

Похожие темы

  1. Панели оператора СП3xx. Вопросы и ответы
    от Мурат Ахриев в разделе Панели оператора (HMI)
    Ответов: 3177
    Последнее сообщение: Вчера, 12:47
  2. Панели оператора ИП320. Вопросы и ответы
    от automat в разделе Панели оператора (HMI)
    Ответов: 822
    Последнее сообщение: 20.11.2023, 17:48
  3. ИПП120. Вопросы и ответы
    от Р.Александр в разделе Программируемые реле
    Ответов: 245
    Последнее сообщение: 02.10.2022, 11:34
  4. Индикатор ИП120 , вопросы- ответы
    от rovki в разделе Программируемые реле
    Ответов: 56
    Последнее сообщение: 03.11.2017, 15:58
  5. Панели оператора СП270. Вопросы и ответы
    от Давидюк в разделе Панели оператора (HMI)
    Ответов: 930
    Последнее сообщение: 15.05.2017, 17:12

Ваши права

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