Jump to content
Форум по продукции MOXA

oiv_1968

Пользователи
  • Posts

    163
  • Joined

  • Last visited

Everything posted by oiv_1968

  1. Если я желал бы: кросс-компиляторы только под x86 Вообще не создавал бы эту тему. Вот и хочу запустить кросс-компилятор под x86 на устройстве "свисток", с линуксом именно на x86, который можно таскать в кармане... коли на ARM нет возможности. Всё компилирует этот MEEGO T02(с установленной UBUNTU на борту)... но зараза как прсто сервер не работает. Требует, чтобы дисплей присутствовал . Проблема конечно решаемя через HDMI-VGA конвертер... с подключением к VGA разъёму "обманных резисторов" и ещё с рядом танцев с бубном. Но уж очень всё вместе громоздко выходит... и совсем не оперативно .
  2. По эксплуатации включение фанук происходит по необходимости, в то время как ia240 в работе круглочуточно совместно со Step7. Нет никаких возможностей, кроме как через Веб странице (на ia240) через пульт обучения (на Fanuc) контролировать и изменятьть необходимые параметры (номера типов изделий, контроль состояния ряда параметров). Номера типов форм читаются из Step7 и записываются в него средствами ia240 по Modbus через порты вводв-вывода. Так что кроме Сеть Веб - это что за хрень? ничего в наличии нет! Конечно можно поюзать FTP, но редактировать нечем!
  3. Доброго времени суток! Имеется оборудование с наличием IA240 для работы с устройствами Modbus по последовательному порту. Кроме этого по ethernet устройство Fanuc (робот) подключен. Случаются моменты в начале работы, когда Fanuc "не видит" по сети ВЕБ сервер на IA240, если более точно подача питания в начале смены не "запустила" как надо IA240. Повтороное выключение и включение IA240 решило апрблему... но может есть возможность как то исправить это. Устройство не проработало года. Выглядит как не "поднята" сеть на нём, не создан RAM диск в ОЗУ... ну и понятно ничего не запущено. Понимаю, что можно и сторожевой таймер... но по соображениям, что он программный и с ним будет тоже самое. Хотя возможно я не прав! Есть ли варианты решений? Заранее спасибо!
  4. Простите не понял... возможно и вы мена не поняли. Особых решений за время доставки и соответственно деньги затруднительно. Потому как это моя инициатива и одобрение затрат не будет. Оборудование уже в работе и всё делаю на "горячую"... в процессе пауз рабочего цикла. И программы и аппаратную часть. На быструю покупку роутеров (благо их в магазинах навалом и купить за свои деньги и предоставить товарный чек не проблема) есть одобрение. Надо только такой вариант, что бы антенна торчала из шкафов и в них (шкафы)не попадала пыль. Потому как в Ia240Lx есть ещё 3 свободных последовательных порта(RS485)... и соответственно ещё три проекта в него можно засунуть... средней тяжести проектов. Он позволит. Но хочу в локальную сеть, которая находится в шкафу индукционной печи ABP... через сервер в локальную сеть предприятия.
  5. Имеется оборудование в цехе... за узел управления принят IA40. Появилась необходимость вывести его сеть по беспроводной связи. Всё понятно и без проблем... но выбрать поутер с антенной, которая внешне должна находиться на шкафу затрудняюсь. Собственно роутер любой пригоден (но способный поддерживать режим клиента - их должно быть два)... волнует решение с антенной для него. Расстояние не большое... Связь испытывалась, но вот антенна на шкафу вопрос! Прошу помощи! Заранее спасибо!
  6. Если я желал бы: кросс-компиляторы только под x86 Вообще не создавал бы эту тему. Вот и хочу запустить кросс-компилятор под x86 на устройстве "свисток", с линуксом именно на x86, который можно таскать в кармане... коли на ARM нет возможности.
  7. Отчаялся... но ожидаю из AliExpress "свисток" на основе ATOM с установленным UBUNTU (Не Debian, но всё же). Вот на него и поставлю компилятор. Он же x86 совместимый... то есть обычная Linux машина... только переносимая в кармане. У меня есть в наличии разные девайсы, но на таком процессоре нет. ARM-мы люблю очень, но вот на них и не смог найти возможность компиляции для IA240LX/UC-7112LX-plus.
  8. Простите за мою медлительность... Только вчера отыскал... но отписаться сам не мог: #include <sys/stat.h> Тоесть в моём примере надо применять добавление в заголовок. Путь для компиляции изменить не додумался. Вообще вот что вышло (смотрите текстовый файл в корне): shared_mem.zip Спасибо!!!
  9. Доброго времени суток. Вроде Linux... но при компиляции: igor@debian-i:/home/ext_projects/shared_mem/w1$ make /usr/local/arm-linux/bin/arm-linux-gcc -c -Wall main.c -o main.o main.c: In function `main': main.c:41: error: `S_IRWXO' undeclared (first use in this function) main.c:41: error: (Each undeclared identifier is reported only once main.c:41: error: for each function it appears in.) main.c:41: error: `S_IRWXG' undeclared (first use in this function) main.c:41: error: `S_IRWXU' undeclared (first use in this function) make: *** [main.o] Ошибка 1 Вот этого (пока бесполезный пример для пробы): w1.zip На другой Linux машине нормально - стоит поправить Makefile/ Хочу применить... не через сокеты как ранее, а "напрямую" если коды процессов на одном устройстве. Заранее спасибо!
  10. Спасибо за ответ! Смогу "прощупать" это только завтра - устройство на работе!
  11. Доброго времени суток! Да именно так! между ETH1 и ETH2! Необходимо "пропускать" с одного интерфейса на другой. Спасибо!
  12. Доброго времени суток!!! Прошу помощи в настройке "сквозного прохода" с LAN1 на LAN2 и наоборот на UC7112Plus. Ранее настроил по рекомендациям Raspberry Pi 3 (WiFi<-->ETH0), но подобная методика (возможно из-за версии) не прокатила на UC7112Plus. Конкретно интересует пример... ну или решение! Заранее благодарен!
  13. Войдите по последовательному порту - там вы уже в ROOT, поменяйте пароль для ROOT (root) поменяйте пароль для root командой passwd. Потом заходите на устройство хоть по telnet, хоть по ssh согласно новым паролям.
  14. Перенастроить не поздно никогда - войдите по последовательному соединению (в комплекте есть шнур) и поменяйте, что хотите. Но если к заводским настройкам то... нажимаете reset и подаёте питание, при этом ресет удерживайте секунд 5. Всё Ваш девайс чист как невеста!
  15. Ранее делал HTTP прокси.... но то познавательные опыты... хоть и рабочие. Может кто делал нормальный.... относительно нормальный. Сейчас на других устройствах (Raspberry Pi) спокойно собирается из прилагаемого архива. Скомпилить его средствами arm-linux-gcc никак не выходит. На Си есть самодельные наработки... но сами понимаете... Может есть у кого опыт или другое решение. Спасибо!
  16. Всевозможный софт для установки (apache и т.п.)- потребуется устанавливать. Тут на форуме есть (уже давнишние)темы - про "WEB+PHP", "MC" и т.д.. Копирование и т.д. произвожу средствами "mc" на ПК. Понятное дело, что в /etc надо с правами root MOXA (не PC а именно UC-7112-plus). Удобно "установить" MC и на саму MOXA. для просто FTP доступа (пример для ROOT): igor@debian-i:~$ ftp 192.168.0.240 Connected to 192.168.0.240. 220 Moxa FTP server (GNU inetutils 1.4.1) ready. Name (192.168.0.240:igor): root 331 Password required for root. Password: 230- 230- #### #### ###### ####### ###### ## 230- ### #### ### ### #### #### ### 230- ### ### ### ### ### ## ### 230- ### #### ## ## ### # #### 230- #### # ## ### ### ### ## ## ## 230- ## ## # ## ### ## #### # ## 230- ## ### ## ## ## ## #### # ### 230- ## ## # ## ## ## ### ####### 230- ## ## # ## ### ### ##### # ## 230- ## ### ## ### ### ## ### # ### 230- ## ### ## ## ## ## ### ## ## 230- ## ### ## ## ## # ### # ## 230- ###### # ###### ######## ####### ########### ###### 230- 230- For further information check: 230- http://www.moxa.com/ 230- 230 User root logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 200 PORT command sucessful. 150 Opening ASCII mode data connection for '/bin/ls'. -rw------- 1 root root 320 Sep 19 04:25 .bash_history -rw-r--r-- 1 root root 81 Apr 29 2013 .bash_profile -rw-r--r-- 1 root root 81 Apr 29 2013 .bashrc drwx------ 2 root root 4096 Jun 4 2015 .cedit drwxr-xr-x 2 root root 4096 Jul 29 20:47 .mc drwx------ 2 root root 4096 Apr 9 2016 .ssh -rw-r--r-- 1 root root 0 Mar 14 2015 rm 226 Transfer complete. ftp> help Commands may be abbreviated. Commands are: ! dir mdelete qc site $ disconnect mdir sendport size account exit mget put status append form mkdir pwd struct ascii get mls quit system bell glob mode quote sunique binary hash modtime recv tenex bye help mput reget tick case idle newer rstatus trace cd image nmap rhelp type cdup ipany nlist rename user chmod ipv4 ntrans reset umask close ipv6 open restart verbose cr lcd prompt rmdir ? delete ls passive runique debug macdef proxy send ftp> команда ftp <ваш IP> запускается на вашем ПК с Linux. recv <файл> - читаем файл с устройства в текущую директорию вашего ПК, а send <файл> - соответственно из вашего ПК в устройство. Обратите внимание на binary - возможно потребуется переход в режим двоичного обмена (иначе запускаемые программы могут не запускаться). Наберите man ftp - для получения полной информации о пакете ftp на вашем ПК. Для файлов, необходимых для запуска на устройстве возможно потребуется указать, что её можно запускать в консоли устройства: chmod +x <ваш файл>. В документации на устройство это всё есть.
  17. Доброго времеени суток! Для ранее рассмотренного сервера modbusRTUserverS добавлена dll-ка, которая обеспечивает связь с устройствами по Modbus RTU, программ написанных в Visual Studio(C++) - испытано. И Delphi - производится испытание. Собстенно эта dll-ка обеспечивает связь с UC-7101, UC7112plus, IA240(241), на котоых запущен сервер и к котрым подключены устройства по Modbus RTU. Одним словом написанная вами прогамма под Windows XP через эту dll-ку будет работать с сервером modbusRTUserverS. Собственно со стороны dll пока поддерживается только несколько команд: чтение регистров хранения : 3 чтение регистров ввода : 4 запись в единичный регистр : 6 запись данных в регистры : 16 Список функций dll: Init - без параметров, возвращаемых значений нет. Производит инициализацию структуры. cMRTUsConnect (соединение) - входные параметры: 1) указатель на строку типа char, котрая содержит IP адрес сервера modbusRTUserverS например "192.168.0.246"; 2) номер порта сервера modbusRTUserverS. Тип int При удачном выполнении (соединении) возвращает 0. При этом в dll запускается рабочий поток поддержания связи и обмена с сервером modbusRTUserverS и соответсвенно устройствами, подключенными к MOXA по Modbus RTU. Другие возвращаемые значения: 1 - ошибка сокета 2 - ошибка соединения 3 - не запустился рабочий поток dll-ки Возвращаемые значения типа int. cMRTUsCMD - собственно работа с устройствами. Входные параметры: 1) адрес устройства на шине Modbus RTU. Параметр типа unsigned char (uint8, byte ...) 2) номер функции (3, 4, 6, 16) - параметр типа unsigned char (uint8, byte ...) 3) началтный регистр устройства - параметр типа unsigned short (uint16 ...) как принято в протоколе. 4) количество регистров для записи (команда 16) или чтения (команды 3 и 4) - параметр типа unsigned short (uint16 ...) как принято в протоколе. Для команды 6 - запись в один регистр данный параметр игнорируется. 5) указатель на начальный регистр типа unsigned short (uint16 ...) как принято в протоколе. В случае чтения (функции 3 и 4) по указателю в этот массив будут записаны регистры из устройства. В случае записи из этого массива будут записаны значения в регистры устройства. 6) фрейм (кадр) - параметр типа int специально для сервера (0..2) позволяет разделить команды для устройства (смотрите далее) 7) флаг - параметр типа int - определяет цикличность. Пример (для C++); cMRTUsCMD ( 4 - адрес устройства 3 - чтение регистров 25 - начальый регистр 1 - в количестве одного &rd - прочитать в указанное место 0 - используем кадр 0 1 - и при этом сервер будет непрерывно читать данные из этого регистра потом и без нас ) Все действия выполняются в потоках как самого сервера, так и в нашей dll-ке. Так же кроме dll-ки cMRTUsS, измененный сервер modbusRTUserverS - в CodeLite, в директории Release откомпилирован специально для UC-7101-LX. Для UC-7112-LX-Plus и IA240(241)-LX применить другой компилятор! Не ругайтесь Спасибо! Если угодно, то проект (исходники в Visual Studio 2005) cMRTUsS.dll могу предоставить. Тут в архиве только готовая к работе, потому как хочу проверить совместимость(работоспособность) для Дельфи. В Дельфи я ноль, а моим сотрудникам нет времени уделить достаточно времени, а я ухожу в отпуск. В C# у меня не получается обращение по указателям. В нормальном C/C++ всё работает - сам делаю и пробую. cMRTUsS.zip modbusRTUserverS.zip
  18. Возник вопрос - может добавить "стандартный" ModbusTCP в сервер (как открытие дополнительного TCP порта? Правда на мой взгляд этот вариант "малоинформативный" с точки зрения контроля результата связи, режима повторения запроса и ещё ряда "функций". Или просто сделать как SERIAL<---->TCP? Но это будет либо как дополнение, либо как вариант компиляции с указанием соответствующих ключей. И ещё - это кому надо? Сейчас добавлен "второй тип" обращения - при котором запись обращения к устройству удаляется из цикла после успешного выполнения или при истечении "времени жизни" цикла обращения к указанному устройству по Modbus RTU. (для каждого устройства оно своё - при соединении по TCP), "первый тип" применяется при непрерывной работе с устройством - удобно для чтения параметра (особенно если связь по Modbus имеет случайные сбои - по причине монтажа). Время жизни возобновляется при обращении к modbusRTUserverS ("S"-значит "serial port" потому как существует тестовый вариант TCP(modbusRTUserverTCP) - испытан на устройстве от ADVANTECH - но по смыслу "бестолковый" - тоже самое но в массиве набор TCP адресов и портов). Сейчас идёт работа над ошибками. Кроме того возможно будет переделка для компиляции в режиме клиента, когда одна программа будет иметь доступ к нескольким сетям Modbus на разных устройствах, соединенных между собой по TCP. это кем-нибудь будет применяться? Заранее Спасибо!
  19. Извините меня за беспокойство! Эта ошибка найдена! А именно в сервере связи: ........ } break; case _type_from_modbus3: #if(_dbg > 0) printf("mwork ServConn for mb3\n"); #endif switch(scop) { case _cop_wr: //запись данных в труктуру Modbus 3 // memcpy(&work.mb3s, rbuf + _daddr, sizeof(MODBUS3_SERVER)); // (*(U16*)(sbuf + _tcp_szl)) = 0; res = 0; break; case _cop_rd: //передача данных в Modbus 3 (*(U8*)(sbuf + _type)) = stype; ssize++; (*(U8*)(sbuf + _cop)) = scop; ssize++; // memcpy(sbuf + _daddr, &work.mb3c, sizeof(MODBUS3_CLIENT)); ssize += sizeof(MODBUS3_CLIENT); // (*(U16*)(sbuf + _tcp_szl)) = ssize; res = ssize; break; case _cop_rdwr: //передача данных в Modbus 3 // memcpy(&work.mb3s, rbuf + _daddr, sizeof(MODBUS3_SERVER)); // (*(U8*)(sbuf + _type)) = stype; ssize++; (*(U8*)(sbuf + _cop)) = scop; ssize++; // memcpy(sbuf + _daddr, &work.mb3c, sizeof(MODBUS3_CLIENT)); ssize += sizeof(MODBUS3_CLIENT); // (*(U16*)(sbuf + _tcp_szl)) = ssize; res = ssize; break; default: (*(U16*)(sbuf + _tcp_szl)) = 0; res = 0; break; } // - А в этой строке дожен быть break; case _type_from_modbus4: #if(_dbg > 0) printf("mwork ServConn for mb4\n"); #endif switch(scop) .................... таким образом "разбор" данных завершался для процесса 3 и начинался "разбор" процесса 4 Ещё раз простите! Спасибо что откликнулись!
  20. Именно так! modbusRTUserverS - обеспечение процесса обмена по Modbus RTU (CRC, контроль связи, повторение и т.п.); IA240_modbus(1..4) - логика работы; сервер связи обмен между IA240_modbus(1...4). Он содержит в себе структуры (массивы) данных для приёма и передачи каждому из IA240_modbus(1..4) в отдельности. Обмен организован через отдельные потки для каждого TCP соединения (синхронизация через мютекс). Его цикл Main производит копирование нужных данных из одной структуры(массива) принятых данных от одного IA240_modbus в массив для передачи другому IA240_modbus. Всё "синхронизировано" всесте с другими потками через мютекс. Кроме того при указании перед компиляцией"ключа": #define _mdbg 1 //консольное сообщение цикла main производикся компиляция для вывода отчёта по текущему консольному соединению, иначе без вывода. Каждий из IA240_modbus(1..4) при запуске производит соединение с соответствующим сервером modbusRTUserverS и общим сервером связи. Таким образом modbusRTUserverS имеет непрерывное в процессе всей работы соединение с соответствующим IA240_modbus(1..4). А сервер связи имеет непрерывную связь со всеми четыремя IA240_modbus(1..4). В отчёте только выборочная индикация параметров из массивов для каждого соединения IA240_modbus(1..4) и на процесс работы влиять не может. Не может ли сервер связи как-то "перепутать" процессы во время регистрации? По идее не может тут при приёме запроса на соединение создаётся поток для соединения в сервере: .... csock = accept(listener,NULL,NULL); if((cserver.csock > 0) && (csock == cserver.csock)) { pthread_mutex_unlock(&ServerMutex); usleep(_listen_sleep); pthread_mutex_lock(&ServerMutex); goto mt1; } //создание потока клиента printf("-----CLIENT-----\r\n"); printf("-- sock. %i --\r\n", csock); count = 0; //тут ищем место для записи параметров соединения while(count < _max_sock) { if(cserver.midcl[count] == 0) { #if(_dbg > 0) printf("ServCoon clien %i connecting...\n",count); #endif cserver.csock = csock; cserver.idclient = count; cserver.midcl[count] = 0xFF; // pthread_attr_init(&cserver.tattr[count]); pthread_attr_setdetachstate(&cserver.tattr[count], PTHREAD_CREATE_DETACHED); //thread_attr_setscope(&cserver.tattr[count], PTHREAD_SCOPE_SYSTEM); // //pthread_create(&cserver.pth[count],NULL,(void*) server_con, &cserver); pthread_create(&cserver.pth[count], &cserver.tattr[count],(void*) server_con, &cserver); // cserver.cntclient++; break; //goto mt1; } count++; } Сам поток (каждый из потоков) имеет собственный массив на приём и передачу в сервере: //поток клиента void server_con(CSERV * cs) { int countlive; int setcntlive; int csock; int idclient; //int rd; pthread_t pth; U8 midcl; U8 rxbuf[_size_buf] //буфер приема; U8 txbuf[_size_buf] //буфер передачи; int txsz = 0; U8 work; int res; #if(_deb_con == 1) printf("ServConn client connected\n"); #endif pthread_mutex_lock(&ServerMutex); countlive = cs->setcntlive; setcntlive = cs->setcntlive; csock = cs->csock; idclient = cs->idclient; midcl = cs->midcl[idclient]; pth = cs->pth[idclient]; work = cs->work; // pthread_mutex_unlock(&ServerMutex); // #if(_deb_con == 1) printf("ServConn client connected and starting...\n"); #endif ....... default: //нормально - данные приняты countlive = setcntlive; //обработка команд и данных сокета #if(_deb_con == 1) printf("---starting mwork...\n"); #endif pthread_mutex_lock(&MainMutex); txsz = mwork(&rxbuf[0], &txbuf[0]); //обработка нашего клиента pthread_mutex_unlock(&MainMutex); //if(txsz == 0) // continue; break; ....... копирование данных по идентификатору в сервере (на примере 4-го процесса): //вызываемая функция анализа и //обработки запросов по сокетам inline int mwork(U8 * rbuf, U8 * sbuf) { int res = 0; U8 stype = (*(U8*)(rbuf + _type)); //тип (команда-чтение;запись;чтение и запись) то что желает клиент U8 scop = (*(U8*)(rbuf + _cop)); //от клиента берём его идентификатор (он сам прислал) U16 ssize = 0x02; // #if(_dbg > 0) printf("stype = %i cop = %i\n", stype, scop); #endif //pthread_mutex_lock(&MainMutex); switch(stype) { ....... case _type_from_modbus4: #if(_dbg > 0) printf("mwork ServConn for mb4\n"); #endif switch(scop) { case _cop_wr: //запись данных в труктуру Modbus 4 - для сервера // memcpy(&work.mb4s, rbuf + _daddr, sizeof(MODBUS4_SERVER)); // (*(U16*)(sbuf + _tcp_szl)) = 0; res = 0; break; case _cop_rd: //чтение данных из Modbus 4 - для клиента (*(U8*)(sbuf + _type)) = stype; ssize++; (*(U8*)(sbuf + _cop)) = scop; ssize++; // memcpy(sbuf + _daddr, &work.mb4c, sizeof(MODBUS4_CLIENT)); ssize += sizeof(MODBUS4_CLIENT); // (*(U16*)(sbuf + _tcp_szl)) = ssize; res = ssize; break; case _cop_rdwr: //чтение и запись данных в Modbus 4 // memcpy(&work.mb4s, rbuf + _daddr, sizeof(MODBUS4_SERVER)); // (*(U8*)(sbuf + _type)) = stype; ssize++; (*(U8*)(sbuf + _cop)) = scop; ssize++; // memcpy(sbuf + _daddr, &work.mb4c, sizeof(MODBUS4_CLIENT)); ssize += sizeof(MODBUS4_CLIENT); // (*(U16*)(sbuf + _tcp_szl)) = ssize; res = ssize; break; default: (*(U16*)(sbuf + _tcp_szl)) = 0; res = 0; break; } break; Хранит ли сервер связи какие-то данные или только передаёт их от отправителя к получателю? Для прийма от каждого и для передачи каждому в отдельности
  21. 1 - на Modbus 1 (/dev/ttyM0) экземпляр программы modbusRTUserverS (115200)- подключены: счётчик метража СИ30; Устройство ввода-вывода (кнопки - пуск/стоп, датчики положения ножниц и пневмоножницы обрезки кабеля). С этим работает процесс (программа) 1. Отвечает за изменение метража, процесс ножниц. Параметры настроек (задание, режим, состояние и т.п.) получает и принимает от других процессов *программ) 2...4 через программу "Сервер Связи". Данный процесс "ведущий" 2 - на Modbus 2 (/dev/ttyM1) экземпляр программы modbusRTUserverS (9600) - подключена панель ИП320. Ранее подключал это по Modbus 1, но это устройство имеет увеличенный интервал запрос-ответ и в результате пришлось его повесить на отдельный модбас и снизить скорость. Данная панель позволяет изменять и индицировать параметры работы. Все значения принимаются и передаются через "сервер связи" другим программам (процессам) 1,3,4. 3 - на Modbus 3 (/dev/ttyM2) экземпляр программы modbusRTUserverS (19200) - подключен частотный преобразователь привода протяжки кабеля. С ним работает программа (процесс) 3, которая получает значение задания метража, измеренный метраж и режим работы, а отдаёт процессу 1 свое состояние, ошибки, завершение и т.п. 4 - на Modbus 3 (/dev/ttyM3) экземпляр программы modbusRTUserverS (19200) - подключен частотный преобразователь привода намотки. Аналогично протяжке, но только в выбранном режиме намотки. Данный привод находится на удалении и в режиме протяжки может быть вообще не подключен (не подано питание). "Сервер связи" (ServConn)только обмен между программами (процессами). По замыслу управляющие программы не обязательно могут находиться на одном устройстве (ну кроме modbusRTUserverS), но также на других IA240LX/UC-7112LX-Plus. Запуск производится последовательно (скрипт Cabel - с параметром start или restart): -Сначала запускаются серверы работы с портами Modbus RTU (modbusRTUserverS), каждый из которых в парметрах запуска получает номер последовательного порта, его настройки, и TCP порт прослушивания (для допуска других процессов к устройствам на соответствующем модбасе) -Затем запускается "сервер связи"(ServConn), котрый в параметрах запуска получает порт TCP. -И запускаются все 4 программы (IA240_modbus1, IA240_modbus2, IA240_modbus3, IA240_modbus4) работы, котрые в своих параметрах запуска получают адреса и порты TCP соответствующих серверов Modbus для доступа к устройствам и адрес и порт TCP "сервера связи". Таким образом каждая программа(процесс) отвечает за работу устройств только на "своём" модбасе, но при этом имеет(передаёт) данные от других программ, которые работают со своими устройствами на "своих" модбасах. Данная "схема" позволила максимально "распараллелить" всю работу. Кроме этого отладку программ можно производить и на ноутбуке (с Linux, если откомпилировать для него, разумеется кроме modbusRTUserverS, которая должна иметь свой указанный последоватеьный порт) не загружая в устройство. Можно так же распределить задачи и на "соседних" устройствах и не обязательно именно IA20, при условии наличия связи между ними по сети Ethernet. Правда запускать их надо уже по своим правилам (автозапуск). Собственно сейчас проблема в том, что данные о подключении и статусе работы, а так же параметры "путаются" (дублируются) на программах управления протяжкой и намоткой (IA240_modbus3, IA240_modbus4). Предположительно в "сервере связи" (ServConn) - вот и думаю, что что-то сбоит в обмене по TCP. Вроде всё обыскал. Может быть проблема и в том, что сервер связи многопоточная программа и для компиляции надо что-то указать (ключ -lpthread уже указан в Makefile) чтобы небыло "слипания" данных. Да кстати каждый процесс при связи с сервером связи имеет свой идентификатор (не путать с ID пакета в отчёте - это просто тестовый счётчик), а в сервере связи свои структуры данных для каждого идентификатора индивидуальны. Вот и не должны они путаться. И ещё это происходит только с этими двумя последними при запуске процессами (IA240_modbus3, IA240_modbus4). Но стоит оговориться что частотный преобразователь привода намотки не подключен. За это отвечает экземпляр сервера modbusRTUserverS на /dev/ttyM3, который сообщает процессу (программе) IA_240_modbus4 об ошибочном доступе к ПЧВ3 и повторяет попытку. 4) Какой из элементов выводит первый ("правильный"), а какой - второй ("неправильный") отчёт? В отчете 3 и 4 столбцы в строке "stat" и ID не должны иметь одинаковые данные - потому как статус(в stat) связи с частотником протяжки имеет маску 0x08, а с частоткиком намотки 0x10 (правильно привод протяжки кодключен, а привод намотки нет): --- ----------ServConn-------- --- mb1 IDfr: 000010BF mb2 IDfr: 00000925 mb3 IDfr: 000010C1 mb4 IDfr: 000010B1 ---ID From mb1 IDto: 000010BF mb2 IDto: 00000925 mb3 IDto: 000010C1 mb4 IDto: 000010B1 ---ID To mb1 stat: 820100AF mb2 stat: 80000020 mb3 stat: 02000008 mb4 stat: 04000000 ---stat mb1 mode: 86000028 mb2 mode: 820100AF mb3 mode: 820100AF mb4 mode: 820100AF ---mode mb1 Lght: 0.000000 mb2 Lght: 0.000000 mb3 Lght: 0.000000 mb4 Lght: 0.000000 ---Lenght mb1 SLgt: 0.000000 mb2 SLgt: 0.000000 mb3 SLgt: 0.000000 mb4 SLgt: 0.000000 ---Set Lenght mb1eLgt1: 0.000000 mb2eLgt1: 0.000000 mb3eLgt1: 0.000000 ------------------ ---Set Err Correct Lenght M1 mb1eLgt2: 0.000000 mb2eLgt2: 0.000000 ------------------ mb4eLgt2: 0.000000 ---Set Err Correct Lenght M2 mb1 SCCt: 00000000 mb2 SCCt: 00000000 ------------------ ------------------ ---Set Cnt Cut mb1 CntC: 00000000 mb2 CntC: 00000000 ------------------ ------------------ ---Cnt Cut mb1_SPM1: 0.000000 ------------------ mb3_SPM1: 0.000000 ------------------ ---pr_speed_m1 mb1_SdM1: 3.000000 ------------------ mb3_SdM1: 3.000000 ------------------ ---pr_speed_m1_min mb1_SuM1: 50.000000 ------------------ mb3_SuM1: 50.000000 ------------------ ---pr_speed_m1_max ------------------ ------------------ mb3_SLu1: 45.000000 ------------------ ---StepSpeedLenghtUp_m1 ------------------ ------------------ mb3_SLd1: 45.000000 ------------------ ---StepSpeedLenghtDown_m1 ------------------ ------------------ mb3_SLD1: 0.300000 ------------------ ---SetLenghtDelta_m1 mb1_SPM2: 0.000000 ------------------ ------------------ mb4_SPM2: 0.000000 ---pr_speed_m2 mb1_SdM2: 5.000000 ------------------ ------------------ mb4_SdM2: 5.000000 ---pr_speed_m2_min mb1_SuM2: 50.000000 ------------------ ------------------ mb4_SuM2: 50.000000 ---pr_speed_m2_max ------------------ ------------------ ------------------ mb4_SLu2: 35.000000 ---StepSpeedLenghtUp_m2 ------------------ ------------------ ------------------ mb4_SLd2: 35.000000 ---StepSpeedLenghtDown_m2 ------------------ ------------------ ------------------ mb4_SLD2: 0.400000 ---SetLenghtDelta_m2 а вот неправильно (слиплись и статус и счётчик пакетов): -- ----------ServConn-------- --- mb1 IDfr: 000010BF mb2 IDfr: 00000925 mb3 IDfr: 000010BC mb4 IDfr: 000010BC ---ID From mb1 IDto: 000010BF mb2 IDto: 00000925 mb3 IDto: 000010BA mb4 IDto: 000010BB ---ID To mb1 stat: 820100AF mb2 stat: 80000020 mb3 stat: 02000008 mb4 stat: 02000008 ---stat mb1 mode: 82000028 mb2 mode: 820100AF mb3 mode: 820100AF mb4 mode: 820100AF ---mode mb1 Lght: 0.000000 mb2 Lght: 0.000000 mb3 Lght: 0.000000 mb4 Lght: 0.000000 ---Lenght mb1 SLgt: 0.000000 mb2 SLgt: 0.000000 mb3 SLgt: 0.000000 mb4 SLgt: 0.000000 ---Set Lenght mb1eLgt1: 0.000000 mb2eLgt1: 0.000000 mb3eLgt1: 0.000000 ------------------ ---Set Err Correct Lenght M1 mb1eLgt2: 0.000000 mb2eLgt2: 0.000000 ------------------ mb4eLgt2: 0.000000 ---Set Err Correct Lenght M2 mb1 SCCt: 00000000 mb2 SCCt: 00000000 ------------------ ------------------ ---Set Cnt Cut mb1 CntC: 00000000 mb2 CntC: 00000000 ------------------ ------------------ ---Cnt Cut mb1_SPM1: 0.000000 ------------------ mb3_SPM1: 0.000000 ------------------ ---pr_speed_m1 mb1_SdM1: 3.000000 ------------------ mb3_SdM1: 3.000000 ------------------ ---pr_speed_m1_min mb1_SuM1: 50.000000 ------------------ mb3_SuM1: 50.000000 ------------------ ---pr_speed_m1_max ------------------ ------------------ mb3_SLu1: 45.000000 ------------------ ---StepSpeedLenghtUp_m1 ------------------ ------------------ mb3_SLd1: 45.000000 ------------------ ---StepSpeedLenghtDown_m1 ------------------ ------------------ mb3_SLD1: 0.300000 ------------------ ---SetLenghtDelta_m1 mb1_SPM2: 0.000000 ------------------ ------------------ mb4_SPM2: 0.000000 ---pr_speed_m2 mb1_SdM2: 5.000000 ------------------ ------------------ mb4_SdM2: 5.000000 ---pr_speed_m2_min mb1_SuM2: 50.000000 ------------------ ------------------ mb4_SuM2: 50.000000 ---pr_speed_m2_max ------------------ ------------------ ------------------ mb4_SLu2: 35.000000 ---StepSpeedLenghtUp_m2 ------------------ ------------------ ------------------ mb4_SLd2: 35.000000 ---StepSpeedLenghtDown_m2 ------------------ ------------------ ------------------ mb4_SLD2: 0.400000 ---SetLenghtDelta_m2 Это происходит циклически около 30 на 30 секунд иногда реже или чаще. 5) Какие участки кода отвечают за формирование отчётов? В сервере связи в цикле main (всего-навсего вывод на консоль некотрых данных сервера связи принятых от процессов и подготовленных для отправки им): #if(_mdbg > 0) if(mdbgcnt < 1) { printf("\n---\t\t\t\t----------ServConn--------\t\t\t\t---\n"); printf("mb1 IDfr: %.8X\tmb2 IDfr: %.8X\tmb3 IDfr: %.8X\tmb4 IDfr: %.8X\t---ID From\n", work.mb1s.id, work.mb2s.id, work.mb3s.id, work.mb4s.id); printf("mb1 IDto: %.8X\tmb2 IDto: %.8X\tmb3 IDto: %.8X\tmb4 IDto: %.8X\t---ID To\n", work.mb1c.id, work.mb2c.id, work.mb3c.id, work.mb4c.id); printf("mb1 stat: %.8X\tmb2 stat: %.8X\tmb3 stat: %.8X\tmb4 stat: %.8X\t---stat\n", work.mb1s.stat, work.mb2s.stat, work.mb3s.stat, work.mb4s.stat); printf("mb1 mode: %.8X\tmb2 mode: %.8X\tmb3 mode: %.8X\tmb4 mode: %.8X\t---mode\n", work.mb1c.mode, work.mb2c.mode, work.mb3c.mode, work.mb4c.mode); printf("mb1 Lght: %f\tmb2 Lght: %f\tmb3 Lght: %f\tmb4 Lght: %f\t---Lenght\n", work.mb1s.Lenght, work.mb2c.Lenght, work.mb3c.Lenght, work.mb4c.Lenght); printf("mb1 SLgt: %f\tmb2 SLgt: %f\tmb3 SLgt: %f\tmb4 SLgt: %f\t---Set Lenght\n", work.mb1c.SetLenght, work.mb2s.SetLenght, work.mb3c.SetLenght, work.mb1c.SetLenght); printf("mb1eLgt1: %f\tmb2eLgt1: %f\tmb3eLgt1: %f\t------------------\t---Set Err Correct Lenght M1\n", work.mb1c.ErrSetLenghtM1, work.mb2s.ErrSetLenghtM1, work.mb3c.ErrSetLenghtM1); printf("mb1eLgt2: %f\tmb2eLgt2: %f\t------------------\tmb4eLgt2: %f\t---Set Err Correct Lenght M2\n", work.mb1c.ErrSetLenghtM2, work.mb2s.ErrSetLenghtM2, work.mb4c.ErrSetLenghtM2); printf("mb1 SCCt: %.8u\tmb2 SCCt: %.8u\t------------------\t------------------\t---Set Cnt Cut\n", work.mb1c.SetCntCut, work.mb2s.SetCntCut); printf("mb1 CntC: %.8u\tmb2 CntC: %.8u\t------------------\t------------------\t---Cnt Cut\n", work.mb1s.CntCut, work.mb2c.CntCut); printf("mb1_SPM1: %f\t------------------\tmb3_SPM1: %f\t------------------\t---pr_speed_m1\n", work.mb1s.pr_speed_m1, work.mb3c.pr_speed_m1); printf("mb1_SdM1: %f\t------------------\tmb3_SdM1: %f\t------------------\t---pr_speed_m1_min\n", work.mb1c.pr_speed_m1_min, work.mb3c.pr_speed_m1_min); printf("mb1_SuM1: %f\t------------------\tmb3_SuM1: %f\t------------------\t---pr_speed_m1_max\n", work.mb1c.pr_speed_m1_max, work.mb3c.pr_speed_m1_max); printf("------------------\t------------------\tmb3_SLu1: %f\t------------------\t---StepSpeedLenghtUp_m1\n", work.mb3c.StepSpeedLenghtUp); printf("------------------\t------------------\tmb3_SLd1: %f\t------------------\t---StepSpeedLenghtDown_m1\n", work.mb3c.StepSpeedLenghtWown); printf("------------------\t------------------\tmb3_SLD1: %f\t------------------\t---SetLenghtDelta_m1\n", work.mb3c.SetLenghtDelta); printf("mb1_SPM2: %f\t------------------\t------------------\tmb4_SPM2: %f\t---pr_speed_m2\n", work.mb1s.pr_speed_m2, work.mb4c.pr_speed_m2); printf("mb1_SdM2: %f\t------------------\t------------------\tmb4_SdM2: %f\t---pr_speed_m2_min\n", work.mb1c.pr_speed_m2_min, work.mb4c.pr_speed_m2_min); printf("mb1_SuM2: %f\t------------------\t------------------\tmb4_SuM2: %f\t---pr_speed_m2_max\n", work.mb1c.pr_speed_m2_max, work.mb4c.pr_speed_m2_max); printf("------------------\t------------------\t------------------\tmb4_SLu2: %f\t---StepSpeedLenghtUp_m2\n", work.mb4c.StepSpeedLenghtUp); printf("------------------\t------------------\t------------------\tmb4_SLd2: %f\t---StepSpeedLenghtDown_m2\n", work.mb4c.StepSpeedLenghtWown); printf("------------------\t------------------\t------------------\tmb4_SLD2: %f\t---SetLenghtDelta_m2\n", work.mb4c.SetLenghtDelta); // mdbgcnt = (1000000 / _main_sleep); } else mdbgcnt--; при опции компиляции в файле config.h: #define _mdbg 1 //консольное сообщение цикла main 6) В каких условиях выводится первый, а в каких - второй отчёт? Что нужно сделать, чтобы программа, работающая правильно, стала работать неправильно или наоборот? Ничего делать не надо - само по себе. 7) Вы указываете на объём занятой памяти. Избыточно ли оно для Вашей задачи? Или другими словами - это описание второй проблемы или условий? Изменяется ли объём занятой памяти со временем? Насколько быстро? Памяти пропасть - задачи-то небольшие! Незначительно - практически незаметно. И в плюс и в минус. Находясь в цехе это определить не удаётся. Нет возможности непрерывно наблюдать часами. И последнее - забыл сказать. Компилировал пакетом для UC-7112-LX-Plus - думаю это не так важно (надеюсь там нет специальных ограничений - ранее им же и делал другие проекты). Может я не прав?
  22. Имеется проект на одном устройстве - при запуске с помощью bash скрипта: 1) - запускаются 4 экземпляра сервера modbusRTUserverS (тут проблем нет) для каждого последовательного порта с прослушиванием для каждого своего TCP порта - соответственно. 2) - запускается "сервер межпроцессовой связи" 3) - запускаются 4 процесса для работы с 4 интерфейсами по ModbusRTU через запущенные серверы. И эти же процессы взаимодействуют между собой через заранее запущенный "сервер межпроцессорной связи" Все взаимодействия через локальные (127.0.0.1) TCP соединения. Т.е. всё запущено на одном устройстве. Собственно проблема: "слипаются" данные двух последних рабочих процессов. Выглядит это по консольному выводу "сервера связи" повторений данных для этих последних процессов, которые управляют двумя частотными преобразователями по двум разным ModbusRTU соединениям через серверы modbusRTUserverS. Всё это запускается от имени пользователя. При консольном выводе для каждого процесса вроде всё нормально. Сервер связи - точнее его потоки(многопоточная схема) испытал и отделяемые и не отделяемые. Возможно на каждый поток надо указать свой стек и т.п. но примеры для MOXA не компилятся при выполнеии команды free занято 30М из 60М (округляю) и буфер более 3М. Обращение каждого процесса к "серверу связи" для приёма и передачи проискодит (интервал) 50мс. с таким же интервалом происходит обращение каждого процесса к устройствам по ModbusRTU через соответствующие серверы. Может есть у кого соображения. Может выделение памяти как-то изменить? Оборудование почти оживил (разработал) но вот возникла эта проблема в процессе пусконаладки. Ранее делал похожую схему, но без сервера связи, а через файлы на рам диске, но там и время реакции было не так важно. Уже не знаю куда копать! Исходники если угодно могу выложить. Точнее выкладываю - иначе некрасиво как-то и непонятно тоже. src.tar Сам думаю что что-то с выделением памяти, но не знаю что и как конфигурировать(возможно надо чтото в /etc или ещё где менять). Может какие ключи при компиляции? Вот так выглядит отчёт: console.doc Заранее благодарен!
  23. Есть ряд настроек в /etc там и автозапуск чего-либо и сетевые настройки и параметры веб сервера. Да и не забудьте - может что ещё установить требуется. Ну и т.д.
×
×
  • Create New...