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

oiv_1968

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

    163
  • Joined

  • Last visited

Posts posted by oiv_1968

  1. На диске, прилагаемом с устройством имеются примеры работы по Modbus RTU.

     

    - Пример - но вам придётся организовывать пакет передачи именно для ADAM (в моём примере применяю OWEN).

    - Не все команды реализованы - добавлял по мере необходимости.

    - Не ругайте - проект сырой и делался (делается) для собственных нужд, но из него можно что-то вырвать (настройка порта, контрольная сумма, команды)

     

    Ещё раз - не ругайте:

     

    attachicon.gifmodbustRTUserverS.zip

     

    Это сервер - с одного конца соединение по Serial(ModbusRTU) с другого порт ETERNET. Это не TCPModbus (применял для своих нужд) - после компиляции готов к работе (смотрите примеры на BASH) для работы указать сериал порт и его параметры, а также TCP порт для сервера. Может обслуживать несколько клиентов для одной Modbus сети. Работает непрерывно - если раз обратились к р кгистру(рам) устройства то они в буфер читаются непрерывно какоето время (время жизни пакета) . Для каждого адресаа (по Modbus) устройства свой буфер. В связи с тем, что список регистров не всегда непрерывный - буфер поделён на "кадры". В каждом кадре свой непрерывный список регистров. Отдельный кадр можно применять и для записи в регистр - разные кадры значит и разные команды с параметрами для одного устройства. Откомпилировано для максимального количества кадров = 3. /ПРИМЕР: обращение одного клиента по TCP для устройства ввода-вывода по (Serial)ModbusRTu кадр0-чтение состояния входов; кадр1-чтение состояния выходов; кадр3-изменение состояния выходов. Другой клиетнт может обатиться как к этому же устройству, так и к другому в этойже "сети" Modbus. Важно чтобы запись в одни и теже регистры не производили. Читать можно как угодно./ Для другого последовательного порта необходимо запустить второй экземпляр сервера но указать другой TCP порт, последоательный порт настр. произвольно.

     

    attachicon.gifIa240_TypesStep.zip

     

    Это клиент - (правда только для моих целей) может быть запущен как на IA240, так и на соседнем по локальной сети устройстве. Тут надо указать IP и Port сервера modbusRTUserverS

     

    attachicon.gifFanuc.zip

     

    Это BASH скрипт запуска всех модулей - примеры настроек там же.

     

    Ещё раз не ругайте - проект сырой.

     

    Добавлено изменение!

    Используются отделяемые потоки (в файле 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. Пару моментов

    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, сливаю что надо с мобильника (ранее откомпилированное) произвожу рестарт/

    Спасибо!!!

  4. окай - мерси

    Кстати с запуском то не от рута - получилось?

     

    Пробую в командной строке от 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.

     

     

     

     

  5. Да нет наверное не нужно, был интересен пример реализации, я поразбираюсь если будут вопросы напишу.

     

    Простите! Совсем забыл ФАЙЛОВЫЙ МЕНЕДЖЕР.

     

    webadmin.php

     

    За название простите - это название я для себя делал, хотя код не мой!

    Поместите его на MOXA в рабочую директорию (где ваша страничка)  WEB сервера и обращайтесь к нему из браузера

  6. Не за что, осмелюсь попросить ответную услугу - кинь бек-енд веб-сервера на мыло(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.

    Для наглядности априлагаю некоторые:

     

    start.php

    stop.php

    Fanuc.zip

    pump_paint.php

     

    Саму страницу послать сложно, там ссылки на картинки и их придётся со страницей - проще всю директорию сжать.

    Но если без этого никак - сделаю!

  7. нда написал - потом увидел:

    да запускаемый файл называется user и да лежит он в /home и да не удачный пример.

     

    Спасибо попробую, но могу только на работе UC-7112LX-plus, на котором всё пробую - оставил на работе.

  8.  

    Если я верно понял задачу, то есть приложение которое надо рестартить через вебку, а вебка это не может сделать т.к. процес автораном от рута запущен. Если все верно то:

     

    "boris@inspiron:/home$ su - elena  -c /home/user" - запуск приложения /home/user от имени пользователя elena

    Проверка:

     

    boris@inspiron:~/Work/Science$ ps axu | grep /home/user
    root     19925  0.0  0.0  88732  2308 pts/28   S+   09:40   0:00 su - elena -c /home/user
    elena    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/user
    boris@inspiron:~/Work/Science$ 
     
     
    Кстати вопрос про вебку - бэкенд на чем написан  cgi-скрипты?

     

     

    Да именно так! Включают оборудование на STEP 7 а IA-240 по Modbus RTU используя порты ввода-вывода от OWEN опрашивает опятьже STEP передаёт параметры роботу FANUC по Modbus RTU опятьже через порты. Ну не смог я подключить напрямую. Кроме того IA-240 обслуживает свой техпроцесс.

    Но бывают случаи, когда требуется произвести остановку ряда процессов, либо изменить. А через ВЕБ интерфейс очень удобно используя вебовский файл-менеджер на PHP производить загрузку и редактирование. И не ребуется SSH соединение.Пока, что пример в начале работает.

     

  9. Здравствуйте!

    Очень необходим стабильный код программы проброски трафика тсп-порта в ком порт 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);

    далее для которого будет открыт свой поток.

  10. Отвечаю сам себе:

    Ничего глупее придумать не смог и найти тоже, но пока работает:

    (Испытание на 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

     

  11. Как запустить скрипт при включении питания в IA240LX(Устройство) от имени имеющегося ВЕБ сервера. Устройство не имеет выход в другие сети и по ETHERNET подключено только к технологическому оборудованию. Необходимо иногда перезапускать или полностью останавливать ранее запущенный скрипт. У меня получается в автозапуске только с ROOT. И поэтому с веб-браузера на указанном оборудовании не удаётся СТАРТ/СТОП/РЕСТАРТ (соответственно и удаление файлов с PID  запущенных процессов)

     

×
×
  • Create New...