PDA

Просмотр полной версии : CODESYS V3.5. Вопросы и ответы



Страницы : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [15] 16 17 18 19 20 21 22 23 24 25 26 27 28 29

Robur
20.09.2021, 09:56
Спасибо! Надеюсь привыкну к новой версии. Ещё бы найти пару тройку видео по быстрому хорошему старту, те что нашёл не особо помогли вникнуть в идеологию версии 3.5

Евгений Кислов
20.09.2021, 10:00
Спасибо! Надеюсь привыкну к новой версии. Ещё бы найти пару тройку видео по быстрому хорошему старту, те что нашёл не особо помогли вникнуть в идеологию версии 3.5

А что именно вы называете "идеологией"?

PavelGO
20.09.2021, 16:49
Подскажите, кто чем может: Каким образом в таблице выделить строки цветом в зависимости от значения булевой колонки?
Т.е. могу красить ячейку, но как узнать индекс закрашиваемой в этот момент строки?

Евгений Кислов
20.09.2021, 17:37
Подскажите, кто чем может: Каким образом в таблице выделить строки цветом в зависимости от значения булевой колонки?
Т.е. могу красить ячейку, но как узнать индекс закрашиваемой в этот момент строки?

Посмотрите это видео до конца:
https://youtu.be/-qPyjuiPbbk

Robur
21.09.2021, 08:14
А что именно вы называете "идеологией"?

Может я и не совсем правильно выразился.... В КДС 2.3 было всё просто и понятно, в конфигурации ПЛК все входа и выхода поименовал как мне понятно (например DI1_V100_Open, AI5_T125, AO_F224_OP) и дальше не морочась во всех POU используешь. в 3.5 смотрю видеопримеры - одно, создаю проект с ПЛК21004 - уже всё даже визуально другое, появились понятия аппликейшн, каналы и прочее. Зачем то (может для удобства а может есть в этом смысл явный) разделено на лефтсайд и райтсайд, в них есть отдельно конфигурация и отдельно соотнесение входов-выходов, наименование входа (или канала, или чего?) имеет вид Application.TargetVars.stLeftSide.xFastDi01, наверняка же не просто так? Или я так же могу это переименовать как DI1_V100_Open и далее использовать? И так далее. Наверняка если прочесть и осмыслить все мануалы всё станет ровненько и понятненько, однако (как в моём случае) есть срочный заказ типа "сделай вчера" а по тому и напряг. С версией 2.3 не напрягаясь в своё время разобрался за неделю с нуля (до того вообще КДС не видел ни разу) до начала полноценной разработки. Рою инеты и пока не нашёл пошагового, так сказать "для прапорщиков", мануала с короткими пояснениями. Вот примерно что я имел ввиду :))).
Да, есть ещё и структуированные данные. в Application - TargetVariables - TRGLeftSide описаны опять входы и выходы. Вот здесь я так понимаю я могу назвать вход или выход как пожелаю. Но опять же вопрос, в чём основной смысл имён (тем более длинных, разделённых точками и в чём различие их с именами в ветке PLC210_04 - LeftSide?

П.С. Живого контроллера и модулей на руках пока нет, они монтируются на объекте. Возможно когда потычу живую технику всё встанет на свои места....

Cs-Cs
21.09.2021, 08:39
Robur Ну, типа идеология сменилась на:
а) Дерево объектов теперь ЕДИНОЕ для - проекта, каждого ПЛК (можно сделать проект с кучей ПЛК разом), всех устройств (включая внутренние устройства ПЛК - экран, динамик, сеть, диски, модем, порты и прочее), всех элементов проекта (POU, визуализации, списки текстов, программы и прочее).
б) Устройство (то, что раньше могло быть "Modbus Slave", или модем, или диски) теперь содержит дофига информации о себе. Включая и вкладки Каналов, и вкладки сопоставления переменных, где ты путаешься.
Ко многим устройствам теперь можно обращаться по имени. И поэтому имя устройств ВАЖНО. То есть, когда ты добавляешь Serial_COM_Port - сразу его переименовывай нормально в что-то типа RS485_Main (например), потому что потом можно прям в программе написать что-то вида RS485_Main.xEnable := TRUE и включить или отключить этот порт из работы (опроса).
Точно так же сами Modbus-устройства стоит переименовывать, потому что все их настройки тоже доступны через точку.
Например, у меня есть датчик WirenBoard, для которого неизвестен адрес на шине (потом заказчик его будет вводить). Датчик называется WB_Zal, и в коде у меня написано прям так (условно - я спросонья пишу по памяти, а комп с CodeSys отключен):
WB_Zal.DeviceAddress := NewAdress;
И вот прям на лету я могу теперь поменять адрес, по которому этот датчик работает. Благодаря новому концепту.
Так же через точку можно тырить ошибки (.xError - TRUE или FALSE), включать и выключать опрос (если у тебя универсальный проект и устройства могут ставиться или не ставиться).
в) Теперь переменные в сопоставлении можно вписать разными способами: или сначала описать нужные прям в коде программы, а потом привязать к каналам устройства (этого не было в прошлой версии), или прям сразу назвать новую переменную в сопоставлении. Штатный шаблон предлагает один из примеров сопоставления, но мне он не нравится - и я делаю как раньше. Например, к каждому биту входов привязыаю переменные типа ButtonStart, ButtonStop и так далее.
г) Вкладка POU, которая осталась (и где есть второе дерево) нужна в основном для того, чтобы удобно было накидывать туда программные компоненты - FB, Функции, созданные типы данны или ENUM. Там тоже можно всё по папочкам раскладывать.
д) И ещё будь внимателен! Теперь работа по Modbus тут НЕ такая как в CDS 2.3 (когда-нить я это всё опишу, дада...)!!!
* Если раньше CDS 2.3 пытался опросить один канал (регистр) устройства, не видел ответа и отваливался с ошибкой (и шёл к опросу следующего устройства, а не канала) - то здесь опрос будет долбиться по всем каналам одного устройства даже если оно не отвечает вообще. С указанным таймаутом. То есть если ты читаешь из устройства три регистра, и таймаут стоит 500 мсек - то если устройство НЕ отвечает вообще (отключено или сдохло) - то новый CodeSys ткнётся в канал 1, выждет таймаут, ткнётся в канал 2, выждет таймаут, ткнётся в канал 3, выждет таймаут - и только потом пойдёт опрашивать остальные устройства. То есть задержка будт равна "Таймаут х Число каналов опроса" = 500 х 3 = 1500 мсек!
* Сама скорость опроса стала медленнее, чем в CDS2.3. Я на нескольких проектах с этим нагорел, но сотрудники ОВЕН и участники форума мне подсказали решения (использовать библиотеки для ручного опроса), и задачу более-менее решил.

Конкретно в шаблонах проектов ПЛК ОВЕН сделал:
а) LeftSide и RightSide - это они так для ПЛК2хх сделали, потому что это физически разные платы внутри ПЛК (а для проекта - устройства), а тип плат зависит от модели ПЛК - где-то дискретные, где-то аналоговые.
б) TargetVars - это тоже шаблон. Рассчитан на то, чтобы формализовать все-все примеры ОВЕНа (наверное, это моя догадка) и чтобы новичок увидел все TargetVars в одном месте и не путался, что загрузка процессора у него лежит в устройстве "Debug", а текущее время - в узле часов (ща на память не вспомню как зовётся, хех). Это всё можно удалить и делать как нравится.

Вот, надобавлял скриншотов структуры проекта.
57093 57094 57095 57096 57097

Евгений Кислов
21.09.2021, 08:47
Зачем то (может для удобства а может есть в этом смысл явный) разделено на лефтсайд и райтсайд

У ПЛК физически есть левая и правая плата входов-выходов.
При этом они совпадают у разных моделей (например, у ПЛК210-01, -02 и -04 одна и та же левая плата).
Разделение на два узла упрощает разработку и перенос проектов между модификациями.


в них есть отдельно конфигурация и отдельно соотнесение входов-выходов

...как и в CoDeSys V2.3

57092


наименование входа (или канала, или чего?) имеет вид Application.TargetVars.stLeftSide.xFastDi01, наверняка же не просто так? Или я так же могу это переименовать как DI1_V100_Open и далее использовать?

Такие "наименования" есть в шаблонах проектов, где к каналам входов-выходов уже привязаны глобальные переменные.
В данном случае:


Application - название приложения ПЛК (носит чисто информативный характер);
TargetVars - название списка глобальных переменных;
stLeftSide - название экземпляра структуры, содержащей параметры левой платы входов-выходов;
xFastDi01 - название элемента структуры (переменная, характеризущая состояние первого быстрого дискретного входа).


Вы можете объявить DI1_V100_Open - например, в программе PLC_PRG - и привязать ее вместо переменной шаблона.
Тогда в канале будет отображаться полный путь к вашей переменной: Application.PLC_PRG.DI1_V100_Open.

В рамках программы PLC_PRG обратиться к переменной можно будет по одному ее имени: DI1_V100_Open (без дополнительных префиксов)


Рою инеты и пока не нашёл пошагового, так сказать "для прапорщиков", мануала с короткими пояснениями.

Самый короткий мануал есть в форме видео: https://youtu.be/tm7a98Ojp7g

Robur
21.09.2021, 10:44
Cs-Cs, спасибо! Обязательно изучу выкладки!

Robur
21.09.2021, 12:25
В рамках программы PLC_PRG обратиться к переменной можно будет по одному ее имени: DI1_V100_Open (без дополнительных префиксов)


Т.е. за пределами PLC_PRG, например если в отдельном FB то необходимо полный путь прописывать, как указан в канале?

Евгений Кислов
21.09.2021, 12:59
Т.е. за пределами PLC_PRG, например если в отдельном FB то необходимо полный путь прописывать, как указан в канале?

Не надо ничего прописывать - просто нажмите на кнопку рядом с названием канала и выберите переменную из выпадающего списка.
Полный путь пропишется автоматически.

57107

sssssaaaaabbbbb
28.09.2021, 16:46
Вопрос по циклу FOR : цикл закончился, а счетчик считает. Почему так?57189 57190

RV9WFJ
28.09.2021, 17:05
В каждом цикле ПЛК счетчик прибавляет +100. Что не так по вашему?

Cs-Cs
28.09.2021, 17:25
Вопрос по циклу FOR : цикл закончился, а счетчик считает. Почему так?
...потому что этот код с циклом выполняется много-много-много-много раз. Поэтому на каждом цикле работы штучки с именем "CIЛL_FOR" прокручивается FOR от 1 до 100, и делается прибавление.
Если надо с нуля - то надо всё обнулять и считать заново каждый раз.

sssssaaaaabbbbb
29.09.2021, 08:59
Должен же прибавлять по 1

sssssaaaaabbbbb
29.09.2021, 09:00
А разве на 101 шаге не должен заканчиваться?

RV9WFJ
29.09.2021, 09:10
Он и прибавляет по одному 100 раз в каждом цикле FOR. В селедующем цикле ПЛК 101,102 и т.д. Если вам обнулять в конце 100 циклов FOR то это вручную делается.

sssssaaaaabbbbb
29.09.2021, 11:09
пасибо, разобрался
// Обнуляем счетчик в цикле FOR
FOR iCounter:= 1 TO 10 BY 1 DO
IF iCounter=10 THEN iCounter:=1 ;EXIT;
END_IF
END_FOR

capzap
29.09.2021, 11:59
пасибо, разобрался
// Обнуляем счетчик в цикле FOR
FOR iCounter:= 1 TO 10 BY 1 DO
IF iCounter=10 THEN iCounter:=1 ;EXIT;
END_IF
END_FOR

что это за дичь? У Вас и так когда выполнение дойдет до цикла FOR, переменной присвоится единица. Если хотите чтоб арифметика внутри цикла не использовалась, то надо просто написать IF iCounter > 10 THEN EXIT; END_IF; перед остальным кодом

TATARin
01.10.2021, 10:30
Здравствуйте знатоки. Вопрос - как лучше передать и записать системное время ПЛК21057252 в СП27057251 для журнала событий57253?

Евгений Кислов
01.10.2021, 11:35
Здравствуйте знатоки. Вопрос - как лучше передать и записать системное время ПЛК21057252 в СП27057251 для журнала событий57253?

Добрый день.
Второй скриншот непонятен - как системное время связано с временем наработки насосов?

TATARin
01.10.2021, 12:24
Они не связаны. Это скрин не обрезан. Связан только журнал событий.

Евгений Кислов
01.10.2021, 12:47
Они не связаны. Это скрин не обрезан. Связан только журнал событий.

С СП270 простых вариантов нет.
Можете попробовать посмотреть этот пример в плане настроек панели:
https://owen.ru/forum/showthread.php?t=34945&p=358104&viewfull=1#post358104

WhyNot
05.10.2021, 08:42
добрый день. Создал структуру в которую пишу данные которые беру по модбас с частотника и данные которые требуется для его управления это Старт стоп, задание на регулятор и коэффициента регулятора. И в поле объявления я не могу сразу в структуру записать коэф регулятора и задание, Но если я сделаю их в поле выполнения то их не возможно уже будет поменять из OPC Так как они постоянно буду перезаписываться. Подскажите как сделать что бы были предварительно сконфигурированные параметры с возможность управления по OPC 57292 57293

Евгений Кислов
05.10.2021, 08:52
добрый день. Создал структуру в которую пишу данные которые беру по модбас с частотника и данные которые требуется для его управления это Старт стоп, задание на регулятор и коэффициента регулятора. И в поле объявления я не могу сразу в структуру записать коэф регулятора и задание, Но если я сделаю их в поле выполнения то их не возможно уже будет поменять из OPC Так как они постоянно буду перезаписываться. Подскажите как сделать что бы были предварительно сконфигурированные параметры с возможность управления по OPC 57292 57293

Добрый день.
Синтаксис инициализации экземпляров структур описан в справке:
https://help.codesys.com/webapp/_cds_datatype_structure;product=codesys;version=3. 5.17.0#declaration-and-initialization-of-structure-variables

Кроме того, если использовать автообъявление (ввести в редакторе кода имя несующествующей переменной и нажать на появившуюся лампочку) - то можно сделать всё тоже самое в графическом конструкторе.

57294

WhyNot
05.10.2021, 09:07
Спасибо большое!!

bogger
05.10.2021, 16:42
Добрый день, уважаемые,
Прошу совета, как реализовать подсчет значений? Т.е. приходит одно значение, его нужно запомнить, потом к нему прибавить изменившееся значение, пытаюсь посчитать суточный расход. Есть значение порций вот их и надо суммировать. Уже неделю ломаю голову, над простой казалось бы с виду задачей, чувствую, что просто, но по разному перепробовал, не втором или третьем цикле сбивается счётчик. Спасибо.

keysansa
05.10.2021, 17:04
Вы в ST пишете?

Евгений Кислов
05.10.2021, 17:15
Добрый день, уважаемые,
Прошу совета, как реализовать подсчет значений? Т.е. приходит одно значение, его нужно запомнить, потом к нему прибавить изменившееся значение, пытаюсь посчитать суточный расход. Есть значение порций вот их и надо суммировать. Уже неделю ломаю голову, над простой казалось бы с виду задачей, чувствую, что просто, но по разному перепробовал, не втором или третьем цикле сбивается счётчик. Спасибо.

Добрый день.
Опишите вашу задачу в формализованном виде.
Например - попробуйте представить ФБ (без деталей реализации), который мог бы решить вашу задачу.
Опишите его входы, выходы и зависимость выходов от входов.

bogger
06.10.2021, 05:54
Доброе утро,

Спасибо, всем кто откликнулся!

Пишу в ST. Но теоретически могу использовать FBD.
К сожалению сейчас объем знаний у меня слишком мал, чтобы использовать сложные схемы, только начинаю изучать Codesys.
ST мне показался проще в реализации и понятнее.

Задача в следующем, есть расходомер с которого надо получить объем партии.
В момент начала налива фиксирую значение с сумматора расходомера ( переменная "Х"),
в момент окончания налива снова фиксирую значение (переменная "Y").

Вычитаю разницу и получаю объем партии "Y -X := Total"; (переменная "Total").
Теперь мне нужно подсчитать сумму всех объемов за день.
Т.е. "Total1 + Total2 + ... + Total_N := Itogo;".

Написал вот так: "Itogo := Itogo + Total;"

По моей логике, значение "Itogo" должно с каждым изменением "Total" должно быть больше на величину "Total".
Т.е. на первом шаге "Itogo = 0;" на втором оно уже равно к примеру 2 и т.д.
На бумажке у меня все так и получается, на практике же после второго или третьего цикла, начинает считать неправильно.
Гуглил усердно, но такие задачи практически не встречаются, судя по всему она такая элементарная, что не представляет сложности, но я бьюсь о нее уже вторую неделю и не могу решить. Решение должно быть достаточно простым, мне возможно просто не хватает знаний.

Евгений Кислов
06.10.2021, 06:22
фиксирую значение

Что вы подразумеваете под словом "фиксирую"? Как именно это происходит в коде?

Я рекомендую вам создать проект, в котором ввод значений X и Y (и их "фиксацию") можно выполнять вручную и выложить его здесь - тогда можно будет в режиме эмуляции посмотреть, в чем именно у вас проблема.

capzap
06.10.2021, 07:25
в момент окончания приема порции и суммируйте итоговую сумму а не только расчитывайте разницу

bogger
06.10.2021, 12:30
Что вы подразумеваете под словом "фиксирую"? Как именно это происходит в коде?

Для фиксации постоянно изменяющегося значения в данный момент времени,
я использую функциональный блок "SH" из библиотеки Oscat Basic.
Он позволяет по сигналу фиксировать значение постоянно изменяющейся переменной.


Хорошо, сделаю. Спасибо!

RV9WFJ
06.10.2021, 21:01
Как активировать колонку Сообщения 2 как в примере alarm_filter_lat
57332ch_example?

Евгений Кислов
06.10.2021, 21:09
Как активировать колонку Сообщения 2 как в примере alarm_filter_lat
57332ch_example?

ПКМ на любую область таблицы - Добавить столбец сообщения

57333

RV9WFJ
06.10.2021, 21:15
Спасибо, прямо Америку сейчас открыли. В проектах где несколько контроллеров прям сильно его не хватало

wildwind1978
07.10.2021, 16:16
Коллеги, после установки CodeSys 3.5 SP16 на рабочий компьютер. CodeSys не дает войти в режим эмуляции. Требует имя пользователя и пароль. Тот же проект на другом ПК в режим эмуляции заходит без проблем. Куда копать? Спасибо

Евгений Кислов
07.10.2021, 16:32
Коллеги, после установки CodeSys 3.5 SP16 на рабочий компьютер. CodeSys не дает войти в режим эмуляции. Требует имя пользователя и пароль. Тот же проект на другом ПК в режим эмуляции заходит без проблем. Куда копать? Спасибо

Можно попробовать отключить управление пользователями:
https://youtu.be/9tfm0y_Bwis

По умолчанию логин/пароль - Administrator/Administrator

Pronto72
08.10.2021, 12:56
Вопрос возможно обсуждался, тогда прошу извинить и ткнуть носом. Многопользовательский веб интерфейс. Нужно архивировать действия пользователей, т.е. нажатия кнопок, ввод новых уставок и т.п. Чтобы можно было просмотреть кто именно и когда нажимал на "пимпочку". Как это правильнее реализовать?

Евгений Кислов
08.10.2021, 14:28
Вопрос возможно обсуждался, тогда прошу извинить и ткнуть носом. Многопользовательский веб интерфейс. Нужно архивировать действия пользователей, т.е. нажатия кнопок, ввод новых уставок и т.п. Чтобы можно было просмотреть кто именно и когда нажимал на "пимпочку". Как это правильнее реализовать?

Только собственными силами - ловить в коде сигнал нажатия на кнопку и выполнять запись в файл.

Pronto72
08.10.2021, 16:54
Только собственными силами - ловить в коде сигнал нажатия на кнопку и выполнять запись в файл.
Т.е. например на событие OnDialogClosed прописать вызов записи в файл? Извините за еще один дилетантский вопрос, а как определить пользователя отпустившего кнопку или закрывшего диалог? В "Управлении пользователями" каждый пользователь описан индивидуально, со своим логином и паролем.

Евгений Кислов
08.10.2021, 16:59
Т.е. например на событие OnDialogClosed прописать вызов записи в файл? Извините за еще один дилетантский вопрос, а как определить пользователя отпустившего кнопку или закрывшего диалог? В "Управлении пользователями" каждый пользователь описан индивидуально, со своим логином и паролем.

Лучше в обработчике OnDialogClosed передавать флаг "нужно записать в файл", а собственно запись реализовать уже в программе.
В контексте клиента визуализации доступны системные переменные VisuElems.CurrentUserName и VisuElems.CurrentFullUserName (WSTRING) - их значения можно скопировать в промежуточные переменные в обработчике OnDialogClose и после этого использовать в коде программы.

Либо можно посмотреть пример с IDialogCloseListener, но он может быть более сложным для восприятия:
https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/02_Visu/04_3S/VisuDialogST.package

keysansa
08.10.2021, 23:06
Для фиксации постоянно изменяющегося значения в данный момент времени,
я использую функциональный блок "SH" из библиотеки Oscat Basic.
Он позволяет по сигналу фиксировать значение постоянно изменяющейся переменной.


Хорошо, сделаю. Спасибо!

Ваша задача реализована алгоритмом "Дозатор". Почитайте, вариантов много. Могу свою реализацию в ST привести.

Просто присваивание в ST - вы написали в сообщении ниже. Вы знали, судя по всему это изначально.

Havingworld
12.10.2021, 04:50
Правильно ли я понял, что вы говорите о конструкции типа:




IF условия THEN

считать системное время
если системное время считано и равно (или больше/меньше/не равно) заданному, то сбросить ФБ и выполнить нужные действия

END_IF



Если речь об этом - то вы пытаетесь заставить блок выполняться по уровню, но, как уже упоминалось, он запускается по фронту.
Т.е. просто вызывайте его в стиле:



// выносим запуск ФБ за пределы IF ... END_IF
dtugt(xExecute:=( условие1 AND условие 2 и т.д.) );

IF dtugt.xDone
// забираем dtDateAndTime
END_IF




Еще раз уточню, что забирать время с выхода блока можно только в тот цикл, когда xDone=TRUE (т.е. блок успешно завершил работу).

Добрый день, сделал всё (насколько могу видеть) как указано в SPK_SystemTime_v.1.1.pdf, загружаю программу в контроллер но системное время не считывается. Всегда в значении переменной 0, а считываемая дата указана как 1970.1.1 00:00:00
При этом внутреннее время в контроллере синхронизировано с ПК через конфигуратор. Батарейка в ПЛК новая. В самом таргете OwenRTC время соответствует действительному.
Пробовал и через ST и через CFC, также пробовал взять время из таргета OwenRTC, результат всегда один - нули.

57396
57397

Евгений Кислов
12.10.2021, 06:23
Добрый день, сделал всё (насколько могу видеть) как указано в SPK_SystemTime_v.1.1.pdf, загружаю программу в контроллер но системное время не считывается. Всегда в значении переменной 0, а считываемая дата указана как 1970.1.1 00:00:00
При этом внутреннее время в контроллере синхронизировано с ПК через конфигуратор. Батарейка в ПЛК новая. В самом таргете OwenRTC время соответствует действительному.
Пробовал и через ST и через CFC, также пробовал взять время из таргета OwenRTC, результат всегда один - нули.

57396
57397

Добрый день.
В эмуляции считать системное время не получится.
OwenRTC будет работать только на реальном контроллере.
Библиотека CAA DTUtil также будет работать на виртуальном контроллере CODESYS Control Win V3:
http://www.owen.ru/forum/showthread.php?t=28167&p=296706&viewfull=1#post296706

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

Havingworld
12.10.2021, 06:43
Добрый день.
В эмуляции считать системное время не получится.
OwenRTC будет работать только на реальном контроллере.
Библиотека CAA DTUtil также будет работать на виртуальном контроллере CODESYS Control Win V3:
http://www.owen.ru/forum/showthread.php?t=28167&p=296706&viewfull=1#post296706

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

На реальном ПЛК ситуация точно такая-же, в данный момент времени нет доступа к ПЛК, сделаю скрины позже.

Евгений Кислов
12.10.2021, 07:23
На реальном ПЛК ситуация точно такая-же, в данный момент времени нет доступа к ПЛК, сделаю скрины позже.

Лучше предоставьте удаленный доступ к ПК, с которого можно подключиться к ПЛК - так будет проще вам помочь.

Солнечный заяц
12.10.2021, 11:21
Здравствуйте, есть СПК107-М01. Формирую отчет за сутки о расходе воды с помощью архиватора.
Триггер для записи изначально имел вид
R_TRIG_1(CLK:=(hour=0 AND Minute=0) , Q=>Write_Arch_2 ); Появлялось огромное количество ложных срабатываний. Часы и минуты беру из таргета. Обработка триггера запускается в задаче OwenArchiver.
Добавил дополнительную проверку еще и на секунды
R_TRIG_1(CLK:=(hour=0 AND Minute=0 AND second>0) , Q=>Write_Arch_2 );Ситуация стала лучше, но ложные срабатывания сохранились.
57401
Как я понимаю, в переменных времени имеется какой-то дребезг. Хочется найти надежное решение.

Евгений Кислов
12.10.2021, 11:28
Добрый день.


Хочется найти надежное решение.

Используйте этот ФБ
https://owen.ru/forum/showthread.php?t=28167&p=352087&viewfull=1#post352087

Солнечный заяц
12.10.2021, 12:16
Используйте этот ФБ
https://owen.ru/forum/showthread.php?t=28167&p=352087&viewfull=1#post352087
Спасибо! Это все объясняет.

Selya
12.10.2021, 13:21
Здравствуйте.
Пытаюсь сделать небольшую программу определения наличия папки на виртуальном контроллере (CODESYS Control Win V3), используя библиотеку CAA File и на основе примеров оттуда.

PROGRAM PLC_PRG
VAR
sDirNewName: CAA.FILENAME:='c:/TestDirectory';
DirectoryOpen: FILE.DirOpen;
uiDirectoryExists: BOOL;
END_VAR

DirectoryOpen.sDirName:=sDirNewName;
DirectoryOpen( xExecute:=TRUE);
IF DirectoryOpen.xDone THEN
uiDirectoryExists := TRUE;
END_IF
IF DirectoryOpen.xError THEN
(* error handling*)
uiDirectoryExists := FALSE;

END_IF
Работает. Но если я удаляю или создаю директорию "на лету", в проводнике на компьютере, такое впечатление, что программа помнит только то состояние, что было при старте программы. Подскажите пожалуйста, что не так? Хотел сделать нечто вроде DirectoryExists() в Delphi.

Pronto72
12.10.2021, 15:26
Не совсем понятно как работает автоматический выход в "Управлении пользователями".
И можно ли пользователя "выкинуть" программно?

Евгений Кислов
12.10.2021, 16:22
Не совсем понятно как работает автоматический выход в "Управлении пользователями".

Работает так: после заданного периода неактивности (отсутствию действий в визуализации) - пользователя автоматически разлогинивает.



И можно ли пользователя "выкинуть" программно?

Можно.
https://owen.ru/forum/showthread.php?t=28167&page=5&p=295107&viewfull=1#post295107

Евгений Кислов
12.10.2021, 16:27
Здравствуйте.
Пытаюсь сделать небольшую программу определения наличия папки на виртуальном контроллере (CODESYS Control Win V3), используя библиотеку CAA File и на основе примеров оттуда.

PROGRAM PLC_PRG
VAR
sDirNewName: CAA.FILENAME:='c:/TestDirectory';
DirectoryOpen: FILE.DirOpen;
uiDirectoryExists: BOOL;
END_VAR

DirectoryOpen.sDirName:=sDirNewName;
DirectoryOpen( xExecute:=TRUE);
IF DirectoryOpen.xDone THEN
uiDirectoryExists := TRUE;
END_IF
IF DirectoryOpen.xError THEN
(* error handling*)
uiDirectoryExists := FALSE;

END_IF
Работает. Но если я удаляю или создаю директорию "на лету", в проводнике на компьютере, такое впечатление, что программа помнит только то состояние, что было при старте программы. Подскажите пожалуйста, что не так? Хотел сделать нечто вроде DirectoryExists() в Delphi.

Судя по коду - вы вызываете ФБ только один раз - при старте ПЛК.
Блок выполняется по переднему фронту на входе xExecute - т.е. для каждого нового вызова нужно сначала вызвать его с FALSE, а потом с TRUE - и сделать это нужно в разных циклах ПЛК.

Havingworld
14.10.2021, 03:35
Добрый день, сделал всё (насколько могу видеть) как указано в SPK_SystemTime_v.1.1.pdf, загружаю программу в контроллер но системное время не считывается. Всегда в значении переменной 0, а считываемая дата указана как 1970.1.1 00:00:00
При этом внутреннее время в контроллере синхронизировано с ПК через конфигуратор. Батарейка в ПЛК новая. В самом таргете OwenRTC время соответствует действительному.
Пробовал и через ST и через CFC, также пробовал взять время из таргета OwenRTC, результат всегда один - нули.

57396
57397

Думаю решение будет полезно новичкам (вроде меня):
Проблема заключалась в том, что программа считывания времени не запускалась.
Я решил проблему просто перенеся код считывания времени в код главной программы.
Но можно (и нужно) по другому, ответ лежит в CDSv3.5_Faq_v.2.2.pdf (см. скрин ниже)

57439

P.S. Спасибо Евгению за разъяснение

kondor3000
14.10.2021, 12:57
Думаю решение будет полезно новичкам (вроде меня):
Проблема заключалась в том, что программа считывания времени не запускалась.
Я решил проблему просто перенеся код считывания времени в код главной программы.
Но можно (и нужно) по другому, ответ лежит в CDSv3.5_Faq_v.2.2.pdf (см. скрин ниже)
P.S. Спасибо Евгению за разъяснение

На сколько я понимаю, вовсе не обязательно вызывать программу конфигуратором задач, без необходимости (особенно новичкам), достаточно вызывать подпрограмму из основной PLC_PRG. Или вообще сделать чтение времени функц. блоком и так же вызывать его из программы. И это на мой взгляд, подход гораздо более правильный.

БлЮрий
15.10.2021, 11:40
Подскажите пожалуйста, что может быть с ПЛК200-257486

Евгений Кислов
15.10.2021, 11:51
Подскажите пожалуйста, что может быть с ПЛК200-257486

Добрый день.
https://owen.ru/forum/showthread.php?t=28167&p=336589&viewfull=1#post336589

БлЮрий
15.10.2021, 12:18
ПЛК зависает в конце загрузки
57487

Евгений Кислов
15.10.2021, 12:46
ПЛК зависает в конце загрузки
57487

Какая у вас версия прошивки и таргет-файлов?

БлЮрий
15.10.2021, 12:55
Версия 1.3.0309.1303, таргет 3.5.14.30

Евгений Кислов
15.10.2021, 12:57
Версия 1.3.0309.1303, таргет 3.5.14.30

Обеспечьте удаленный доступ, пожалуйста.

БлЮрий
15.10.2021, 13:12
Отправил в личку

Havingworld
16.10.2021, 01:31
На сколько я понимаю, вовсе не обязательно вызывать программу конфигуратором задач, без необходимости (особенно новичкам), достаточно вызывать подпрограмму из основной PLC_PRG. Или вообще сделать чтение времени функц. блоком и так же вызывать его из программы. И это на мой взгляд, подход гораздо более правильный.

Я не разобрался как вызмать RealTime_PRG из PLC_PRG, можете привести пример?

В последней редакции кода я взял время из таргета Owen_RTC, долго не мог догнать как это сделать правильно, в мануале к таргетам этот момент опущен:


TargetVars.stRtc.usiGetHour //вызов переменной "час" из таргета Owen_RTC

PavelGO
18.10.2021, 17:55
Подскажите, пожалуйста по CAAFile. Можно ли как то сделать подобие readln в паскале(я так понял можно лишь читать по буфферу последовательно). Файл около 500кб. Буфер такого размера не объявляется стрингом. Как можно прочитать такой файл, а главное, чтобы потом было удобно парсить массив?

Евгений Кислов
18.10.2021, 17:59
Подскажите, пожалуйста по CAAFile. Можно ли как то сделать подобие readln в паскале(я так понял можно лишь читать по буфферу последовательно). Файл около 500кб. Буфер такого размера не объявляется стрингом. Как можно прочитать такой файл, а главное, чтобы потом было удобно парсить массив?

Подробно опишите задачу, которую вы пытаетесь решить.

PavelGO
18.10.2021, 19:37
Подробно опишите задачу, которую вы пытаетесь решить.

Задача организовать запись/чтение настроек на 207х спк. (У них у всех не работет retain, да и часто сейчас проект изменяется, а персистанта нет).
Запись реализовал в XML построчно(так удобнее готовить новые объекты на 107х уже с готовой конфигурацией), а вот над чтением думаю и спрашиваю как лучше считать, а потом распарсить(тут проблем не должно возникнуть).

Евгений Кислов
18.10.2021, 20:18
Запись реализовал в XML построчно(так удобнее готовить новые объекты на 107х уже с готовой конфигурацией)

Я не очень понял про 107x - что такое "готовая конфигурация", в чем удобство и как вы там считываете XML.

Отвечая по существу вопроса: можно посмотреть в сторону CmpSysExec и вызова через нее утилиты sed (https://linux.die.net/man/1/sed).
С помощью нее можно считывать файл построчно.

kondor3000
22.10.2021, 01:17
Я не разобрался как вызмать RealTime_PRG из PLC_PRG, можете привести пример?


Для примера я сделал программу TIMER_1 и функциональный блок FB_TIMER. Специально сделал их одинаковыми и простыми (счётчик считает секунды). Их вызов из PLC_PRG будет таким:


PROGRAM PLC_PRG
VAR
FB_TIMER1:FB_TIMER; //Объявление Функционального Блока FB_TIMER
END_VAR
__________________________________________________ ________________________
FB_TIMER1(); // Вызов Функционального Блока FB_TIMER

TIMER_1(); // Вызов программы PROGRAM TIMER_1

В конфигураторе задач вызывается только PLC_PRG, всё остальное ( программы и Функц. блоки) вызывается из программы PLC_PRG. 57630
Разница в том, что программу надо только вызвать в теле PLC_PRG ( но только один раз),
а Функц. Блок, надо не только вызвать, но и объявить в PLC_PRG, но зато его можно объявить и вызывать несколько раз добавив к имени число (1,2,3 и т. д.), что удобно при однотипных задачах. На скрине видно, что и программа и ФБ работают и считают абсолютно идентично, а в конфигураторе задач вызов только PLC_PRG.

Вячеслав@
22.10.2021, 10:06
Добрый день. Как узнать загрузку контроллера? Мне нужно найти минимальное время цикла, при котором ПЛК 210 стабильно работает. В ЛюСи есть графики загрузки CPU и "загрузка системы", там обычно значения порядка 10-20. В каких единицах эта "загрузка системы" отображается? И что означает, если "загрузка ЦПУ" близка к 100%?
Также хотелось бы получать эти данные в переменные программы. В разделе Debug есть строка загрузки процессора, но добыть ее оттуда у меня не получилось, при привязки переменной вылетает ошибка.

Евгений Кислов
22.10.2021, 10:18
Добрый день. Как узнать загрузку контроллера? Мне нужно найти минимальное время цикла, при котором ПЛК 210 стабильно работает. В ЛюСи есть графики загрузки CPU и "загрузка системы", там обычно значения порядка 10-20. В каких единицах эта "загрузка системы" отображается? И что означает, если "загрузка ЦПУ" близка к 100%?
Также хотелось бы получать эти данные в переменные программы. В разделе Debug есть строка загрузки процессора, но добыть ее оттуда у меня не получилось, при привязки переменной вылетает ошибка.

Добрый день.


В каких единицах эта "загрузка системы" отображается?
https://ru.wikipedia.org/wiki/Load_Average


И что означает, если "загрузка ЦПУ" близка к 100%?

Это означает, что приложение CODESYS занимает практически все доступные ресурсы.



В разделе Debug есть строка загрузки процессора, но добыть ее оттуда у меня не получилось, при привязки переменной вылетает ошибка.

Выложите скриншоты с объявлением переменной и ошибкой.
Или можно создавать проекты на основе шаблонов (Файл - Новый проект - выбрать нужную модель ПЛК) - в них все эти переменные уже созданы и привязаны заранее.

Вячеслав@
22.10.2021, 11:39
Это означает, что приложение CODESYS занимает практически все доступные ресурсы.


Евгений, благодарю за ответ. У меня стабильно "загрузка системы" 10-15, а загрузка процессора 80%. Чему верить?
При уменьшении времени цикла до определенного значения интерфейс ЛюСи становится недоступен. Логично, что уже перебор. Но хотелось бы знать более точный способ определения допустимой загрузки.
И есть ли рекомендуемое минимальное время цикла для ПЛК210? В случае маленького довольно простого кода 5 мс реально работать?

Евгений Кислов
22.10.2021, 11:44
Евгений, благодарю за ответ. У меня стабильно "загрузка системы" 10-15, а загрузка процессора 80%. Чему верить?

Обоим значениям - они не противоречат друг другу.


Но хотелось бы знать более точный способ определения допустимой загрузки.

Поскольку это зависит от конкретного проекта - такие вещи обычно проверяются опытным путем.


В случае маленького довольно простого кода 5 мс реально работать?

Да.

kondor3000
22.10.2021, 13:57
И есть ли рекомендуемое минимальное время цикла для ПЛК210? В случае маленького довольно простого кода 5 мс реально работать?
Удивительно, но старый ПЛК 154АМ спокойно тянет немаленькие программы на 1 мс. И покрупнее на 5 мс. Думал, что ПЛК 210 не должен уступать в быстродействии, проц то гораздо мощнее, ан нет( 3.5 всё портит(

RV9WFJ
22.10.2021, 14:09
А то что у одого ОС нет а у другого есть вы в рассчет не берете? ОС дает не только плюсы но и минусы

SA104
22.10.2021, 21:02
Добрый день
Подскажите, как корректно импортировать библиотеку из Codesys 2.3 в Codesys 3.5
Есть рукописная библиотека, состоящая из нескольких функциональных блоков.
Импорт проходит наполовину успешно - импортированные ФБ в Codesys 3 можно объявить,
но при компиляции вылазит куча ошибок, компилятор не может найти множество элементов из биб-ки STANDARD - TON, TOF, RS и пр.
Подозреваю, что при первичной установке неверно указал, какая из библиотек Codesys 2.3 соответствует аналогичной библиотеке в Codesys 3.5
Где это править сейчас не представляю
Буду признателен за совет

Евгений Кислов
22.10.2021, 21:21
Добрый день
Подскажите, как корректно импортировать библиотеку из Codesys 2.3 в Codesys 3.5
Есть рукописная библиотека, состоящая из нескольких функциональных блоков.
Импорт проходит наполовину успешно - импортированные ФБ в Codesys 3 можно объявить,
но при компиляции вылазит куча ошибок, компилятор не может найти множество элементов из биб-ки STANDARD - TON, TOF, RS и пр.
Подозреваю, что при первичной установке неверно указал, какая из библиотек Codesys 2.3 соответствует аналогичной библиотеке в Codesys 3.5
Где это править сейчас не представляю
Буду признателен за совет

Добрый день.
Сохраните в CODESYS V3 вашу библиотеку с ошибками компиляции и выложите сюда или пришлите мне.

kondor3000
22.10.2021, 22:21
Добрый день
Подскажите, как корректно импортировать библиотеку из Codesys 2.3 в Codesys 3.5
Есть рукописная библиотека, состоящая из нескольких функциональных блоков.
Импорт проходит наполовину успешно - импортированные ФБ в Codesys 3 можно объявить,
но при компиляции вылазит куча ошибок, компилятор не может найти множество элементов из биб-ки STANDARD - TON, TOF, RS и пр.
Подозреваю, что при первичной установке неверно указал, какая из библиотек Codesys 2.3 соответствует аналогичной библиотеке в Codesys 3.5
Где это править сейчас не представляю
Буду признателен за совет

Вчера только импортировал проект, в дереве компонентов слева, в 3.5 открыть менеджер библиотек и добавить биб-ку Standart.lib (практически как в 2.3), например для версии 3.5.11 поставить биб-ку 3.5.11 (или ниже ближайшую, например 3.5.9), библиотеки 3.5 должны быть уже установлены. И таргеты 3.5 тоже, через менеджер компонентов.
После компиляции всё заработает, дел на минуту.
Мне понадобились 2 биб-ки Standart.lib и Util.lib, что вам надо посмотрите в 2.3
И дело не в том, что вы не указали какие биб-ки, а в том что они не активны.

SA104
23.10.2021, 06:31
Большое Спасибо за ответ!
У меня биб-ка Standart.lib из версии 3.5 активна
Но к моей самописной библиотеке при первом импорте присоединилась Standart.lib из codesys 2.3
и при компиляции она и используется..
Удаление биб-ки и переустановка заново не помогает, кодесис больше не предлагает диалог замены библиотек второй версии на третью
В общем где то что то прописалось не так , как это поправить не знаю

SA104
23.10.2021, 06:44
Добрый день.
Сохраните в CODESYS V3 вашу библиотеку с ошибками компиляции и выложите сюда или пришлите мне.

Евгений, Спасибо за ответ
Вот ссылка на архив проекта - https://cloud.mail.ru/public/vc9L/gakgbSJWT

Евгений Кислов
23.10.2021, 07:03
Евгений, Спасибо за ответ
Вот ссылка на архив проекта - https://cloud.mail.ru/public/vc9L/gakgbSJWT

1. Как верно заметил выше kondor3000 - в вашей библиотеки не хватает зависимостей.
Вам нужно добавить в ее Менеджер библиотек библиотеки Standard, Util, Oscat Basic и CmpOwenPidRegs.

2. В проекте библиотеки используйте команду Компиляция - Проверка всех объектов пула, чтобы сразу увидеть ошибок.

Для ошибок типа Неоднозначное использование имени и Неизвестный тип добавляйте к имени ФБ, на который ссылается ошибка, пространство имен.
Например, меняйте TON на Standard.TON, DIG_FLTR на OPR.DIG_FLTR и т.д.

3. В CODESYS V3 нет аналога для ФБ VALVE_REG_NO_POS.

Вам придется либо переделать ваши ФБ, которые используют этот блок, либо самостоятельно написать/найти его реализацию.

SA104
23.10.2021, 07:13
Спасибо за развернутый ответ, буду разбираться

SA104
23.10.2021, 07:51
Где найти команду - Компиляция - Проверка всех объектов пула ?
Весь кодесис перерыл, не нашел

С библиотеками получилось исправить импорт через опции конвертирования в Codesys 3 с указанием исходной и целевой библиотеки.
Только oscat не хочет конвертироваться.. придется выкинуть его наверно

Евгений Кислов
23.10.2021, 08:50
Где найти команду - Компиляция - Проверка всех объектов пула ?
Весь кодесис перерыл, не нашел

С библиотеками получилось исправить импорт через опции конвертирования в Codesys 3 с указанием исходной и целевой библиотеки.
Только oscat не хочет конвертироваться.. придется выкинуть его наверно

Она доступна, когда вы открываете библиотеку (.library), а не проект (.project).

Pronto72
23.10.2021, 11:35
Добрый день. SPK107[M01]. Codesys V3.5 SP16 Patch4.
Пытаюсь сделать вход пользователя визуализации с помощью автозаполнения стандартного диалога.
Вот таким образом сконфигурировал действия при нажатии кнопки:
57650
При нажатии кнопки открывается диалог, заполняется, а потом закрывается:
57651
При отпускании кнопки изменяю данные пользователя:
57653
В результате получаю следующее:
57654
т.е. VisuElems.CurrentUserGroupName имеет неопределенное значение.
При этом выход с помощью Logout работает, а автоматический выход нет. Что-то я недоуказал при автологине или принципиально неправильно делаю?

Евгений Кислов
23.10.2021, 12:56
Добрый день.


Пытаюсь сделать вход пользователя визуализации с помощью автозаполнения стандартного диалога.

Т.е. чтобы у пользователя при открытии диалога был уже заполнен логин и ему осталось только ввести пароль - я правильно понимаю?



При отпускании кнопки изменяю данные пользователя:

Так не получится - эти переменные доступны только для чтения.

Прочитайте эту тему:
https://owen.ru/forum/showthread.php?t=34168

Ключевой пост:
https://owen.ru/forum/showthread.php?t=34168&p=345987&viewfull=1#post345987

SA104
23.10.2021, 15:34
Она доступна, когда вы открываете библиотеку (.library), а не проект (.project).

Спасибо, все получилось

Pronto72
23.10.2021, 15:55
Т.е. чтобы у пользователя при открытии диалога был уже заполнен логин и ему осталось только ввести пароль - я правильно понимаю?

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

Евгений Кислов
23.10.2021, 16:18
Не совсем так. Идентификация пользователя осуществляется до нажатия на кнопку на визуализации, после чего пытаюсь сделать вход без дополнительных внешних проявлений. Мне не нужно чтобы на визуализации отображался еще и стандартный (или от Овена) диалог логина, пусть и автозаполненный.

Тогда вам нужно это прочитать:
https://owen.ru/forum/showthread.php?t=28167&page=5&p=295107&viewfull=1#post295107

WhyNot
24.10.2021, 12:55
Добрый день, в codesys 3.5 можно сделать блок в котором можно будет добавлять входа? (Динамически добавлять вход экземпляру функционального блока) Например как с элементом И / ИЛИ . Правой кнопкой добавить вход. Хочу такую возможность к самописному блоку.
Я хочу реализовать блок суть которого в следующем: Найти большое аналоговое значение с N входов при условие что на нем нет ошибки. Аналоговые показания берутся по modbus.

Евгений Кислов
24.10.2021, 13:23
Добрый день, в codesys 3.5 можно сделать блок в котором можно будет добавлять входа? (Динамически добавлять вход экземпляру функционального блока) Например как с элементом И / ИЛИ . Правой кнопкой добавить вход. Хочу такую возможность к самописному блоку.
Я хочу реализовать блок суть которого в следующем: Найти большое аналоговое значение с N входов при условие что на нем нет ошибки. Аналоговые показания берутся по modbus.

Добрый день.
Такой возможности нет.

Обычно в подобных ситуациях на вход ФБ передается указатель на массив данных и его размер или число элементов.

Pronto72
25.10.2021, 12:30
Добрый день. Продолжаю мучать Евгения вопросами)
Можно ли в программе изменить время до выхода пользователя? Вообще, можно программно переключать UseAutoLogoutTime и изменять RemainingAutoLogoutTime?
Последний раз обсуждалось тут https://owen.ru/forum/showthread.php?t=30466&p=297424&viewfull=1#post297424

WhyNot
25.10.2021, 15:10
А случайно нет примера. Не могу найти , а сообразить самому мозгов не хватает.

Евгений Кислов
25.10.2021, 16:29
А случайно нет примера. Не могу найти , а сообразить самому мозгов не хватает.

Посмотрите, как в библиотеке OSCAT реализованы функции работы с массивами (ARRAY_SUM и т.п.).

https://ftp.owen.ru/CoDeSys3/04_Library/05_3.5.11.5/02_Libraries/OSCATBasic_v3.3.4.0.package

Откройте .package архиватором (например, WinZip), вытащите оттуда файл .library и откройте его в CODESYS, чтобы увидеть исходный код библиотеки.

Евгений Кислов
25.10.2021, 16:57
Добрый день. Продолжаю мучать Евгения вопросами)
Можно ли в программе изменить время до выхода пользователя? Вообще, можно программно переключать UseAutoLogoutTime и изменять RemainingAutoLogoutTime?
Последний раз обсуждалось тут https://owen.ru/forum/showthread.php?t=30466&p=297424&viewfull=1#post297424

Посмотрите пример, который выложен здесь:
https://forge.codesys.com/forge/talk/Visualization/thread/37a2b491cb/

Там показано много всего - и, в частности, функция SetAutoLogoutTime, которая позволяет решить вашу задачу.

pro100user
25.10.2021, 18:30
Доброго времени суток!
Сконфигурировал МУ110-224.16Р. Задал маску выходов (запись). Написал программу на языке ST. В режиме эмуляции происходит запись в маску. Задал маску выходов (чтение). Выходы в маску не считываются. Помогите, как на языке ST считать маску выходов (чтение).

kondor3000
25.10.2021, 19:03
Доброго времени суток!
Сконфигурировал МУ110-224.16Р. Задал маску выходов (запись). Написал программу на языке ST. В режиме эмуляции происходит запись в маску. Задал маску выходов (чтение). Выходы в маску не считываются. Помогите, как на языке ST считать маску выходов (чтение).

Вы не написали ничего, какой регистр вы читаете - записываете, какой функцией и что вы вообще в эмуляции хотите получить, если прибора у вас нет?
Записываете в никуда и хотите прочитать из ни откуда))) Выложите код, как вы читаете и как записываете.

Солнечный заяц
03.11.2021, 08:46
Здравствуйте, в визуализации кодесис есть элемент "таблица", если к ней подключить массив данных

// Массив точек таблицы соотношения газ/воздух
aprGas_Air_Table: ARRAY [0..254] OF point_real; где
TYPE Point_real :
STRUCT
X:REAL;
Y:REAL;
END_STRUCT
END_TYPE
При выборе ячейки таблицы мы получаем номер строки (индекс массива) и столбца(0 - Х, 1 - Y). Могу ли я каким-то образом по номеру столбца обратиться к элементу структуры X или Y?

RV9WFJ
03.11.2021, 08:59
Функцию напишите и все. Но мне кажется там проще можно, сейчас попробую.
P.S. зачем вам 254 точки газ/воздух?

Солнечный заяц
03.11.2021, 09:31
Функцию напишите и все. Но мне кажется там проще можно
Я интересуюсь скорее из академического интереса, чем для прикладного применения. О функции я не подумал. Но может есть какие-то штатные механизмы. Через указатели или псевдонимы какие нибудь.


P.S. зачем вам 254 точки газ/воздух?
Из-за лени. Это размер входного массива блока аппроксимации. Реально используется 10. Памяти вроде с избытком.

RV9WFJ
03.11.2021, 09:48
57798
А в каком месте у вас сложность? Просто указываю в таблице массив из структур и все само выводится.

Евгений Кислов
03.11.2021, 09:51
Мне кажется, вариант RV9WFJ с функцией (или просто фрагментом кода, конвертирующим номер столбца в обращение к нужному полю структуры) - самый простой и понятный.


PROGRAM PLC_PRG
VAR
aprGas_Air_Table: ARRAY [0..255] OF point_real;

usiSelectedRow: USINT := 10; // номер выбранной строки
usiSelectedColumn: USINT(0..1); // номер выбранного столбца

rSelectedValue: REAL; // значение в выбранной ячейке
END_VAR

CASE usiSelectedColumn OF
0:
rSelectedValue := aprGas_Air_Table[usiSelectedRow].X;
1:
rSelectedValue := aprGas_Air_Table[usiSelectedRow].Y;
END_CASE



Если обязательно хочется использовать указатели - то можно. Но если структура изменится, то код придется переделывать (и учитывать выравнивание данных в структуре).



PROGRAM PLC_PRG
VAR
aprGas_Air_Table: ARRAY [0..255] OF point_real;

usiSelectedRow: USINT := 10; // номер выбранной строки
usiSelectedColumn: USINT(0..1); // номер выбранного столбца

rSelectedValue: REAL; // значение в выбранной ячейке
prSelectedValue: POINTER TO REAL;
END_VAR

prSelectedValue := ADR(aprGas_Air_Table[usiSelectedRow] );
rSelectedValue := prSelectedValue[usiSelectedColumn];
// индексный доступ к указателю
// см. здесь: https://help.codesys.com/webapp/_cds_datatype_pointer;product=codesys;version=3.5. 13.0


Если наличие структуры не принципиально - то можно перейти к двухмерному массиву:


aprGas_Air_Table: ARRAY [0..255] OF ARRAY [0..1] OF REAL;

Соответственно, можно будет просто обращаться к его элементам с помощью usiSelectedRow и usiSelectedColumn в качестве индексов.

Солнечный заяц
03.11.2021, 10:02
57798
А в каком месте у вас сложность? Просто указываю в таблице массив из структур и все само выводится.
Сложность с редактированием. Что бы пользователь выделил ячейку, и рядом в окошке ввел новое значение.

Евгений Кислов
03.11.2021, 10:04
Сложность с редактированием. Что бы пользователь выделил ячейку, и рядом в окошке ввел новое значение.

А почему бы сразу в ячейку не вводить значение?
Или требуется какое-то подтверждение ввода? (типа "вы точно хотите изменить...")

Солнечный заяц
03.11.2021, 10:04
Спасибо за подробный ответ.

Солнечный заяц
03.11.2021, 10:06
А почему бы сразу в ячейку не вводить значение?
Или требуется какое-то подтверждение ввода? (типа "вы точно хотите изменить...")
Не нашел, как это делается

Евгений Кислов
03.11.2021, 10:13
Не нашел, как это делается

https://youtu.be/-qPyjuiPbbk

Солнечный заяц
03.11.2021, 10:27
https://youtu.be/-qPyjuiPbbk

Спасибо! Это все упрощает.

Солнечный заяц
03.11.2021, 11:25
А как можно выполнить ввод в переменную типа Time?

Евгений Кислов
03.11.2021, 11:28
А как можно выполнить ввод в переменную типа Time?

Используйте NumpadOwen из библиотеки OwenVisuDialogs:
https://owen.ru/forum/showthread.php?t=34327


https://youtu.be/1AEinfoSfOI?t=292

Stan_1
04.11.2021, 11:01
Написал TCP server, который является слейвом к ПЛК-210. В принципе, все работает нормально, но со стороны ПЛК раз в 3-20 минут идет разрыв TCP соединения. В логах это выглядит так (я заменил IP-адреса на название устойства). ПЛК и сервер связаны прямым проводом без коммутаторов/маршрутизаторов.

07:29:51.036177 IP_PLC > IP_SERVER: Flags [FP.], seq 3341925890:3341925998, ack 217531772, win 913, options [nop,nop,TS val 1266839810 ecr 330477084], length 108
07:29:51.042539 IP_SERVER > IP_PLC: Flags [F.], seq 12, ack 109, win 508, options [nop,nop,TS val 330478987 ecr 1266839811], length 0
07:29:51.042765 IP_PLC > IP_SERVER: Flags [R], seq 3341925999, win 0, length 0

Что это может быть? В каких случаях идет разрыв TCP-соединения? Обмен идет раз в 200 мс, поэтому таймаута неактивности там не бывает. Чтение идет одного регистра, fc=4. IP_PLC - Modbus master, IP_SERVER - Modbus slave.

За одну сессию устройства обмениваются от 300 до 3500 транзакций с шагом 200 мс.

Заранее спасибо!

Евгений Кислов
04.11.2021, 11:56
Написал TCP server, который является слейвом к ПЛК-210. В принципе, все работает нормально, но со стороны ПЛК раз в 3-20 минут идет разрыв TCP соединения. В логах это выглядит так (я заменил IP-адреса на название устойства). ПЛК и сервер связаны прямым проводом без коммутаторов/маршрутизаторов.

07:29:51.036177 IP_PLC > IP_SERVER: Flags [FP.], seq 3341925890:3341925998, ack 217531772, win 913, options [nop,nop,TS val 1266839810 ecr 330477084], length 108
07:29:51.042539 IP_SERVER > IP_PLC: Flags [F.], seq 12, ack 109, win 508, options [nop,nop,TS val 330478987 ecr 1266839811], length 0
07:29:51.042765 IP_PLC > IP_SERVER: Flags [R], seq 3341925999, win 0, length 0

Что это может быть? В каких случаях идет разрыв TCP-соединения? Обмен идет раз в 200 мс, поэтому таймаута неактивности там не бывает. Чтение идет одного регистра, fc=4. IP_PLC - Modbus master, IP_SERVER - Modbus slave.

За одну сессию устройства обмениваются от 300 до 3500 транзакций с шагом 200 мс.

Заранее спасибо!

Попробуйте повторить этот тест, использовав OPC-сервер на ПК в качестве Modbus TCP Slave.
https://insat.ru/products/Universal_MasterOPC/MODBUS_OPC_SERVER_TRIAL.ZIP

Каким образом настроен Modbus Master в ПЛК, через стандартные компоненты в дереве проекта?

Stan_1
04.11.2021, 14:30
Попробуйте повторить этот тест, использовав OPC-сервер на ПК в качестве Modbus TCP Slave.
https://insat.ru/products/Universal_MasterOPC/MODBUS_OPC_SERVER_TRIAL.ZIP

Каким образом настроен Modbus Master в ПЛК, через стандартные компоненты в дереве проекта?

Да, все подключено стандартно (приложил скриншоты). Даже все тайминги увеличил, думал, может в них дело.

А еще подскажите, плз. Я иногда вижу, что ПЛК устанавливает два соединения TCP после разрыва, затем буквально через доли секунды одно разрывает, по второму работает. Такое ощущение (без документации только фантазировать могу), что ПЛК устанавливает соединение, что-то с ним происходит, и он через 3-10 секунд устанавливает второе, и потом разрывает первое, как ненужное. Может быть такая логика? Вообще возможна ситуация, когда ОДИН ПЛК как слейв, создает ДВА TCP-соединения одновременно?

57817
57818

Евгений Кислов
04.11.2021, 14:41
Вообще возможна ситуация, когда ОДИН ПЛК как слейв,

Так у вас проблемы с ПЛК-мастером или ПЛК-слэйвом?
Судя по предыдущему посту и скриншоту - мастером.

Тогда к чему этот вопрос?

Stan_1
04.11.2021, 14:57
Так у вас проблемы с ПЛК-мастером или ПЛК-слэйвом?
Судя по предыдущему посту и скриншоту - мастером.

Тогда к чему этот вопрос?

У меня ПЛК подключается к малинке. При этом:
ПЛК: TCP Modbus Master, но TCP-клиент
Малинка: TCP Modbus Slave, но TCP-сервер

ПЛК (TCP-клиент) подключается к TCP-сервер, но периодически рвет соединение.

Евгений Кислов
04.11.2021, 14:59
У меня ПЛК подключается к малинке. При этом:
ПЛК: TCP Modbus Master, но TCP-клиент
Малинка: TCP Modbus Slave, но TCP-сервер

ПЛК (TCP-клиент) подключается к TCP-сервер, но периодически рвет соединение.

Тогда я предлагаю вернуться к рекомендации из поста выше:
https://owen.ru/forum/showthread.php?t=20069&p=367800&viewfull=1#post367800

Это позволит понять, смогу ли я воспроизвести вашу проблему без малинки или нет.

Stan_1
06.11.2021, 18:59
Подскажите, плз, а для CODESYS 3.5 существует модуль Statistic? Или можно-ли по другому, без debug-режима, получать информацию о загрузке процессора и состоянии устройства? Пока из полезного нашел только температуру процессора :)

Евгений Кислов
06.11.2021, 19:11
Подскажите, плз, а для CODESYS 3.5 существует модуль Statistic? Или можно-ли по другому, без debug-режима, получать информацию о загрузке процессора и состоянии устройства? Пока из полезного нашел только температуру процессора :)

См. узел Debug в дереве проекта.
Или его вы и называете "debug-режимом"?

Stan_1
06.11.2021, 20:29
См. узел Debug в дереве проекта.
Или его вы и называете "debug-режимом"?

Ага. Именно его. Не знаю просто, допустимо ли его держать включенным в production, а не на период отладки. Если можно - то он закрывает мою потребность полностью.

Евгений Кислов
06.11.2021, 21:56
Ага. Именно его. Не знаю просто, допустимо ли его держать включенным в production, а не на период отладки. Если можно - то он закрывает мою потребность полностью.

Можно, но тогда лучше для него задать разумный период обновления данных (5 секунд, например).

Stan_1
06.11.2021, 22:02
Можно, но тогда лучше для него задать разумный период обновления данных (5 секунд, например).

О! Отлично, спасибо большое!

RV9WFJ
07.11.2021, 11:53
Пытаюсь проверить совет по контролю наличия связи на источнике Network Variables согласно поста https://owen.ru/forum/showthread.php?t=28167&page=12&p=365393&viewfull=1#post365393
До того как выставляю галочку "Подтверждение" связь между PLC есть, как ставлю галочку "Подтверждение" то связь пропадает. Проверяю на двух Codesys Control Win V3 контроллерах запущенных на одном компьютере.
Это проблема в моей схеме проверки или еще какие-то подводные камни есть? Т.е. если я буду проверять на двух ПЛК с этой галочкой должно работать? Просто нет двух ПЛК под рукой.
P.S. В том посте необходимо подправить последний раздел "Для диагностики на стороне отправителя" на "Для диагностики на стороне получателя"

Выкладываю тестовый проект https://yadi.sk/d/50B385fxe0CwCg

RV9WFJ
07.11.2021, 13:01
Нашел таки два контроллера и да на 2х контроллерах почему-то тот же проект работает с галочкой "Подтверждение"

МВН
07.11.2021, 19:31
Здравствуйте!
Ребят, услышал в одном видео про СПК1х, что якобы где то в документации
можно найти информацию про виртуальный контроллер, который дает больше возможностей при
отладке ПО, чем режим эмуляции в меню ОТЛАДКА CoDeSys 3.5.
Подскажите пожалуйста, кто знает, где ее найти.
Спасибо.

Евгений Кислов
07.11.2021, 19:41
Здравствуйте!
Ребят, услышал в одном видео про СПК1х, что якобы где то в документации
можно найти информацию про виртуальный контроллер, который дает больше возможностей при
отладке ПО, чем режим эмуляции в меню ОТЛАДКА CoDeSys 3.5.
Подскажите пожалуйста, кто знает, где ее найти.
Спасибо.

Добрый день.
http://www.owen.ru/forum/showthread.php?t=28167&p=296706&viewfull=1#post296706

RV9WFJ
07.11.2021, 21:22
При организации обмена данными между контроллерами с помощью DataSource Manager можно как-то задать IP адрес опрашиваемого контроллера? Ну или его системный ID или еще как-то обойти скан сети. Дело в том что я подключаюсь удаленно через OpenVPN в сеть с контроллерами и соответственно скан сети не работает. И Автоматическая конфигурация у меня тоже не работает - связь не устанавливается. Вроде как в своей сети смог сделать связь через Поиск целевого устройства, но повторить это на удаленных контроллерах не получилось. Пока не пробовал только через переменную с адресом ПЛК, но там не до конца понятно какой ID в эту переменную записывать.
57842

Евгений Кислов
08.11.2021, 06:41
Нашел таки два контроллера и да на 2х контроллерах почему-то тот же проект работает с галочкой "Подтверждение"

Потому что при наличии галочки "Подтверждение" открывается слушающий сокет.
И когда это два разных ПЛК - то вопросов нет.
А когда на одном ПК два экземпляра виртуального контроллера пытаются открыть сокеты на одном порту - начинаются проблемы.
Вряд ли разработчики вообще тестировали такой вариант, потому что он не имеет реального применения.

Евгений Кислов
08.11.2021, 08:49
При организации обмена данными между контроллерами с помощью DataSource Manager можно как-то задать IP адрес опрашиваемого контроллера? Ну или его системный ID или еще как-то обойти скан сети. Дело в том что я подключаюсь удаленно через OpenVPN в сеть с контроллерами и соответственно скан сети не работает. И Автоматическая конфигурация у меня тоже не работает - связь не устанавливается. Вроде как в своей сети смог сделать связь через Поиск целевого устройства, но повторить это на удаленных контроллерах не получилось. Пока не пробовал только через переменную с адресом ПЛК, но там не до конца понятно какой ID в эту переменную записывать.
57842

У вас скан не работает, вероятно, из-за OpenVPN - потому что сканирование сети происходит через UDP Broadcast.
Но конкретно с ПЛК2хх метод сканирования сети в DataSource Manager вообще не сработает (мы в дальнейшем посмотрим, в чем там может быть дело).
Как вы верно заметили - нужно использовать настройку связи через переменную.

Как это сделать:

1. На устройстве, в котором будет создаваться DataSource Manager объявляете переменную (экземпляр структуры):


stSetup: DatasourceAppV3.ConnectionSetup;

2. При добавлении DataSource Manager выбираете режим Конфигурация вручную - Динамически из переменной устройства.
Привязываете объявленную переменную.

3. В коде в поле структуры stNodeAddress присваиваете логический адрес (см. ниже) устройства, к которому подключается DataSource Manager.
После этого в поле xDataValid присвоить TRUE.



stSetup.stNodeAddress := '0003.0885.9000.2DDC.0A02.1949';
stSetup.xDataValid := TRUE;


Логический адрес устройства виден при сканировании сети и подключении:

57848

57849

Batnic
09.11.2021, 11:37
Приветствую.
Создал проект с двумя контроллерами СПК107, добавил сетевые переменные между ними, использовал "множественную загрузку". Все работает хорошо.
Но!
Скажите, пожалуйста, как сделать Логин во второе устройство в списке устройств. И вообще, возможно ли это. Логин происходит всегда в первое добавленное.
Пересмотрел инструкции - там описаны только стандартные случаи с одним устройством. Пробовал искать в интернете, тоже ничего не нашел.

Codesys 3.5 SP14 Patch 3

RV9WFJ
09.11.2021, 11:53
А выбрать активное приложение не помогает?

Batnic
09.11.2021, 12:00
В смысле: выделить кликом мышки нужное устройство или приложение (Application) в нем? Нет не помогает.

Евгений Кислов
09.11.2021, 12:11
В смысле: выделить кликом мышки нужное устройство или приложение (Application) в нем? Нет не помогает.

Правой кнопкой на Application - Установить активное приложение.

57865

saii
09.11.2021, 12:12
57864
Login - загрузить приложение в устройство и запустить его там.
Set Active - сделать активным приложением. Все команды меню "Online" будут относиться к нему. Также отлаживать Вы будете именно это приложение.

Batnic
09.11.2021, 12:14
Спасибо большое!

В инструкции не нашел или проглядел?

Евгений Кислов
09.11.2021, 13:01
Спасибо большое!

В инструкции не нашел или проглядел?

Это описано в справке CODESYS:
https://help.codesys.com/webapp/_cds_cmd_active_app_selector;product=codesys;versi on=3.5.17.0

Zerling
11.11.2021, 06:36
Здравствуйте!
Где узнать, как настраивается Watchdog?
Допустим, контроллер должен перезагрузиться после деления на нуль.
В конфигураторе спк, на вкладке ПЛК есть режим обработки исключений. Там выбирается "отобразить и перезагрузить". В веб-конф-ре настраиваем сторожевое время. На этом как я понимаю, настройка завершена?

И как задать на плк200 режим обработки исключений? В описании таргет файлов, в узле watchdog просто указано - "Режим обработки исключения, выбранный в конфигураторе. " но у плк же только вебморда?

Евгений Кислов
11.11.2021, 06:40
Здравствуйте!
Где узнать, как настраивается Watchdog?
Допустим, контроллер должен перезагрузиться после деления на нуль.
В конфигураторе спк, на вкладке ПЛК есть режим обработки исключений. Там выбирается "отобразить и перезагрузить". В веб-конф-ре настраиваем сторожевое время. На этом как я понимаю, настройка завершена?

И как задать на плк200 режим обработки исключений? В описании таргет файлов, в узле watchdog просто указано - "Режим обработки исключения, выбранный в конфигураторе. " но у плк же только вебморда?

Добрый день.


В веб-конф-ре настраиваем сторожевое время.

Этого можно и не делать. То, о чем вы говорите - это аппаратный вотчдог, он не связан с CODESYS.
Честно говоря, я не встречал ситуаций, когда его настройка требовалась бы пользователям.


но у плк же только вебморда?

...и в ней есть настройки вотчдога CODESYS (ПЛК - Настройки)

57882

Дед Пантелей
17.11.2021, 13:27
Добрый день.

Codesys 3.5 SP16 Patch 3
СПК107 М01

Коллеги, нужна помощь. После внесения незначительных изменений в проект и перезаливки проекта на СПК частотники SE ATV31 и ATV312 (COM2, 19200), подключенные по Modbus RTU, перестали работать. Устройства в сети, ошибок нет. Загрузил на СПК предыдущую версию - то же самое. В чем может быть дело?

Евгений Кислов
17.11.2021, 13:37
Добрый день.

Codesys 3.5 SP16 Patch 3
СПК107 М01

Коллеги, нужна помощь. После внесения незначительных изменений в проект и перезаливки проекта на СПК частотники SE ATV31 и ATV312 (COM2, 19200), подключенные по Modbus RTU, перестали работать. Устройства в сети, ошибок нет. Загрузил на СПК предыдущую версию - то же самое. В чем может быть дело?

Добрый день.
Что значит "перестали работать"?
В дереве проекта рядом с устройствами что отображается?

vinam
17.11.2021, 13:42
Здравствуйте.
Скажите, почему у меня не получается преобразование кодировок sDatamatrixText1:= OSU.UNICODE_TO_CP1251("Привет");

57946

Дед Пантелей
17.11.2021, 13:46
Добрый день.
Что значит "перестали работать"?
В дереве проекта рядом с устройствами что отображается?
Устройства перестали реагировать на команды и возвращать запрашиваемые параметры.
57948

Евгений Кислов
17.11.2021, 13:50
Здравствуйте.
Скажите, почему у меня не получается преобразование кодировок sDatamatrixText1:= OSU.UNICODE_TO_CP1251("Привет");

57946

Добрый день.
Выложите ваш проект, чтобы я смог воспроизвести проблему.

Евгений Кислов
17.11.2021, 13:51
Устройства перестали реагировать на команды и возвращать запрашиваемые параметры.
57948

Индикаторы зеленые - значит, связь есть.
Что значит "перестали реагировать на команды и возвращать запрашиваемые параметры"?
Выложите скриншоты вкладки Соотнесение входов-выходов (при подключении к ПЛК) и проект.

vinam
17.11.2021, 13:56
Добрый день.
Выложите ваш проект, чтобы я смог воспроизвести проблему.

Нашел Ваш ответ:
Надо STRING конвертировать в WSTRING, и уже WSTRING привязывать в визуализации.
Правильно?

https://owen.ru/forum/showthread.php?t=23897&p=303073&viewfull=1#post303073

Евгений Кислов
17.11.2021, 14:02
Нашел Ваш ответ:
Надо STRING конвертировать в WSTRING, и уже WSTRING привязывать в визуализации.
Правильно?

https://owen.ru/forum/showthread.php?t=23897&p=303073&viewfull=1#post303073

Да - на визуализацию нужно выводить именно WSTRING.

Дед Пантелей
17.11.2021, 14:05
Индикаторы зеленые - значит, связь есть.
Что значит "перестали реагировать на команды и возвращать запрашиваемые параметры"?
Выложите скриншоты вкладки Соотнесение входов-выходов (при подключении к ПЛК) и проект.

Этот ПЧ сейчас получает команду 000F на движение вперёд. Но движения не происходит.

Евгений Кислов
17.11.2021, 14:14
57951
Этот ПЧ сейчас получает команду 000F на движение вперёд. Но движения не происходит.
57952

По настройкам на первый взгляд проблем нет (по адресам регистров и кодам функций - вам виднее).
Надо разбираться, на стороне какого устройства возникает проблема.
Подключите ПЧВ к ПК и с помощью какого-нибудь ПО (например, MasterOPC Universal Modbus Server) настройте те же самые регистры для опроса (с теми же кодами функций).

ОлегОлег
17.11.2021, 14:22
Подскажите как определить давление в вытяжке и каким оно являеться

Дед Пантелей
17.11.2021, 14:25
По настройкам на первый взгляд проблем нет (по адресам регистров и кодам функций - вам виднее).
Надо разбираться, на стороне какого устройства возникает проблема.
Подключите ПЧВ к ПК и с помощью какого-нибудь ПО (например, MasterOPC Universal Modbus Server) настройте те же самые регистры для опроса (с теми же кодами функций).

К сожалению объект находится за несколько тысяч километров, соединяюсь с СПК через VPN.

Такой случай уже был, тоже проект заливался через VPN, решился загрузкой напрямую на СПК, не через VPN. Но суть проблемы осталась неясна. После того случая неоднократно загружал и отлаживал проекты через VPN, всё было нормально.

Попробую создать загрузочное приложение для записи на USB-носитель и выслать для загрузки на объект.

krollcbas
17.11.2021, 14:35
К сожалению объект находится за несколько тысяч километров, соединяюсь с СПК через VPN.

Такой случай уже был, тоже проект заливался через VPN, решился загрузкой напрямую на СПК, не через VPN. Но суть проблемы осталась неясна. После того случая неоднократно загружал и отлаживал проекты через VPN, всё было нормально.

Попробую создать загрузочное приложение для записи на USB-носитель и выслать для загрузки на объект.

Тоже достаточно долго провозился соединяя СПК107 (старого образца) с ATV.
1. Там особая схема терминаторов нужна, без нее они отказываются обмен данными вести. Просто резисторы - не работало
2. Для запуска используется автомат состояний и важно отслеживать какие ответы на команды он дает

Схемы соединения и код драйвера оставил в статье (https://lapshinvr.ru/articles/spk107-atv312-korrektnaya-shema-modbus-rtu.html)

RV9WFJ
17.11.2021, 14:41
К сожалению объект находится за несколько тысяч километров, соединяюсь с СПК через VPN.

Такой случай уже был, тоже проект заливался через VPN, решился загрузкой напрямую на СПК, не через VPN. Но суть проблемы осталась неясна. После того случая неоднократно загружал и отлаживал проекты через VPN, всё было нормально.

Попробую создать загрузочное приложение для записи на USB-носитель и выслать для загрузки на объект.
С OpenVPN это 100% не связано

keysansa
17.11.2021, 14:44
К сожалению объект находится за несколько тысяч километров, соединяюсь с СПК через VPN.

Такой случай уже был, тоже проект заливался через VPN, решился загрузкой напрямую на СПК, не через VPN. Но суть проблемы осталась неясна. После того случая неоднократно загружал и отлаживал проекты через VPN, всё было нормально.

Попробую создать загрузочное приложение для записи на USB-носитель и выслать для загрузки на объект.

Отлаживаю СПК по VPN некоторое время.
Соединения по VPN не влияют на обмен панели по Modbus RTU. А вот, обновление библиотек проекта, влияет. Попробуйте открыть старый проект, выполнить сравнение с только что созданным, но примите только изменение кода и графики, не меняя библиотечных ссылок.

keysansa
17.11.2021, 14:45
С OpenVPN это 100% не связано
Полностью согласен (это еще и 100 моих %)

Дед Пантелей
17.11.2021, 14:50
Тоже достаточно долго провозился соединяя СПК107 (старого образца) с ATV.
1. Там особая схема терминаторов нужна, без нее они отказываются обмен данными вести. Просто резисторы - не работало
2. Для запуска используется автомат состояний и важно отслеживать какие ответы на команды он дает

Схемы соединения и код драйвера оставил в статье (https://lapshinvr.ru/articles/spk107-atv312-korrektnaya-shema-modbus-rtu.html)

Спасибо за информацию.
Дело было не в Codesys, а видимо как раз в состояниях. Человек на объекте перезагружал контроллер выключением вводного автомата щита для проверки функции автозапуска котла после возобновления питания. ПЧ скорее всего не успели выключиться. Нужно пересмотреть процедуру проверки состояний ПЧ.

keysansa
17.11.2021, 15:37
Спасибо за информацию.
Человек на объекте перезагружал контроллер выключением вводного автомата щита для проверки функции автозапуска котла после возобновления питания.
Вы не используете контактор для включения ПЧ, как я понял. Как вы обеспечиваете видимый разрыв цепи питания двигателя?

RV9WFJ
17.11.2021, 15:49
А зачем нужен видимый разрыв?

keysansa
17.11.2021, 15:52
А зачем нужен видимый разрыв?

Для обслуживания.

RV9WFJ
17.11.2021, 16:14
А автомат перед ПЧ?

aek58
25.11.2021, 12:15
Добрый день! Можно ли сменить домашний каталог ftp-сервера /mnt/ufs/home/ftp/in (СПК1хх [М01]) в web-конфигураторе или иным способом на другой, например SD?

Евгений Кислов
25.11.2021, 12:24
Добрый день! Можно ли сменить домашний каталог ftp-сервера /mnt/ufs/home/ftp/in (СПК1хх [М01]) в web-конфигураторе или иным способом на другой, например SD?

Добрый день.
В свежей прошивке (https://ftp.owen.ru/CoDeSys3/10_Firmware/SPK1xx_M01/1.3.0928.2149.zip) такая возможность есть.

58057

Солнечный заяц
01.12.2021, 12:06
Здравствуйте, есть таблица тревог в визуализации. В группе тревог описано событие: "Переменная_1=3". Способ подтверждения REP. Переменная_1=3 один цикл основной программы. В таблице тревог сообщение не появляется. Засунул вызов АлармМенеджера в МейнТаск, что бы он обрабатывался каждый цикл программы и увидел, что Переменная_1=3. Не помогло.
Обработка тревог происходит при обработке визуализации? Как заставить работать?.

Евгений Кислов
01.12.2021, 12:15
Здравствуйте, есть таблица тревог в визуализации. В группе тревог описано событие: "Переменная_1=3". Способ подтверждения REP. Переменная_1=3 один цикл основной программы. В таблице тревог сообщение не появляется. Засунул вызов АлармМенеджера в МейнТаск, что бы он обрабатывался каждый цикл программы и увидел, что Переменная_1=3. Не помогло.
Обработка тревог происходит при обработке визуализации? Как заставить работать?.

Добрый день.
Выложите, пожалуйста, простейший проект, на котором я смогу воспроизвести проблему.

Солнечный заяц
01.12.2021, 13:50
Добрый день.
Выложите, пожалуйста, простейший проект, на котором я смогу воспроизвести проблему.
Вот такой пример

Евгений Кислов
01.12.2021, 17:18
Вот такой пример

В приложенном проекте включен режим симуляции.
Вы в нем проверяете работу с тревогами?

Солнечный заяц
02.12.2021, 08:30
В приложенном проекте включен режим симуляции.
Вы в нем проверяете работу с тревогами?

Пример сделал в симуляции, но на реальном устройстве ситуация такая же.

Солнечный заяц
02.12.2021, 09:00
Сделал пример для СПК110. Проблема сохраняется.
P.S. сделал пример чуть нагляднее

Евгений Кислов
02.12.2021, 10:31
Сделал пример для СПК110. Проблема сохраняется.
P.S. сделал пример чуть нагляднее

На СПК1хх [М01] у меня проблема не воспроизводится - т.е. дело не в настройках.
На старом СПК1хх в данный момент проверить возможности нет.
Предоставьте удаленный доступ к ПК, к которому подключен ваш СПК - посмотрю, в чем может быть дело.

Солнечный заяц
02.12.2021, 13:54
На СПК1хх [М01] у меня проблема не воспроизводится - т.е. дело не в настройках.
На старом СПК1хх в данный момент проверить возможности нет.
Предоставьте удаленный доступ к ПК, к которому подключен ваш СПК - посмотрю, в чем может быть дело.

Написал на e-mail

Mal31
04.12.2021, 10:35
Простите, а в CODESYS 3.5 нельзя писать программу на языке IL? Неужели из текстовых только ST остался? Или я просто не могу найти эту опцию? В инструкциях IL вроде не нашёл, поэтому спрашиваю здесь.

Евгений Кислов
04.12.2021, 11:24
Простите, а в CODESYS 3.5 нельзя писать программу на языке IL? Неужели из текстовых только ST остался? Или я просто не могу найти эту опцию? В инструкциях IL вроде не нашёл, поэтому спрашиваю здесь.

Можно.
Но для этого надо сделать так: Инструменты - Опции - Редактор FBD, LD и IL - IL - Включить IL

gom
15.12.2021, 07:15
в наличии : CODESYS V3.5 SP14 Patch 3 и плк ПЛК210-03-CS с прошивкой 1.3.0309.1257. вот прочитал Онлайн-FAQ
https://owen.ru/forum/showthread.php?t=28167&p=325383&viewfull=1#post325383
и вопрос можно ли отключить запись в файл что бы этой ошибки не возникло и как это правильно сделать. тренд если сбросится при пропадании питания то не критично. запись в тренд нужно каждые 10 минут, через 2-3 дня старые значения пусть удаляются.

Евгений Кислов
15.12.2021, 09:00
в наличии : CODESYS V3.5 SP14 Patch 3 и плк ПЛК210-03-CS с прошивкой 1.3.0309.1257. вот прочитал Онлайн-FAQ
https://owen.ru/forum/showthread.php?t=28167&p=325383&viewfull=1#post325383
и вопрос можно ли отключить запись в файл что бы этой ошибки не возникло и как это правильно сделать. тренд если сбросится при пропадании питания то не критично. запись в тренд нужно каждые 10 минут, через 2-3 дня старые значения пусть удаляются.

Для тренда отключить запись в файла нельзя. Можно увеличить период записи (например, как раз до 10 минут).

Если сброс значений при пропадании питания некритичен - то лучше использовать элемент Трассировка.
Он как раз предназначен для отображения "оперативных" данных и не использует файлы.

Вячеслав90
16.12.2021, 00:19
Здравствуйте! Есть ли в Codesys готовая библиотека для нахождения полиномиальной функции регрессии по известному набору данных (диаграмме рассеяния)? Необходимо для получения характеристик расхода регулирующих клапанов в зависимости от давления.

Евгений Кислов
16.12.2021, 09:28
Здравствуйте! Есть ли в Codesys готовая библиотека для нахождения полиномиальной функции регрессии по известному набору данных (диаграмме рассеяния)? Необходимо для получения характеристик расхода регулирующих клапанов в зависимости от давления.

Добрый день.
Такой библиотеки нет.
Это совершенно не типовая для контроллера задача.

Kipiamail
21.12.2021, 11:07
Может кто сталкивался с проблемой. CODESYS V3.5 SP16 Patch 3 перестала открываться панель сообщений, показывает ошибки а посмотреть не могу.
Пробовал щелкать два раза по полю состояния не помогает. Переустановил Codesys тоже не помогло.

Евгений Кислов
21.12.2021, 11:15
Может кто сталкивался с проблемой. CODESYS V3.5 SP16 Patch 3 перестала открываться панель сообщений, показывает ошибки а посмотреть не могу.
Пробовал щелкать два раза по полю состояния не помогает. Переустановил Codesys тоже не помогло.

Продемонстрируйте свою проблему скриншотом.

RV9WFJ
21.12.2021, 11:20
Может кто сталкивался с проблемой. CODESYS V3.5 SP16 Patch 3 перестала открываться панель сообщений, показывает ошибки а посмотреть не могу.
Пробовал щелкать два раза по полю состояния не помогает. Переустановил Codesys тоже не помогло. Alt+3 не помогает?

Kipiamail
21.12.2021, 18:10
58428
Alt+3 попробовал не помогает. На скриншоте как можно показать что сообщения не работают?

Евгений Кислов
21.12.2021, 18:17
58428
Alt+3 попробовал не помогает. На скриншоте как можно показать что сообщения не работают?

Ваш скриншот вполне нагляден.
Попробуйте выполнить команду Вид - Сообщения.
Также панель сообщений автоматически появляется при выполнении команды Компиляция - Перекомпиляция.

Если это не поможет - предоставьте завтра доступ по AnyDesk.

Kipiamail
21.12.2021, 19:42
Команда Вид - Сообщения не помогает.
При выполнении команды Компиляция - Перекомпиляция автоматически не появляется.

Солнечный заяц
13.01.2022, 13:45
Здравствуйте, в ПЛК200 доступно 512Мб памяти для пользователя. Сколько из них можно безопасно выделить для сохранения тренда?

Евгений Кислов
13.01.2022, 13:48
Здравствуйте, в ПЛК200 доступно 512Мб памяти для пользователя. Сколько из них можно безопасно выделить для сохранения тренда?

Добрый день.
Объем свободной flash-памяти можно посмотреть в web-конфигураторе - и исходя из этого выбрать максимальный размер файла тренда.

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

heiipyxa
24.01.2022, 09:30
Добрый День! Возникла проблема с записью тренда в контроллере. В веб визуализации пишет ошибку Some kind of disk I/O error occurrend. Check disk space.
Подскажите как побороть данную ошибку.?

Евгений Кислов
24.01.2022, 09:37
Добрый День! Возникла проблема с записью тренда в контроллере. В веб визуализации пишет ошибку Some kind of disk I/O error occurrend. Check disk space.
Подскажите как побороть данную ошибку.?

Добрый день.
https://owen.ru/forum/showthread.php?t=28167&p=325383&viewfull=1#post325383

wad71
24.01.2022, 22:50
Добрый день. А существует ли возможность каким то образом сохранить на комп онлайн справку, вызываемую в codesys, чтобы пользоваться при отсутствии доступа к интернету?

wad71
24.01.2022, 23:17
Извините. Разобрался, как вызвать chm.

WhyNot
26.01.2022, 11:25
Добрый день. необходимо опросить все 254 адреса на шине модбас, для составления массива существующих адресов. Справился с помощью вашей библиотеки owencomminacations. Хотел сделать цикл FOR по массиву от 1 до 254 но так понял работать не будет из за того как исполняется данная операция. Подскажите как более правильно обвязать один FB MB_SerialRequest для исполнения его в цикли на 250 раз.

Евгений Кислов
26.01.2022, 11:31
Добрый день. необходимо опросить все 254 адреса на шине модбас, для составления массива существующих адресов. Справился с помощью вашей библиотеки owencomminacations. Хотел сделать цикл FOR по массиву от 1 до 254 но так понял работать не будет из за того как исполняется данная операция. Подскажите как более правильно обвязать один FB MB_SerialRequest для исполнения его в цикли на 250 раз.

Добрый день.
У меня под руками нет конкретного примера (но такой алгоритм реализовывал Cs-Cs (https://owen.ru/forum/member.php?u=74642) - возможно, он поделится скриншотами или сниппетом кода из своего проекта).
Общий принцип - по xDone или xError производите инкремент входа usiSlaveId и повторно вызывайте блок.

WhyNot
26.01.2022, 12:02
Добрый день.
У меня под руками нет конкретного примера (но такой алгоритм реализовывал Cs-Cs (https://owen.ru/forum/member.php?u=74642) - возможно, он поделиться скриншотами или сниппетом кода из своего проекта).
Общий принцип - по xDone или xError производите инкремент входа usiSlaveId и повторно вызывайте блок.

т.е. в цикле FOR это реально сделать?? я думал там не получиться именно из разницы выполнения. (Но я в этом оч плохо соображаю)) )

Евгений Кислов
26.01.2022, 12:08
т.е. в цикле FOR это реально сделать?? я думал там не получиться именно из разницы выполнения. (Но я в этом оч плохо соображаю)) )

Я нигде не писал про цикл FOR. Цикл FOR для описанной вами задачи не подойдет (если вы в нем собирались вызывать MB_SerialRequest).

capzap
26.01.2022, 12:08
т.е. в цикле FOR это реально сделать?? я думал там не получиться именно из разницы выполнения. (Но я в этом оч плохо соображаю)) )

в цикле FOR не получится, каждый цикл ПЛК получится, каждый - с оговоркой, пока не придет подтверждение или ошибка от последнего опрашиваемого устройства. Лучше всего для наглядности использовать CASE


CASE i OF
1..254:
; (* выполнение произвольного кода для конкретного экземпляра*)
IF fb.xDONE OR fb.XError THEN
i := i + 1;
END_IF;
ELSE
;
END_CASE;

WhyNot
26.01.2022, 12:13
Спасибо, всем

Cs-Cs
26.01.2022, 12:53
Добрый день.
У меня под руками нет конкретного примера (но такой алгоритм реализовывал Cs-Cs (https://owen.ru/forum/member.php?u=74642) - возможно, он поделиться скриншотами или сниппетом кода из своего проекта).
Общий принцип - по xDone или xError производите инкремент входа usiSlaveId и повторно вызывайте блок.
Евгений Кислов Я их тебе когда-то слал. Ща найду, вставлю сюда.

WhyNot В ПЛК немного не так, как в программировании на компах. Тут важно НЕ забывать о том, что каждая программа-задача повторяется бесконечно вся целиком.
Поэтому если ты напишешь FOR с 1 по 254 - то он прокрутится за один вызов задачи и за этот вызов задачи ПЛК будет пытаться опросить разом всех.
FORом должен служить сам вызов задачи, как уже подсказали: заводим некую переменную "Шаг", и каждый вызов задачи крутим её, опрашивая устройство с нужным номером шага.

Вот что делал я для OCL. Скриншоты мутные, попробую пояснить принцип.
Сначала я делал большую копипасту - для каждого шага. И закручивал это в большой CASE. Было много-много кода!
58938 58939
Потом мне это захотелось оптимизировать. Я вспомнил про массивы объектов из СИ, и сделал себе структуру для описания одного запроса вместе с его FB SerialRequest:
58940
Потом объявил константный массив всех-всех запросов (Евгений Кислов - тут где-то помог твой ответ о том, как это делать и объявлять и на лету структуры инициализировать):
58941
А дальше оставалось завести ту самую переменную "Шаг" (ioMBReqStep) и увеличивать её на 1, если опрос был успешным:
58942

WhyNot
26.01.2022, 12:59
Спасибо за разъяснение!

Игорь Владимирович
28.01.2022, 19:03
Ребят всем привет!
Как разбить строку WSTRING на байты и потом собрать обратно?

Евгений Кислов
28.01.2022, 19:05
Ребят всем привет!
Как разбить строку WSTRING на байты и потом собрать обратно?

Добрый день.
Опишите конкретную задачу, которую вы хотите решить.

Игорь Владимирович
28.01.2022, 19:07
Добрый день.
Опишите конкретную задачу, которую вы хотите решить.

Предположим хочу передать посети. Те можно вордами разбить. И потом собрать обратно.

Евгений Кислов
28.01.2022, 19:09
Предположим хочу передать посети. Те можно вордами разбить. И потом собрать обратно.

По какому протоколу? Каким образом вы будете настраивать обмен, через какие компоненты/библиотеки?

Игорь Владимирович
28.01.2022, 19:16
По какому протоколу? Каким образом вы будете настраивать обмен, через какие компоненты/библиотеки?
Да просто по модбасу. Это для примера.

Евгений Кислов
28.01.2022, 19:26
Да просто по модбасу. Это для примера.

Если через компоненты в дереве проекта - используйте объединение (UNION), чтобы представить WSTRING как массив вордов (будьте внимательны с размерностью массива).
Если через библиотеку OwenCommunication - то ничего преобразовывать не надо, под указатель на отправляемые данные можно сразу положить строку.

Игорь Владимирович
28.01.2022, 19:29
Если через компоненты в дереве проекта - используйте объединение (UNION), чтобы представить WSTRING как массив вордов (будьте внимательны с размерностью массива).
Если через библиотеку OwenCommunication - то ничего преобразовывать не надо, под указатель на входные данные можно сразу положить строку.

Мне бы подошла возможность указать ADR(переменная) и затем нужные байты забрать и в массив байтов все загнать. Ну и потом из массива байт собрать обратно

Через Юнион я думал. Но уменя длинна разная. Где-то 3-4 символа (8байт) а где-то 50 символов. Уже 100байт. Вот думаю может через обращение к памяти можно байты забрать проще. И в массив все это собрать мне нужно. Сейчас имею данные за 1 раз свыше 10000 байт. Те 10килобайт

Евгений Кислов
28.01.2022, 19:36
Мне бы подошла возможность указать ADR(переменная) и затем нужные байты забрать и в массив байтов все загнать

Тогда OwenCommunication вам больше подойдет. Я, правда, так и не понял, зачем всё загонять в "массив байтов" - но вам виднее.

10 килобайт "за 1 раз" передать по Modbus всё равно не получится - в протоколе ограничение на 256 байт в запросе записи.

Игорь Владимирович
28.01.2022, 19:40
Тогда OwenCommunication вам больше подойдет. Я, правда, так и не понял, зачем всё загонять в "массив байтов" - но вам виднее.

10 килобайт "за 1 раз" передать по Modbus всё равно не получится - в протоколе ограничение на 256 байт в запросе записи.

Модбас для примера привел))
Я сейчас формирую большую строку и пишу ее в Фаил на плк. Но мне нужно перевестисе в бинарный Фаил, в живые байты с известными мне адресами. Причин много, одна из ник катастрофическая нехватка памяти. Так как нужно например записать число 9999 для этого нужно 8байт. А в битах мне для моей задачи хватит 9-10 бит. Вот хочу все преобразовать под одно. Числа хранить в байтах одного массива, и внегоже преобразовать текст. И потом записать в Фаил прочитать, и снова восстановить ворды и встринг.

Игорь Владимирович
28.01.2022, 19:47
И неплохо было бы использовать только встроенные средства кодесиса. Чтобы потом проблем не было с переносом на разные плк.

Евгений Кислов
28.01.2022, 19:47
Если вам нужна какая-то рекомендация - то, как ни печально, придется отвечать на вопросы.


Я сейчас формирую большую строку

Что это за "большая строка", зачем она нужна? Опишите конкретную задачу из вашей предметной области.


пишу ее в Фаил на плк.

Для чего?


Но мне нужно перевестисе в бинарный Фаил, в живые байты с известными мне адресами.

Для чего?


Причин много, одна из ник катастрофическая нехватка памяти

Назовите все причины и уточните, что вы подразумеваете под "катастрофической нехваткой памяти".


Так как нужно например записать число 9999 для этого нужно 8байт.

Хватит двух (9999 спокойно вписывается в INT/UINT). Если вы имели в виду что-то иное - формулируйте точнее, пожалуйста.


Вот хочу все преобразовать под одно.

Что такое "все" и что значит "под одно"?


Числа хранить в байтах одного массива, и внегоже преобразовать текст.

Для чего?


И потом записать в Фаил прочитать, и снова восстановить ворды и встринг.

Т.е. цель в том, чтобы ПЛК что-то записал в файл, а потом прочитал записанное?
Вы реализуете архивацию или работу с рецептами?

Игорь Владимирович
28.01.2022, 19:50
Если вам нужна какая-то рекомендация - то, как ни печально, придется отвечать на вопросы.



Что это за "большая строка", зачем она нужна? Опишите конкретную задачу из вашей предметной области.



Для чего?



Для чего?



Назовите все причины и уточните, что вы подразумеваете под "катастрофической нехваткой памяти".



Хватит двух (9999 спокойно вписывается в INT/UINT). Если вы имели в виду что-то иное - формулируйте точнее, пожалуйста.



Что такое "все" и что значит "под одно"?



Для чего?



Т.е. цель в том, чтобы ПЛК что-то записал в файл, а потом прочитал записанное?
Вы реализуете архивацию или работу с рецептами?

Пишу данные испытаний с испытательного стенда. Храню очень много информации. 1 прогон 10килобайт, за день около 100 тестов может быть. Объем информации большой. Сейчас уменя строка на 5425 символов (на пару могу ишибится) и 90% из этого это числа. Если ути от текстовых переменных частично экономия памяти будет в 3 раза минимум.

А если перейду на биты то вообще могу в 4-5 раз уменьшить объем.

Евгений Кислов
28.01.2022, 20:01
Храню очень много информации.

Как потом эта информация используется?

Игорь Владимирович
28.01.2022, 20:20
Как потом эта информация используется?

Читаю, вывожу в визуализацию графиков и всего остального и на печать протокола испытаний. В любой момент может понадобится дубликат любого протокола, мы его находим в базе, выводим и печатаем. Ну или просто показываем.

Игорь Владимирович
28.01.2022, 20:23
Из того, что я смог найти по вашим сообщениям - вам необходимо собрать статистику работы оборудования, записать ее в человеко-читаемый вид?
Исходя из этого, могу предложить записывать в машино-читаемый вид, "строки" будут гораздо компактнее, но для анализа придется писать дешифратор.
Либо смириться. И например, перейти на контроллер, который позволит сохранять в базу данных. Дальше анализ сползает с контроллера, и приобретает "кубические" возможности.

Программа уменя работает. Вопросов нет. Но хочу все оптимизировать.

Евгений Кислов
28.01.2022, 20:27
Читаю, вывожу в визуализацию графиков и всего остального и на печать протокола испытаний. В любой момент может понадобится дубликат любого протокола, мы его находим в базе, выводим и печатаем. Ну или просто показываем.

Каким образом осуществляется печать протокола испытаний?

Игорь Владимирович
28.01.2022, 20:27
Каким образом осуществляется печать протокола испытаний?

Через браузер))

Евгений Кислов
28.01.2022, 20:33
Через браузер))

Ок, после всей полученной от вас информации я в рамках вашей задачи не вижу причин сохранять данные в строковом виде.
Бинарный архив, как вы верно заметили, позволит сэкономить память.
В чем тогда у вас сейчас вопрос?

Игорь Владимирович
28.01.2022, 20:36
Ок, после всей полученной от вас информации я в рамках вашей задачи не вижу причин сохранять данные в строковом виде.
Бинарный архив, как вы верно заметили, позволит сэкономить память.
В чем тогда у вас сейчас вопрос?

как все сохранять в бинарник, я предпологал ссамого начала что уменя это будет массив байт, все числа и значения буду переводить в байты, а сам массив писать в фаил один за одним, потом также читать нужный, преобразовать обратно согласно структуре данных

Евгений Кислов
28.01.2022, 20:40
Функция MemMove из библиотеки CAA Memory позволит "перевести" всё что угодно во всё что угодно.

Игорь Владимирович
28.01.2022, 20:40
Функция MemMove из библиотеки CAA Memory позволит "перевести" всё что угодно во всё что угодно.

если несложно можно подробнее и желательно с примером

Как понимаю так?

MEM.MemMove(pSource:=ADR(LW1) , pDestination:= ADR(LW2), uiNumberOfBytes:= 8);

Евгений Кислов
28.01.2022, 20:46
если несложно можно подробнее и желательно с примером

https://youtu.be/1SC0FkMEXKY?t=737

Игорь Владимирович
28.01.2022, 20:52
работает! спасибо! в принцепи это и искал!

Игорь Владимирович
28.01.2022, 20:55
https://youtu.be/1SC0FkMEXKY?t=737

вот единственно непойму точнее неуверен, допустем имеем адрес 1000, имеем длинну байт 16, те первым я беру адрес 1000 копирую 4 байта, затем 1004 и беру от туда еще 4 байта и так далее? или я что то непонимаю?

Игорь Владимирович
28.01.2022, 21:00
MEM.MemMove(pSource:=ADR(LW1) , pDestination:= ADR(LWArray[0]), uiNumberOfBytes:= 1);
MEM.MemMove(pSource:=ADR(LW1)+1 , pDestination:= ADR(LWArray[1]), uiNumberOfBytes:= 1);
MEM.MemMove(pSource:=ADR(LW1)+2 , pDestination:= ADR(LWArray[2]), uiNumberOfBytes:= 1);
MEM.MemMove(pSource:=ADR(LW1)+3 , pDestination:= ADR(LWArray[3]), uiNumberOfBytes:= 1);
MEM.MemMove(pSource:=ADR(LW1)+4 , pDestination:= ADR(LWArray[4]), uiNumberOfBytes:= 1);
MEM.MemMove(pSource:=ADR(LW1)+5 , pDestination:= ADR(LWArray[5]), uiNumberOfBytes:= 1);
MEM.MemMove(pSource:=ADR(LW1)+6 , pDestination:= ADR(LWArray[6]), uiNumberOfBytes:= 1);
MEM.MemMove(pSource:=ADR(LW1)+7 , pDestination:= ADR(LWArray[7]), uiNumberOfBytes:= 1);

MEM.MemMove(pSource:=ADR(LWArray[0]) , pDestination:=ADR(LW2) , uiNumberOfBytes:= 1);
MEM.MemMove(pSource:=ADR(LWArray[1]) , pDestination:=ADR(LW2)+1 , uiNumberOfBytes:= 1);
MEM.MemMove(pSource:=ADR(LWArray[2]) , pDestination:=ADR(LW2)+2 , uiNumberOfBytes:= 1);
MEM.MemMove(pSource:=ADR(LWArray[3]) , pDestination:=ADR(LW2)+3 , uiNumberOfBytes:= 1);
MEM.MemMove(pSource:=ADR(LWArray[4]) , pDestination:=ADR(LW2)+4 , uiNumberOfBytes:= 1);
MEM.MemMove(pSource:=ADR(LWArray[5]) , pDestination:=ADR(LW2)+5 , uiNumberOfBytes:= 1);
MEM.MemMove(pSource:=ADR(LWArray[6]) , pDestination:=ADR(LW2)+6 , uiNumberOfBytes:= 1);
MEM.MemMove(pSource:=ADR(LWArray[7]) , pDestination:=ADR(LW2)+7 , uiNumberOfBytes:= 1);


все отлично работает даже в эмуляции!
Просто изумительно! именно то что я искал! Огромное спасибо! теперь подвежу фор и впуть!


FOR I1:=0 TO 7 BY 1 DO
MEM.MemMove(pSource:=ADR(LW1)+I1 , pDestination:= ADR(LWArray[I1]), uiNumberOfBytes:= 1);
END_FOR

FOR I2:=0 TO 7 BY 1 DO
MEM.MemMove(pSource:=ADR(LWArray[I2]) , pDestination:=ADR(LW2)+I2 , uiNumberOfBytes:= 1);
END_FOR

Игорь Владимирович
28.01.2022, 21:07
один вопрос остался, как я пишу массив в фаил


sArchEntry := WstWst_TO_VLWst.sVeryLongWStr;

fbFileWrite(xExecute:=TRUE, hFile:=hFile, pBuffer:=ADR(sArchEntry), szSize:=(StrLenW(ADR(sArchEntry)))*2)

sArchEntry это переменная для записи в буфер, подставляю сюда свой массив и впуть ?

Евгений Кислов
28.01.2022, 21:08
Вместо



FOR I1:=0 TO 7 BY 1 DO
MEM.MemMove(pSource:=ADR(LW1)+I1 , pDestination:= ADR(LWArray[I1]), uiNumberOfBytes:= 1);
END_FOR


можно так (и это будет семантически эквивалентно):


MEM.MemMove(pSource:=ADR(LW1) , pDestination:= ADR(LWArray[0]), uiNumberOfBytes:= 8);



sArchEntry это переменная для записи в буфер, подставляю сюда свой массив и впуть ?

В pBuffer можно передать адрес чего угодно - в т.ч. и вашего массива.

Игорь Владимирович
28.01.2022, 21:10
Вместо



можно так (и это будет семантически эквивалентно):






В pBuffer можно передать адрес чего угодно - в т.ч. и вашего массива.

да массив же подряд идёт))) ну тут у меня эйфория и накатал что в голову пришло.

Игорь Владимирович
28.01.2022, 21:13
Вместо



можно так (и это будет семантически эквивалентно):






В pBuffer можно передать адрес чего угодно - в т.ч. и вашего массива.

так, стоп, у меня есть массив структуры и я могу его сразу записать и прочитать потом без проблем??

Игорь Владимирович
28.01.2022, 21:15
Если честно, я не понял, в чем счастье наступило... Как был строковый буфер, так и остался...
И еще

Не забыть исправить.

нечего исправлять не надо, все работает идеально

Евгений Кислов
28.01.2022, 21:17
так, стоп, у меня есть массив структуры и я могу его сразу записать и прочитать потом без проблем??

Можете, конечно.


В pBuffer можно передать адрес чего угодно - в т.ч. и вашего массива.

Mal31
28.01.2022, 23:05
Пришлите в личку или на почту данные для подключения по TeamViewer, пожалуйста.
https://www.teamviewer.com/

Добрый день! Теперь у меня та же проблема, как в сообщении https://owen.ru/forum/showthread.php?t=20069&p=312256&viewfull=1#post312256 - ошибка при попытке подключения к СПК110. Буквально за день до этого всё было хорошо и загружалось.
5898858989
Интересно, получилось у вас помочь ему в этом, и если да - то как?

Евгений Кислов
29.01.2022, 08:22
Добрый день! Теперь у меня та же проблема, как в сообщении https://owen.ru/forum/showthread.php?t=20069&p=312256&viewfull=1#post312256 - ошибка при попытке подключения к СПК110. Буквально за день до этого всё было хорошо и загружалось.
5898858989
Интересно, получилось у вас помочь ему в этом, и если да - то как?

Добрый день.
На скрине видно, что не запущены службы CODESYS Gateway и Codemeter.

Проверьте их состояние:
58991

Если самостоятельно решить проблему не получится - обеспечьте в понедельник удаленный доступ к ПК (лучше утром).

Игорь Владимирович
30.01.2022, 16:33
Добрый вечер! ребят подскажите пожалуйста как узнать сколько занимает переменная в байтах? ну или массив сколько занимает, чтобы не сидеть и в ручную не считать))

Евгений Кислов
30.01.2022, 16:42
Добрый вечер! ребят подскажите пожалуйста как узнать сколько занимает переменная в байтах? ну или массив сколько занимает, чтобы не сидеть и в ручную не считать))

Используйте оператор SIZEOF.
https://help.codesys.com/webapp/_cds_operator_sizeof;product=codesys;version=3.5.1 7.0

Игорь Владимирович
30.01.2022, 16:58
Используйте оператор SIZEOF.
https://help.codesys.com/webapp/_cds_operator_sizeof;product=codesys;version=3.5.1 7.0

Отлично! забыл про него, использовал в пред идущих проектах.

еще вопрос в эмуляции мы создавать фаил не можем? вроде нет, а на виртуальном плк?

Евгений Кислов
30.01.2022, 17:13
Отлично! забыл про него, использовал в пред идущих проектах.

еще вопрос в эмуляции мы создавать фаил не можем? вроде нет, а на виртуальном плк?

Все верно - для работы с файлами нужно использовать виртуальный контроллер.

Игорь Владимирович
30.01.2022, 17:41
Все верно - для работы с файлами нужно использовать виртуальный контроллер.

непойму оду вещь, немогу добавить в новый проект CAA File. открываю итем и там пусто

Евгений Кислов
30.01.2022, 17:42
непойму оду вещь, немогу добавить в новый проект CAA File. открываю итем и там пусто

Продемонстрируйте вашу проблему скриншотом.

Игорь Владимирович
30.01.2022, 17:48
Продемонстрируйте вашу проблему скриншотом.

Вот скрин:

в общем добавилось другим путём, нажал дополнительно и там в разделах нарыл библиотеку и добавил.

Евгений Кислов
30.01.2022, 18:09
Лучше добавлять библиотеки вот так:

59007

TATARin
30.01.2022, 19:00
Здравствуйте знатоки. Нам - эксплуатации, необходимо реализовать настройку модулей с панели оператора(СП270), а то при замене датчика постоянно необходим ноутбук или похожий датчик. Вопрос - можно ли установить конфигураторы модулей Mx110 и Mx210 на ПЛК210 и конфигурировать эти модули с ОП(СП270). Если можно, то ссылки на примеры или подобные темы.

Евгений Кислов
30.01.2022, 19:06
Здравствуйте знатоки. Нам - эксплуатации, необходимо реализовать настройку модулей с панели оператора(СП270), а то при замене датчика постоянно необходим ноутбук или похожий датчик. Вопрос - можно ли установить конфигураторы модулей Mx110 и Mx210 на ПЛК210 и конфигурировать эти модули с ОП(СП270). Если можно, то ссылки на примеры или подобные темы.

Добрый день.
Установить конфигуратор на ПЛК нельзя.

Для Mx210 можно изменить тип датчика по Modbus.
В шаблоне уже есть нужные каналы:
https://owen.ru/forum/showthread.php?t=31176

Для Mx110 это можно сделать только по протоколу ОВЕН.
Задача не самая простая, и примеров для конкретно вашего случая нет.
Начать можно с этого документа:
https://ftp.owen.ru/CoDeSys3/11_Documentation/03_3.5.11.5/CDSv3.5_ProtocolOWEN_v2.1.pdf

Игорь Владимирович
30.01.2022, 19:49
какой путь можно использовать для создания файлов в виртуальном ПЛК?
на живом плк я использую '/mnt/ufs/home/ftp/in/base.bin'

Евгений Кислов
30.01.2022, 20:25
какой путь можно использовать для создания файлов в виртуальном ПЛК?
на живом плк я использую '/mnt/ufs/home/ftp/in/base.bin'

Какой вам удобно (и для какого есть права доступа на создание файлов).
Например - 'D:\base.bin'

Mal31
30.01.2022, 23:17
Добрый день.
На скрине видно, что не запущены службы CODESYS Gateway и Codemeter.

Проверьте их состояние:
58991

Если самостоятельно решить проблему не получится - обеспечьте в понедельник удаленный доступ к ПК (лучше утром).

Спасибо, проблема решилась пока заменой компьютера- с другого соединение прекрасно работает, доступ обеспечить уже не смогу.

samthesuperhero
01.02.2022, 11:18
Добрый день!

Не могу настроить связь между ноутом и ПЛК-200-03,

==============================
DETAILED VERSION INFORMATION
Created at 01.02.2022
==============================

Startup profile: .................................................. ............. CODESYS V3.5 SP16 Patch 3
OS version: .................................................. .................. Microsoft Windows NT 10.0.19042.0
.NET version: .................................................. ................ 4.0.30319.42000


Вот здесь не находит устройство, сканнер ничего не находит:
59045

Версии таргетов:
59046

Ноут включен в ПЛК-200-03 напрямую кабелем в порт ПЛК "lan", IP адреса настроены, веб-конфигуратор загружается и работает:
59047,

но никак не могу продключиться через CodeSys !

Помогите пожалуйста!!

+++++ PS: прошивку обновил дважды аппаратно как и написано, (единственно что между первым и вторым обновлением прошивки я заходил в веб-интерфейс, надеюсь это не повлияло)

Евгений Кислов
01.02.2022, 11:20
Добрый день!

Не могу настроить связь между ноутом и ПЛК-200-03,

но никак не могу продключиться через CodeSys !

Помогите пожалуйста!!

+++++ PS: прошивку обновил дважды аппаратно как и написано, (единственно что между первым и вторым обновлением прошивки я заходил в веб-интерфейс, надеюсь это не повлияло)

Добрый день.
См. https://owen.ru/forum/showthread.php?t=28167&p=330018&viewfull=1#post330018

Если не поможет - обеспечьте удаленный доступ по TeamViewer или AnyDesk.

samthesuperhero
01.02.2022, 11:38
Добрый день.
См. https://owen.ru/forum/showthread.php?t=28167&p=330018&viewfull=1#post330018

Если не поможет - обеспечьте удаленный доступ по TeamViewer или AnyDesk.

Магия,
59048
- кто бы мог подумать :) видимо каспер блокирует

Спасибо!!!

gwimplen
04.02.2022, 17:14
Доброго времени коллеги.
Столкнулся с подобной проблемой при подключении к проекту в режиме эмуляции.
59120
P.S.
Проект - долгострой. Когда открывал его в последний раз(месяца два назад), подобного не наблюдалось. Настройки КДС никакие не менял, пароли не ставил. Версия КДС- 3.5 SP16 +

Евгений Кислов
04.02.2022, 17:18
Доброго времени коллеги.
Столкнулся с подобной проблемой при подключении к проекту в режиме эмуляции.
59120
P.S.
Проект - долгострой. Когда открывал его в последний раз(месяца два назад), подобного не наблюдалось. Настройки КДС никакие не менял, пароли не ставил. Версия КДС- 3.5 SP16 +

Добрый день.
За эти два месяца вы не устанавливали другие версии CODESYS?

Обеспечьте в понедельник удаленный доступ к ПК - попробуем разобраться в происходящем.

heiipyxa
07.02.2022, 08:33
Добрый день! Выполнил все что вы скинули по данной ссылке. но через пару дней все равно выскакивает данная ошибка. Я так понимаю данная ошибка появляется из-за переполнении памяти плк? Можно ли сделать запись трендов на на microsd карту?

heiipyxa
07.02.2022, 08:35
Добрый день.
https://owen.ru/forum/showthread.php?t=28167&p=325383&viewfull=1#post325383

Добрый день! Выполнил все что вы скинули по данной ссылке. но через пару дней все равно выскакивает данная ошибка. Я так понимаю данная ошибка появляется из-за переполнении памяти плк? Можно ли сделать запись трендов на на microsd карту?

Евгений Кислов
07.02.2022, 08:43
Добрый день! Выполнил все что вы скинули по данной ссылке. но через пару дней все равно выскакивает данная ошибка. Я так понимаю данная ошибка появляется из-за переполнении памяти плк? Можно ли сделать запись трендов на на microsd карту?

Данная ошибка обычно появляется из-за повреждения файла трендов при перезагрузке по питанию.
Возможность записи трендов на MicroSD появится в следующей прошивке.
Также в ближайшем времени мы приступим к разработке собственной библиотеки трендов, что перестать зависеть от проблем встроенного компонента.

gwimplen
07.02.2022, 10:32
Добрый день.
За эти два месяца вы не устанавливали другие версии CODESYS?

Обеспечьте в понедельник удаленный доступ к ПК - попробуем разобраться в происходящем.

Добрый день.
Нет, за это время не устанавливал ничего. Единственное, пробовал переустановить таргет сегодня.

Наполовину разобрался с проблемой. Проект изначально создавался в версии SP14, но при открытии через ярлык проекта открывался SP16.
Но остался вопрос по SP16. При создании нового проекта - просит залогиниться (в SP14 все без проблем создается и открывается)

Ответил вам в личку.

Игорь Владимирович
07.02.2022, 12:46
Всем хорошего дня!
Как выполнить поиск в массиве структуры?

имеем структуру
WORD это номер
WSTRING это текстовое поле, тут нужно выполнить поиск, результатом поиска должны быть значения номеров записи записанных в массив. чтобы по номерам из массива можно было подгрузить необходимый номер записи

Евгений Кислов
07.02.2022, 12:49
Всем хорошего дня!
Как выполнить поиск в массиве структуры?

имеем структуру
WORD это номер
WSTRING это текстовое поле, тут нужно выполнить поиск, результатом поиска должны быть значения номеров записи записанных в массив. чтобы по номерам из массива можно было подгрузить необходимый номер записи

Опишите задачу на конкретном примере с конкретными значениями переменных.