|
Готовые решения Здесь собраны все темы, по которым было найдено и выложено решение |
|
Опции темы | Поиск в этой теме |
29.03.2019, 23:31 | #1 |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
В помощь всем, кто кодит на С++
Товарищи, разработал я тут программулину, прикладываю бинарник в архиве к этому сообщению.
Если вы программируете на с++, делаете это так же часто как я и вас раздражает способ, с которым реализован обмен данными shared memory, то я предлагаю вам совершенно бесплатно воспользоваться моей программой. Что делает: анализирует все шаред мемори переменные в проекте лоджика и создаёт файл класса, который вы можете встроить в свою программу. Этот класс является обёрткой над Shm и просто предоставляет более удобные методы работы. Настолько более удобные, что прям, на мой взгляд "так и должно было быть с самого начала". Как использовать: Копируйте на контроллер и запускайте бинарник из архива. Он выплюнет файл shmemz.hpp. В файле есть описание методов класса и примеры использования в коде. Класс является надстройкой над Shm, так что инклюд Shm должен быть. ну и далее - #include на файл, который выплюнет программа. Отдельно хочу сказать про Shm. К сожалению, у меня не так уж много времени, чтобы избавиться от этого недоразумения. Считаю, что segnetics должно быть стыдно официально рекомендовать такое Г, с точки зрения программирования, как официальный способ программирования контроллеров на С++. Мало того, что там string переопределены, так там ещё и map используется отвратительно, в итоге мы имеем невозможность компилировать это дело от C++11, что накладывает существенные ограничения на использование таких вещей как boost и прочих полезностей. Я к тому, что такой уровень написания библиотеки говорит о низкой квалификации программиста, который это делал. Да, я знаю, что он уже там не работает, но продукт-то на виду... Может быть когда-нибудь меня это полностью задолбает и я найду время переделать Shm по-хорошему. Но пока что - вот вам моя программа, пользуйтесь на здоровье. ------ Комментарии, отзывы и пожелания, так же как и критика, принимаются здесь же, в ответах этой темы =) __________________ В сегнетиксе не работаю с самого начала 2019 года. |
30.03.2019, 10:34 | #2 | ||
Senior Member
Регистрация: Nov 2017
Сообщения: 561
Благодарил(а): 3 раз(а)
Поблагодарили:
38 раз(а) в 30 сообщениях
|
Ответ: В помощь всем, кто кодит на С++
Цитата:
Что мне показалось не так: 1. На дворе 2019 год, поэтому странным выглядит распространение таких утилит в бинарном виде через форум. Это было нормально 10-20 лет назад, но сейчас это выглядит странно. Типовым средством распространения таких вещей сейчас является GitHub, где можно выложить и исходники, и бинарники. Не стоит стесняться или быть "собакой на сене", утаивая исходный код от общественности. Многие разработчики, которые не дают доступ к исходникам, на самом деле значительно преувеличивают их ценность. И наоборот, выложив исходники они "бесплатно получают": удобную обратную связь, которая может повысить их квалификацию; базоваю инфраструктуру поддержки проекта, включая баг-трекер и документацию, возможность коллективной разработки и т.д. Подытоживая, рекомендую выложить это дела на GitHub вместе с исходниками. Не стоит разработчикам мариноваться в собственном соку. Как пример, можно привести мой репозиторий: https://github.com/gelsrc/shm2mqtt или репозиторий "конкурентов" Segnetics: https://github.com/contactless/wb-mqtt-serial Я бы на месте Segnetics и все исходники SMLogix выложил, это могло бы через некоторое время за счет комьюнити привести к чуду. 2. Было бы здорово, если бы был предоставлен пример работы утилиты с различными вариантами, что бы ее работу можно было оценить просто глазами без необходимости проводить самостоятельный процесс тестирования. Это сильно упростит оценку вашей работы и может привлечь внимание большего числа пользователей. Лень и занятость никто не отменял. 3. Не принято распространять такие продукты rar-архвами, лучше использовать zip. Цитата:
Я правильно понял (в т.ч. по форумному статусу), что вы ушли из Segnetics? |
||
30.03.2019, 11:24 | #3 |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Ответ: В помощь всем, кто кодит на С++
1. Понимаете, во-первых, у меня нет там аккаунта, а во-вторых, посетителям гитхаба оно ни к чему, я считаю. А вот на форуме полно людей "около-программистов", которым будет полезно. А вот исходники им могут только навредить, по моему мнению. Да и потом, я сам не считаю что очень уж хорошо программирую на плюсах и конкретно в этом проекте не занимался правильными вещами, не использовал динамические выделения памяти, например, хотя в некоторых местах это было бы здраво и так далее. Короче говоря, конкретно код показывать не горю желанием, так как прогерам низкой квалификации он бесполезен, а прогеры высокой квалификации будут плеваться от того, что оно сделано "на отвали". На самом деле, оно просто сделано быстро, без особого старания, лишь бы работало. И работает.
А так вообще - да, я за опенсорс, однозначно. Нет там ничего такого "страшного" и "ноухау" в этом смлоджике, чтобы было что прятать. Как и нет ничего страшного в закрытых макросах конструктора. Просто макросы закрыты по тем же причинам, что я выше описал - люди слабые в fbd просто ещё больше запутаются от этого. А сильным в fbd оно и не надо. 2. Видео подходит? Могу записать, это не долго. 3. Я бы просто бинарник приложил, да вот только форум не ест файлы без расширения... Я ушел с началом 2019 года. Или, точнее, с концом 2018. __________________ В сегнетиксе не работаю с самого начала 2019 года. Последний раз редактировалось Arsie, 16.06.2022 в 14:38 |
30.03.2019, 15:40 | #4 | |||
Senior Member
Регистрация: Nov 2017
Сообщения: 561
Благодарил(а): 3 раз(а)
Поблагодарили:
38 раз(а) в 30 сообщениях
|
Ответ: В помощь всем, кто кодит на С++
Цитата:
Так же не стоит переживать, что GitHub "замусорится", т.к. он для этого и создавался. Обратите внимание, что GitHub (и другие аналоги) -- это не просто хранение кода, это инфраструктура для взаимодействия и поддержки кода. Если хотите, это сейчас необходимый элемент культуры разработки. Цитата:
Зато, если кто-то заинтересуется, то смогут и подсказать и идей подкинуть, и с доработками помочь. GitHub -- эффективный инструмент для этого: 1) удобный просмотр кода и документации (например, MarkDown-файлов); 2) баг-трекер, который можно использовать в т.ч. для обсуждения вопросов; 3) история кода и релизы; 4) pull request, командная разработка; 5) отдельное wiki, если нужно. Никто не обязывает всем этим пользоваться, но при необходимости можно задействовать то, что нужно. Цитата:
Вы же все равно при разработке тестировали приложение, готовили тестовые случаи, проверяли результат. Т.е. по идее, он у же в каком-то виде у вас должен быть. Тогда вы можете эти входные и выходные файлы так же выложить для того, что бы можно просто и быстро посмотреть и оценить вашу работу без необходимости самостоятельно делать тестовый FBD, заливать на контроллер, копировать туда программу, запускать, скачивать и только после этого смотреть. Вот, о чем я писал. Видео в данном случае не подходит. Последний раз редактировалось Gel, 30.03.2019 в 15:53 |
|||
01.04.2019, 07:00 | #5 |
Senior Member
Регистрация: Jun 2007
Адрес: Tyumen
Сообщения: 2 052
Благодарил(а): 20 раз(а)
Поблагодарили:
21 раз(а) в 21 сообщениях
|
Ответ: В помощь всем, кто кодит на С++
|
01.04.2019, 11:22 | #6 | ||
Сотрудник Segnetics
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 122
Благодарил(а): 15 раз(а)
Поблагодарили:
661 раз(а) в 605 сообщениях
|
Ответ: В помощь всем, кто кодит на С++
Цитата:
А тут непонятный бинарник, причём довольно-таки большого размера для обёртки библиотеки. Мне больше нравится использование localhost + modbus для работы из PHP. Но всё равно, Дмитрию спасибо за создание подобной обёртки, очень полезно! Добавлено через 30 минут Цитата:
Дело в том, что ему была доверена пусконаладка вентиляции нового цеха. За две или три недели Дмитрий так и не смог выяснить, что две заслонки из трёх (перепускная рекуператора и приточная) работают "наоборот". Также Дмитрий потерял немало времени на войну с частотниками, пример работы с которыми я создал ещё в 2006 году Ну и мелочи всякие. Такой вот опыт у преподавателя и участника "разовых проектов по интересной автоматизации". Больше всего вызывает раздражение именно тот факт, что наименее квалифицированный человек из Сегнетикса прикрывается (прикрывался) нашим именем, чтобы учить неопытных людей основам программирования и пуско-наладки. __________________ Программа делает то что написал программист, а не то что он хотел. Добро всегда побеждает зло. Кто победил - тот и добрый. Последний раз редактировалось Arsie, 01.04.2019 в 16:12 |
||
01.04.2019, 18:53 | #7 |
Senior Member
Регистрация: Oct 2010
Адрес: Москва
Сообщения: 403
Благодарил(а): 29 раз(а)
Поблагодарили:
2 раз(а) в 2 сообщениях
|
Ответ: В помощь всем, кто кодит на С++
Я правильно понял, что эту альтернативу вы предлагаете взамен извращений со шмемами?
А можно ссылочку, где о таком подходе почитать подробнее можно? (в идеале бы вообще с привязкой к SMH4 или хотя бы Триму)... |
01.04.2019, 18:53 | #8 | ||
Senior Member
Регистрация: Nov 2017
Сообщения: 561
Благодарил(а): 3 раз(а)
Поблагодарили:
38 раз(а) в 30 сообщениях
|
Ответ: В помощь всем, кто кодит на С++
Цитата:
Цитата:
Если чувствуется, что есть недостаток абстрактного мышления, умения локализовывать проблемы и скорости соображалки, то потренировать это. |
||
01.04.2019, 20:07 | #9 |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Ответ: В помощь всем, кто кодит на С++
Можно сколько угодно рассуждать о том, что происходило на объекте, но не следует замалчивать тот факт, что проверка монтажа не была моей задачей, как потом выяснилось. И "зря потраченное время" - это то, что я лазил там под потолком и разбирался, куда что монтажник перепутал. А перепутал он всё.
Частотники? Я с ними боролся потому, что с ними нет связи, ведь на объекте нет земли и проброшено всё отвратительным проводом ради экономии. О том, хороша моя преподавательская деятельность или нет - спрашивайте людей, кто через это прошел, кто за это заплатил деньги. Спрашивайте их, довольны они или нет, а не Арсения, который не удосужился ни одного видео посмотреть (бесплатно), хотя я ему предлагал оценить. Он как последователь общества плоской земли, не хочет разбираться, просто не верит. Вообще, зачем тут срач разводить? Давайте по конструктиву. Что касается примеров работы - они в сгенерированном классе присутствуют. Достаточно взять контроллер со шмемами в лоджике и запустить на нём бинарник. Когда я переделаю Shm на нормальный язык, я обязательно интегрирую это дело, чтобы всё собиралось в 1 файл класса Shm, работал с с++11 и более новыми, и всё это было легче чем сейчас. __________________ В сегнетиксе не работаю с самого начала 2019 года. |
02.04.2019, 06:50 | #10 | ||
Senior Member
Регистрация: Nov 2017
Сообщения: 561
Благодарил(а): 3 раз(а)
Поблагодарили:
38 раз(а) в 30 сообщениях
|
Ответ: В помощь всем, кто кодит на С++
Цитата:
Цитата:
С точки зрения передачи знаний и "маркетинга" (продвижения утилиты среди разработчиков) ваш результат не оптимальный. Документация, документация и еще раз документация, как завещал великий Ленин. Даже для таких небольших утилит. |
||
02.04.2019, 06:59 | #11 |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Ответ: В помощь всем, кто кодит на С++
Тем временем, выдалась ещё одна рабочая ночь, когда мне понадобилось для другого проекта использовать с++11 и шмемы одновременно... ШТОШ, этот день настал...
Не могу сказать, что задачу я решил "красиво", но я избавился от использования сегнетиксовой обёртки над обёрткой Райнера Лехрига. Райнер Лехриг молодец, к нему вопросов нет, умеет кодить. Правда, вопросы есть всё равно, зачем надо было использовать эту библиотеку, ведь она и под винду и под всё остальное. Ну да ладно, раз есть и работает - пусть будет. Из готовых альтернатив - это буст, а я не хочу использовать буст в данном проекте. Ещё из альтернатив - это mmap или стандартный же sys/shm.h, на котором и основывался Райнер. Однако, там надо будет предусматривать блокирующие вызовы и разрулить в posix всё это дело, а я не хочу сейчас этим заниматься. Да и по сути, придётся сделать то же самое, что сделал Райнер. Лирическое отступление кончилось. Теперь к делу: Новая версия программы выдаёт класс, который не использует обёртку Shm от сегнетикса, следовательно, может быть скомпилирован с С++11 и выше, и НЕ ПЕРЕОПРЕДЕЛЯЕТ стринги. УРА, товарищи! Прикладываю архив, в котором вы найдёте бинарник. Что делать дальше: 1. Копируйте бинарник на контроллер, на котором крутится проект, выглядящий так, примерно: После запуска бинарника, он вам выплюнет следующий вывод в консоль: Код:
root@localhost:/projects/memzv2# ./memz Найдено SHMEM переменных: 17 Размер памяти: 65606 Номер: Имя - Тип - Направление - Смещение 1: res1 - SHORT - READ - 65538 2: res2 - SHORT - READ - 65540 3: res3 - SHORT - READ - 65542 4: res4 - SHORT - READ - 65544 5: res5 - SHORT - READ - 65546 6: data1 - SHORT - WRITE - 65548 7: data2 - SHORT - WRITE - 65550 8: data3 - SHORT - WRITE - 65552 9: data4 - SHORT - WRITE - 65554 10: data5 - SHORT - WRITE - 65556 11: data6 - SHORT - WRITE - 65558 12: data7 - SHORT - WRITE - 65560 13: data8 - SHORT - WRITE - 65562 14: data9 - SHORT - WRITE - 65564 15: data10 - SHORT - WRITE - 65566 16: data11 - SHORT - WRITE - 65568 17: data12 - SHORT - WRITE - 65570 Файл класса находится здесь: /projects/shmemz.hpp Описание использования класса найдёте в этом же файле. Код:
root@localhost:/projects/memzv2# ./memz -p /home/mycode/shmemz.hpp 2. Описание использования класса есть в самом классе, однако, прикладываю ещё и код с примером main.cpp Код:
#include "rlsharedmemory.h" #include "shmemz.hpp" #define timesec 1 #define timensec 0 struct timespec tw = {timesec,timensec}; struct timespec tr; Logix logix; // Объявление класса smlogix int main(int argc, char ** argv){ int addict =0; for (;;) { nanosleep (&tw, &tr); if (addict <= 100){ addict++; } else { addict =0; } logix.data1 = addict; logix.data2 = logix.data1 + 1; logix.data3 = logix.data2 + 1; logix.data4 = logix.data3 + 1; logix.data5 = logix.data4 + 1; logix.data6 = logix.data5 + 1; logix.data7 = logix.data6 + 1; logix.data8 = logix.data7 + 1; logix.data9 = logix.data8 + 1; logix.data10 = logix.data9 + 1; logix.data11 = logix.data10 + 1; logix.data12 = logix.data11 + 1; logix.refresh(); printf("Принято:\n res1: %i\n res2: %i\n res3: %i\n res4: %i\n res5: %i\n", logix.res1, logix.res2, logix.res3, logix.res4, logix.res5); printf("Отправлено: data1: %i\n", logix.data1); } } Вначале инклюды. Кроме ваших - надо добавить библиотеку Райнера Лехрига. После - мой файл класса. Следующие строки - задержку по времени делаем, как обычно. Logix logix; - объявляем тип класса с большой буквы, название с маленькой. Название можете указать любое, но лоджикс очень уж удобно использовать. Переменная addict - просто инкремент, чтобы данные менялись. Далее мы обращаемся к переменным из проекта лоджика просто по их названию logix.data1 и так далее. Мы можем и читать их и писать, они там просто хранятся. data - я присваиваю сюда значения из своей программы, так как эти переменные созданы для записи, лоджик их читает как свои входы. res - здесь я получаю данные из лоджика, для меня это такие же переменные как и data, я просто использую их в своей программе. logix.refresh(); - самый полезный метод. Он записывает все данные, которые мы прописали в переменные, и считывает все данные, которые прописал лоджик. То есть, все данные просто обновляются. После этого пара выводов на экран. Если нужны выборочные чтение/запись, то можно использовать метод класса logix, образованный по имени переменной. Например, для переменной data1 будет метод logix.setdata1(value); где value - это число, которое мы запишем сразу в лоджик. Для чтения - аналогично value = logix.getres1(); Фух. Надеюсь, это хоть кому-нибудь будет нужно =) И да, можно поудалять всякой ненужной теперь ерунды из мейкфайла и архива проекта. Мой мейкфайл теперь выглядит так: Код:
#makefile Gromov Dmitry. Assamble all shmem shit. CC=g++ CFLAGS=-c -Wall -Ofast -march=native -std=c++11 LDFLAGS=-lpthread SOURCES=main.cpp rlsharedmemory.cpp rlwthread.cpp OBJECTS=$(SOURCES:.cpp=.o) EXECUTABLE=program all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o $@ .cpp.o: $(CC) $(CFLAGS) $< -o $@ clean: rm -rf *.o Отдельно замечу, что если в проекте меняются типы переменных - обязательно обновите файл этого класса (запустите программу на контроллере ещё раз). Класс не предоставляет проверку соответствия переменных тому, что мы хотим. Потом и это я тоже добавлю, но не сейчас. Работать можно уже сейчас. Уже полноценно работать. __________________ В сегнетиксе не работаю с самого начала 2019 года. |
02.04.2019, 12:20 | #12 | ||
Guest
Сообщения: n/a
|
Ответ: В помощь всем, кто кодит на С++
Цитата:
Цитата:
|
||
02.04.2019, 14:08 | #13 | |
Уволен из Сегнетикс
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили:
1 раз в 1 сообщении
|
Ответ: В помощь всем, кто кодит на С++
Цитата:
Так это ж разные подходы. Можно без mmap делать, а можно с ним. __________________ В сегнетиксе не работаю с самого начала 2019 года. |
|