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

oiv_1968

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

    163
  • Joined

  • Last visited

Everything posted by oiv_1968

  1. Добавлено изменение! Используются отделяемые потоки (в файле modbusRTU.c): int OpenSerial(void) { int res; float work; pthread_attr_t tattr; // <--- параметр атрибутов создавакмого потока res = IA241sopen(ModbusRTU.serialport, RS485_2WIRE_MODE, ModbusRTU.baudrate, 0, ModbusRTU.databits, ModbusRTU.stopbits); if(res < 0) return res; // pthread_attr_init(&tattr); // <--- инициализируем атрибуты pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); // <--- устанавливаем для потока режим отделения /* ************************* * вычисляемые параметры * ************************* */ //полный размер символа BIT ModbusRTU.full_size_sym = 2 + ModbusRTU.databits + ModbusRTU.stopbits; //время полного символа в секундах work = (float)((float)(ModbusRTU.full_size_sym)) * (float)(1.0 / (float)(ModbusRTU.baudrate)); ModbusRTU.time_one_sym = (int)((float)(work * 1000000.0)); //время сна - ожидания (четырёх символов) ModbusRTU.time_silence = ModbusRTU.time_one_sym * 4; //запуск потока последовательного сервера SerialWork = 1; CountDev = 0; pthread_mutex_init(&SerialMutex,NULL); //pthread_create(&hSerialServer,NULL,(void*)SerialServer, NULL); pthread_create(&hSerialServer,&tattr,(void*)SerialServer, NULL); // <--- создаём поток обслуживания порта RS485 (ModbusRTU) return res; } Теперь простоя почти нет, общий доступ к глобальным данным, мютекс приобрёл полный смысл! Аналогично поступил с потоками обработки клиента по Ethernnet (файл mrtusocket.c): void ListenProcess(void) { int err; fd_set fdss; struct timeval tvs; int count; int csock; pthread_attr_t tattr; // pthread_attr_init(&tattr); pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED); //инициализация данных memset(&MRTUServer.midcl[0], 0, _max_sock); MRTUServer.cntclient = 0; MRTUServer.set_pr_ssleep = _cl_pr_ssleep; MRTUServer.setcntlive = _time_life; //основной цикл прослушивания while(MRTUServer.work) { mt1: tvs.tv_sec = 0; tvs.tv_usec = _LSOCKET_TIMEOUT; FD_ZERO(&fdss); FD_SET(listener,&fdss); // err = select(listener + 1,&fdss,&fdss,NULL,&tvs); //err = select(listener + 1,&fdss,NULL,&fdss,&tvs); if(err <= 0) { usleep(_SSRLEEP); goto mt1; } csock = accept(listener,NULL,NULL); if((MRTUServer.csock > 0) && (csock == MRTUServer.csock)) { usleep(_SSRLEEP); goto mt1; } //создание потока клиента printf("-----CLIENT-----\r\n"); printf("-- sock. %i --\r\n", csock); count = 0; while(count < _max_sock) { if(MRTUServer.midcl[count] == 0) { MRTUServer.csock = csock; MRTUServer.idclient = count; MRTUServer.midcl[count] = 0xFF; //pthread_create(&MRTUServer.pth[count],NULL,(void*) ClientProcess, &MRTUServer); pthread_create(&MRTUServer.pth[count],&tattr,(void*) ClientProcess, &MRTUServer); MRTUServer.cntclient++; break; } count++; } // //usleep(TServerMutex); usleep(_pr_ssleep); } } Соответственно нормально происходит обслуживание клиентов по ETHERNET соединению. в файле mrtusocket.h установил другие параметры - время ожидания: #define _pr_ssleep 300000 #define _cl_pr_ssleep 20000 В моём случае клиенты и серверы находятся на одном устройстве: 1) чтение состояния по Modbus RTU(скорость 115200) - modbusRTUserverS - порт 0 (задание на включение - устройство ввода вывода (МК110-8Д4Р) - кнопка) и передача по Ethernet (локальный адрес) - клиенту программа 1. 2) прграмма 1 - задание по кнопке значение частоты - передача по Ethernet серверу связи (общие данные для просессов ServConn) 3) сервер связи - передача по Ethernet программе 2 4) программа 2 (скорость + командное слово)- передача modbusMRTUserverS (скорость 19200) - порт 2 (задание частотному преобразователю ПЧВ3) Следует отметить, что на порт 0 подключены устройства: 1) МК110-8Д4Р (устройства ввода-вывода) - чтение (кадр 0 - регистр состояния входов; кадр 1 - регистр состояния выходов) -запись(кадр 2 - регистр задания выходов) 2) МВ110-2АС (устройство аналогового ввода) - чтение (кадр 0 - список регистров FLOAT) 3) счётчик СИ30 - (реверсивный счётчик импульсов) - чтение(кадр 0 - список регистров более 16) -запись(кадр 1 регистр команды сброса - (0 - нет сброса; 0xFF - сброс)) на порт 3 подключен только частотный преобразователь ПЧВ3 -чтение(кадр 0 - регистр татуса) -запись(кадр 1 - регистр задания частоты; кадр 2 - регистр командного слова) Результат: управление (ремя реакции) около двух секунд.
  2. Доброго времени суток! Прошу помощи - необходимо компилировать (время от времени) код на устройстве (IA240-LX, UC7112-Plus) - иметь в наличии компилятор на устройстве (возможность его установить). (Только будьте добры не задавайте вопросы типа: "почему ты хочеш ехать именно на этой машине и именно в это мнсто, лучше возьми другую машину и поезжай в другом направлении" - воспользуйся кросскомпиляцией на другой машине). Проект(ы) делаю на машине с кросскомпилятором, а отлаживаю и изменяю по месту расположения оборудования. Распологать ноут с кросскомпилятором рядом каждый раз нет возможности. Но есть более мобильная техника со связью по WIFI (SSH / TELNET / HTTP) с отлаживаемым оборудованием (IA240-LX, UC7112-Plus). Изменение кода обычно не превышает несколько десятков строк, после чего компиляция и контроль работы по SSH / TELNET. Кроме этого визуальный контроль работы оборудования необходим. И из-за этой мелочи требуется городить рабочее место в условиях вибрации и пыли, а иногда на весу и почти вверх ногами. Для связи с IA240 все равно использую WIFI через роутер, который подклчаю в том же шкафу. Заранее благодарен!
  3. Обратите внимание - в последнем сообщении актуальная версия... а это только начальная!
  4. Да! Жаль! Буду кросс-компиляцию применять как и в самом начале! По поводу сессий - должно отваливаться и отваливается. Запуск, который производится через ВЕБ - продолжает работать. Сам сервер: 216 www-data 15404 S /usr/bin/httpd -k start -d /etc/apache 217 www-data 15404 S /usr/bin/httpd -k start -d /etc/apache 218 www-data 15404 S /usr/bin/httpd -k start -d /etc/apache 219 www-data 15404 S /usr/bin/httpd -k start -d /etc/apache 220 www-data 15404 S /usr/bin/httpd -k start -d /etc/apache в работе, т.е. сессия от него продолжается. Про TELNET - он "висит" в цикле единыжды запустив скрипт от имени пользователя www-data которым и является apache. Спасибо огромное вопрос снят. Сотрудники приходят в начале смены, подают напряжение - всё стартует. При необходимости перезапускают - обычно это я сам (значит изменение в коде). /Подключаю RaspberryPI с WIFI к IA240 - ко второму порту ETHERNET, сливаю что надо с мобильника (ранее откомпилированное) произвожу рестарт/ Спасибо!!!
  5. Пробую в командной строке от ROOT: su - www-data -c /home/httpd/serial/test Производиться вход: #### #### ###### ####### ###### ## ### #### ### ### #### #### ### ### ### ### ### ### ## ### ### #### ## ## ### # #### #### # ## ### ### ### ## ## ## ## ## # ## ### ## #### # ## ## ### ## ## ## ## #### # ### ## ## # ## ## ## ### ####### ## ## # ## ### ### ##### # ## ## ### ## ### ### ## ### # ### ## ### ## ## ## ## ### ## ## ## ### ## ## ## # ### # ## ###### # ###### ######## ####### ########### ###### For further information check: http://www.moxa.com/ www-data@Moxa:~$ Далее проверяю вроде нормально: www-data@Moxa:~$ ps axu | grep /home/httpd/serial/test 22401 www-data 2228 S grep /home/httpd/serial/test Просто PS - не видно: www-data@Moxa:~$ ps PID USER VSZ STAT COMMAND 1 root 1248 S init [3] 2 root 0 SWN [ksoftirqd/0] 3 root 0 SW< [events/0] 4 root 0 SW< [khelper] 5 root 0 SW< [kblockd/0] 6 root 0 SW [pdflush] 7 root 0 SW [pdflush] 9 root 0 SW< [aio/0] 8 root 0 SW [kswapd0] 12 root 0 SW< [kmmcd] 10 root 0 SW [mxcrypto_dispat] 11 root 0 SW [mtdblockd] 13 root 0 SW< [mmcqd] 24 root 0 SWN [jffs2_gcd_mtd3] 73 root 1252 S dhcpcd eth1:2 77 root 1284 S /bin/inetd 85 bin 1220 S /bin/portmap 99 root 2008 S /bin/bash /etc/init.d/sharedev 147 root 15380 S /usr/bin/httpd -k start -d /etc/apache 149 root 2084 S /bin/sh --login 161 root 1280 S /bin/snmpd 165 root 1200 S /bin/reportip 216 www-data 15404 S /usr/bin/httpd -k start -d /etc/apache 217 www-data 15404 S /usr/bin/httpd -k start -d /etc/apache 218 www-data 15404 S /usr/bin/httpd -k start -d /etc/apache 219 www-data 15404 S /usr/bin/httpd -k start -d /etc/apache 220 www-data 15404 S /usr/bin/httpd -k start -d /etc/apache 21213 root 6676 S /bin/sshd -i 21243 www-data 6616 S /bin/sshd -i 21244 www-data 2468 S -sh 21345 root 2092 S -bash 22231 www-data 2468 S -sh 22415 root 2220 S sleep 3 22416 www-data 2300 R ps Вхожу в другой сеанс SSH и проверяю: www-data@Moxa:~$ ps axu | grep /home/httpd/serial/test 24086 www-data 2228 S grep /home/httpd/serial/test Сразу: для первого сеанса, когда запускали из под ROOT: 22401 www-data 2228 S grep /home/httpd/serial/test для втого сеанса, когда сделали второе соединение по SSH для пользователя www-data: 24086 www-data 2228 S grep /home/httpd/serial/test PID не совпадает! В другом сенансе просто PS: www-data@Moxa:~$ ps PID USER VSZ STAT COMMAND 1 root 1248 S init [3] 2 root 0 SWN [ksoftirqd/0] 3 root 0 SW< [events/0] 4 root 0 SW< [khelper] 5 root 0 SW< [kblockd/0] 6 root 0 SW [pdflush] 7 root 0 SW [pdflush] 9 root 0 SW< [aio/0] 8 root 0 SW [kswapd0] 12 root 0 SW< [kmmcd] 10 root 0 SW [mxcrypto_dispat] 11 root 0 SW [mtdblockd] 13 root 0 SW< [mmcqd] 24 root 0 SWN [jffs2_gcd_mtd3] 73 root 1252 S dhcpcd eth1:2 77 root 1284 S /bin/inetd 85 bin 1220 S /bin/portmap 99 root 2008 S /bin/bash /etc/init.d/sharedev 147 root 15380 S /usr/bin/httpd -k start -d /etc/apache 149 root 2084 S /bin/sh --login 161 root 1280 S /bin/snmpd 165 root 1200 S /bin/reportip 216 www-data 15404 S /usr/bin/httpd -k start -d /etc/apache 217 www-data 15404 S /usr/bin/httpd -k start -d /etc/apache 218 www-data 15404 S /usr/bin/httpd -k start -d /etc/apache 219 www-data 15404 S /usr/bin/httpd -k start -d /etc/apache 220 www-data 15404 S /usr/bin/httpd -k start -d /etc/apache 21213 root 6676 S /bin/sshd -i 21243 www-data 6616 S /bin/sshd -i 21244 www-data 2468 S -sh 21345 root 2092 S -bash 23151 root 6676 S /bin/sshd -i 23161 www-data 6528 S /bin/sshd -i 23162 www-data 2468 S -sh 23807 www-data 2088 S -sh 23831 root 2220 S sleep 3 23832 www-data 2300 R ps удаляю в другом сеансе: www-data@Moxa:~$ kill 24086 sh: kill: (24086) - No such pid и проверяю: www-data@Moxa:~$ ps axu | grep /home/httpd/serial/test 24739 www-data 2228 S grep /home/httpd/serial/test НЕ УБИЛ И ВИЖУ ДРУГОЙ PID! В первом сеансе: www-data@Moxa:~$ kill 23817 sh: kill: (23817) - No such pid и проверяю: 1 раз: www-data@Moxa:~$ ps axu | grep /home/httpd/serial/test www-data@Moxa:~$ ps axu | grep /home/httpd/serial/test вроде убил! 2 раз: www-data@Moxa:~$ ps axu | grep /home/httpd/serial/test 25342 www-data 2228 S grep /home/httpd/serial/test НЕ УБИЛ! выхожу обратно в ROOT: ps axu | grep /home/httpd/serial/test всё на месте и если посмотреть на все PID - они все разные! Впрочем при нормальном запуске для одного прог. модуля три потока! Обычно я делаю многопоточные модули на Си, а в моём случае собственный сервер Modbus RTU - 1 поток Main, который окрывает последовательный порт и стартует поток работы с ним, а также иоткрывает сокет и стартует поток его прослушивания, который в свою очередь будет отрывать поток для каждого соединения. Когда есть подключение видно: 27758 www-data 7880 S ./modbusRTUserverS -sp 0 -br 2400 -db 8 -sb 1 -p 8971 27763 www-data 7880 S ./modbusRTUserverS -sp 0 -br 2400 -db 8 -sb 1 -p 8971 27765 www-data 7880 S ./modbusRTUserverS -sp 0 -br 2400 -db 8 -sb 1 -p 8971 27766 www-data 7880 S ./modbusRTUserverS -sp 0 -br 2400 -db 8 -sb 1 -p 8971 27767 www-data 1340 S ./Ia240_TypesStep -ip 127.0.0.1 -p 8971 -cip 8990 -rt 27768 www-data 7880 S ./modbusRTUserverS -sp 0 -br 2400 -db 8 -sb 1 -p 8971 Всё по моему усложняется (может я чего не понял), и пока нет возможности кропотливо всё испытывать =( Пока оставляю TELNET соединение. Уже почти неделю всё крутится. И ещё, ну это не по теме : МОЖЕТ ПОДЕЛИТЕСЬ GCC, КОТОРЫЙ РАБОТАЕТ НА MOXA ДЛЯ MOXA, А НЕ ТОТ, ЧТО ИДЁТ НА ДИСКЕ - РАБОТАЕТ НА PC ДЛЯ MOXA. Я миею ввиду arm-linux-gcc, котрый работает на самих IA240(1)LX и UC-7112-plus.
  6. Простите! Совсем забыл ФАЙЛОВЫЙ МЕНЕДЖЕР. webadmin.php За название простите - это название я для себя делал, хотя код не мой! Поместите его на MOXA в рабочую директорию (где ваша страничка) WEB сервера и обращайтесь к нему из браузера
  7. Собственно в PHP я не очень, но кое-что. Запуск/Перезапуск у меня производится вызовом из PHP команды (BASH) (Веб-клиент на Fanuc ничего не умеет, даже кнопки, флаги, и селекты отображает как строку. Но может картинки и таблицы, а так же ссылки). По ссылке на странице вызываю PHP (в данном случае RESTART) ФРАГМЕНТ - ОДИН ИЗ ВЫЗОВОВ В HTML: (не ругайте я тут очень не очень - делал с помощью "KompoZer") <tr> <td rowspan="1" colspan="1" style="vertical-align: top; width: 633px; height: 35px;"><span style="font-weight: bold;"><a href="fanuc/start.php"> <img style="border: 0px solid ; width: 616px; height: 30px;" alt="" src="img/sm1.png"></a> <a href="fanuc/start.php"><br> </a></span></td> </tr> ВЫЗЫВАЕМЫЙ PHP: <?php $command = "./Fanuc restart &"; exec($command); echo "Press Key \"BACK\""; ?> строка : echo "Press Key \"BACK\""; нужна потому, что указанный веб-клиент и вернуться не позволяет в отличии от нормального браузера - вот и приходиться выводить это сообщение, да и кирилицы никакой он не умеет. Меню на русском делал с помощью картинок. А так получал в параметры в PHP из BASH (shell_exec(****) - выполнение оболочки shell of linux с выводом в PHP): <?php //......... $nfile="/home/httpd/ramdisk/WrInMask"; $DI117=shell_exec("cat ".$nfile." | grep 'DI117' | awk '/DI117/ {print($3)}'"); $DI118=shell_exec("cat ".$nfile." | grep 'DI118' | awk '/DI118/ {print($3)}'"); $DI119=shell_exec("cat ".$nfile." | grep 'DI119' | awk '/DI119/ {print($3)}'"); $DI120=shell_exec("cat ".$nfile." | grep 'DI120' | awk '/DI120/ {print($3)}'"); $InMask=shell_exec("cat ".$nfile." | grep 'InMask' | awk '/InMask/ {print($3)}'"); $OutMask=shell_exec("cat ".$nfile." | grep 'OutMask' | awk '/OutMask/ {print($3)}'"); //......... //Далее формируется страница // ?> Собственно "Fanuc" - скрипт на BASH запускает бинарные файлы написанные на C. Для наглядности априлагаю некоторые: start.php stop.php Fanuc.zip pump_paint.php Саму страницу послать сложно, там ссылки на картинки и их придётся со страницей - проще всю директорию сжать. Но если без этого никак - сделаю!
  8. Конечно возможноно - прикреплю, но не ругайте за код - его допиливать надо. Выложу, но по приходу домой - до конца смены 10 минут (не успею). Через пару часов смогу.
  9. Спасибо попробую, но могу только на работе UC-7112LX-plus, на котором всё пробую - оставил на работе.
  10. Да именно так! Включают оборудование на STEP 7 а IA-240 по Modbus RTU используя порты ввода-вывода от OWEN опрашивает опятьже STEP передаёт параметры роботу FANUC по Modbus RTU опятьже через порты. Ну не смог я подключить напрямую. Кроме того IA-240 обслуживает свой техпроцесс. Но бывают случаи, когда требуется произвести остановку ряда процессов, либо изменить. А через ВЕБ интерфейс очень удобно используя вебовский файл-менеджер на PHP производить загрузку и редактирование. И не ребуется SSH соединение.Пока, что пример в начале работает.
  11. Простите, но я не увидел в приложеннм коде формирования второго потока для работы со вторым соединением по TCP. int do_it() { char *ip; int size, rz, len; struct sockaddr_in client; struct timeval twait; fd_set ListenSockets; size = sizeof(client); while(1) { printf("accept...\n"); sClient = accept(sListen, (struct sockaddr *)&client, &size); if (sClient < 0){ print_err_mess("accept...failed"); break; } ip = inet_ntoa(client.sin_addr); if (!ip) continue; sprintf(&sbuf[0], "connect from %s", ip); print_mess(&sbuf[0]); endtime_session = time(NULL) + cfg.max_time_session_min * 60; // set socket to nonblock rz = fcntl(sClient, F_GETFL); rz |= O_NONBLOCK; if (fcntl(sClient, F_SETFL, rz) < 0) { print_err_mess("set socket to nonblock fail"); break; } while(1) { if (time(NULL) > endtime_session) { print_mess("session end time"); return 2; } FD_ZERO(&ListenSockets); FD_SET(sClient, &ListenSockets); twait.tv_sec = 0; twait.tv_usec = 100; rz = select(sClient+1, &ListenSockets, NULL, NULL, &twait); if (rz < 0) { close_fd(&sClient); break; } else if (!rz || !FD_ISSET(sClient, &ListenSockets)) { //nothing receive } else { // receive data form LAN rz = recv(sClient, rbuf, BUFFER_LEN, 0); if (!rz){ printf("LAN: recvice 0 bytes (!)\n"); close_fd(&sClient); break; } else if (rz < 0) { if (errno == EAGAIN) { /* The socket is marked non-blocking, and the receive operation would block, or a receive timeout had been set, and the timeout expired before data were received. */ continue; } if (errno == ENOTCONN) { /* The socket is associated with a connection-oriented protocol and has not been connected */ close_fd(&sClient); break; } close_fd(&sClient); print_mess("LAN disconnected"); printf("\n"); break; } if (cfg.log) { if (cfg.log == 2) printf("LAN: read %d bytes\n", rz); if (cfg.log > 2) PrintBytes(rbuf, rz); } // write data to serial port len = write(fd, rbuf, rz); if (len < 0) { print_err_mess("COM: write fail"); return -1; } } // read data from serial port len = read(fd, sbuf, BUFFER_LEN); if (len < 0) { print_err_mess("COM: read data fail"); return -1; } else if (len > 0) { if (cfg.log) { if (cfg.log == 2) printf("COM: read %d bytes\n", len); if (cfg.log > 2) PrintBytes(sbuf, len); } // send data to LAN rz = send(sClient, sbuf, len, 0); if(rz < 0){ print_err_mess("LAN: send data fail"); return -1; } } } } return 0; } Так, что обрабатывать второй сокет некому! Так что после приёма соединения необходимо открывать "параллельный" поток для обработки текущего соединения для sClient = accept(sListen, (struct sockaddr *)&client, &size); , а этот цикл адаптировать для ожидания другого sClient = accept(sListen, (struct sockaddr *)&client, &size); далее для которого будет открыт свой поток.
  12. Отвечаю сам себе: Ничего глупее придумать не смог и найти тоже, но пока работает: (Испытание на UC-7112-plus) В /еtс/rc.d/rc.local добавил запуск "приежуточного" скрипта: /etc/init.d/moxa_fanuc & Сам скрипт производит локальное соединение по TELNET от имени WWW-DATA по умолчанию для APACHE: #!/bin/bash ############################ # AUTOSTART MOXA_FANUC_IMF # ############################ #sleep 3 #echo "moxa fanuc" ( sleep 1 echo "www-data" sleep 1 echo "www-data" sleep 1 echo " cd /home/httpd/ia240_fanuc1/fanuc" sleep 1 echo "ls" sleep 1 echo "./Fanuc restart &" sleep 30 ((i=10)) while((i > 0)) do sleep 1 done ) | telnet 127.0.0.1 Где : ./Fanuc restart & - то что запускается/перезапускается как при включении питания, так и с ВЕБ интерфейса по PHP. Правда в процессе всей работы остаётся локальное соединение по TELNET
  13. Как запустить скрипт при включении питания в IA240LX(Устройство) от имени имеющегося ВЕБ сервера. Устройство не имеет выход в другие сети и по ETHERNET подключено только к технологическому оборудованию. Необходимо иногда перезапускать или полностью останавливать ранее запущенный скрипт. У меня получается в автозапуске только с ROOT. И поэтому с веб-браузера на указанном оборудовании не удаётся СТАРТ/СТОП/РЕСТАРТ (соответственно и удаление файлов с PID запущенных процессов)
×
×
  • Create New...