Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 11.09.2023
Сообщений: 4

Разделяемая память Linux на ПЛК Matrix

11.09.2023, 14:44. Показов 1226. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Я Новичёк в С++...
И так в кратце. Есть ПЛК Сегнетикс Матрикс работающий на Линукс. Для него есть своя среда разработки со своим языком ФБД.
Язык ограничен. Но типа есть возможность писать программы на С++ и взаимодействовать с ФБД через разделяемую память.
Фирма предоставляет Виртуальную машину с уст. ОС Линукс, а в ней тулчейн для немного другого контоллера и пример
программы взаимодействия ФБД и С++ через разделяему память. Пример оказалься не рабочий. Фирма отказалась помагать
с этим примером, типа они осуществляют тех поддержку только по ФБД.
Делать нечего пришлось влазить самому.
Тулчейн для копиляции в ОС машины был заменён на более современных и подходящий
под ЦПУ ПЛК.
При компиляции примера на С++ вылазать ошибки. Сам пример основан на опенсоурс проекте работы с разделяемой п.
Из всего проекта примера проблемы в двух файлах:
Изначально в примере был класс string. Форумчанин с форума сегнетикс посоветовал его переименовать в мойстрин,
мотивировав что класс стринг в С++ уже есть. Но это не помогло.
Компилятор ругается на строчкe
it = m->find(&s);
error: no matching function for call to 'std::map<mystring*,ShmValue*, mystring>::find(std::cxx11::string*)'

Мои попытки изменить эту строчку не приводят к желаемому результату.
Где ORIGINAL это то что было изначально, где Роман это уже мои попытки изменить.
Где то вычитал что в какое то время изменился стандарт языка и такое написание уже не работает.
вводи команду #define _GLIBCXX_USE_CXX11_ABI 0/1 по разному 0/1, 0, 1. Не помагает.
Прошу Направьте на правильный путь.
В архиве полный проект.


C++
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
// Файл заголовков shm.hpp
#include <stddef.h>
#include <string.h>
#include <map>
                #include <iostream>
//ROMAN #include <algorithm>
 
#include "rlinifile.h"
#include "rlsharedmemory.h"
//Roman:       #define _GLIBCXX_USE_CXX11_ABI 0/1
 
using namespace std;
 
enum { BOOL, SHORT, LONG, FLOAT };
 
class ShmValue {
 
    int typ;
    int off;
    
    public:
    ShmValue(int _type, int _off) : typ(_type), off(_off) { };// конструктор 
    int offset(void) { return off; };
    int type(void) { return typ; };
};
//ORIGINAL:
/*
class string {
    char * s;
    char alloc;
    public:
    string(const char * str) { s = new char[(strlen(str) + 1)]; strcpy(s, str); alloc = 1; };
    string() { alloc = 0; };
    ~string() { if(alloc) { delete s; alloc = 0; }; };
    bool operator()(const string * a, const string * b) { return strcmp(a->s, b->s) < 0; };
    bool operator()(const char * a, const char * b) { return strcmp(a, b) < 0; };
    string & operator=(const char * a) { s = (char*)a; return *this; };
};
 */ 
//ROMAN:
class mystring {
    char * s;
    char alloc;
    public:
        // Roman:
        // char *ss; //==============End Roman 
    mystring(const char * str) { 
            s = new char[(strlen(str) + 1)]; 
            strcpy(s, str); 
            alloc = 1;            
        }; //конструктор
        // Roman:
        char *ss = s;
        //==============End Roman 
              
    mystring() { alloc = 0; };
    ~mystring() { if(alloc) { delete s; alloc = 0; }; };
    //Original:         bool operator()(const mystring * a, const mystring * b) { 
        //Roman:  
        //#define _GLIBCXX_USE_CXX11_ABI 0/1
        
        bool operator()( mystring *a, mystring *b ) {
        //Original: 
            return strcmp(a->s, b->s) < 0; };
        //Roman:   return strcmp( a->s, b->s)  < 0;  };
           
    bool operator()(const char * a, const char * b) 
             { return strcmp(a, b) < 0; };
 
    mystring & operator = (const char *a) { 
                s = (char*) a; 
                return *this; 
        };
        /*/ROMAN test
        char *dld;
        int operator()(const char *dd){
          // string dld="Hello";
           cout << dd;
        return 0; };
        */
};
 
//original: typedef map <string*, ShmValue* , string> map_t;
//ROMAN NEW:
typedef map<mystring*, ShmValue*, mystring> map_t;
 
 
class Shm {
 
        map_t map_coil;
        map_t map_status;
        map_t map_inreg;
        map_t map_holdreg;
        map_t *maps[4];
        rlSharedMemory  * shm;
 
        int     parseSect(rlIniFile & ini, const char * sect, map_t * list);
    int parseItem(const char * name, map_t * list);
        int     parseHeader(rlIniFile & ini, const char * item, int * off, int * qty);
//original:  
        int     isFound(const char *name, map_t::iterator &, map_t * m);
//ROMAN:           int     isFound(const char *name, map_t::iterator , map_t * m);
        int     set(const char *name, void * , int size, map_t * first);
        int     set(int, void * , int size);
        void *  get(const char * name, void *, int, map_t *, map_t *);
    int     get(const char * name, int);
        void *  get(int, void*, int);
 
        
        public:
        Shm(const char * name);
        ~Shm();
        int     getType(const char * name);
        int     getOffset(const char * name);
 
        char    getBool(const char * name);
        char    getBool(int);
    int     get(int, char*);
        int     get(const char * name, char*);
        int     setBool(const char * name, char val);
        int     setBool(int, char val);
        int     set(const char * name, char val);
        int     set(int, char val);
 
        short   getShort(const char * name);
        short   getShort(int);
        int     setShort(const char * name, short val);
        int     setShort(int, short val);
        long    getLong(const char * name);
        long    getLong(int);
        int     setLong(const char * name, long val);
        int     setLong(int, long val);
        float   getFloat(const char * name);
        float   getFloat(int);
        int     setFloat(const char * name, float val);
        int     setFloat(int, float val);
};

C++
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
// Файл shm.cpp
#include <stddef.h>
#include <string.h>
#include <map>
//ROMAN 
#include <algorithm>
 
#include "rlinifile.h"
#include "shm.hpp"
//Roman:    #define _GLIBCXX_USE_CXX11_ABI 0/1
 
 
int Shm::parseHeader(rlIniFile & ini, const char * item, int * off, int * qty)
{
    const char * ptr, *sect = "Slave";
    int ret = 0, tmp;
    
    ptr = ini.text(sect, item);
    if(ptr) {
    ret = sscanf(ptr, "%i,%i,%i", &tmp, off, qty);
    }
    return ret;
}
 
 
// parse Item (пер. разобрать элемент)
int Shm::parseItem(const char * name, map_t * list)
{
    int tmp, size, type, off;
    int ret = sscanf(name, "%i,%i,%i,%i,%n", &tmp, &tmp, &type, &off, &tmp);
    // sscanf -читает данные из массива адресуемого name
    //%i целое число в любом формате, %n цело равное кол-ву прочитанных символов
    //
    //
    if(ret == 4) {
        ShmValue * val = new ShmValue(type, off);
        name += tmp;
        ret = sscanf(name, "%i,%i,%n", &tmp, &tmp, &tmp);
        if(ret < 2) {
            tmp = 0;
        }
        
        size = strlen(name);
    char * ptr = (char*)alloca(size);// alloca выделяет size байт из стека системы (не из кучи)
    if(ptr) {
        memcpy(ptr, name, size);
            if(ptr[size - 1] == '\r')
            ptr[size - 1] = 0;
    }
    else
        ptr = (char*)"";
        
        mystring * st = new mystring(ptr+tmp);
//        syslog(LOG_INFO, "%s %i", st->c_str(), off);
  //VREMENNO  UDALENO ROMAN:  
        list-> insert(  pair <mystring*, ShmValue*> (st, val)  ); 
        //<x,y> -шаблон
        //"->" это доступ к элементу структуры через указатель 
    }
    return 0;
}
 
int Shm::parseSect(rlIniFile & ini, const char * sect, map_t * list)
{
    const char * ptr = ini.firstName(sect);
    while(ptr) {
    const char * name = ini.text(sect, ptr);
    parseItem(name, list);
    ptr = ini.nextName(sect);
    }
    return 0;
}
 
Shm::~Shm(){
    for(unsigned char i = 0; i < sizeof(maps) / sizeof(map_t *); i++) {
    for(map_t::iterator it = maps[i]->begin(); it != maps[i]->end(); it++) {
        delete it->first;
        delete it->second;
    }
    }
    delete shm;
}
 
//для начальной инициализации 
Shm::Shm(const char * name)
{       //maps[] -это массив указателей класса map_t
    maps[0] = &map_coil; 
    maps[1] = &map_status; //вот тут похоже просто другое название 
                           // по логике, должно быть "Instat"
    maps[2] = &map_inreg; maps[3] = &map_holdreg;
    const char *items[] = { "Coil", "Instat", "Inreg", "Holdreg" };
 
    rlIniFile ini;
    //читаем файл
    ini.read(name);
    int size = 0;
    for(unsigned char i = 0; i < sizeof(items) / sizeof(const char *); i++) {
        int ret, off, qty;
        ret = parseHeader(ini, items[i], &off, &qty);
        if(ret == 3) {
            size += qty;
            parseSect(ini, items[i], maps[i]);
        }
    }
    const char * ptr = ini.text("Slave", "ShmSize");
    if(ptr && *ptr)
        size = atoi(ptr);
    shm = new rlSharedMemory("/dev/shm/wsi", size);
}
 
// ищет заданное слово и возвращает итератор на него
int Shm::isFound(const char *name, map_t::iterator & it, map_t * m)
{
//ORIGINAL:     string s;
    // ROMAN:    
    string s;//, *sn;
 
    s = name;
    
//ORIGINAL:  it = m->find(&s);
//Roman:  
    it= find(m->begin(), m->end(), &s);
     //strcpy(sn, m->**ss); 
    //it = m->find(sn);
//====================End Roman    
 
    if(it != m->end())
    return 1;
    return 0;
}
// Получаем ??? в зависимости от what=0/1
// what=0 -type
int Shm::get(const char *name, int what)
{   // создаём массив указателей на классы
    map_t *maps[] = { &map_coil, &map_status, &map_inreg, &map_holdreg };
    
    for(unsigned char i = 0; i < sizeof(maps) / sizeof(map_t*); i++) {
    map_t::iterator it;
    if( isFound(name, it, maps[i]) )
        return what ? it->second->offset() : it->second->type();
    }
    return -1;
}
//==============================================================
//==============================================================
//==============================================================
int Shm::getType(const char * name){
    return get(name, 0);
}
 
int Shm::getOffset(const char * name)
{
    return get(name, 1);
}
 
void * Shm::get(int off, void * buf, int size){
    if(shm->read(off, buf, size) == size)
    return buf;
    return NULL;
}
 
int Shm::set(int off, void * val, int size){
    return shm->write(off, val, size);
}
 
void* Shm::get(const char *name, void * buf, int size, map_t * first, map_t * second)
{
    map_t::iterator it;
    if(isFound(name, it, first) || isFound(name, it, second)) {
    return get(it->second->offset(), buf, size);
    }
    return NULL;
}
 
int Shm::set(const char *name, void * val, int size, map_t * first)
{
    map_t::iterator it;
    if(isFound(name, it, first)) {
    return set(it->second->offset(), val, size);
    }
    return -1;
}
 
char Shm::getBool(const char *name){
    char buf;
    return get(name, &buf, 1, &map_status, &map_coil) ? buf : -1;
}
 
char Shm::getBool(int off){
    char buf;
    return get(off, &buf, 1) ? buf : -1;
}
 
int Shm::setBool(const char *name, char val){
//    if(last->second->type() == BOOL || strcmp(last->first, name) != 0)
    val = !!val;
    return set(name, &val, 1, &map_coil);
}
 
int Shm::setBool(int off, char val){
//    if(last->second->type() == BOOL || strcmp(last->first, name) != 0)
    val = !!val;
    return set(off, &val, 1);
}
 
short Shm::getShort(const char *name){  
    short buf;
    return get(name, &buf, 2, &map_inreg, &map_holdreg) ? buf : -1;
}
 
short Shm::getShort(int off){
    short buf;
    return get(off, &buf, 2) ? buf : -1;
}
 
int Shm::setShort(const char *name, short val){
    return set(name, &val, 2, &map_holdreg);
}
 
int Shm::setShort(int off, short val){
    return set(off, &val, 2);
}
 
long Shm::getLong(const char *name){
    long buf;
    return get(name, &buf, 4, &map_inreg, &map_holdreg) ? buf : -1;
}
 
long Shm::getLong(int off){
    long buf;
    return get(off, &buf, 4) ? buf : -1;
}
 
int Shm::setLong(const char *name, long val){
    return set(name, &val, 4, &map_holdreg);
}
 
int Shm::setLong(int off, long val){
    return set(off, &val, 4);
}
 
float Shm::getFloat(const char *name){
    float buf;
    return get(name, &buf, 4, &map_inreg, &map_holdreg) ? buf : -1;
}
 
float Shm::getFloat(int off){
    float buf;
    return get(off, &buf, 4) ? buf : -1;
}
 
int Shm::setFloat(const char *name, float val){
    return set(name, &val, 4, &map_holdreg);
}
 
int Shm::setFloat(int off, float val){
    return set(off, &val, 4);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.09.2023, 14:44
Ответы с готовыми решениями:

Разделяемая память linux, Ошибка сегментирования (сделан дамп памяти)
здравствуйте! помогите с задачей. Четыре дочерних процесса выполняют некоторые циклы работ, передавая после окончания ...

Разделяемая память POSIX IPC как узнать, что память выделена и её уже можо использовать?
1. Описание проблемы: Две программы. Одна пишет в разделяемую память, другая читает. Из-под читающей программы read невозможно понять...

Разделяемая память
Добрый день!!! Столкнулся вот с какой проблемой, мне необходимо написать программу крестики-нолики через разделяемую память. А как это...

6
0 / 0 / 0
Регистрация: 11.09.2023
Сообщений: 4
11.09.2023, 14:47  [ТС]
Архив проекта во вложении
Вложения
Тип файла: rar Segnetics_Linaro.rar (588.1 Кб, 7 просмотров)
0
147 / 135 / 50
Регистрация: 14.05.2021
Сообщений: 642
11.09.2023, 15:05
Цитата Сообщение от RomanBRIZ Посмотреть сообщение
error: no matching function for call to 'std::map<mystring*,ShmValue*, mystring>::find(std::cxx11::string*)'
Если у тебя в мапе ключи mystring, то и find делай по mystring, а не по string.
Тебе, правда, нужен свой класс строки? Чем std::string не угодил?
0
0 / 0 / 0
Регистрация: 11.09.2023
Сообщений: 4
11.09.2023, 17:36  [ТС]
Цитата Сообщение от psergee Посмотреть сообщение
Если у тебя в мапе ключи mystring, то и find делай по mystring, а не по string.
Тебе, правда, нужен свой класс строки? Чем std::string не угодил?
Я очень плохо знаю С++, фактически только начал его изучать... Не совсем уловил что хочешь мне сказать.
мар у меня содержит mystring. m->find(&s) как я понимаю это и есть обращение к переменной map_t объявленного типа map.
Как понять *то и find делай по mystring, а не по string*? А разве сейчас иначе? Как это видно?
Интересно то что на конструкцию типа m->end() компилятор не ругается.
По поводу класса. В коде создаётся свой класс и поэтому он не может называться так же как и стандартный класс string. Что в принципе логично. Если создаваемый класс аналогичен классу стринг, то тогда он не нужен. Но я уверен что это не полный аналог.
0
599 / 421 / 136
Регистрация: 02.10.2008
Сообщений: 1,796
Записей в блоге: 1
12.09.2023, 05:52
Цитата Сообщение от RomanBRIZ Посмотреть сообщение
C++ (Qt)
1
2
3
4
5
string s;//, *sn;
s = name;
//ORIGINAL: it = m->find(&s);
//Roman: 
 it= find(m->begin(), m->end(), &s);
сфигали? у тебя объявление string s;
1
147 / 135 / 50
Регистрация: 14.05.2021
Сообщений: 642
12.09.2023, 10:13
Цитата Сообщение от RomanBRIZ Посмотреть сообщение
А разве сейчас иначе?
Да, сейчас иначе.
Цитата Сообщение от RomanBRIZ Посмотреть сообщение
Как это видно?
std::map<mystring*,ShmValue*, mystring>
find(std::cxx11::string*)
1
0 / 0 / 0
Регистрация: 11.09.2023
Сообщений: 4
12.09.2023, 13:51  [ТС]
Ой БАЛДА, ой балда... Это я про себя. Недели три я этот файнд разве что на китайском не писал и не изучал...
Drfaust and psergee ОГРОМНОЕ СПАСИБО что так оперативно откликнулись.
Впереди меня ждут ещё чудные дела, связь Линукс и Винды по протоколу UDP...
Ещё раз спасибо.

string s;
заменил на
mystring s;
И прога начала компилироваться...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.09.2023, 13:51
Помогаю со студенческими работами здесь

Разделяемая память
Два процесса обмениваются данными через разделяемую память. Первый процесс посылает второму массив элементов типа float и строку...

разделяемая память
Всем привет! подскажите, пожалуйста, как решить такую проблему: У меня есть программа которая открывает 2 консольных окна. есть...

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

Разделяемая память
Как создать разделяемую память?? какие функции можно использовать. Я вроде нашел CreateFileMaping. Но не пойму какие ей параметры нужно...

Разделяемая память
Добрый день. Скажите, если в разделяемую память поместить файл, через какое время он затрётся, и обратиться к нему будет невозможно? Что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru