А вот скажите.... собираюсь купить таргеты за 35 евро. Он только на одну малинку? на один комп? на один кодесис?
Вид для печати
А вот скажите.... собираюсь купить таргеты за 35 евро. Он только на одну малинку? на один комп? на один кодесис?
Он только на одну малинку ставится и (только на той что первую активировал и работает)
А как он прорисывается,я так понимаю мне пришлют ЗИП. Что кодесис вышлет серийник малинки? если хочу запрограмировать штук 10, то что каждый раз по 35? и вопрос действительно ли нужен кодесис 3,5,10(так в хелпе написано) или старшая версия тоже работает?
EATON (moeller) вообще бесплатные таргеты дает.
Vadzim Да, на каждую отдельно, и не 35 евро а порядка 47-50 так как там еще указано что + налог.
Это лицензия на ПЛК, для Codesys малина это отдельно взятый ПЛК.
Это цена очень скромная, поверьте. Есть еще одна Итальянская контора, которая делает что-то похожее и программируется на МЭК, в том числе и для Raspberry, так вот их цена порядка 800 евро.
Почувствуйте разницу как говорится.
Кстати в зависимости от ваших процессов можно сделать так, что система будет бесплатной, если cronom делать перегрузку каждые 2 часа всей Малины. Главное чтобы исполняемый Runtime Codesys стартовал.
может кому интересно будет
https://www.linkedin.com/pulse/alarm...-title-publish
Неплохо.. только Codesys там нет как я понял? тогда не совсем по профилю форум
motion помоему получше будет, не одним мылом , так чисто порадоваться за человека, что написал
вот если бы человек сказал как к PI прикрутить > 5 веб камер.. а то у меня драйвер USB хаба отваливается со словами (недостаточно скорости порта.. камеры правда USB 1.1)
[OFFTOP]
Привет, столкнулся с такой проблемой, малина закрывает программы через некоторое время (через несколько часов).
У меня задача, просто отображать web страницу 24\7, но малина закрывает браузер, вечером оставлю, утром уже всё закрыто.
Пробовал и родной оставлять и chromium, результат один.
Где отключить эту умную фичу или где почитать?
Спасибо.
[/OFFTOP]
Scream что именно за web у вас закрывается ?
хоть и ссылка не совсем по теме, но там есть направление которое может заменить гуи браузер и аякс вместе взятые
всмысле браузер встроен в скаду что ли, он картинку отображает, ну а так будете скачивать её в tempfs и открывать в скаде или еще где, может получится чуть медленнее, зато стабильнее
Да не, забудьте о слове scada.
У меня задача отображать 24\7 web сайт с web сервера, который находится в локальной сети.
На страничке обновляются онлайн данные, всё просто, немного графики.
Проблема в том, что raspbian убивает брвузер через несколько часов, сутки пожить не даёт браузеру, потребление памяти браузера вижу, утечек нет, всё выгружается, тоесть OOM Killer'у убивать смысла нет. Наоборот приоритетней браузер должен быть так как отображается я думаю.
А кто и почему действительно убивает не пойму.
Я пользую браузер Kweb, отображает картинки с локального(на этой-же Pi) CodeSys.
Подключена через кабель HDMI к монитору. Работает СУТКАМИ и ничего не закрывается и не слетает.
Главное - правильно запустить. Основа http://forum.codesys.com/viewtopic.p...it=kweb#p14542
У меня, правда, так, как пишет автор, не получилось. Пришлось написать самому маленький скрипт и вставить в автозагрузку, в моём случае в /home/pi/.config/lxsession/LXDE-pi/autostart.
Теперь вопрос, наверно, к murdemon.
Видел на просторах нета Ваши сообщения касательно MQTT.
Получилось-ли получать данные в кодесис, или лишь отправка.
Посещает мысль попытаться сделать(читай-наколхозить) связку: MQTT - клиент OpenHab мастер Modbus TCP - клиент Modbus TCP Codesys.
Т.е. openhab будет подписан на mqtt(стандартная ситуация), потом правила по преобразованию и отправка на modbus кодесиса.
Смущает работа web openhaba и кодесиса на одном порту, но можно попытаться поменять порты или отключить web на стороне опенхаба.
Что скажете?
P.S. нашёл интересный проект по моей теме - nodered.org, изучаю...
тут есть... http://www.owen.ru/forum/attachment....3&d=1484413963 и подписка, и отправка
Спасибо, буду смотреть!
Только там оскатовская библиотека уже переделаная...
P.S. Уважаемый murdemon.
Просветите слеповатого, почему проблема с OSCAT-овской библиотекой, 3.3.0?
Не хочет компилить, пишет 17 ошибок. Типа
Направте на путь истины.Код:------ Компиляция : Приложение: Device.Application -------
типизировать код...
[ERROR] MQTT: MQTT_Client [Device: Plc Logic: Application](Строка 48, Столбец 1 (Реализ.)): C0032: Невозможно конвертировать тип 'Неизвестный тип: 'BUFFER_TO_STRING(ADR(receiveBuffer.data), DINT_TO_UINT(diReceiveCount), 5, DINT_TO_UINT((diReceiveCount - DINT#1)))'' в тип 'STRING(80)'
[ERROR] MQTT: MQTT_Client [Device: Plc Logic: Application](Строка 48, Столбец 1 (Реализ.)): C0046: Идентификатор 'BUFFER_TO_STRING' не задан
[ERROR] MQTT: MQTT_Client [Device: Plc Logic: Application](Строка 48, Столбец 1 (Реализ.)): C0035: Вместо 'BUFFER_TO_STRING' требуется имя программы или экземпляр функционального блока
[ERROR] MQTT: MQTT_Client [Device: Plc Logic: Application](Строка 85, Столбец 1 (Реализ.)): C0046: Идентификатор 'CHR_TO_STRING' не задан
[ERROR] MQTT: MQTT_Client [Device: Plc Logic: Application](Строка 85, Столбец 1 (Реализ.)): C0035: Вместо 'CHR_TO_STRING' требуется имя программы или экземпляр функционального блока
[ERROR] MQTT: MQTT_Client [Device: Plc Logic: Application](Строка 118, Столбец 1 (Реализ.)): C0046: Идентификатор 'BYTE_OF_BIT' не задан
[ERROR] MQTT: MQTT_Client [Device: Plc Logic: Application](Строка 118, Столбец 1 (Реализ.)): C0035: Вместо 'BYTE_OF_BIT' требуется имя программы или экземпляр функционального блока
[ERROR] MQTT: _BUFFER_PUSH_STRING [Device: Plc Logic: Application](Строка 5, Столбец 1 (Реализ.)): C0046: Идентификатор 'BYTE_OF_DWORD' не задан
[ERROR] MQTT: _BUFFER_PUSH_STRING [Device: Plc Logic: Application](Строка 5, Столбец 1 (Реализ.)): C0035: Вместо 'BYTE_OF_DWORD' требуется имя программы или экземпляр функционального блока
[ERROR] MQTT: _BUFFER_PUSH_STRING [Device: Plc Logic: Application](Строка 6, Столбец 1 (Реализ.)): C0046: Идентификатор 'BYTE_OF_DWORD' не задан
[ERROR] MQTT: _BUFFER_PUSH_STRING [Device: Plc Logic: Application](Строка 6, Столбец 1 (Реализ.)): C0035: Вместо 'BYTE_OF_DWORD' требуется имя программы или экземпляр функционального блока
[ERROR] MQTT: CREATE_MESSAGE [Device: Plc Logic: Application](Строка 5, Столбец 1 (Реализ.)): C0046: Идентификатор 'BIT_LOAD_B' не задан
[ERROR] MQTT: CREATE_MESSAGE [Device: Plc Logic: Application](Строка 5, Столбец 1 (Реализ.)): C0035: Вместо 'BIT_LOAD_B' требуется имя программы или экземпляр функционального блока
[ERROR] MQTT: CREATE_MESSAGE [Device: Plc Logic: Application](Строка 6, Столбец 1 (Реализ.)): C0046: Идентификатор 'BIT_LOAD_B' не задан
[ERROR] MQTT: CREATE_MESSAGE [Device: Plc Logic: Application](Строка 6, Столбец 1 (Реализ.)): C0035: Вместо 'BIT_LOAD_B' требуется имя программы или экземпляр функционального блока
[ERROR] MQTT: ENCODE_REMAINING_LENGTH [Device: Plc Logic: Application](Строка 15, Столбец 1 (Реализ.)): C0046: Идентификатор 'BYTE_OF_DWORD' не задан
[ERROR] MQTT: ENCODE_REMAINING_LENGTH [Device: Plc Logic: Application](Строка 15, Столбец 1 (Реализ.)): C0035: Вместо 'BYTE_OF_DWORD' требуется имя программы или экземпляр функционального блока
Компиляция завершена -- 17 ошибок, 14 предупреждений
Докладываю о результатах экспериментов по приёму по MQTT.
По указанной выше ссылке с помощью уважаемого Дмитрия, он же murdemon, блок заработал( с меня пиво, я помню!!!:)).
Потом, с небольшими усилиями получил в переменной codesys значения REAL от датчика через MQTT.
Честно - гиморно...
Особенно, если учесть, что дачиков может быть много, блоков придётся понавставлять столько-же.
Я не спец по этому, но сколько будет создано сокетов сказать не могу.
Как я уже писал, решил присмотреться к node-red.
С MQTT работает без проблем, на выходе блоков сразу данные, а не как в предыдущем блоке вместе с названием топика.
Добавил функцию преобразования в float(он же Real), умножаю на необходимый коэф.(10,100).
Добавил библиотеки для модбас.
Добавил запись в регистры, данные автоматом в int.
В программе содесис добавил localhost слэйв модбас тср.
Получаю в формате word, перевожу в real, делю на коэф..
ВУАЛЯ- всё прекрасно работает!!!!
Железо - Pi2 mod.B
P.S. Попробовал в обратку, из ModBus к MQTT - тоже без проблем!
Вопрос знатокам: а как себя ведёт малина с данным ПО при пропадании питания, сбоев файловой системы не возникает при этом? Если да,то как вообще отключать такой ПЛК?
ретайн через файл более или имения работает. Если не очень часто меняете и запись в файл не совпадет с выключением питания (запись в файл только по изменению ретайна идет)
Кто нибудь пробовал организовать retain через чип часов ? есть платки часов с памятью
kst-pu ну в данном случае правильнее будет halt из под root.
флешки да, умирают при постоянной перезаписи
Понятно.
Есть такая линуксовая сборка TinyCore, создана специально для флешек. Суть её в том, что линь с флешки грузится в ОЗУ, причем весь. Файловая система тоже в ОЗУ. Идеальный вариант для плк. Вся сборка весит 10-20мб. Не знаю, влезет ли кодесис в такую систему. В таком варианте есть изаграф.
ну да, я это и имел в виду. halt и shutdown они синонимы
Вопрос а куда тогда писать данные, если все крутится в озу и вырубается питание ? например у меня в scada 30 секунд и запись данных.
Для сброса файлов ram-диска на флеш в tinycore есть специальная команда, вернее shell-скрипт. Если вызывать его каждые 30 сек, то будет сохраняться. Но крутить скаду под tinycore наверное будет неправильно, все преимущества потеряются при частой записи. Это уровень ПЛК, а архивы надо держать в другом месте (не на sd-карте).
То есть подключать винт как более надежное место хранения, тогда вопрос цены будет стоять, винт или пром флеш.
С КДС не пробовал, а так, у Малины только USB, можно записывать видимо так же как на флешку..
Да не, с версиями всё норм. Это глюк runtime'а как по мне. Вот видео демонстрация проблемы. CoDeSys 3.5.10.0 (10, 20). Остальное свежее с сайта RaspberryPi. runtime в устройство загружает сам CoDeSys (уж какой загрузит, ему виднее).
https://youtu.be/bGNL8n5qV64
Для тех потомков, кто будет пользовать этот самый codesys и столкнётся с глюком потери соединения при работе с event'ами, знайте, что CDRead() с принудительно установленным флагом O_NONBLOCK спасёт отца русской демократии. Такого флага конечно нет, но вы его можете объявить сами (O_NONBLOCK = 4000 - в десятичной (!) системе). Флаг нужно пользовать как в Си-программах.
Ну и если вы хотите большего, к примеру, часами (/dev/rtc) поуправлять (ioctl) или чем другим, то запросы можно оформить так (я не нашёл эквиваленты макросов _IOR и _IOW):
П.С. Оказывается CmpCharDevice.library после чистой установки CoDeSys почему-то недоступна. Видимо эта библиотека появляется при добавлении пакета с RaspberryPi, но на просторах сети её найти и скачать можно. Также можно добавить в проект библиотеки недостающий флаг и дополнительную функциональность по сборке запросов. Может быть где-то кто-то до меня это уже сделал, кто знает...Код:var constant
RTC_RD_TIME: udint := 16#09;
RTC_SET_TIME: udint := 16#0a;
group: dword := 16#70;
IOC_OUT: dword := 16#80000000;
IOC_IN: dword := 16#40000000;
IOCPARM_MASK: dword := 16#1fff;
end_var
method private ReadRequest : dword
var_input
num: udint;
len: udint;
end_var
ReadRequest := IOC_OUT or ( shl( len and IOCPARM_MASK, 16 ) or ( shl( group, 8 ) or num ) );
method private WriteRequest : dword
var_input
num: udint;
len: udint;
end_var
WriteRequest := IOC_IN or ( shl( len and IOCPARM_MASK, 16 ) or ( shl( group, 8 ) or num ) );
// ...
hRtc := CDOpen( '/dev/rtc', CmpCharDevice.ACCESS_MODE.O_RDONLY, adr( Result ) );
if hRtc <> RTS_INVALID_HANDLE then
Request := dword_to_dint( ReadRequest( RTC_RD_TIME, sizeof( TRtcTime ) ) );
CDIoctl( hRtc, Request, dword_to_dint( adr( Read ) ), adr( Result ) );
CDClose( hRtc, adr( Result ) );
end_if
// ...
hRtc := CDOpen( '/dev/rtc', CmpCharDevice.ACCESS_MODE.O_WRONLY, adr( Result ) );
if hRtc <> RTS_INVALID_HANDLE then
Request := dword_to_dint( WriteRequest( RTC_SET_TIME, sizeof( TRtcTime ) ) );
CDIoctl( hRtc, Request, dword_to_dint( adr( rtctime ) ), adr( Result ) );
CDClose( hRtc, adr( Result ) );
end_if
Используя shared memory можно передавать данные из runtime codesys во внешние программы. Таким образом можно делать визуализацию на Mono, используя преимущества c#. Отлаживать оба проекта можно в Windows системе, правда с небольшим отличием в доступе к разделяемому объекту.
Код для codesys взят из примера SharedMemory и обрезан (см. в store). На raspberri pi 3 нужно лишь открыть и прочитать файл /dev/shm/{имя_объекта_в_codesys}. На картинке ниже codesys формирует одно число типа lreal и записывает его в разделяемую память. Проект на c# открывает файл, читает это число (текущее измерение) и отображает его на графике (компонент NPlot).
Писать визуализацию в Codesys то ещё занятие, не для слабонервных. Всё равно она нестандартная (велосипедная). Ни чем не хуже делать её на mono, тем более, что возможностей здесь на порядок больше.
Вложение 33815
Мужики, не в дружбу а в службу, если есть здесь кто покупал CODESYS Control for Raspberry Pi SL - интересует содержимое папки /var/opt/codesys/backup. Скиньте в личку в любом виде, 'на_коньяк' строго гарантирую.
Добрый день. Обновлю тему.
в логе codesyscontrol.log такие сообщения
1547254171, 0x00000002, 4, 16, 40, Retain restore from file failed: [<app>Application</app>]
1547254171, 0x00000002, 2, 1288, 49, Retain data are initialized now of [<app>Application</app>]
1547254177, 0x00000002, 1, 0, 2, Application [<app>Application</app>] loaded via [Bootproject]
поля такие
;<entries>
;Timestamp, CmpId, ClassId, ErrorId, InfoId, InfoText
;</entries>
Можно ли отловить это событие (event)? куда смотреть? CmpApp EventIDs смотрел, что то не нашел.... И что такое CmpId, ClassId, ErrorId, InfoId?
c CmpId разобрался, там же в логе
1547264340, 0x00000001, 1, 0, 10, <cmp>CmpApp</cmp>, <id>0x00000002</id> <ver>3.5.14.0</ver>
т.е. это CmpApp...
описание ClassId тоже найдено:
#define LOG_INFO 0x00000001
For general information
#define LOG_WARNING 0x00000002
For warnings
#define LOG_ERROR 0x00000004
For errors
#define LOG_EXCEPTION 0x00000008
For exceptions
#define LOG_DEBUG 0x00000010
Only for debug log entries
#define LOG_COM 0x00000040
For communication entries
#define LOG_INFO_TIMESTAMP_RELATIVE
0x00000080
Там же описания ErrorId, InfoId, InfoText
"Error Id" The error Id, if an operation failed
"Info Id" An unique Id per component, that can be used to specify a longer
test for the log entry in the target description of CODESYS. This is
used to save resources in the runtime system to store the log entries
'Info string" - Info string with optional and variable information, e.g. application
names or task names