Страница 329 из 352 ПерваяПервая ... 229279319327328329330331339 ... ПоследняяПоследняя
Показано с 3,281 по 3,290 из 3514

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

  1. #3281

    По умолчанию

    Добрый день!
    Подскажите, пожалуйста. Есть главный цикл, внутри главного цикла другой цикл, где побайтно собирается строка, привязанная к элементу "Текстовое поле" в визуализации (строго говоря, там массив строк, элементов текстовое поле 16 штук). Должна ли быть меньше нагрузка на подсистему КДС, связывающую программу с визуализацией, если сначала собирать строку в независимую промежуточную переменную, а потом, после выхода из внутреннего цикла, присвоить текстовому полю уже собранную строку. У меня поступает в парсер пачкой 16 строк по ~ 8-10 символов. Пробовал и так, и так - честно говоря, особой разницы во времени цикла (среднем, после сброса) не заметил. Как есть примерно 150 микросекунд, так и есть.

  2. #3282

    По умолчанию

    Петр Петрович Я могу ответить невпопад, так как прочитал "строка" и про это и хотел сказать.
    а) Конечно, сначала лучше собирать всё во временную переменную, а потом один раз её визуализации присваивать. Иначе же визуализация каждый раз будет пытаться обновляться. Скорости это может и не добавить, но так правильнее.
    б) Работа со строками чем сделана? Штатные функции тормозят, и всем советуют переходить на работу со строками по указателям (библиотека StringUtils - НЕ OwenStringUtils, а просто). У меня при переходе со штатных CONCAT на StringUtils загрузка процессора в одном из проектов упала с 97% до 70%. Сразу прям.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell

  3. #3283

    По умолчанию

    Спасибо за ответы! Да, там внутри парсера цикл FOR. Насчет временной переменной понял. Тоже думал, что пока подсистема визуализации протолкнет туда каждый символ... эти переключения на другую задачу для каждого символа стабильности не добавят. А работа со строками там как таковая отсутствует - проверяется заголовок в массиве принятых по TCP байт, далее результирующая строка собирается посимвольно, через индексы (в цикле FOR, т.к. заранее известна только максимально возможная длина сообщения, выход из цикла по стоповому байту и EXIT) и пищется признак конца строки.
    Последний раз редактировалось Петр Петрович; 24.07.2021 в 10:27.

  4. #3284

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    бредятина, не так парсится. Нехотите проект выкладывать скинте массив байт который нужно парсить
    Вот например:
    \xE0\x00\x3A\x58\xD0\x01\x75\x44\xD0\x02\x75\x44\x C0\x03\x00\x3A\xC0\x04\x00\x44\xC0\x05\x00\x11\xF0 \x06\x7F\x4E\xF0\x07\x7F\x4E\xF0\x08\x7F\x58\xF0\x 09\x7F\x67\xC0\x0A\x00\x11\xC0\x0B\x00\x2E\xC0\x0C \x00\x4C\xF0\x0D\x7F\x52\xF0\x0E\x7F\x5D\xC0\x0F\x 00\x11\xF0\x10\x7F\x4E\xF0\x11\x7F\x4E\xF0\x12\x7F \x58\xF0\x13\x7F\x67\xC0\x14\x00\x11\xC0\x15\x00\x 2E\xC0\x16\x00\x4C\xC8\x17\x20\x31\x50\x4F\x2E\x33 \x46\x4D\xFF\xC8\x18\x31\x30\x32\x2C\x33\x30\xFF\x C8\x19\x20\x31\x50\x4F\x2E\x33\x46\x4D\xFF\xC8\x1A \x20\x31\x50\x4F\x2E\x33\x46\x4D\xFF\xC8\x1B\x20\x 31\x50\x4F\x2E\x33\x46\x4D\xFF\xC8\x1C\x20\x31\x50 \x4F\x2E\x33\x46\x4D\xFF\xC8\x1D\x20\x31\x50\x4F\x 2E\x33\x46\x4D\xFF\xC8\x1E\x20\x31\x50\x4F\x2E\x33 \x46\x4D\xFF\xC8\x1F\x20\x31\x50\x4F\x2E\x33\x46\x 4D\xFF\xC8\x20\x20\x31\x50\x4F\x2E\x33\x46\x4D\xFF \xC8\x21\x20\x31\x50\x4F\x2E\x33\x46\x4D\xFF\xC8\x 22\x20\x31\x50\x4F\x2E\x33\x46\x4D\xFF\xC8\x23\x20 \x31\x50\x4F\x2E\x33\x46\x4D\xFF\xC8\x24\x20\x31\x 50\x4F\x2E\x33\x46\x4D\xFF\x80\x28\x80\x2B

    Кусок, начинающийся с C8h и заканчивающийся FFh - это строка символов, данные + индекс сигнала. А \x80\x2B (их хорошо в конце видно) это логическая единица, второй байт индекс сигнала. Вот я и прохожу последовательно весь массив входных данных, разбираю что к чему. В общем, алгоритм простейший линейный, нашли сигнатуру типа сигнала, определили индекс в какой элемент визуализации выдавать, определили конец строки в процессе прохода, если сигнал - строка символов. А как еще?

  5. #3285

    По умолчанию

    Нет, это аналоговые величины, строго говоря они всегда по 4 байта, но сигнатуру начала там надо определять по сочетанию отдельных бит (там в первый байт часть бит из самой величины залазит), поэтому я пока не стал про них писать. Иногда их может не быть. В посылке могут быть аналоговые данные, логические и символьные одновременно или только два или один из этих типов.
    Последний раз редактировалось Петр Петрович; 24.07.2021 в 12:21.

  6. #3286
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    9,700

    По умолчанию

    я правильно расшифровал посылку? owen.png
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  7. #3287

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    я правильно расшифровал посылку? owen.png
    Да, пожоже на правду, факт.

  8. #3288
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    9,700

    По умолчанию

    тогда находим первый начальный символ, это нулевой кейс, затем получаем строку из оставшегося массива(кейс 2) и далее делим её(split), находя символы яИ с помощью FIND в цикле и получаем строки
    Последний раз редактировалось capzap; 24.07.2021 в 13:08.
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  9. #3289

    По умолчанию

    У меня вот так было сделано. Искомая строка формируется сразу во время побайтового прохода:

    IF fb_TcpServer.abyRx[Current_Byte_Num]=16#C8 THEN // Байты начала serial значения, переменная длина последовательных данных
    Serial_Index:=fb_TcpServer.abyRx[Current_Byte_Num+1]-Serial_Offset; // Получаем порядковый номер для сигнала serial, с учетом смещения в общем порядке индексов всех сигналов

    FOR Symbol_Counter:=Current_Byte_Num+2 TO UDINT_TO_UINT(fb_TcpServer.Bytes_Read_Count)-1 BY 1 DO // Предполагаемая максимальная длина Serial - до конца строки данных, первые два байта заголовка прибавляем сразу к позиции
    IF fb_TcpServer.abyRx[Symbol_Counter]=16#FF THEN // Если признак конца последовательных данных
    Serial_Value[Serial_Index][Symbol_Counter-Current_Byte_Num-2]:=16#00; // То пишем признак конца строки и выходим из цикла
    EXIT;
    END_IF
    Serial_Value[Serial_Index][Symbol_Counter-Current_Byte_Num-2]:=fb_TcpServer.abyRx[Symbol_Counter]; // Переходим от Symbol_Counter к индексам (с нуля) для символов в строке
    END_FOR
    Current_Byte_Num:=Current_Byte_Num+(Symbol_Counter-Current_Byte_Num)+1; // Корректируем позицию, переходим на следующий за последовательными данными байт

    END_IF


    А вjобще, думаю лучше так заменить:

    //Serial_Value[Serial_Index][Symbol_Counter-Current_Byte_Num-2]:=fb_TcpServer.abyRx[Symbol_Counter]; // Переходим от Symbol_Counter к индексам (с нуля) для символов в строке
    Str_To_WEB[Symbol_Counter-Current_Byte_Num-2]:=fb_TcpServer.abyRx[Symbol_Counter]; // Собираем строку, но до выхода из цикла на визуализацию не отправляем !!!
    Последний раз редактировалось Петр Петрович; 24.07.2021 в 13:11.

  10. #3290

    По умолчанию

    Вопрос по компилятору:
    Вылезает 2 предупреждения с которыми не могу разобраться: Есть вообще где почитать по ошибкам/предупреждениям компилятора
    СПАСИБО
    ------ Компиляция : Приложение: Device.Application -------
    типизировать код...
    [WARNING] owenvisudialogs, 3.5.14.3 (production association owen): FileDirChoiceOwen(Вход элемента ID 72): C0373: Диалог <Keypad> не представлен в вашем приложении. Присутствует ли он в менеджере визуализции?
    [WARNING] PLCVIRTUAL_EXPERIMENT: SetDriversParameters [Device: Plc Logic: Application](ID элемента 21): C0198: Строковая константа ''GVL.stServoDrivePrms[GVL.enServoType].stServoAllPrms.wInputSignal[INDEX].uiD...' слишком велика для типа цели 'STRING'
    Код предупреждения c0198

Страница 329 из 352 ПерваяПервая ... 229279319327328329330331339 ... ПоследняяПоследняя

Похожие темы

  1. Панели оператора СП3xx. Вопросы и ответы
    от Мурат Ахриев в разделе Панели оператора (HMI)
    Ответов: 2264
    Последнее сообщение: Вчера, 23:53
  2. Панели оператора ИП320. Вопросы и ответы
    от automat в разделе Панели оператора (HMI)
    Ответов: 661
    Последнее сообщение: 11.08.2021, 19:59
  3. ИПП120. Вопросы и ответы
    от Р.Александр в разделе Программируемые реле
    Ответов: 218
    Последнее сообщение: 25.05.2021, 19:55
  4. Индикатор ИП120 , вопросы- ответы
    от rovki в разделе Программируемые реле
    Ответов: 56
    Последнее сообщение: 03.11.2017, 15:58
  5. Панели оператора СП270. Вопросы и ответы
    от Давидюк в разделе Панели оператора (HMI)
    Ответов: 930
    Последнее сообщение: 15.05.2017, 17:12

Ваши права

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