-
Posts
163 -
Joined
-
Last visited
Content Type
Profiles
Forums
Calendar
Posts posted by oiv_1968
-
-
Доброго времени суток!
Прошу помощи - необходимо компилировать (время от времени) код на устройстве (IA240-LX, UC7112-Plus) - иметь в наличии компилятор на устройстве (возможность его установить).
(Только будьте добры не задавайте вопросы типа: "почему ты хочеш ехать именно на этой машине и именно в это мнсто, лучше возьми другую машину и поезжай в другом направлении" - воспользуйся кросскомпиляцией на другой машине).
Проект(ы) делаю на машине с кросскомпилятором, а отлаживаю и изменяю по месту расположения оборудования. Распологать ноут с кросскомпилятором рядом каждый раз нет возможности. Но есть более мобильная техника со связью по WIFI (SSH / TELNET / HTTP) с отлаживаемым оборудованием (IA240-LX, UC7112-Plus). Изменение кода обычно не превышает несколько десятков строк, после чего компиляция и контроль работы по SSH / TELNET. Кроме этого визуальный контроль работы оборудования необходим. И из-за этой мелочи требуется городить рабочее место в условиях вибрации и пыли, а иногда на весу и почти вверх ногами. Для связи с IA240 все равно использую WIFI через роутер, который подклчаю в том же шкафу.
Заранее благодарен!
-
Обратите внимание - в последнем сообщении актуальная версия... а это только начальная!
-
Пару моментов
1. При закрытии терминала(сессии) все процессы у которых специально не обрабатывается сигнал SIGINT(вроде) умирают.
2. Проверил на w325 - у меня вообще не получилось сделать запуск описанным ранее способом. Походу реализации su разные.
3. gcc - это компилятор, для компиляции программ нужен набор системных библиотек и <b>заголовоных файлов</b>, как раз и из-за последних на контроллере ничего собрать не получиться - там их нет, д аи жутко медленно будет. Поэтому и была придумана кросс-компиляция. - это когда ты на х86 собираешь программки для arm.
А теперь ответ: gcc для moхa UC-7112+ - странная штука, скорее всего не существующая в природе. если надо что то собрать то поищи программинг гайд и пользуй тоолчайн с диска.
Например тут: http://www.moxa.com/support/support_home.aspx?isSearchShow=1
Да! Жаль! Буду кросс-компиляцию применять как и в самом начале!
По поводу сессий - должно отваливаться и отваливается.
Запуск, который производится через ВЕБ - продолжает работать.
Сам сервер:
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, сливаю что надо с мобильника (ранее откомпилированное) произвожу рестарт/
Спасибо!!!
-
окай - мерси
Кстати с запуском то не от рута - получилось?
Пробую в командной строке от ROOT:
su - www-data -c /home/httpd/serial/test
Производиться вход:
#### #### ###### ####### ###### ##
### #### ### ### #### #### ###
### ### ### ### ### ## ###
### #### ## ## ### # ####
#### # ## ### ### ### ## ## ##
## ## # ## ### ## #### # ##
## ### ## ## ## ## #### # ###
## ## # ## ## ## ### #######
## ## # ## ### ### ##### # ##
## ### ## ### ### ## ### # ###
## ### ## ## ## ## ### ## ##
## ### ## ## ## # ### # ##
###### # ###### ######## ####### ########### ######
For further information check:
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.
-
Да нет наверное не нужно, был интересен пример реализации, я поразбираюсь если будут вопросы напишу.
Простите! Совсем забыл ФАЙЛОВЫЙ МЕНЕДЖЕР.
За название простите - это название я для себя делал, хотя код не мой!
Поместите его на MOXA в рабочую директорию (где ваша страничка) WEB сервера и обращайтесь к нему из браузера
-
Не за что, осмелюсь попросить ответную услугу - кинь бек-енд веб-сервера на мыло(boris_r_v @ mai l.ru), при условии, что это возможно.
Давно хотел веб морду прикрутить к контроллеру, да не умею я сильно вебку на php-кодить с нуля.
Собственно в 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.
Для наглядности априлагаю некоторые:
Саму страницу послать сложно, там ссылки на картинки и их придётся со страницей - проще всю директорию сжать.
Но если без этого никак - сделаю!
-
Конечно возможноно - прикреплю, но не ругайте за код - его допиливать надо. Выложу, но по приходу домой - до конца смены 10 минут (не успею). Через пару часов смогу.
-
нда написал - потом увидел:
да запускаемый файл называется user и да лежит он в /home и да не удачный пример.
Спасибо попробую, но могу только на работе UC-7112LX-plus, на котором всё пробую - оставил на работе.
-
Если я верно понял задачу, то есть приложение которое надо рестартить через вебку, а вебка это не может сделать т.к. процес автораном от рута запущен. Если все верно то:
"boris@inspiron:/home$ su - elena -c /home/user" - запуск приложения /home/user от имени пользователя elena
Проверка:
boris@inspiron:~/Work/Science$ ps axu | grep /home/userroot 19925 0.0 0.0 88732 2308 pts/28 S+ 09:40 0:00 su - elena -c /home/userelena 19933 0.0 0.0 12520 1056 ? Ss 09:40 0:00 /home/user - профитboris 19967 0.0 0.0 17184 944 pts/13 S+ 09:42 0:00 grep --color=auto /home/userboris@inspiron:~/Work/Science$Кстати вопрос про вебку - бэкенд на чем написан cgi-скрипты?Да именно так! Включают оборудование на STEP 7 а IA-240 по Modbus RTU используя порты ввода-вывода от OWEN опрашивает опятьже STEP передаёт параметры роботу FANUC по Modbus RTU опятьже через порты. Ну не смог я подключить напрямую. Кроме того IA-240 обслуживает свой техпроцесс.
Но бывают случаи, когда требуется произвести остановку ряда процессов, либо изменить. А через ВЕБ интерфейс очень удобно используя вебовский файл-менеджер на PHP производить загрузку и редактирование. И не ребуется SSH соединение.Пока, что пример в начале работает.
-
Здравствуйте!
Очень необходим стабильный код программы проброски трафика тсп-порта в ком порт IA240 под UNIX.
Во вложении рабочий вариант (исходник, конф-файл и скомпилированный файл). При длительной работе этого варианта периодически образуются нерабочие окна минут в 20-40.... При прочих модификациях наблюдались полные зависания приложения .
Прошу помощи у специалистов! Пожалуйста, укажите ошибку или поделитесь стабильным рабочим кодом проброски трафика. Готов проспонировать 300-500 рублей на пиво при условии стаблильной работы вашего кода более суток.
Условия обмена по трафику:
1. Запросы сверху-вниз. Т.е. открывается ТСП-сокет, из него приходит запрос и транслируется в порт. Из порта должен прийти ответ в течении 1-4 сек. макисмум и отправлен обратно в tcp-порт. (Если не пришел, то ждать ответа дольше смысла нет).
2. Если, одновременно с открытым сокетом открывается второй, то желательно, чтобы последний был главным и обмен в ком-порт переводился на него. ( в приложенном файле - напротив, первый открытый сокет захватывает порт и отключается только по таймауту (впринципе, таймаут - это уже попытки стабилизировать полные зависания...)).
3. Пакеты по обмену небольшие. В большинстве случаев укладываются в 255 - 300 байт.
Жду с нетерпением любой помощи. Заранее благодарю за советы.
Простите, но я не увидел в приложеннм коде формирования второго потока для работы со вторым соединением по 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);
далее для которого будет открыт свой поток.
-
Отвечаю сам себе:
Ничего глупее придумать не смог и найти тоже, но пока работает:
(Испытание на 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
-
Как запустить скрипт при включении питания в IA240LX(Устройство) от имени имеющегося ВЕБ сервера. Устройство не имеет выход в другие сети и по ETHERNET подключено только к технологическому оборудованию. Необходимо иногда перезапускать или полностью останавливать ранее запущенный скрипт. У меня получается в автозапуске только с ROOT. И поэтому с веб-браузера на указанном оборудовании не удаётся СТАРТ/СТОП/РЕСТАРТ (соответственно и удаление файлов с PID запущенных процессов)
IA240-LX ModBus RTU Master
in Встраиваемые коммуникационные компьютеры
Posted
Добавлено изменение!
Используются отделяемые потоки (в файле modbusRTU.c):
Теперь простоя почти нет, общий доступ к глобальным данным, мютекс приобрёл полный смысл!
Аналогично поступил с потоками обработки клиента по Ethernnet (файл mrtusocket.c):
Соответственно нормально происходит обслуживание клиентов по ETHERNET соединению.
в файле mrtusocket.h установил другие параметры - время ожидания:
В моём случае клиенты и серверы находятся на одном устройстве:
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 - регистр командного слова)
Результат: управление (ремя реакции) около двух секунд.