Просмотр полной версии : Тормозит проект в ПЛК 1**
Проект в ПЛК Большой, по блоку Statistic время цикла около 25 ms. Половину кода (*коментирую*) проект летит. Целиком тормозит. Даже когда подключаю СП270 при полной загрузке программы, связь с панелью теряется раз в секунду.
В параметрах модуля ставил время MinCecleLength = 50 все равно все также.
Что делать подскажите?
Алгоритм программы простой, в больших массивах висят значения.
По Модбас Слейв подключена СП270, По модбас мастер 2 ТРМ'а, СИ30, МЭ110
приборист
08.04.2016, 09:21
Нужно проект смотреть, как с массивами работаете. Может массивы в каждом цикле перегоняете каждый раз.
Нужно проект смотреть, как с массивами работаете. Может массивы в каждом цикле перегоняете каждый раз.
Массивы проверяются, если УСЛОВИЕ тогда записываем.
Половину кода (*коментирую*) проект летит. Целиком тормозит
а если в половине закоментированного раскоментировать половину?
а если в половине закоментированного раскоментировать половину?
потихоньку начинаются тормоза.
lara197a
08.04.2016, 11:23
Бегло посмотрел, у вас не корректно организованы циклы.
и тормоза идут из-за зацикливания внутри цикла.
У меня программы примерно раз в 10 больше крутятся в 10мс на ПЛК 100, на 110М2 тоже в 3-4мс.
Нужно оптимизировать, вынести условия из фор и уже запускать циклы по условию
Если не нужно перебирать все условия, то используйте выход из цикла eхit.
Дмитрий Артюховский
08.04.2016, 11:26
вы получаете медленные данные по последовательным интерфейсам, и при этом, в каждом цикле плк бессмысленно перелопачиваете одни и те же значения которые не успели измениться... ну и "алгоритмы" сортировки могли бы быть более так сказать алгоритмами )))
lara197a
08.04.2016, 11:34
Не посмотрел конфигурацию.
Вам по UDP опрос бы организовать.
пример на диске к ПЛК есть.
Данные летают с космической скоростью.
И т.к. как у вас данные поступают из сети,
то сделайте к примеру какую -нибудь переменную. которая передается последней и меняйте ее значение,
к примеру +1.
При изменении переменной, вы информируете ПЛК, что произошло обновление и по фронту запускайте обработку в цикле фор.
А не в каждом цикле ПЛК, не зная достоверно, что данные обновлены. гоняете фор в пустую.
Бегло посмотрел, у вас не корректно организованы циклы.
и тормоза идут из-за зацикливания внутри цикла.
У меня программы примерно раз в 10 больше крутятся в 10мс на ПЛК 100, на 110М2 тоже в 3-4мс.
Нужно оптимизировать, вынести условия из фор и уже запускать циклы по условию
Если не нужно перебирать все условия, то используйте выход из цикла eхit.
Прям в 10 раз больше???
Тоесть у вас особенный плк с памятью 1 310 720 кб?
мда....
Сделайте обработку массивов по тому же фронту, что и запись в них. Нет необходимости выполнять ФБ в каждом цикле.
Я понял ошибку, спасибо всем. Получается тормозит не ПЛК, а я:)
lara197a
08.04.2016, 13:55
ВАм бы еще флоат заменить на int, с нужным количеством знаков после запятой.
Или критично точность до большого числа знаков после запятой?
ВАм бы еще флоат заменить на int, с нужным количеством знаков после запятой.
Или критично точность до большого числа знаков после запятой?
Я бы с удовольствием, но от минуса к плюсу меняется значение, и ворд с минусом передавать на панель не знаю как.:confused: приходится дворд
lara197a
08.04.2016, 17:34
инт от -32т до +32т
самый левый бит в старшем байте (15) отвечает за знак.
и насчет стринг обрезать- это валенок очень правильно заметил.
инт от -32т до +32т
самый левый бит в старшем байте (15) отвечает за знак.
и насчет стринг обрезать- это валенок очень правильно заметил.
Нет примера, как такое число загнать на панель? У меня что-то не получалось давеча.
В конфигураторе ПЛК либо WORD, либо DWORD, либо Float. а как на СП270 передавать отрицательные значения не разобрался. Если есть пример такой, буду признателен.
Николаев Андрей
12.04.2016, 11:36
Действительно есть некоторая путаница когда начинаешь работать с конфигурацией.
В конфигурации ПЛК word обозначает не целочисленное в положительной области, а размер - 2 байта.
То есть никто не помешает Вам завести переменную:
param_int : int AT% (адрес в конфигурации ПЛК переменной с размером word).
И все :)
Нет примера, как такое число загнать на панель? У меня что-то не получалось давеча.
В конфигураторе ПЛК либо WORD, либо DWORD, либо Float. а как на СП270 передавать отрицательные значения не разобрался. Если есть пример такой, буду признателен.
Действительно есть некоторая путаница когда начинаешь работать с конфигурацией.
В конфигурации ПЛК word обозначает не целочисленное в положительной области, а размер - 2 байта.
То есть никто не помешает Вам завести переменную:
param_int : int AT% (адрес в конфигурации ПЛК переменной с размером word).
И все :)
Не надо через AT%. И так все будет работать
1. Заведите в конфигурации переменную 2 byte. Присвойте там же ей имя, например, HMI_PV1
23815
2. Для элемента на экране панели задайте регистр управления с нужным адресом, в данном случае таким
23816
тип данных д.б. Word
3. На вкладке вид задайте формат Dec, длину всего и длину дробной части, например, на дисплей будет выводится 5 знаков, три для целой части и два для дробной.
23817
4. Значения, передаваемые на панель, нужно преобразовать из Real в INT. Только в начале нужно значение Real умножить на 10 в степени n, где n -число знаков после запятой, заданное в настройках дисплея панели.
Я использую для преобразования такую функцию
FUNCTION Real_TO_Panel : INT
VAR_INPUT
PV_Real: REAL; (*Заначение в формате Real*)
Nz_ai: INT; (*Положение точки(число знаков после запятой)*)
END_VAR
Real_TO_Panel:=REAL_TO_INT(PV_Real*EXPT(10,Nz_ai)) ;
Теперь, если надо выводить на панель значения переменной My_Real, используем эту функцию
HMI_PV1:=Real_TO_Panel(My_Real, 2);
где HMI_PV1 переменная 2 byte в конфигурации.
23819
При этом не обращаем внимания, что в конфигурации переменная HMI_PV1 прописана как WORD
https://www.youtube.com/watch?v=LIXZNmI_rhI
Можете поиграться с этим примером
Спасибо petera! Попробую обязательно. А не знаете как перевести Time в реальное число милисекунд. Чтобы например 1 минута = 60000. Пробовал всяко разно , за минуту переваливает и неадыкватные значения вылетают.
Спасибо petera! Попробую обязательно. А не знаете как перевести Time в реальное число милисекунд. Чтобы например 1 минута = 60000. Пробовал всяко разно , за минуту переваливает и неадыкватные значения вылетают.
Знаю.
Для перевода TIME в другой тип нужно просто использовать стандартный оператор TIME_TO...
Ваша ошибка "..за минуту переваливает и неадыкватные значения вылетают" из-за того, что Вы скорей всего используете переменную для "реального числа миллисекунд" типа WORD, а это не правильно, потому что
23871http://www.owen.ru/forum/attachment.php?attachmentid=11963&d=1392751579
Физически значение времени сохраняется в переменной типа DWORD, выраженное в миллисекундах. Собственное это число и будет преобразовано. При преобразовании в меньший тип, вы рискуете потерять информацию
О чем идет речь? О какой потере информации?
Пример правильного и не правильного преобразования
23872
Результат будет таким
23873
Почему так получается? Потому, что 70 секунд это 70 000 мс, а диапазон чисел "помещающихся" в WORD от 0 до 65535 (максимально 1 минута и 5 секунд). Так как 70 000 "не влезают" в WORD, то там остается только младшая часть результата
Это хорошо видно, если переключить отображение переменных в шестнадцатеричный формат
23874
Таким образом в переменной "А" от (16#0001 1170)=70 000 осталось всего (16#1170)=4464, а (16#0001 0000)=65536 просто не поместилось.
По этому, если планируете получать "реальное число миллисекунд" для TIME> 65 секунд, то используйте для результата переменную типа DWORD и оператор преобразования TIME_TO_DWORD.
По этому, если планируете получать "реальное число миллисекунд" для TIME> 65 секунд, то используйте для результата переменную типа DWORD и оператор преобразования TIME_TO_DWORD.
Спасибо большое.
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot