PDA

Просмотр полной версии : ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)



Страницы : 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 30 31 [32] 33 34 35 36 37 38 39 40 41 42

Daiven
13.05.2020, 11:01
Здравствуйте ! Подскажите что делаю не так. Задача стоит в том что бы передать целочисленную константу с Arduino UNO на ОВЕН ПЛК160 по Modbus RTU RS485. Arduino настроена как slave, Овен как мастер, указываю в конфигурации ПЛК чтение 0 регистра, реакции вообще никакой. С Arduino получилось считать регистры через программу QModbus и подключал Arduino к панеле Weintek, тоже получилось считать регистры. Т.е. проблема не в Ардуино, а в конфигурации ПЛК.49013

Sulfur
13.05.2020, 12:43
В регистрах Last adress и Last error какие цифирки в момент попытки связи?

Daiven
13.05.2020, 13:36
Last adress 0
Last error 0

Slave на ПЛК настраиваю без проблем, с СПК отлично работает. А master вообще не реагирует.

capzap
13.05.2020, 13:42
Last adress 0
Last error 0

Slave на ПЛК настраиваю без проблем, с СПК отлично работает. А master вообще не реагирует.

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

Daiven
13.05.2020, 14:14
показали бы настройки, где успешно опрос идет, чтоб было с чем сравнивать. Иногда помогает поменять провода местами

Вот, успешно считываю 0 регистр. 49018
Провода местами менял.

melky
13.05.2020, 14:24
У вас Arduino c RS485 или таки с UART ? потому что судя по CP210x USB to UART на Arduino нет 485-го интерфейса, а у ПЛК именно 485-й
https://aliexpress.ru/item/32385757602.html?spm=a2g0s.9042311.0.0.264d33ed2Oq dNZ
Вам нужна вот такая шляпа, с автоопределением передачи, чтобы прицепиться через RS485 интерфейс

capzap
13.05.2020, 14:35
Вот, успешно считываю 0 регистр. 49018
Провода местами менял.

не в конфигураторе дело, если конечно параметры UMD не меняли, ну вдруг ТСР поставили и забыли. Если ни чего не приходит, может в сети остался еще мастер который первым запустился

Daiven
13.05.2020, 14:43
У вас Arduino c RS485 или таки с UART ? потому что судя по CP210x USB to UART на Arduino нет 485-го интерфейса, а у ПЛК именно 485-й
https://aliexpress.ru/item/32385757602.html?spm=a2g0s.9042311.0.0.264d33ed2Oq dNZ
Вам нужна вот такая шляпа, с автоопределением передачи, чтобы прицепиться через RS485 интерфейс
Пользуюсь этим преобразователем https://zakupus.com.ua/p738280185-modul-rs485-ttl.html?gclid=CjwKCAjwte71BRBCEiwAU_V9h8Se-FV5HWFgRwip8DuvhThVV1TSOMEekQq0dTc6RxF533j3sgc1_Ro C3M4QAvD_BwE и что бы связаться с компом пользуюсь этим https://owen.ru/product/owen_as4

Daiven
13.05.2020, 14:51
не в конфигураторе дело, если конечно параметры UMD не меняли, ну вдруг ТСР поставили и забыли. Если ни чего не приходит, может в сети остался еще мастер который первым запустился

49019 вроде тоже все правильно настроено.
Я думаю может это просто неисправность контроллера. Но slave отлично работает.
В сети тоже никого нету кроме одного контроллера.

melky
13.05.2020, 14:57
Преобразователь, на который вы дали ссылку не имеет автоопределения передачи, им Ардуина дрыгать должна программно.

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

capzap
13.05.2020, 15:03
49019 вроде тоже все правильно настроено.
Я думаю может это просто неисправность контроллера. Но slave отлично работает.
В сети тоже никого нету кроме одного контроллера.

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

Daiven
13.05.2020, 15:04
Преобразователь, на который вы дали ссылку не имеет автоопределения передачи, им Ардуина дрыгать должна программно.

А как я смог считать с него регистры через панель Weintek по RS485 ? Программу на ардуино писал через FLProg. Может у вас есть ссылки на сайты где описываться как реализовать программно определение передачи через этот преобразователь ?

Lordorakus
13.05.2020, 15:05
Вопрос, возможно ли в CFC добавить ещё 1 значение к CU счетчика?Мне главное, чтобы переменная выхода CV была одинаковая, чтобы поверх насчитывалось за каждое пройденное расстояние каждого листа
49033

Daiven
13.05.2020, 15:26
точно так же как устанавливали эмулятор мастера, установите на компе эмулятор слейва и подключите плк через АС4 к ПК, можно будет наблюдать приходит что либо от мастера или нет, станет ясно какие действия предпринимать, может вообще Вы не загрузили программу в плк, потому что все скрины не в режиме онлайн

ПЛК мастер считывает с ПК регистры. Но не считывает с ардуинки. СПК мастер считывает с ардуинки. Подскажите в чем может быть проблема ?

melky
13.05.2020, 16:37
Daiven я про преобразователь UART-RS485 по ссылке на украинский сайт.... я так понимаю вы его к Ардуино прилепили, чтобы получить в ней RS485 порт ?

я к тому, что бес его знает, как у вас через него вообще читается Arduino, учитывая, что этот преобразователь не имеет автоопределения передачи и вы в программе для Ардуино это никак не настраивали. Или в FLProg уже появилась поддержка этого преобразователя ?

и собственно при чем тут панель Weintek, у нее разве UART а не сразу RS485 ?

Lordorakus
13.05.2020, 16:50
Отбой, разобрался)

VaBo
14.05.2020, 16:56
Вопрос такой:
В пределах одного функционального блока разбираем бит, являющийся дискретным выходом ПЛК.
Допустима ли конструкция

bit := 0;
IF тра-ля-ля THEN bit := 1;
END_IF;

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

petera
14.05.2020, 18:03
Вопрос такой:
В пределах одного функционального блока разбираем бит, являющийся дискретным выходом ПЛК.
Допустима ли конструкция

bit := 0;
IF тра-ля-ля THEN bit := 1;
END_IF;

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

Не возникает из-за принципа работы ПЛК
Физическая запись в порт происходит только после выполнение всего кода ВСЕЙ программы.
Вы можете добавить после этого кода любое количество строк
......
bit := 0
bit := 1
.......
bit := 0
bit := 1
.........

Актуальным будет то значение, которое присвоилось последним. Оно и будет на выходе ПЛК

VaBo
14.05.2020, 20:14
Спасибо, оно-то мне и нужно!

Daiven
15.05.2020, 08:42
Здравствуйте ! Подскажите что с таргет файлами к ПЛК110-24.60.К-М. Уже удалял все и заново поставил, Target_v.2.11 и Target_v.2.12 ставил, все равно не работают. Может быть есть какие то нюансы по их установке ? Или как обычно у Овна что-то сломалось

VaBo
15.05.2020, 08:51
Согласен с вами полностью, но привычка как раз обратная, долгое время занимался программированием микропроцессоров, где такие штуки как раз не проходят.
Но во многих контроллерах прописывается, что переменные передаются на выходы по окончании цикла, поэтому пробую не городить лишних локальных.

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

Daiven
17.05.2020, 12:32
Поподпробнее

Удалял все старые таргет файлы и поставил новые.

keksman
20.05.2020, 04:19
Доброго времени суток, пкл160 овен, кдс стабильно подключался к нему, в один из дней на предприятии выгорел свитч, заменили, и перестал цепляться, пингуется стабильно большими пакетами, если его подключить напрямую к пк то подключается, а именно через свитч-нет, таргет переустанавливал, все 10 раз перепроверил, понять не могу, по идее пингуется, все должно быть ок. да и в принципе ничего не менялось в сети, есть какие-то мысли ребят?

krollcbas
20.05.2020, 04:35
Так бывает. Пинг есть, работы нет. Проверьте сетевые настройки, шлюзы, маски

keksman
20.05.2020, 07:22
Так бывает. Пинг есть, работы нет. Проверьте сетевые настройки, шлюзы, маски

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

capzap
20.05.2020, 07:39
Понимаю, что не понимаю, два часа все перепроверял, снес кдс с таргетами, заново установил, о это были уже отчаянные попытки

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

Shade876
20.05.2020, 08:56
Здравствуйте!
Помогите с реализацией проверки связи с модулями.
6 модулей связь с которыми идет по rs-485 Modbus.
В конфигурации задач это ТИП циклический.

Проблема в том что TRUE и FALSE на одних и тех-же переменных "обрыв" принимают циклические значения. Я так понимаю это связано с о скоростью опроса модулей.

49176
Это код программы
49177
Если в конфигурации задач в пункте "по событию" ставлю глобальную переменную (она может быть хоть BOOL хоть FALSE на работу это не влияет), возвращаю в "циклический" все работает как надо.

Подскажите что не так делаю или как это можно реализовать проще.
49178

Sulfur
20.05.2020, 10:15
Убирайте прямую адресацию входов\выходов.
Переменные, объявленные в шапке программы, объявляйте сразу в конфигурации ПЛК.
Они будут иметь статус глобальных.
49182

Shade876
20.05.2020, 10:43
На самом деле они объявлены Глобальными в Global Variables.
Это я здесь для примера выложил.

Sulfur
20.05.2020, 11:26
Должно быть только одно объявление. Предпочтительно в конфигурации.
А в программах просто читать эти переменные.

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

Программа RS485 будет выполняться по MVA_ERR_=TRUE. Которая нигде не назначается.
Я бы сделал по другому.
Выкинул задачи, т. е. все крутится в МайнТаске.
----

VAR ERR_RESET: bool; (*Сброс ошибок*)
--------
IF MVA_ERR<>0 THEN
CASE MVA_Adsress OF
2:
Obriv2:=true;
.
.
.
n:
ObrivN:=true;
END_CASE;
END_IF;

IF ERR_RESET THEN
Obriv2:=false;
.
.
.
n:
ObrivN:=false;
END_IF;
---

Ну как-то так. А вообще удобнее сделать булевый массив Obriv, и обращаться по номеру элемента массива. Так можно читать флаги в цикле FOR..DO. Программа получается проще и читабельнее.

TV13M
22.05.2020, 22:00
Доброго времени!
Можно ли общаться с ПЛК110 М02 по протоколу DF1?
Что то не получается связаться с Allen Bradley(((
Пытаюсь через стандартный 232.
Честно говоря я пока и не понял что такое этот DF1
Может кто подскажет где найти описание этого DF1?

melky
23.05.2020, 10:47
TV13M ну вы барин вааще офигели :). на сайте Rocwell Automation можно найти описание протокола на английском, вот только прочитать его с ПЛК110 вам придется попотеть изрядно. С одной стороны протокол описан, с другой стороны очень многообразен и со своими фишками. Например контрольная сумма может быть 1-но байтовой BCC а может быть 2-х байтовой CRC. байт 0х10 (DLE) дублируется, если попадается в блоке данных, при этом не участвует в расчете BCC или CRC и т.д... хотя в общем-то вполне логичный протокол.

1770-rm516_-en-p.pdf - ищите и обрящите данный файл.

я драйвер для Scada делал и то, реализовал только по одной функции чтения и записи из протокола. ПЛК ML1400

Shade876
26.05.2020, 16:41
Всем здравствуйте!
Прошу сильно не кидать камнями.
Опрашиваю модуль по rs-485, запрос делаю строкой и беру все регистры, в структуре "modul_1" прописываю порядок регистров в строке.
Далее в программе в массив "MVA_1" передаю строку запроса "mva_1_string".
В массив D1[1]:=MVA_2^.two_1; таким обзором можно занести нужные мне данные.
Но у меня вопрос как можно реализовать проход по массиву "MVA_1" циклом и выбрать только нужные данные например "two_1, two_2, two_n"

--------в структуре
TYPE modul_1 :
STRUCT
one_1:INT;
two_1:INT;
three_1:INT;
four_1:INT;
five_1:REAL;
(* 2 *)
one_2:INT;
two_2:INT;
three_2:INT;
four_2:INT;
five_2:REAL;
(* n *)
one_n:INT;
two_n:INT;
three_n:INT;
four_n:INT;
five_n:REAL;
END_STRUCT
END_TYPE

--------в программе
VAR
MVA_1: POINTER TO modul_1;
D1: ARRAY [1..8] OF INT ;
END_VAR
--------
MVA_1:=ADR(mva_1_string); (* mva_1_string запрос всех регистров по rs-485 с модуля *)
D1[1]:=MVA_1^.two_1;

ZETs
28.05.2020, 05:45
Всем Привет!
Объясните пожалуйста.
Произвожу опрос МВА8 4,5 регистра.
Данные из 4,5 регистра измерений передаются в формате 1,878787е+009.
В структуре ставил тип WORD и REAL не помогло.
Пробовал все преобразования но не смог получить величину температуры.

ZETs
28.05.2020, 08:05
надо было не на word менять, а в real байты местами перетасовать

Подскажите по подробней как это сделать?

ASo
28.05.2020, 08:45
Зависит от того, чем Вы опрашиваете. Укажите ПО.

capzap
28.05.2020, 08:49
Подскажите по подробней как это сделать?

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

ZETs
28.05.2020, 08:50
Зависит от того, чем Вы опрашиваете. Укажите ПО.

Опрашиваю контроллером плк110 модуль мва8 по протоколу модбас рту.
4,5 регистр в инструкции указан тип FLOAT32.

melky
28.05.2020, 09:21
переставить слова местами, проверить адреса регистров.

ZETs
29.05.2020, 04:12
Спасибо всем большое.
Еще вопросик.
Каждому элементу массива соответствует своё n№.
Подскажите как сделать например чтоб при DAT[2] выводилось TRUE в n2, при DAT[3] выводилось TRUE в n3.
Можно ли в кодесис вывести нужную переменную?
Выбором CASE это я знаю что возможно, может есть вариант по проще. )))

VAR
DAT: ARRAY [1..8] OF INT;
n1,n2,n3,n4: BOOL;
i:INT;
----------------
FOR i := 1 TO 4 DO
IF DAT[i] <>0 THEN
n(???):=TRUE; (поставить номер переменной )
END_IF;

Sulfur
29.05.2020, 07:16
n1,n2,n3,n4,: BOOOL;
Есть какие-то трудности сделать булевый массив?

FOR i := 1 TO 4 DO
IF DAT[it] <>0 THEN
Это так задумано?

ZETs
29.05.2020, 07:41
Извините опечатка.
Вопрос то в том можно переменные n1, n2, n3, n4 выводить в зависимости от значения счетчика i ? Чтоб после перебора массива присвоить значение нужной переменной, если они например другого типа.
В php например такое возможно. вот мне интересно а в codesys так можно?

Sulfur
29.05.2020, 12:17
Про булевый массив я имел ввиду следующее:

DAT: ARRAY [1..8] OF INT;
N: ARRAY [1..4] OF BOOL;
i:INT;
----------------
FOR i := 1 TO 4 DO
IF DAT[i] <>0 THEN
N[i]:=TRUE;
ELSE N[i]:=false; (*Обнуление делать либо здесь, либо в другом месте программы, но делать обязательно. Иначе N будет в TRUE всегда после первого срабатывания условия до перезагрузки ПЛК*)
END_IF;

Sulfur
29.05.2020, 14:38
Мож человеку и нужен триггер ?

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

Shade876
30.05.2020, 17:20
Здравствуйте!
Проблема как у ZETs я опрашиваю модуль и заношу все данные в строку. Из строки данные выбираю структурой. Один тип данных REAL показывает погоду (ерунду).
Пробовал описанными способами выше и на форуме ранее найденными способами.
https://owen.ru/forum/archive/index.php/t-17912.html
https://owen.ru/forum/showthread.php?t=17394&p=138028#post138028
При этом температура целых чисел показывает нормально.
Если опрашивать модуль "Real input module" то показания тоже нормальные.

Короче я врезал дубаря. Прошу помощи. Если не сложно разъясните, может я что то не так делаю.

petera
30.05.2020, 18:06
Здравствуйте!
Проблема как у ZETs я опрашиваю модуль и заношу все данные в строку. Из строки данные выбираю структурой. Один тип данных REAL показывает погоду (ерунду).
Пробовал описанными способами выше и на форуме ранее найденными способами.
https://owen.ru/forum/archive/index.php/t-17912.html
https://owen.ru/forum/showthread.php?t=17394&p=138028#post138028
При этом температура целых чисел показывает нормально.
Если опрашивать модуль "Real input module" то показания тоже нормальные.

Короче я врезал дубаря. Прошу помощи. Если не сложно разъясните, может я что то не так делаю.

Тута (String input/output) есть проблема
49379

Дело в том, что при использовании String input модулей для группового чтения регистров есть магическая цифра 80!
К сожалению, тема форума, где подробно обсуждалось использование String для группового чтения регистров, по непонятной причине была "прибита" модераторами.
Так вот, оказывается, если в конфигурации всего ОДИН модуль String input, то количество байт в нем можно использовать до 249.
Но если в конфигурации есть еще модули String input, как у Вас, то в действие вступает правило - не более 80 байт(40 регистров) в не последнем String
На практике оказалось, что не зависимо от того, сколько указано в Amounth byte первого стринг с физическим адресом %QB6.1.0, физический адрес начала следующего стринга %QB6.2.0 отстоит от начала первого РОВНО на 80 байт.
В следствие этого последние, в вашем случае 14 байт, первого стринга перекрываются первыми 14 байтами второго стринга
Т.е. первые 14 байт второго стринга ПОСТОЯННО перезаписывают последние 14 байт первого стринга! А там для восьмого канала тип данных REAL показывает погоду

Ну и "хвост" второго стринга с адресом %QB6.2.0 переписывается последующим стрингом с адресом %QB6.3.0
и т.д.

petera
30.05.2020, 18:44
to Shade876
Вопрос - почему у Вас в стрингах 94 байт?
Если
TYPE STRUCT_MVA :
STRUCT
pol_tocka :INT; (* регистр 0 *)
ZAMERs :WORD; (* регистр 1 *)
ERR :INT; (* регистр 2 *)
chicl :INT; (* регистр 3 *)
ZAMER :REAL; (* регистр 4-5 *)
END_STRUCT
END_TYPE
т.е. один канал 6 регистров или 12 байт
значит 8 каналов = 12*8= 96 байт
А у Вас - 94?

Валенок
30.05.2020, 22:29
.. есть магическая цифра 80.. если ... всего ОДИН модуль String input, то .. до 249 .... вступает правило - не более 80 байт(40 регистров) в не последнем String....
Магия ? Правило ? ))) Вы ж человек с опытом. Назовите вещи своими именами - классический деццкий про..б от Овена. Причем регулярный. Просто позорище.

Техподдержка ? Ау ! Это днище лехко воспроизводится именно как про..б.. И его классификация - классический деццкий.

Shade876
31.05.2020, 01:43
Всем спасибо.
Про string input я чесно сказать не знал.
Сделаю отдельными запросами.
А то пришлось 10 раз код писать / удалять. ((((

petera
31.05.2020, 23:10
Магия ? Правило ? ))) Вы ж человек с опытом. Назовите вещи своими именами - классический деццкий про..б от Овена. Причем регулярный. Просто позорище.

Техподдержка ? Ау ! Это днище лехко воспроизводится именно как про..б.. И его классификация - классический деццкий.
Проблема 80 для String обсуждалась где-то в 15 году.
Вот ссылки на прибитые темы, где подробно обсуждался эти вопросы https://owen.ru/forum/showthread.php?t=10555&p=278924&viewfull=1#post278924
Вот что осталось по использованию String
https://owen.ru/forum/showthread.php?t=22372&p=185176&viewfull=1#post185176
https://owen.ru/forum/showthread.php?t=22915&p=244022&viewfull=1#post244022
https://owen.ru/forum/showthread.php?t=22915&p=333593&viewfull=1#post333593

Валенок
01.06.2020, 01:26
Проблема 80 для String обсуждалась
Я перестал юзать конфигурацию ранее 15-ого года.
Вот Вы вкратце описали - я взял два проводочка и проверил. 5-10минут и готово. Это - не проблема. Это грубый про..б от Овена. Абсолютно деццкий т.к. происходит тупое наложение на чужую область. И никаких обрезаний. И нет разницы - стринг первый, в середине, последний... Все одинаковые.

capzap
01.06.2020, 06:37
Я перестал юзать конфигурацию ранее 15-ого года.
Вот Вы вкратце описали - я взял два проводочка и проверил. 5-10минут и готово. Это - не проблема. Это грубый про..б от Овена. Абсолютно деццкий т.к. происходит тупое наложение на чужую область. И никаких обрезаний. И нет разницы - стринг первый, в середине, последний... Все одинаковые.

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

Юрко
02.06.2020, 07:24
Добрый день! Столкнулся с проблемой в codesys. Главная программа ld. Переменная объявлена как глобальная, привязана к реле. В режиме эмуляции сразу переходит в True, хотя цепь разомкнута. Удалил реле, переменная больше нигде не используется, но в эмуляции все ровно переходит в true, и никак не сбросить. Незначительно изменил название, то же самое. Полностью поменял, все норм. Что делать? Забить и поменять, или это как то отразится на самой программе?

capzap
02.06.2020, 07:52
Не понял причем тут стринг и протокол ? Тут стремная работа с памятью. Для выхода за рамки есть явные способы, а конфигурация вещь статичная и обязана не дать ввести левые значения. Так что это не костыль а про..б. Вы знаете что лежит за областью конфигурации ? Что там будет в следующей прошивке ? Попробуйте объявить at% за этой областью или указателю скормить адрес вне области объявленных данных. И что ? Всё ожидаемо. А тут нечто простое обозвано работами по внесению удобрений. Причем если не уследить - переливается на соседский газон.
не в этом костыль, стринг изначально применялся для чтения наименования прибора еще по протоколу овен, раз есть модбас и для него это сделали, вряд ли кто то проверял работу с 80 символами, таких имен не существует. А использовать стринг как групповой запрос, вот кто за это агитировал, можно было предлагать работать с библиотекой, это было бы наиболее правильно

melky
02.06.2020, 08:31
как вариант стринг при опросе по протоколам ASCII, тот же МЭК61107, там ответ может и превысить 80 байт, если мы читаем группу параметров.

karabass
02.06.2020, 14:07
Добрый день!
Есть вопрос по библиотеке oscat_basic_333.lib
Беру оттуда генератор импульсов CLK_N, задаю N=5. Если верить описанию, Он должен выдавать импульсы каждые 32мс (2^N). А выдает примерно каждые 200мс. Я понимаю, что accuracy depends on system clock и все такое, но... далее беру измеритель параметров сигнала M_TX, измеряю частоту - на выходе около 0,8Гц... Измеряю трассировкой в режиме эмуляции.
Собственно вопрос - это лыжи не едут, или со мной что-то не так?
П.С. Я не программист, поэтому не кидайтесь тапками за попытки строить программу из "готовых кубиков". Есть проект, который должен быть простым и дешевым, т.е. на ОВЕН и без привлечения труда профильного программиста...

capzap
02.06.2020, 14:30
Добрый день!
Есть вопрос по библиотеке oscat_basic_333.lib
Беру оттуда генератор импульсов CLK_N, задаю N=5. Если верить описанию, Он должен выдавать импульсы каждые 32мс (2^N). А выдает примерно каждые 200мс. Я понимаю, что accuracy depends on system clock и все такое, но... далее беру измеритель параметров сигнала M_TX, измеряю частоту - на выходе около 0,8Гц... Измеряю трассировкой в режиме эмуляции.
Собственно вопрос - это лыжи не едут, или со мной что-то не так?
П.С. Я не программист, поэтому не кидайтесь тапками за попытки строить программу из "готовых кубиков". Есть проект, который должен быть простым и дешевым, т.е. на ОВЕН и без привлечения труда профильного программиста...
согласны что за 321 миллисекунду будет 10 импульсов?
а в бибке сказано в описании, что clk_N генерирует импульсы в зависимости от точности системных часов

Эмуляция и цикл в плк отличаются значительно

karabass
02.06.2020, 17:03
согласны что за 321 миллисекунду будет 10 импульсов?
а в бибке сказано в описании, что clk_N генерирует импульсы в зависимости от точности системных часов

Эмуляция и цикл в плк отличаются значительно

Я правильно перевел это на русский язык: "в компе/кодсисе системные часы кривые, поэтому тестить в режиме эмуляции бесполезно"? Библиотеки рабочие?

capzap
02.06.2020, 18:04
Я правильно перевел это на русский язык: "в компе/кодсисе системные часы кривые, поэтому тестить в режиме эмуляции бесполезно"? Библиотеки рабочие?

я это вообще не могу перевести, почему кривое, какие библиотеки

если хочется получать импульс, раз во сколько то миллисекунд то можно и такой конструкцией воспользоваться


IF tik.Q THEN
// тело условия
END_IF;
tik(IN:= NOT tik.Q, PT:=T#32ms);

где tik это таймер TON

karabass
02.06.2020, 19:11
я это вообще не могу перевести, почему кривое, какие библиотеки

если хочется получать импульс, раз во сколько то миллисекунд то можно и такой конструкцией воспользоваться


IF tik.Q THEN
// тело условия
END_IF;
tik(IN:= NOT tik.Q, PT:=T#32ms);

где tik это таймер TON

Да понял я, что Вы код с закрытыми глазами строчите. Уважаю, правда.
А я электрик. И поэтому я спросил: работоспособны ли готовые модули из библиотеки oscat, или еще какой-нибудь?
Мне по-простому надо, по рабоче-крестьянски. Зачем сочинять и отлаживать корявый код(я электрик, помним?), если есть готовый модуль? По эмуляции тоже не понял: я в настройках выбрал целевую платформу, но при этом цикл в эмуляции и цикл ПЛК "сильно различается"? Зачем тогда вообще эмуляция нужна? Все на ПЛК отлаживать?

capzap
02.06.2020, 19:53
А я электрик. И поэтому я спросил: работоспособны ли готовые модули из библиотеки oscat, или еще какой-нибудь?


я жеж вроде показал, что через FOR, как бы эмулируя цикл плк в 1 мс, всё работает. И так же можно проверить цикл, например 5мс, через FOR i:=0 TO 320 BY 5 DO
Кроме того сменив целевую платформу на winplcnt можно получить большое но более менее стабильное время цикла, я имитирую нажимая галку в меню, там все не стабильно

karabass
02.06.2020, 20:34
я жеж вроде показал, что через FOR, как бы эмулируя цикл плк в 1 мс, всё работает. И так же можно проверить цикл, например 5мс, через FOR i:=0 TO 320 BY 5 DO
Кроме того сменив целевую платформу на winplcnt можно получить большое но более менее стабильное время цикла, я имитирую нажимая галку в меню, там все не стабильно
Генератор нужен исключительно для теста, пусть работает как угодно, лишь бы стабильно.
Блок измерения частоты импульсов мне тоже свой городить через FOR и сотню строк кода? Ну не умею я в код, как это еще объяснить?! Я пытаюсь в CFC собрать схему из готовых функциональных блоков, с минимальными супер-примитивными вкраплениями кода, типа этого:
49419
Потому и вопросы - почему генератор CLK_N неправильно генерирует, а частотомер M_TX неправильно измеряет в режиме эмуляции? Блоки из библиотеки негодные, или я не умею их готовить? Можно ли вообще этим функционалом пользоваться, или неизбежно {изобретать велосипед с квадратными колесами} городить свои блоки?

capzap
02.06.2020, 20:54
Вы хоть поняли что на скрине я вставил исходник используемого вами ПОУ CLK_N, библиотека та расшифровывается как Open Source Community for Automation Technology, это протестированная работоспособная библиотека для любых видов контроллеров. Всё генерирует правильно, хоть на ST, хоть на CFC

Ну не умею я в код, как это еще объяснить?!так нахера здесь вопрошать работает или не работает, задачу объясните что необъодимо, тут вариантов предоставят испугаетесь выбирать

karabass
02.06.2020, 21:15
библиотека та расшифровывается как Open Source Community for Automation Technology, это протестированная работоспособная библиотека для любых видов контроллеров.
Вот так бы сразу.

Вы хоть поняли что на скрине я вставил исходник используемого вами ПОУ CLK_N
Нет, не понял! Я не "вскрывал" готовые блоки, потому что не знаю как.
Получается, что трассировка в эмуляции показывает ерунду, потому что эмуляция некорректно работает с системными часами? Надо отлаживать на контроллере, там блоки из библиотеки работать будут как надо?
Извините, что задаю глупые вопросы, но повторюсь - я не прогер! То, что вы считаете очевидным, для меня дремучий лес.

задачу объясните что необъодимо, тут вариантов предоставят испугаетесь выбирать
Я не прошу написать программу за меня, не надо. Просто спрашиваю от том, чего не понимаю.

capzap
03.06.2020, 07:52
Это классика )) Из протокола :
....
-А че не посмотрела направо-налево когда выезжала со двора ?
-Да тута никто не ездит никогда
....
не так, я вчера ночью ездила, никого небыло

в доках написано для переменных типа String, диапазон значений от 1 до 80, значение по умолчанию – 80 (см. п. 3.2.2.3) значит конкретно такой элемент проверялся, но когда это делалось возможно еще не знали что существуют тесты (https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D 0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D1%82%D0%B5%D1 %81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B 8%D0%B5). Продукт не вчера вышел, раз это заметили через десяток лет, не такой он и существенный

ZETs
03.06.2020, 07:54
Здравствуйте!
Произвожу опрос 3 модулей МВА8, с одного модуля 8 показаний датчиков в формате WORD на наличие ошибок. Все измеренные показания заношу в переменные с присвоением адреса АТ входа.
Каждый запрос проверяю отдельным условием:

IF M1D1_ERR <> 0 THEN
M1D1_MEAS:=TRUE; (* Сигнализация для определённого датчика *)
END_IF;

Есть возможность сделать всё по проще и удобней?
Если есть возможность скиньте пример.
Заранее всем спасибо.

Sulfur
03.06.2020, 09:45
ZETs
У меня получилось вот так:
49429
В архиве экспортный файл ФБ, который можете импортировать в свой проект.

---
Я там немного неправильно объявил в этот ФБ в ПЛЦ_ПРГ. Обычно такие плюшки я делаю в виде POU (Программа)

karabass
03.06.2020, 11:28
Близко к пониманию. Но не кривые. Кодесис обращается к ОС, винда тикает около 64Гц. ОС в плк (не перегруженный) - 1кГц.

Благодарю, теперь понятно.

Валенок
04.06.2020, 02:19
.. не такой он и существенный
Так когда знаешь - вообще беспроблемный. Проблема в том что кто не знает - у того и проблемы ))
Например можно внезапно увидеть данные с не подключенного прибора. А т.к. они могут быть при этом быть похожими на правду успокоится и строить на этом контроль техпроцесса. Если повезет - не очень дорогого. В итоге.

ZETs
04.06.2020, 08:56
Добрый день.
Считываю температуру с датчика ПЛК Мастером по Модбас РТУ в переменную с адресом АТ, надо это же значение передать на панель.
Подскажите можно ли без назначения новой переменной передать данные?
Или вариант по проще есть ))

Sulfur
04.06.2020, 12:42
Что может быть проще чем одна строка кода в любом месте ПЛЦ_ПРГ?
Var_to_HMI:=Var_from_Modbus;
где обе переменные прописаны (объявлены) в конфигурации ПЛК в соответствующих регистрах\портах.

capzap
04.06.2020, 12:47
Что может быть проще чем одна строка кода в любом месте ПЛЦ_ПРГ?

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

ZETs
05.06.2020, 01:40
Спасибо, я так и сделал.
Думал может есть вариант обойтись одной переменной.

Илья2282
05.06.2020, 13:04
Здравствуйте, кто нибудь знает какой протокол по умолчанию у ТРМ-32 и ТРМ-202?Modbus ASCII,Modbus RTU или может быть OWEN?

Shade876
08.06.2020, 12:57
Здравствуйте!
Вопрос конечно глупый но уточнить надо.
Перевожу старый код программы к одному языку ST так как он написан на разных языках. Так вот в старом коде увидел следующее:
В контроллер (slave) с панели (master) передаются уставки и сохраняются в RETAIN.

R1:word; (* переменная уставки в контроллере*)
new1:word; (* переменная уставки с панели*)
-/-/-/-/-/-/-
IF R1 <> new1 then
R1:=new1;
END_IF;

Из данного примера видно что 2 уставки сравниваются, и если не равны то присваиваем новое значение.
Можно же напрямую передать значение с панели сразу в переменную RETAIN. Примерно так:

R1 AT %QW7.1.0:word; (* переменная уставки в контроллере*)

Может я чего-то не до понял? )))
Заранее благодарен.

petera
08.06.2020, 13:59
Здравствуйте!
Вопрос конечно глупый но уточнить надо.
Перевожу старый код программы к одному языку ST так как он написан на разных языках. Так вот в старом коде увидел следующее:
В контроллер (slave) с панели (master) передаются уставки и сохраняются в RETAIN.

R1:word; (* переменная уставки в контроллере*)
new1:word; (* переменная уставки с панели*)
-/-/-/-/-/-/-
IF R1 <> new1 then
R1:=new1;
END_IF;

Из данного примера видно что 2 уставки сравниваются, и если не равны то присваиваем новое значение.
Можно же напрямую передать значение с панели сразу в переменную RETAIN. Примерно так:

R1 AT %QW7.1.0:word; (* переменная уставки в контроллере*)

Может я чего-то не до понял? )))
Заранее благодарен.

Абсолютно ВСЕ переменные в слейве являются RETAIN!
По этому совершенно правильно
R1 AT %QW7.1.0:word; (* переменная уставки в контроллере*)

Причем, переменную R1 больше нигде не нужно объявлять, она уже через объявление в конфигурации будет глобальной.

kondor3000
08.06.2020, 19:23
Всем привет! У меня из панели, читается реальное время тремя WORD ( час, мин, сек) в системе HEX (шестнадцатиричная), а в PLC - время работы считается тремя WORD ( час, мин, сек), в DEC (десятичной системе).
Мне надо сравнивать время из панели со временем из PLC, секунды с секундами, минуты с минутами и т. д.

49528

Как просто, желательно в 1-2 строки на языке ST перевести отдельно секунды, минуты и часы из системы HEX в систему DEC ?

melky
08.06.2020, 20:01
kondor3000, а можно глупый вопрос ? откуда у вас вообще секунды и минуты больше 60 ? какое-то новое измерение времени ?

kondor3000
08.06.2020, 20:13
kondor3000, а можно глупый вопрос ? откуда у вас вообще секунды и минуты больше 60 ? какое-то новое измерение времени ?

Это реальное время из панели СП310-Р, из 33, 34 и 35 системных регистров, в панели отражается в HEX, 12 час, 56 мин, 59 сек, а в PLC в системе DEC
выходит 18 час, 86 мин , 89 сек.
Мне надо это сделать в программе и быстро 1-2 строками.

Поэтому и спрашиваю: Как просто, желательно в 1-2 строки на языке ST перевести отдельно секунды, минуты и часы из системы HEX в систему DEC ?

kondor3000
08.06.2020, 20:39
foo := 16#59;
bar := STRING_TO_WORD(CONCAT(WORD_TO_STRING(SHR(foo, 4)), WORD_TO_STRING(foo AND 16#F)));

Спасибо за ответ, но мне не очень понятно foo := 16#59; это число 59 в 16-ричном формате?

bar := STRING_TO_WORD(CONCAT(WORD_TO_STRING(SHR(foo, 4)), WORD_TO_STRING(foo AND 16#F))); а тут не понятно что за F

kondor3000
09.06.2020, 09:02
foo := 16#59;
bar := STRING_TO_WORD(CONCAT(WORD_TO_STRING(SHR(foo, 4)), WORD_TO_STRING(foo AND 16#F)));

Спасибо, всё работает))) 49535

petera
09.06.2020, 13:44
Всем привет! У меня с панели читается реальное время тремя WORD ( час, мин, сек) в системе HEX (шестнадцатиричная), а в PLC времени работы считается тремя WORD ( час, мин, сек), в DEC (десятичной системе).
Мне надо сравнивать время из панели со временем из PLC, секунды с секундами, минуты с минутами и т. д.

49528

Как просто, желательно в 1-2 строки на языке ST перевести отдельно секунды, минуты и часы из системы HEX в систему DEC ?

Вообще-то HEX тут не причем, в панели время представлено в BCD формате, т.е в двоично-десятичном формате https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D0%BE-%D0%B4%D0%B5%D1%81%D1%8F%D1%82%D0%B8%D1%87%D0%BD%D 1%8B%D0%B9_%D0%BA%D0%BE%D0%B4

Байт, представленный в формате BCD, содержит числа от 0 до 99. Каждый десятичный знак занимает 4 бита. Биты 4-7 содержат первую цифру - число десятков, биты 0-3 содержат вторую цифру - число единиц. Формат BCD подобен шестнадцатеричному представлению с ограничением диапазона чисел 0..99 вместо 0.. FF.

Например: Преобразуем число 51 в BCD формат. 5 - это двоичное 0101, 1 - это 0001. В результате получается байт 0101_0001.

Для дисплея в панели используется формат HEX потому, что цифры от 0 до 9 для каждой тетрады BCD совпадают с HEX

petera
09.06.2020, 14:01
В одну строчку перевести отдельно секунды, минуты и часы из системы "HEX" (BCD) в систему DEC
Используем ф-цию BCD_TO_INT из библиотеки Util


PROGRAM PLC_PRG
VAR
hasHEX: INT:=18;
minHEX: INT:= 86;
sekHEX:INT:=89;

hasDEC: INT;
minDEC: INT;
sekDEC: INT;
END_VAR

hasDEC:= BCD_TO_INT(INT_TO_BYTE(hasHEX));
minDEC:= BCD_TO_INT(INT_TO_BYTE(minHEX));
sekDEC:= BCD_TO_INT(INT_TO_BYTE(sekHEX));



49545

capzap
09.06.2020, 14:10
В одну строчку перевести отдельно секунды, минуты и часы из системы "HEX" (BCD) в систему DEC
Используем ф-цию BCD_TO_INT из библиотеки Util


PROGRAM PLC_PRG
VAR
hasHEX: INT:=18;
minHEX: INT:= 86;
sekHEX:INT:=89;

hasDEC: INT;
minDEC: INT;
sekDEC: INT;
END_VAR

hasDEC:= BCD_TO_INT(INT_TO_BYTE(hasHEX));
minDEC:= BCD_TO_INT(INT_TO_BYTE(minHEX));
sekDEC:= BCD_TO_INT(INT_TO_BYTE(sekHEX));



49545
В Util сам исходный код довольно громоздкий, лучше оскатовский вариант BCDC_TO_INT := (in AND 16#0F) + (SHR(in,4) * 10); без моих преобразований в стринг

ОлегВ
09.06.2020, 16:51
Доброго дня. Пытаюсь настроить обмен данными между ПК-клиентом и ПЛК-сервером через модем ПМ01. В инструкциях и примерах в модуль "Modem" модуля "Modbus(slave)" добавляется PPP_Driver. А для ПЛК 110-30-P-M такой опции нет. Пробовал другую платформу (например, ПЛК 100) - там есть.

ZETs
10.06.2020, 08:12
Здравствуйте!
Разрешите уточнить момент. Необходимо сравнить значения которые могут быть тип WORD, IN, REAL.

Пример: сравниваем данные типа WORD? как правильно сделать первым или вторым способом.

VAR
in1:WORD;
in2:WORD:=0;
---------------
(* 1 *)
IF in1 = in2 THEN
(* 2 *)
IF (in1 = 0) THEN

Просто меня волнует как правильно! Склоняюсь что 2 вариант правильный, хотя компилятор кушает оба варианта.

capzap
10.06.2020, 08:24
Просто меня волнует как правильно! Склоняюсь что 2 вариант правильный, хотя компилятор кушает оба варианта.

Круглые (операторные) скобки (https://ru.wikipedia.org/wiki/%D0%A1%D0%BA%D0%BE%D0%B1%D0%BA%D0%B8) нужны для обозначения приоритета во множестве. У Вас всего одно сравнение, поэтому оно и так имеет наивысший приоритет, в связи с этим оба варианта правильно, а второй избыточен

Пантелеев Дмитрий
10.06.2020, 10:59
Доброго дня. Пытаюсь настроить обмен данными между ПК-клиентом и ПЛК-сервером через модем ПМ01. В инструкциях и примерах в модуль "Modem" модуля "Modbus(slave)" добавляется PPP_Driver. А для ПЛК 110-30-P-M такой опции нет. Пробовал другую платформу (например, ПЛК 100) - там есть.
https://owen.ru/product/pm01/example посмотрите примеры. Для ПЛК110 М02 выход в интернет осуществляется по-другому.

Shade876
10.06.2020, 17:57
Добрый вечер.
Для компилятора не критично сравнивать различные числовые типы данных, например число в WORD и INT.
Он их вроде сравнивает, но не является ли это косячком?

capzap
10.06.2020, 18:17
Добрый вечер.
Для компилятора не критично сравнивать различные числовые типы данных, например число в WORD и INT.
Он их вроде сравнивает, но не является ли это косячком?

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

Shade876
11.06.2020, 11:18
Здравствуйте.
Панель Master, ПЛК Slave связь по модбас рту скорость 115200.
На ПЛК написан счетчик наработки часов привода. На панель выводится (часы, минуты, секунды).
Заметил что панель стала подтупливать. Секунды проскакивают через 3-6, раньше не замечал. Часы на панели идут нормально.
Обшее количество регистров 190.
Может ли это быть связано с передсчей секунд в панель? (Планирую убрать секунды, главное чтоб затуп не остался )) )
Конфигуратор для панели использую V2.D3d-3.

petera
11.06.2020, 12:02
Здравствуйте.
Панель Master, ПЛК Slave связь по модбас рту скорость 115200.
На ПЛК написан счетчик наработки часов привода. На панель выводится (часы, минуты, секунды).
Заметил что панель стала подтупливать. Секунды проскакивают через 3-6, раньше не замечал. Часы на панели идут нормально.
Обшее количество регистров 190.
Может ли это быть связано с передсчей секунд в панель? (Планирую убрать секунды, главное чтоб затуп не остался )) )
Конфигуратор для панели использую V2.D3d-3.

Дело было не в бобине..

ЗЫ
На экране панели или в другом месте, например в настройках, есть элементы с несуществующим номером регистра ПЛК или неправильным адресом ПЛК

Sulfur
11.06.2020, 12:32
есть элементы с несуществующим номером регистра
Или как вариант - кабель от ПЧ к двигателю дает наводки на линию связи. Мало кто применяет экранированные силовые кабеля.

ZETs
15.06.2020, 05:33
Спасибо !!!
Точно не в бобине )))
Данных много вводил и в 2 местах вместо адреса устройства ввёл адрес регистра.

ZETs
17.06.2020, 01:52
Здравствуйте!
Прошу уточнить.
К примеру есть условие:

in1: BOOL;
in2: BOOL;
out: BOOL;
----------
IF in1 AND in2 THEN
out:=TRUE;
ELSE
out:=FALSE;
END_IF;

Его можно записать в упрощенном виде:

out:=in1 AND in2;

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

Sulfur
17.06.2020, 07:59
Ну а почему бы и нет? Переменной out присваивается значение логической операции AND. Все по фен-шую.
Вот аналог вашего вопроса на LD:
49671

ZETs
17.06.2020, 08:21
Сегодня у меня произошло непредвиденное обстоятельство.

Вчера взяв домой код программы и запустив на домашнем ПК CS выдал что библиотеки изменены, я не придав этому сообщению внимания, проверил код, добавил комментарии к коду и всё.

На рабочем ПК запустил код и залил его в ПЛК (тоже было сообщение о изменившихся библиотеках), а вот в онлайн режиме происходило самое интересное. Если сказать что я был удивлен то это не сказать не чего. Связь по модбас отвалилась напрач, операторы if сработали как им вздумается. Я закрыл файл с флешки и запустил дубликат проги на компе, но он тоже не хотел работать.

Короче я отключился удалил все библиотеки и подключился по новой но проблему это не решило.

Создал новый проект, добавил все нужные настройки, копипастом сделал файлы программ, залил в ПЛК и все прекрасно работает.

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

Shade876
23.06.2020, 16:10
Здравствуйте!
Вопрос конечно банальный.
Как в массив добавить значения переменных одной строкой? Просто переменных может быть гораздо больше, рассмотрю и другие полезные варианты )))

Если так то выдает ошибку "неверное начальное значение"
VAR_GLOBAL
z1:WORD;
z2:WORD;
END_VAR

VAR
ar_1: ARRAY[1..2] OF WORD:=z1,z2;
END_VAR

Можно конечно в программе для каждого индекса передать значение.
ar_1[1]:=z1;
ar_1[2]:=z2;

Заранее всем огромное спасибо!

Александр Срывкин
23.06.2020, 16:23
VAR
ar_1: ARRAY[1..2] OF WORD:=z1,z2;
END_VAR



ar_1: ARRAY[1..2] OF WORD := [z1,z2]; вот так должно быть

melky
23.06.2020, 16:24
А в ST нет типа такого Array[1..2] := {z1, z2} ? просто не знаю, как в ST это вообще должно выглядеть ?

Shade876
23.06.2020, 16:31
ar_1: ARRAY[1..2] OF WORD := [z1,z2]; вот так должно быть

Всё равно выдаёт ту же ошибку (3760).

Александр Срывкин
23.06.2020, 16:45
мой косяк, давно с кодесисом не работал. Просто обявите начальное значение без лишних перемнных
типа того ar_1: ARRAY[1..2] OF WORD := 1,2; без скобок

Shade876
23.06.2020, 16:49
мой косяк, давно с кодесисом не работал. Просто обявите начальное значение без лишних перемнных
типа того ar_1: ARRAY[1..2] OF WORD := 1,2; без скобок

А значения переменных можно потом только в программе назначить, это я знаю. ))
ar_1[1]:=z1;
ar_1[2]:=z2;

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

kondor3000
24.06.2020, 17:20
Мне интересно как проще значения переменных передать в массив. Если у меня 10 переменных значения которых нужно передать в массив, не уж то придется 10 отдельных строк писать и нет способа проще... )))

Можно сколько влезет одной строкой)))
ar_1[1]:=z1; ar_1[2]:=z2; ar_1[3]:=z3;..... ar_1[10]:=z10;

Александр Срывкин
25.06.2020, 08:10
Мне интересно как проще значения переменных передать в массив. Если у меня 10 переменных значения которых нужно передать в массив, не уж то придется 10 отдельных строк писать и нет способа проще... )))

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

ZETs
29.06.2020, 05:54
Заводской сброс и проект/очистить всё - были ?
Прям бсдм какое-то

Здравствуйте!
Сегодня сделал но не помогло, передача с панелью отсутствует ... то программа не исполняется.
Перезалил опять, та же ерунда. Например таймер в программе идет а на панели не отображается.

Делаю так, подключение заводской сброс. отключаюсь, проект очистить всё.
По новой подключаюсь, всё заливаю и какие-то новые глюки.
В чем причина не пойму.
Заранее всем спасибо.

capzap
29.06.2020, 08:36
В чем причина не пойму.

обычно такое было когда меняют прошивку, но после этого не переустанавливают таргеты

ZETs
29.06.2020, 08:59
Всем всё равно спасибо!
Сообщение удалять не стал вдруг кому нибудь пригодится!!!

Решил проблему так:

На флешке дополнительно храню рабочий проект.
Решил открыть проект так сказать вчерашнего дня, скопировал его на рабочий стол, запустил но проблема осталась.
Решил удалить папку с проектом от сегодняшнего дня, но не смог так как она использовалась процессом (не сфоткал каким).
Открыл папку прогой Unlocker и разблокировал её, закрыв все использовавшие её процессы.
Далее все нормально загрузилось, залилось и работает.... К слову перезагрузка не помогала...

ZETs
30.06.2020, 10:42
Здравствуйте!
Я всё по той же проблеме. Проблема повторилась.
Подобная проблема была из-за разных библиотек на ПК как я думал (может и ни в этом причина была)...

ПЛК 110.60 опрашивает модули мва. ПЛК мастер. ПЛК не передаёт их в регистры соответственно их не видит панель. ПЛК slave панель сп310 мастер.

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

Урезал всю программу назовём её новой сделал что при подаче сигнала на DI 1 включаются 10 DO и таймер наработки. Всё вроде бы работает. В старой программе от DI 1 включался только таймер.
Подключаюсь делаю заводской сброс, заливаю старую программу подаю сигнал на DI 1 включаются 10 DO (почему???) и таймер наработки, панель не видит таймер.
Подключаюсь делаю заводской сброс, заливаю новую программу подаю сигнал на DI 1 включаются 10 DO и таймер наработки, панель видит таймер.

Подключаюсь делаю заводской сброс, заливаю старю программу подаю сигнал на DI 1 включаются таймер наработки дискреты не включились. Признаки что ПЛК в стопе, но при подаче на вход DI таймер запускается панель его отображает, дискреты не сработали, паказания с датчиков считывает REAL должен перевести в INT и передать на панель но ПЛК их не обрабатывает.

Что может быть? За любую подсказку благодарен ))))
Подскажите пожалуйста где что глянуть. Это по любому я нубасина что-то накосарезил.

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

ZETs
02.07.2020, 05:48
Не увидел Пушкина, который должен делать это

В урезанной программе это 4-6 регистр.

ZETs
02.07.2020, 05:59
Вот код основной программы, панели и карты регистров.

Федор Назаров
02.07.2020, 12:57
В урезанной программе, в конфигурации ПЛК, нет присвоения переменных в нужные регистры, соответственно в в регистры 4-6 ничего не пишется.
50013

Shade876
02.07.2020, 16:23
Здравствуйте!
Они у него в global определеены с адресацией на регистры.

Евгений Леонтьев
02.07.2020, 19:01
Добрый день! У меня у одного лоджик зависает https://skr.sh/s2xE1HHrECd?a Добавляю элементы, начинаю их соединять и частенько зависает. Иногда помогает Ctrl Z но редко.

ZETs
03.07.2020, 03:36
Карта регистров.

Shade876
03.07.2020, 04:42
Здравствуйте!
Посмотрел обсуждение по работе со структурами, но не совсем разобрался.

https://owen.ru/forum/archive/index.php/t-10252.html

Получается я считаю все 8 измерений в режиме Master с модуля в структуру которая является массивом, с начального адреса (%QD6.1.8) 8 показаний, каждое длинной DWORD так как тип REAL.
Это очень удобно.
Как обратиться к такому массиву в цикле?
Izmerenie.[i]^
Подскажите как передать эти 8 показаний в регистры Slave, например с такого-то адреса? Панель их будет читать.


STRUCT
Izmerenie_1:ARRAY [1..8] OF REAL; (*создаём структуру*)
END_STRUCT
VAR_GLOBAL
Izmerenie:POINTER TO Izmerenie_1; (*создаём переменную *)
END_VAR
(*Настраиваем начальные адреса структур*)
Izmerenie := ADR(%QD6.1.8); (*начальный адрес*)

ZETs
03.07.2020, 10:39
TYPE MVA_ERR :
STRUCT
ERR:ARRAY [1..6] OF WORD;
END_STRUCT

VAR
ERR_1,:POINTER TO MVA_ERR;
END_VAR

--------------
ERR_1:=ADR(%QW____);

FOR i:=1 TO 6 DO
ERR_1^.ERR[i];
END_FOR;

VaBo
03.07.2020, 21:48
Допустимо ли при конфигурировании ПЛК160 вытащить в "дерево" несколько RS485-I (физически он там один) для удобства копирования/клонирования. Внутри каждого предполагается несколько UMD.
Не возникнет у CDS путаницы?

Raikkonen
06.07.2020, 09:30
Добрый день!
Не устанавливается трагет файлы. Нажимаю на .бат файл с правами администратора. Затем открываю кодэсис, и в таблице выбора нет целевых платформ ОВЕН.
[оказалось, не стоило пользоваться .бат файлом, он не выполняет обещанного]

Второй вопрос - что делать если я не знаю какой был таргет файл у проекта, который я делал пару лет назад?

Sulfur
06.07.2020, 10:14
что делать если я не знаю какой был таргет файл у проекта, который я делал пару лет назад?
Ставить все имеющиеся таргеты.

Raikkonen
06.07.2020, 10:28
Ставить все имеющиеся таргеты.

В смысле? Может стоять несколько вариантов таргетов на один ПЛК (110.60) одновременно?

Raikkonen
07.07.2020, 09:59
я попробовал поставить два разных таргета на один тип плк - ругается, и говорит - не устанавливать таргет, или перезаписать..... я проект делал 3 года назад, мне теперь перебирать таргеты за 3 года, серьезно чтооли? нет ни какой возможности узнать таргет из проекта? может какой-то файлик в блокноте открыть посмотреть....

Raikkonen
07.07.2020, 11:22
на торцевой стенке плк что написано, какая конкретно модель выгравирована?
Что подразумеваете под таргетами и зачем их перебирать за три года?
проект выкладывайте и мы скажем какая целевая платформа была

Ситуация очень простая. Три года назад написал программу. Сейчас заказчик просит внести изменения. Проект у меня разумеется сохранен. Чтобы его открыть я установил все заново.
Под таргетами подразумевается таргет файл. Я скачиваю последней версии с сайта ОВЕН, при открытии говорит "ошибка целевой платформы". Нужно выяснить на каком таргете я писал программу.......
Проект давать жалко (уж простите). Скажите пожалуйста как определить мне самому.
Я в одном городе, заказчик в другом, поэтому что выгравировано на стенке точно не скажу, но это был ПЛК110-220.60.Р-М

Sulfur
07.07.2020, 11:58
Нужно выяснить на каком таргете я писал программу
Попробуйте подключиться с помощью EasyWorkPLC, и там в ПЛЦ-браузере посмотреть версию прошивки.
По версии прошивки уже поставить таргет.
---
Если проект на руках, то можно перепрошить ПЛК на самую свежую прошивку, поставить нужный таргет и залить проект. Возможно придется переназначить объявления в конфигурации ПЛК.

Raikkonen
07.07.2020, 13:18
Я вот только что полез делать скриншот ошибки при таргете, но перед этим заново таргет установил самый последний, и ВУАЛЯ ошибки нет, проект открывается. Не понял в чем дело до этого =(
Посмотрел внимательно архивы прошивок и таргетов, там один таргет перекрывает кучу прошивок. Судя по всему, проще будет и правда просто на всем самом последнем сделать доработку и все.

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

Shade876
09.07.2020, 04:21
Здравствуйте!

К примеру мы проверяем что если хоть один элемент массива ar_bJOB = TRUE то мы устанавливаем bJOBs = TRUE. Если все элемент массива ar_bJOB = FALSE то надо присвоить bJOBs = FALSE.
Вопрос как проверить все элементы массива что они равны FALSE и присвоить SJOBs = FALSE

VAR
ar_bJOB: ARRAY [1..3] OF BOOL;
i:INT;
bJOBs:BOOL;
END_VAR
-----------

FOR i := 1 TO 3 DO
IF ar_bJOB[i] THEN
bJOBs := TRUE;
END_IF;
END_FOR;

Можно сделать конечно так (пример ниже), проверяя каждый элемент в отдельности, но а если в массиве к примеру 100 элементов. Может есть вариант по проще до которого я не додумался ))):

IF NOT ar_bJOB[1] AND NOT ar_bJOB[2] AND NOT ar_bJOB[3] THEN
bJOBs := FALSE;
END_IF;

Shade876
09.07.2020, 08:16
Массив булей можно заполнить только в программе, следовательно когда вносите новое значение заполняйте свою переменную соответствующим значением

Его надо не заполнить, а проверить, и если все элементы массива FALSE установить переменную bJOBs в FALSE.

Shade876
09.07.2020, 11:04
Ну тогда поделитесь откуда там появляются данные, в массиве булевых переменных?
В массиве хранятся данные состояния дискретов. Вот его и надо проверить все ли они соответствуют False.

ZETs
09.07.2020, 12:36
Третий раз спрашиваю, как заполняется массив
ЗЫ и убедитесь что задаете вопрос в теме про КДС соответствующей Вашему контроллеру

Извините я наверное вас не понял и скорее всего есть нюансы, смотря как фомируется массив. Если не сложно расскажите. У меня примерно так:
После опроса модулей сравниваем температуру с уставками, и формируем булевый массив, часть массива относится к одному оборудованию часть к другому.
При превышении уставки хотя-бы 1-го датчика на панели оборудования подсвечиваем номер экрана с этим оборудованием.

VAR
ar_bJOB: ARRAY [1..3] OF BOOL;
i:INT;
bJOBs:BOOL;
END_VAR
-----------

FOR i := 1 TO 3 DO
IF ar_bJOB[i] THEN
bJOBs := TRUE;
END_IF;
END_FOR;

Вот и возник вопрос как проверить весь массив на отсутствие аварий, что все переменные теперь FALSE. Можно конечно проверить каждый элемент массива:

IF NOT ar_bJOB[1] AND NOT ar_bJOB[2] AND NOT ar_bJOB[3] THEN
bJOBs := FALSE;
END_IF;

Возможно есть способ по проще?

Andrew_Stranger
09.07.2020, 12:48
Так нельзя?
FOR i := 1 TO 3 DO
IF NOT ar_bJOB[i] THEN
bJOBs := TRUE;
END_IF;
END_FOR;

saii
09.07.2020, 13:02
bJOBS := ar_bJOBS[1];
FOR i:= 2 TO N DO
bJOBS := bJOBS or ar_bJOB[i];
END_FOR

Только на выходе Вы будете знать, что у Вас где-то авария. Что Вам это даст?

ZETs
09.07.2020, 14:21
bJOBs := False;
FOR i := 1 TO 3 DO
bJOBs := bJOBs or ar_bJOB[i] ;
END_FOR

Спасибо! Помогло. По отрицанию столько конструкций в коде а я Втупил..... заработался ))

Raikkonen
09.07.2020, 17:03
Добрый день еще раз.
У меня вопрос - а как профи реализуют хранение и передачу уставок, например, на панель оператора по модбасу.
Я вижу два варианта:
1. Сквозь боль и слезы заполнить в конфигурации ПЛК Модбас слейв. Заодно эти переменные становятся энергонезависимыми.
2. Программное управление 485 портом + ретейн переменные + запись в одну сторону при включение и обратная записать каждый цикл.

Или есть какой-то еще более изящный вариант?

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

Поэтому вопрос!
Не помню где, но где-то видел (может в фаствеле, а может вообще приснилось), что можно как-то в конфигурации ПЛК данные из ветки "модбас мастер" связать с данными из ветки "модбас слейв" - таким образом связать панель оператора через плк "напрямую" с аналоговым МВВ и все эти мин,макс,хх,х,л,лл,сафе будет панель задавать напрямую на МВВ.
Есть такое, или я чет напутал?

Илья2282
09.07.2020, 17:15
Здравствуйте.Не могу найти готовую конфигурацию ТРМ-202 для Lectus Modbus OPC сервера.Можете пожалуйста подсказать?

Мария Мильчакова
10.07.2020, 10:37
Здравствуйте.Не могу найти готовую конфигурацию ТРМ-202 для Lectus Modbus OPC сервера.Можете пожалуйста подсказать?

Добрый день.

Готовой конфигурации ТРм202 для Lectus OPC нет.

ZETs
12.07.2020, 06:58
Здравствуйте!
Необходима была реализация примерно следующего характера:
Допустим есть 3 сигнала in1, in2, in3, при наличии хотя бы одного из них (например in1) включается звуковая сигнализация. При пропадании сигнала сигнализация отключалась.
Также при нажатии кнопки сброс звуковая сигнализация сбрасывалась (при наличии сигнала in1), при появлении нового события (например in2) опять включалась звуковая сигнализация.
Реализовал так.
Нужна ваша критика и замечания.
Заранее всем спасибо.

_Mikhail
12.07.2020, 20:14
Здравствуйте!
Необходима была реализация примерно следующего характера:
Допустим есть 3 сигнала in1, in2, in3, при наличии хотя бы одного из них (например in1) включается звуковая сигнализация. При пропадании сигнала сигнализация отключалась.
Также при нажатии кнопки сброс звуковая сигнализация сбрасывалась (при наличии сигнала in1), при появлении нового события (например in2) опять включалась звуковая сигнализация.
Реализовал так.
Нужна ваша критика и замечания.
Заранее всем спасибо.
А что случится если кто-то заблокирует кнопку "Сброс" в нажатом состоянии?

petera
12.07.2020, 22:08
Здравствуйте!
Необходима была реализация примерно следующего характера:
Допустим есть 3 сигнала in1, in2, in3, при наличии хотя бы одного из них (например in1) включается звуковая сигнализация. При пропадании сигнала сигнализация отключалась.
Также при нажатии кнопки сброс звуковая сигнализация сбрасывалась (при наличии сигнала in1), при появлении нового события (например in2) опять включалась звуковая сигнализация.
Реализовал так.
Нужна ваша критика и замечания.
Заранее всем спасибо.

Вариант


IF NOT(in1 OR in2 OR in3) OR reset THEN
signal:= FALSE;
ELSIF (in1 AND NOT x_in1) OR (in2 AND NOT x_in2) OR (in3 AND NOT x_in3) THEN
signal:= TRUE;
END_IF
x_in1:= in1;
x_in2:= in2;
x_in3:= in3;

petera
12.07.2020, 22:35
Подумает и добавит тригер. И petera тоже думаю ))


Добавил

IF NOT(in1 OR in2 OR in3) OR (reset AND NOT x_reset) THEN
signal:= FALSE;
ELSIF (in1 AND NOT x_in1) OR (in2 AND NOT x_in2) OR (in3 AND NOT x_in3) THEN
signal:= TRUE;
END_IF
x_in1:= in1;
x_in2:= in2;
x_in3:= in3;
x_reset:= reset;

ZETs
13.07.2020, 04:20
Всем спасибо!


А что случится если кто-то заблокирует кнопку "Сброс" в нажатом состоянии?
Этот момент я не учёл...

Penni
13.07.2020, 15:07
Вопрос по избитому LREAL в плк110м02.
Правильно ли я понял из прочтенного на форуме, что для использования двойной точности надо самому реализовывать математику? OsCat судя по описанию умеет умножать только REAL и REAL2, а два REAL2 она перемножить не может.
Есть ли еще какие-то варианты? Или вернуть по гарантии и взять на кодесис 3.5.

Penni
14.07.2020, 09:04
А как будет звучать формулировка претензии по гарантии? Ведь контроллеры, даже работающие в КДС3.5, имеют 32-хбитную разрядность, а считать арифметику Вы хотите из 64 бит

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

По поводу притензий юристы расскажут, я им обрисовал ситуацию, они сказали реально. А почему собственно и нет? Заявлена ведь поддержка LREAL в документации. Там нет ссылок что оно не работает на конкретных ПЛК.

А по поводу математики и иныорматики: так ее знаем и применяем, но покупая плк за 20к+ не хочетсявозиться с такой ерундой. Даже стм32 или тот же игрушечный дуе с коробки двойную точность поддерживают.

З.Ы. Сергей Лысов писал что в 3.5 есть поддержка LREAL. Поддержка означает возможность работать с типом и выполнять арифметические операции. Или у Овна поддержка это просто маркетинг.

Penni
14.07.2020, 10:02
Видел конечно это окно. Трактовать как реал просто обрежет до реала и все.
В документации (размещенной на сайте овена) для кодесис 2.3 значится поддержка LREAL. Так что притензии тут вполне обоснованы.
Вы лучше поделитесь функциями математических операций для двойной точности, если приходилось работать с двойной точностью.

Penni
14.07.2020, 11:06
Сложите 1.12345678 + 1.12345678 и получите 2.246914 т.е. семь значащих цифр как и должно быть. И сравните с тем что кулькуляторе получается.
По поводу доки: /uploads/134/codesys_v23_ru.pdf страница 331 (10-36)

rejl
14.07.2020, 11:59
Добрый день, может кто подскажет, есть ПЛК110-24.60.Р-М и счётное устройство Orbit OM 602UQC. Счётное устройство работает по Rs-485 протокол ASCII. Необходимо с помощью ПЛК считать данные со счётного устройства и занести их в переменную. Запрос на получение данных выглядит : " #017W<CR>" . К сожалению никогда не работал по протоколу ASCII и понятия не имею как правильно отправить запрос и получить ответ. Мануалов толковых так же не нашёл. Может кто либо скинуть какой-либо мануал или как вообще происходит запрос и ответ, спасибо.

rejl
14.07.2020, 13:00
а зачем ascii когда есть модбас?

У данной модели нет модбас, счётчики покупали давно, в них есть часы реального времени, но нет модбас))

Penni
15.07.2020, 05:41
В догонку, чтоб не получилось так что и с контроллерами на КДС3.5 у Вас обманка не вышла

Спасибо за скрин, вот видно же что работает. Это ПЛК210 ?

ЛизаКИП
15.07.2020, 08:06
Добрый день, у кого то может есть схема подключения МЭОФ к ПР110?)

Penni
15.07.2020, 08:20
Чтобы темы не плодить, попробую узнать тут.
Нашёл на оф.сайте кодесиса такой документик "Creating and Linking External C Library Functions"
Сделал свою внешнюю библиотеку, подключил к проекту, везде она видится нормально и компилируется, но при попытке залить в контроллер ругается с сообщением "Неразрешенные ссылки на внешние POU: MyPOU" (MyPOU для примера).
Собственно вопрос, как понимать слово "неразрешенные"? Это ошибка в библиотеке и есть какие-то перекрёстные ссылки, которые среда не может разрешить или изготовитель запретил использовать внешние библиотеки?
Для нас это был бы идеальный вариант выхода из сложившейся ситуации. Я бы математику реализовал во внешней библиотеке и всё.

Филоненко Владислав
15.07.2020, 08:42
самый главный вопрос - что же Вам надо считать в двойной точности? Откуда у Вас датчики с классом 0.00001 максимум?

krollcbas
15.07.2020, 08:45
Penni, "Я бы математику реализовал во внешней библиотеке и всё" - раскройте цель, пожалуйста.
Codesys 3.5 имеет такой потенциал по возможным функциям, что никакое С там в помине не нужно, да и не для того ПЛК придумано и языки МЭК стандартизированы, чтоб так извращаться.
Все что Вы пишите, при необходимости, должно быть понятно другим пользователям, например, если надумаете уволиться.

capzap
15.07.2020, 08:46
Чтобы темы не плодить, попробую узнать тут.
Нашёл на оф.сайте кодесиса такой документик "Creating and Linking External C Library Functions"
Сделал свою внешнюю библиотеку, подключил к проекту, везде она видится нормально и компилируется, но при попытке залить в контроллер ругается с сообщением "Неразрешенные ссылки на внешние POU: MyPOU" (MyPOU для примера).
Собственно вопрос, как понимать слово "неразрешенные"? Это ошибка в библиотеке и есть какие-то перекрёстные ссылки, которые среда не может разрешить или изготовитель запретил использовать внешние библиотеки?
Для нас это был бы идеальный вариант выхода из сложившейся ситуации. Я бы математику реализовал во внешней библиотеке и всё.

вот тема https://owen.ru/forum/showthread.php?t=29189&p=333269&viewfull=1#post333269 как бы досих пор не проверил, видимо не вышло, раз не отписался о результатах

Penni
15.07.2020, 08:49
Считаю расход газообразной среды, есть ГОСТ соответствующий. Там есть коэффициент сжимаемости, он нужен с очень большой точность. Разница между реализацией с одинарной и двойной точностью порядка 1%, при допустимых 0,001%.

ЗЫ: Удалось подключить свою библиотеку, всё работает, но есть проблемы с типом REAl.
Вот в этой теме тоже были проблемы похожие https://owen.ru/forum/showthread.php?t=26081
В общем накидаю свой заголовочный файл с определением типов и должно заработать.

ЗЫ: Чьёрт побьяри, это я накосячил. Сохранил случайно библиотеку как внутреннюю и всё заработало конечно :) Сейчас пересохранил как внешнюю и та же проблема осталась. :(

Sulfur
15.07.2020, 12:50
"Неразрешенные ссылки на внешние POU: MyPOU"
Это значит, что в вашей ПОУ на Си есть ссылка на функцию, которой нет в датабазе кодесиса.

Penni
15.07.2020, 13:07
Это значит, что в вашей ПОУ на Си есть ссылка на функцию, которой нет в датабазе кодесиса.

Вы не могли бы уточнить что за база кодесиса? Есть документ который описывает процесс создания внешней библиотеки, там ничего нет про базу данных. Заголовочный файл генерирует сама кодесис, по нему я реализую свою функцию в С файле собираю воедино в MVC++, беру obj файл и lib файл закидываю в папку библиотек. В кодесис библиотека видится, функция видится, но при попытке залить в контроллер вот такое сообщение.

Филоненко Владислав
15.07.2020, 18:37
Все эти внешние библиотеки на С - для Кодесиса работают только на WinPC.

Sulfur
16.07.2020, 08:49
что за база кодесиса?
Вероятно я неправильно выразился. Менеджер библиотек. Внешние вызываемые функции\ПОУ\ФБ должны быть в нем зарегистрированы.

Shade876
18.07.2020, 11:54
Здравствуйте!
Подскажите пожалуйста как считать состояние дискретных входов DI в массив? например.

с AT %IX1.0.0:
по AT %IX1.0.7:

ar_BOOL_DI :ARRAY [1..8] OF BOOL;

По отдельности присвоить значение каждому элементу массива получается длинно ))).

capzap
18.07.2020, 11:59
По отдельности присвоить значение каждому элементу массива получается длинно ))).

поверте другие варианты еще затратнее

Shade876
18.07.2020, 12:29
поверте другие варианты еще затратнее

Ясно.
Ещё разспасибо!

Raikkonen
20.07.2020, 10:11
Добрый день!
А нет ли в общем доступе нормальной библиотеки модбас слейв для овена?
Нормальной, в смысле чтобы были разные массивы данных для 1 2 3 4 функций..... ну и соответственно 5, 15, 6 и 16 норм работали

Sulfur
20.07.2020, 12:30
Подскажите пожалуйста как считать состояние дискретных входов DI в массив?
Например так:
50227
Таргет 110.60М02-М

Andrey24
22.07.2020, 14:23
Добрый день!
На объекте имеется система светофорного регулирования. Собрана из ПЛК110-30 и МК110 – 4ДН.4Р(4 шт.). Четыре модуля залили водой. Заказал новые. Хочу загрузить проект из ПЛК для того чтобы понять какие адреса выставить в модулях. Подскажите пожалуйста как это правильно сделать.

IVM
22.07.2020, 18:38
Добрый день!
На объекте имеется система светофорного регулирования. Собрана из ПЛК110-30 и МК110 – 4ДН.4Р(4 шт.). Четыре модуля залили водой. Заказал новые. Хочу загрузить проект из ПЛК для того чтобы понять какие адреса выставить в модулях. Подскажите пожалуйста как это правильно сделать.

Если программист не сохранил проект в исходном виде, то ничего не получится.

IVM
23.07.2020, 10:31
подключаетесь к сети RS485 через преобразователь, например АС-4 и сниферите сеть, разбираете запросы посылаемые плк и выставляете в модулях найденные адреса

Проще OPC-сервером прощелкать.

melky
23.07.2020, 10:34
IVM что прощелкать ? залитые водой модули В/В ?

Andrey24
23.07.2020, 13:02
Добрый день!
Спасибо за советы. Подскажите какой программой лучше прослушать сеть?

Andrey24
23.07.2020, 13:21
Спасибо. Склоняюсь к созданию нового проекта.

Миронов Илья
30.07.2020, 13:12
Доброго времени суток! Подскажите пожалуйста, как настроить соединение между ПЛК110 с вакуумным датчиком Erstevak MTP4D-KF16 по RS485. По руководству эксплуатации датчика необходимо подать запрос с определенной командой чтобы получить выходное значение. По протоколу Owen(Master) ---> RS-485--->Unsigned variable (Listen) или Float variable + time (listen) с задачей необходимого кода команды не получается. Прикрепляю фотографию manual'a на датчик со связью .5041750418
5041950420

Николай Суриков
30.07.2020, 14:06
Вам нужно использовать библиотеку UNM и с помощью нее настроить чтение параметра с датчика.
https://ftp.owen.ru/CoDeSys23/05_Library/01_Manuals/UNM.pdf

Миронов Илья
30.07.2020, 14:28
Спасибо попробую

Миронов Илья
30.07.2020, 14:51
Вам нужно использовать библиотеку UNM и с помощью нее настроить чтение параметра с датчика.
https://ftp.owen.ru/CoDeSys23/05_Library/01_Manuals/UNM.pdf

Чтение более менее понятно, но как правильно настроить связь непосредственно с датчиком по 485

Pavel Snegirev
01.08.2020, 09:34
Всем доброе утро. Народ помогите советом. Есть энкодер на подъемникие,ПЛК 110, есть задача заменить энкодер на индуктивный датчик со звездой. Может кто подсказать каким образом можно это сделать CodeSys 2.3, что бы по датчику можно было понимать направление движения. Именно програмное исполнение.

Сильно не ругайтесь, только учусь. Спрашивать особо не у кого.

VaBo
01.08.2020, 10:42
По одному невозможно, нужно два, со смещением.

Егор Шелдышов
04.08.2020, 17:04
добрый день. Подскажите как реализовать вложенные if и многовариантные инструкции if-else в ST!

capzap
04.08.2020, 17:07
добрый день. Подскажите как реализовать вложенные if и многовариантные инструкции if-else в ST!

имеет смысл прочитать документацию https://owen.ru/product/codesys_v2/documentation

Егор Шелдышов
04.08.2020, 17:22
capzap Спасибо!

Егор Шелдышов
05.08.2020, 10:27
Добрый день! Как реализовать следующуюю задачу в сodesys 2.3, язык ST. Нужно пошагово сдвигать влево содержимое регистра и при каждом сдвиге анализировать значение бита, может есть какой то флаг который реагирует на конкретное значение? Спасибо.

saii
05.08.2020, 10:32
сдвиг влево SHL, вправо - SHR. А какой бит Вы хотите анализировать?

Егор Шелдышов
05.08.2020, 10:34
Тот который был сдвинут, может быть есть инструкции в IL?

saii
05.08.2020, 10:39
Тогда перед сдвигом накладывайте битовую маску с установленным нужным битом и сравнивайте с нулем. Например для байта:

...
a := b and 127;
if a = 0 then
что-то делаете;
else
делаете что-то другое;
end_if
b := shl(b, 1);
...

Егор Шелдышов
05.08.2020, 10:45
saii О! Спасибо!!!

Raikkonen
05.08.2020, 18:20
Всем привет! подскажите, почему не работает?

var
test_pointer: POINTER TO BOOL;
word1: WORD := 1;
bool1: BOOL;
end_var
test_pointer := BITADR(word1.0);
bool1 := test_pointer^;

Смысл в том, что хочу одно словечко в модбасе сделать как маску дискретных настроек, и чтобы было красиво в коде, а не mb_settings.0

Spawn
06.08.2020, 00:00
Всем привет! подскажите, почему не работает?

var
test_pointer: POINTER TO BOOL;
word1: WORD := 1;
bool1: BOOL;
end_var
test_pointer := BITADR(word1.0);
bool1 := test_pointer^;

Смысл в том, что хочу одно словечко в модбасе сделать как маску дискретных настроек, и чтобы было красиво в коде, а не mb_settings.0

Какой толк "городить" на автомобиль крылья от самолета, если он все равно будет только ездить?

Raikkonen
06.08.2020, 09:12
а в кодэсисе нет ни чего похожего на definne?

Raikkonen
06.08.2020, 09:34
поиск не пробовали использовать

поиск по форуму, по-моему это нечто невозможное. Нужно отдельную инструкцию страниц на 100 как отсеять мусор.
Ну я так понял дефайна нет. Жаль, в алене в бредлине есть.
Цель прежняя - обращаться к биту в слове не через "." а через какое-то наименование

Raikkonen
06.08.2020, 09:52
var
uno: pointer to bool := mb_settings.0;
end_var

if uno^ then (*что-нибудь*) else (*например*) end_if;

Raikkonen
06.08.2020, 10:16
а вот эта штучка чудесная "^" шо делает ?

Raikkonen
06.08.2020, 10:31
все это для того чтобы в коде было удобно смотреть на "setiings_1^" вместо "mb_settings.0".
Вот я и расстроен что с булевыми так не работает, а очень уж хочется. Отсюда собственно и вопрос - можно ли как-то сделать то что мне нужно

capzap
06.08.2020, 10:36
"setiings_1^" вместо "mb_settings.0"

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

Raikkonen
06.08.2020, 11:49
оба этих названия обезличены, не несут ни какой информативности что это
если вместо нуля подставите константу как я показывал вот тогда будет удобнее во много раз mb_settings.start или mb_settings.stop
без шуток - чет не подумал так сделать, это полностью удовлетворит мою потребность
Спасибо!

Сергей61
10.08.2020, 11:24
Подскажите как используя стандартные аварии ИП320 использовать больше 15 аварий в режиме ИП-320 Мастер, ПЛК-73 слэйв? Если ИП-320 запрашивает командой модбас 01 больше 16 бит, то ПЛК73 не отвечает на эту команду.

Fartovjy
12.08.2020, 22:22
Всем добра! Можно в ПЛК 110 засунуть код из FLPROG?

flycat
13.08.2020, 11:14
Новичок.
Возникла срочная необходимость заменить ПЛК-110-30 первой версии с неисправными входами на ПЛК-110-30 второй версии.
Исходник разработчик не предоставляет, но говорит, что компилированный файл есть в памяти.
Как подключиться, чтобы считать этот файл и адаптировать под вторую версию.
Какие необходимы программы, порядок действий и по какому входу лучше подключаться?
Насколько совместимы эти версии ПЛК по разъёмам? Не придется ли изменять что-то в коммутации?
Заранее спасибо тем, кто сможет или попытается помочь.

flycat
14.08.2020, 09:49
Возникла необходимость заменить ранний ПЛК110-30 с неисправными входами на новый, второй версии.
Скомпилированный файл в ПЛК сть исходника нет и не предвидится. Обратился в техподдержку, сказали, что реально без исходника и посоветовали обратиться за подробностями на форум. Уже дважды сообщения удалялись без комментария.
Интересует пошаговый алгоритм действия, программы, способ подключения и прочие подробности.
Время весьма ограничено., если снова будете удалять, то хоть объясните, за что?

P.S. Извиняюсь, до отправки этого сообщения не видел, что предыдущие перенесли.

Mike_K
14.08.2020, 12:46
Возникла необходимость заменить ранний ПЛК110-30 с неисправными входами на новый, второй версии.
Скомпилированный файл в ПЛК сть исходника нет и не предвидится. Обратился в техподдержку, сказали, что реально без исходника и посоветовали обратиться за подробностями на форум. Уже дважды сообщения удалялись без комментария.
Интересует пошаговый алгоритм действия, программы, способ подключения и прочие подробности.
Время весьма ограничено., если снова будете удалять, то хоть объясните, за что?

P.S. Извиняюсь, до отправки этого сообщения не видел, что предыдущие перенесли.

Не Ваш случай? https://owen.ru/forum/showthread.php?t=20097

Orlikov
15.08.2020, 06:13
доброго дня, приобрел МВ 210-101 с датчиками ДТС РТ100 .. не могу их подружить...
то малое значение то обрыв датчика... прошу совета..

RV9WFJ
17.08.2020, 20:57
Схему подключения проверьте - без проблем они дружатся

RV9WFJ
17.08.2020, 21:04
Обратился в техподдержку, сказали, что реально без исходника и посоветовали обратиться за подробностями на форум.Без исходника в другой ПЛК вы не зальете, у них разные таргеты. Вас ввели в заблуждение.

Shade876
19.08.2020, 12:05
Здравствуйте.
Панель примерно раз в 30 сек. замирает, это стало заметно при наблюдении за мигающими элементами.
Я когда-то ввел неверный адрес, так панель вся подвисала а тут нет.
Скорость 115, модбас рту опрашиваю плк110.
Заранее всем спасибо.

Rake Runner
19.08.2020, 12:10
Заранее всем спасибо.

Пожалуйста.

Shade876
19.08.2020, 12:17
Я знал что на вас можно положиться! )))

Александр N
19.08.2020, 15:29
Здравствуйте. Есть проект линия приготовления смеси для формования огнеупорных кирпичей методом прессования. В этой линии 42 дозирующих бункера и передаточная весовая телега которая собирает рецепт.Линия работает на plc110-60 owen, codesys 2.3
Меня не до конца устраивает скорость отрабатывания дозирующих устройств. Проверил цикл контроллера по модулю статистики - 2,5....2,8 мсек. Предполагаю что проблема кроется во времени скана модулей ввода-вывода по rs485. Количество модулей 37, есть аналоговые и дискретные, скорость обмена 115 кбит/с, подключены на два плеча интерфейса примерно поровну. Вопрос в следующем, возможно ли в codesys 2.3 организовать опрос модулей таким образом, чтобы в каждый момент времени опрашивались только те модули которые в данный момент участвуют в технологическом процессе. Спасибо

Николай Суриков
19.08.2020, 16:03
Пишите опрос модулей используя библиотеку modbus.lib и опрашивайте нужные модули когда вам нужно.

IVM
20.08.2020, 11:36
Здравствуйте. Есть проект линия приготовления смеси для формования огнеупорных кирпичей методом прессования. В этой линии 42 дозирующих бункера и передаточная весовая телега которая собирает рецепт.Линия работает на plc110-60 owen, codesys 2.3
Меня не до конца устраивает скорость отрабатывания дозирующих устройств. Проверил цикл контроллера по модулю статистики - 2,5....2,8 мсек. Предполагаю что проблема кроется во времени скана модулей ввода-вывода по rs485. Количество модулей 37, есть аналоговые и дискретные, скорость обмена 115 кбит/с, подключены на два плеча интерфейса примерно поровну. Вопрос в следующем, возможно ли в codesys 2.3 организовать опрос модулей таким образом, чтобы в каждый момент времени опрашивались только те модули которые в данный момент участвуют в технологическом процессе. Спасибо

Опрос модулей можно организовать через библиотеки.

Александр N
20.08.2020, 11:55
Добрый день, проект во вложении.50723

ZETs
20.08.2020, 15:18
Всем здравствуйте!

В приложении РЭ пункт "В. Подключение входных устройств и схемы выходных элементов контроллера"
Я правильно понимаю на входную клемму S/S можно подавать напряжение как со стороннего источника питания так и со встроенного?
И еще ответьте пожалуйста на тупой вопрос для чего клемма N/C ? в РЭ этого нет ))))

YuriBel
20.08.2020, 15:27
Про S/S - правильно, про N/C- Not Connected

ZETs
20.08.2020, 16:56
Про S/S - правильно, про N/C- Not Connected

Спасибо!!!!
У меня чуть рак мозга не случился ))) неожиданный поворот для меня ))

Danilkhikhlukh
22.08.2020, 16:16
День добрый!
ПЛК 110 подключается с модулем ввода MB 210 по сети Ethernet
Подскажите, как сделать, чтобы при пропадание связи (между ПЛК и модулем) срабатывала определенная логика? Как проверять пропадания связи?

Николай Суриков
22.08.2020, 18:44
День добрый!
ПЛК 110 подключается с модулем ввода MB 210 по сети Ethernet
Подскажите, как сделать, чтобы при пропадание связи (между ПЛК и модулем) срабатывала определенная логика? Как проверять пропадания связи?

163 страница руководства программирования плк110\160
50741

Danilkhikhlukh
23.08.2020, 13:57
163 страница руководства программирования плк110\160
50741

Пожалуйста,подскажите что дальше с этим делать? Уже третий день книги, форум, гугл...

Николай Суриков
23.08.2020, 14:01
ЕСЛИ LastError != 0 ТОГДА
АварияВсеПропало := ИСТИНА;
ИНАЧЕ
АварияВсеПропало := ЛОЖЬ;
КОНЕЦ_ЕСЛИ

Danilkhikhlukh
23.08.2020, 19:23
ЕСЛИ LastError != 0 ТОГДА
АварияВсеПропало := ИСТИНА;
ИНАЧЕ
АварияВсеПропало := ЛОЖЬ;
КОНЕЦ_ЕСЛИ

Спасибо, большое!

Миронов Илья
24.08.2020, 11:41
Здравствуйте, есть вопрос по поводу работы входов на ПЛК110-24.60.Р-М , при подаче напряжения -24В на вход контроллер не реагирует на это, нету индикации и подтверждения сигнала в codesys .

Миронов Илья
24.08.2020, 12:45
Проблема решена. Причина банальна. Отсутствие контакта на нуле.

Невнимательность.

Александр N
24.08.2020, 16:22
Спасибо. Займусь.

sssssaaaaabbbbb
26.08.2020, 20:27
50803 Здравствуйте, мне нужно пинговать устройство в сети. Нашел библиотеку OwenLibPing.lib на сайте Овен. Не получается ввести данные, 50804 не знаю как вбить пингуемый адрес?

Евгений Кислов
27.08.2020, 09:52
50803 Здравствуйте, мне нужно пинговать устройство в сети. Нашел библиотеку OwenLibPing.lib на сайте Овен. Не получается ввести данные, 50804 не знаю как вбить пингуемый адрес?

Добрый день.
Адрес задается в HEX:

192.168.39.2 = 16#C0A82702

(192 = 0xC0, 168 = 0xA8, 39 = 0x27, 2 =0x02)

Рекомендую также ознакомиться с примером использования библиотеки - в него входит функция конвертации IP из строкового вида в DWORD:
https://ftp.owen.ru/CoDeSys23/07_Examples/01_Plc1xx/21_Ping.zip

sssssaaaaabbbbb
28.08.2020, 14:18
Что означают эти синие стрелочки с в кодесис 50825

capzap
28.08.2020, 14:20
Что означают эти синие стрелочки с в кодесис 50825

означает, что в исходном коде есть изменения с компилированной версией залитой в плк

Vlad_doc
31.08.2020, 10:04
Добрый день..в cfc работают перекрестныее ссылки?...Места использования в программе выводит...перейти невозможно...кидает в раздел объявления переменных.

stepavel
04.09.2020, 02:33
50922
как вызывать любую функцию? что нужно исправить в данном примере

capzap
04.09.2020, 07:40
50922
как вызывать любую функцию? что нужно исправить в данном примере

Вы перепутали, среда разработки не от сименса. Здесь каждое ПОУ только для чего то одного либо программы, либо ФБ либо функции

https://ftp.owen.ru/CoDeSys23/06_Documentation/Cds23_Manual_v2.8.pdf раздел 3

stepavel
04.09.2020, 09:44
Есть простые примеры на st как организовывать функцию поу и вызывать ее из программы. За ранее спасибо

stepavel
04.09.2020, 09:45
Как правильно добавлять функцию в поу из библиотеки

stepavel
04.09.2020, 09:47
Копировать код из библиотеки или можно просто добавить Блок функции? Из библиотеки

Spawn
04.09.2020, 10:01
Как правильно добавлять функцию в поу из библиотеки

Не добавлять, а вызывать существующую.
Например, как-то так:
A := My_Function(Par1, Par2...);

YuriBel
04.09.2020, 10:04
Нужно подключить нужную библиотеку к проекту через менеджер библиотек, после этого можно использовать функции из этой библиотеки в своем коде.

Егор Шелдышов
04.09.2020, 11:51
Добрый день! Есть плк100 2020 года, есть ли адаптеры юсб рс232, так как по юсб проблематично подключиться, по езернет не могу так как работаю с ПМ01. Прикол в том что один плк 100 по юсб можно подключить, а второй идентичный подключил только раз, залил програму, а после винда выдает ошибку юсб не опознано, может дело в прошивке?

stepavel
04.09.2020, 14:17
тогда что я сделал не так в посте выше - дублирую. 50935

stepavel
04.09.2020, 14:19
мне объявлять переменные не нужно? они привязаны с библиотекой. я просто вызываю в программе функцию?

YuriBel
04.09.2020, 14:49
Объявлять нужно именно переменные, а вы пытаетесь объявить функцию. Начните с просмотра примеров, тогда все станет ясно.

stepavel
04.09.2020, 15:39
можно пример
или что у меня нет еще раз50938

kondor3000
05.09.2020, 11:57
можно пример
или что у меня нет еще раз50938

Вот так: x123:=Scale_R();

stepavel
06.09.2020, 10:29
50949
какие параметры, входы и выходы нужно писать в скобках функции?
x123:=SCALE_R(X, I_LO, I_HI, O_LO, O_HI); правильно я сделал? какой порядок очередности нужно соблюдать ввода в скобках в библиотеке это не написано, в библиотеке.

Spawn
06.09.2020, 10:57
stepavel, Вы меня извините, конечно, но если для Вас вызов функции вызывает сложности, то может стоит начать с самого начала, а именно с мат. части по программированию на темы, например, "Что такое функция?", "Для чего нужна функция?" и т.д. и т.п.? На эти темы куча, уже существующей, информации на просторах сети Интернет, где все подробно расписано.

stepavel
06.09.2020, 20:33
да тоже приношу свои извинения, работы много времени нет все читать и искать. да я понимаю что такое функция и для чего она нужна. но раз тема для новичков я и пишу в эту тему если нет желания можете не читать. если кому не сложно объяснить буду благодарен. У меня вопрос был как правильно на языке st в кодесис пишится функция мне ответили в примере для меня это понятно, но что в скобках нужно указывать формулу или вводные параметры функции? я прочитал справку кодесис, но хочется уточнения. как я понял что в скобках пишется через запятую вводные данные функции - это правильно? ввод воходных значений можно не через переменную а сразу число, и порядок вводных значений обязательно соблюдать?

Cs-Cs
06.09.2020, 21:16
stepavel Ага... работы много нетвремени песыт верно прастите тут запятая это мне функция нужна в общем лучше бы подсказали чем обижать и выпендриваться своими знаниями.
Так, да? А уважить тех, у кого просишь помощи (написать понятно и ясно) - это тоже работы много? Может у нас всех тоже работы много, и нам много работы в текст без знаковы препинаний и абзацев вчитываться работы много... Пхх.

Короче, функция на языке st в кодисись пишется при помощи отдельного POU которай надо дабавить в праэкд при пом прав кноп мыще но тебе функция нужна не вызов функциональуго блока нужен а это разные вещи функцыйа чтото вычисляет и возвращает результат о функционал блог работает как минепрограмма и может эметь много парам на вх-вых вот тебе это и надо ты объявляешь такой ФБ как переменную вразделе перем сверху так MyFB: FUNCTION_BLOCK; а потом в коде вставляешь его выхзов по кнопке F2 как вызов экземпляра и там будет чтоить типа MyFB (InVar :=, InVar2 :=, OutVar1 =>, OutVar2 =>) куда надо подставить те переменные куда ты хочешь передать или записать значения это если ты вызываешь заранее сделанный FB из библиотеки например таймер счётчик а свои функции надо объявлять через POU а не в VAR это не паскаль ни разу

Вот тут написан верный ответ. У меня тоже, как у тебя - работы много времени нет всё писать разборчиво разберись сам

Spawn
07.09.2020, 01:09
Cs-Cs, не нагружайте человека дополнительной информацией. Ему нужна функция, а не функциональный блок. Не нужно смешивать все в кучу - еще больше запутается. Что такое FB, как он работает и чем от простой функции отличается - это уже "темы" последующих "уроков".

лучше бы подсказали чем обижать и выпендриваться своими знаниями Даже и мысли не возникало кого-то обидеть. Дело не в выпендреже и не в блеске знаний, а в том, что человеку (на будущее) нужно дать не просто информацию, а знания, чтобы при написании той или иной строчки кода, человек понимал (сам, своей головой) что он пишет и зачем. У меня, например, вызывает сложности написание доходчивого (для другого человека) толкования, с примерами (в картинках), на "несколько листов А4". Мои тараканы, конечно, знают и понимают то, что им нужно, но по-своему. По азам есть много авторов, которые, на мой взгляд, более подробно и грамотно смогут объяснить, в изложенных ими материалах, те или иные моменты с нюансами/тонкостями, с примерами (примеры очень важны, потому как теория без практики очень плохо усваивается и быстро забывается). Первое, что попалось под руку - "РП ПЛК63.73.pdf", страница 32 - краткое описание, что из себя представляет функция. Вот тут (https://studfile.net/preview/4599465/page:4/) есть информация как вызывать функцию. Чтобы вызвать функцию, нужно чтобы она присутствовала в проекте, не важно где, написанная собственноручно в перечне POU или в добавленной к проекту библиотеке.
Пример от меня: Задача - "склеить" две строки в одну. Для этого можно воспользоваться функцией "CONCAT" из библиотеки "STANDARD.LIB". Если библиотека не добавлена в проект, то необходимо ее добавить, для этого переходим на вкладку "Ресурсы", двойной клик по "Менеджер библиотек", правой кнопкой мыши в окне перечня библиотек, выбираем "Добавить библиотеку...", идем в (путь по умолчанию) "C:\Program Files\3S Software\CoDeSys V2.3\Library", ищем там файл "STANDARD.LIB", двойной клик по нему. Всё, библиотека добавлена в проект.


PROGRAM PLC_PRG
VAR
Str1 : STRING; (*первая склеиваемая строка*)
Str2 : STRING; (*вторая склеиваемая строка*)
Str3 : STRING; (*Конечный результат*)
END_VAR

Str1 := 'Привет,';
Str2 := ' МИР!';
Str3 := CONCAT(Str1, Str2);


В результате работы функции "CONCAT", мы получим значение "Привет, МИР!" в переменной Str3.

Бывает необходимо, чтобы функция выполнила какие-либо действия, но возвращаемый ею (функцией) результат нам не важен. В таком случае, функция просто вызывается в теле кода с параметрами. Например, есть такая функция, которая очищает экран ПЛК63 (например) - "ClearScreen", находящаяся в библиотеке "Work_Mode.lib" (тоже должна быть добавлена в проект), которая после выполнения возвращает значение типа DINT (при успешном выполнении номер очищенного экрана или -1 в случае ошибки). Нас, допустим, не интересует возвращаемое значение, нам нужно, чтобы функция просто выполнила какие-то действия (в нашем случае очистила экран), тогда функция будет вызываться так:


PROGRAM PLC_PRG
VAR
END_VAR
ClearScreen(0);


Пример собственноручно написанной функции:
В проекте, на вкладке "POU", жмем правой кнопки мыши по изображению папки с названием "POU" в дереве проекта, выбираем "Добавить объект...", в открывшемся окне вводим имя добавляемой нами функции в поле "Имя нового POU", например, "MathsPlus", выбираем "Тип POU" - "Функция", выбираем "Язык реализации" - "ST", выбираем "Тип результата:" - "INT", жмем кнопку "ОК". В дереве проекта появится новый POU с именем "MathsPlus" и откроется окно для редактирования кода. В области переменных оставляем только VAR_INPUT.



FUNCTION MathsPlus : INT
VAR_INPUT
Par1 : INT;
Par2 : INT;
END_VAR
MathsPlus := Par1 + Par2;


Открываем "PLC_PRG", добавляем в область объявления переменных переменную "Res", в области кода вызываем, добавленную нами собственноручно, функцию с параметрами (с присваиванием/передачей значений переменным функции):


PROGRAM PLC_PRG
VAR
Res : INT;
END_VAR
Res := MathsPlus(1, 3);


В результате работы функции и кода в "PLC_PRG", переменная "Res" будет содержать значение 4 (четыре).

Как-то так... озадачили меня с утра...:) тараканы еще проснуться не успели, а я их палкой...:)

stepavel
07.09.2020, 22:36
Спасибо за все разъяснения. Я не программист. И правильно написать для меня, как я понял проблема. Начал думать, что мои коллеги меня тоже не понимают. Сказали, что объяснять умею. За ваше время готов отблагодарить пивом, конфетами или деньгами в размере презента. Я понимаю что такое функция и ваши примеры мне хорошо понятны и я их читал в руководстве и с ними работал, проверял. Как добавлять библиотеки и свои функции в руководстве понятно для меня расписано.
Я в начале прикреплял картинки, картинку(дублирую). У меня вопрос был, вот есть функции в библиотеках в частности OSCAT Basic функция SCALE. 1. переменные X,K,O,MX,MN-нужно в скобках функции, вводить соблюдая очередность согласно картинке или таблицы входы сверху вниз, или можно не соблюдать очередность. 2. Есть примеры где вводят сразу число, возможно через запятую присваивать данной функции значения констант, числа). С Уважением Павел.50975

Spawn
07.09.2020, 23:36
Спасибо за все разъяснения. Я не программист. И правильно написать для меня, как я понял проблема. Начал думать, что мои коллеги меня тоже не понимают. Сказали, что объяснять умею. За ваше время готов отблагодарить пивом, конфетами или деньгами в размере презента. Я понимаю что такое функция и ваши примеры мне хорошо понятны и я их читал в руководстве и с ними работал, проверял. Как добавлять библиотеки и свои функции в руководстве понятно для меня расписано.
Я в начале прикреплял картинки, картинку(дублирую). У меня вопрос был, вот есть функции в библиотеках в частности OSCAT Basic функция SCALE. 1. переменные X,K,O,MX,MN-нужно в скобках функции, вводить соблюдая очередность согласно картинке или таблицы входы сверху вниз, или можно не соблюдать очередность. 2. Есть примеры где вводят сразу число, возможно через запятую присваивать данной функции значения констант, числа). С Уважением Павел.50975

stepavel, создайте пустой проект в CodeSys, попробуйте реализовать все ваши вопросы кодом, запустите проект в режиме симуляции и посмотрите что будет происходить. Сами все поймете.

stepavel
08.09.2020, 01:06
Спасибо большое. С меня пиво(в личку). Много дней кратковременных размышлений(моих), как все это проверить. элементарное решение не мог увидеть. Spawn отдельное спасибо, что понял меня. Функцию - отработал, посмотрел, понял. Как дойду до следующего ступора напишу.

Егор Шелдышов
10.09.2020, 17:07
Подскажите что это за файлы, открываю один из них, а тм абракадабра 51006, плк110 60 v2

Rednaxel
11.09.2020, 09:36
Подскажите что это за файлы, открываю один из них, а тм абракадабра 51006, плк110 60 v2

Вот содержимое моего ПЛК 110-30 [M2]:
filedir

Journal.dat
debug.txt
local_addres.dat
DEFAULT.PRG
DEFAULT.CHK
source.dat
DOWNLOAD.SDB

А отчего собственно такой вопрос возник? Какая предыстория? Может быть Ваша текущая программа что-то там пишет?

Rednaxel
11.09.2020, 09:41
И здравствуйте коллеги!

Может ли кто-нибудь прояснить вопрос смены состояния питания (https://owen.ru/forum/showthread.php?t=27319) ПЛК 110 [M2] ?

Егор Шелдышов
11.09.2020, 12:48
Вот содержимое моего ПЛК 110-30 [M2]:
filedir

Journal.dat
debug.txt
local_addres.dat
DEFAULT.PRG
DEFAULT.CHK
source.dat
DOWNLOAD.SDB

А отчего собственно такой вопрос возник? Какая предыстория? Может быть Ваша текущая программа что-то там пишет?

Хотел ПЛК 110 60м2 подключить через ПМ01 к ОРС серверу, вчера бился не получалось никак, поэтому подумал может быть причина в каком нибуть из тех файлов, сегодня все таки удалось запустить! Хотя в плк ничего не записывал кроме файла local_addres.dat и не использовал никаких библиотек по работе с файлами

Welldi
12.09.2020, 10:06
Добрый день. Что то я совсем запутался.
Есть связка:
ОВЕН СКАДА Телемещаника Лайт ->Ethernet->ПЛК110->modbus RTU->датчики температуры ПВТ100.
Вопрос 1:
-могу ли я напрямую со Скады обращаться к датчикам, без реализации опроса датчиков контролоером. Т.е ПЛК110 как бы в роли шлюза.
Вопрос 2:
-какие настройки необходимы в CoDeSys чтобы ПЛК110 работал в таком режиме. При этом сам ПЛК110 будет иметь свои регистры modbus для обмена.

Какие настройки необходимы в Скаде Телемеханика Лайт.
Пробовал создать контроллер как no target связь по TCP. А в нем канал ввода вывода modbus и датчик ПВТ100 (из встроенной библиотеки). У него настроил RTU over TCP.

Но ничего не выходит. Ни опроса ПЛК, ни датчиков. Или надо было ПЛК подключать как Эксель Модбус......
Памагите)))) укажите путь))

Welldi
13.09.2020, 13:48
У кого - у него ? В конфигурации ПЛК этого нет как класса.

Это в конфигурации модуля ввода вывода модбас в Овен Скада Телемеханика.

Welldi
14.09.2020, 08:35
Скаде сказали говорить с ПЛК по-китайски
ПЛК по-китайски не разумеет
И ?

Так вопрос как в том, как спросить не «на китайском»

Тех поддержка овен сказала это возможно.