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

oiv_1968

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

    163
  • Joined

  • Last visited

Posts posted by oiv_1968

  1. Добрый день,

     

    установил последнюю прошивку на устройство moxa UC-8112-lx. Пытаюсь настроить устройство, однако, в нем отсутствует веб - интерфейс, показанный в документации. Из средств доступен только ssh- сервис.

    В чем может быть проблема?

     

    Спасибо.

     

    Доброго времени суток!

    Если не затруднит хотелось бы сначала узнать что есть в директории /etc/init.d ведь на устройстве у Вас Debian?

    по ssh можно и с помощью PuTTY заходить, если пользуетесь виндовсом.

    (кстати кроме ssh в Debian применять что-то другое для настроек это грязное извращение)

     

  2. Доброго времени суток!

    ...Если вдруг кого-то заинтересовало, то вот пример применения "nc":

    www-data@Moxa:~/nsite3$ ./spp.sh help                         
    ./spp.sh -ip <ip addr> -p <ip port>                - сканирование портов и адресов
    ./spp.sh -ip <ip addr> -p <ip port> -f <file_res>  - сканирование с записью в файл
                                                         если файл <file_res> не указан, то сохранение
                                                         в файл "/home/httpd/ramdisk/spp.dat"
    ./spp.sh -ip <ip addr> -p <ip port> -fp <file_res> - сканирование несколькими потоками с записью в файл
                                                         если файл <file_res> не указан, то сохранение
                                                         в файл "/home/httpd/ramdisk/spp.dat"
    www-data@Moxa:~/nsite3$ 
    
    

    Точнее скрипт, в котором используется эта утилита. Понятное дело она не доведена до ума.

    пример:

    www-data@Moxa:~/nsite3$ ./spp.sh -ip 192.168.0.1-254 -p 21-80 -fp
    str=192 168 0 1-255
    Start URL:192.168.0.1 Stop URL:192.168.0.254
    end
    
    

    имя файла не указал... так, что сохранение отчёта будет в "/home/httpd/ramdisk/anshttp.dat".

    Так же понятно, что проверены будут хосты с адреса 192.168.0.1 по 192.168.0.254. И соответственно порты с 21 по 80 на каждом из них.

     

    Пример вызова этого скрипта из другого скрипта (wnsite.sh):

    #многопоточный поиск портов по списку адресов IP4 с записью в файл
    function _spps()
    {
    	echo "URL:  $_url"
    	echo "Port: $_port"
    	str=$(./spp.sh -ip $_url -p $_port -fp)
    	echo -e "$str"
    }
    
    

    А отчёты применены ранее.

     

    Кроме того можно читать содержимое WEB страниц на серверах... и... в Inetnet тоже:

    #GET запрос
    function _get()
    {
    	_met="GET $_path HTTP/1.0\r\n"
    	_host="Host: $_url\r\n"
    	_agent="User-Agent: $_User_Agent\r\n"
    	_snd="$_met$_host$_agent$_Authorization$_Proxy_Authorization$_Proxy_Connection$_Content_type\r\n\r\n"
    	rcv=$(echo -e "$_snd" | nc -4 "$_url" "$_port")
    	echo -e "$rcv"
    }
    
    

    Ну и конечно построить автоматический "web-браузер" конечно... формируя запросы и анализируя ответы (пример):

    www-data@Moxa:~/nsite3$ ./wnsite.sh head_http www.google.ru
    url:www.google.ru port:80
    HTTP/1.0 200 OK
    Date: Fri, 01 Dec 2017 22:54:26 GMT
    Expires: -1
    Cache-Control: private, max-age=0
    Content-Type: text/html; charset=UTF-8
    P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
    Server: gws
    X-XSS-Protection: 1; mode=block
    X-Frame-Options: SAMEORIGIN
    Set-Cookie: 1P_JAR=2017-12-01-22; expires=Sun, 31-Dec-2017 22:54:26 GMT; path=/; domain=.google.ru
    Set-Cookie: NID=118=Zw1AJcJux5jIiFp3Hb2aoVWE_pgb2h8ciC0b9jsZcD1jtUOYhiMb663bBOOpkZ0bBmBLV6Dbe5JT6h3DrOBNogJ0pxORDjEL6g-BHSh4xh32NE1r544LDxGQUMhFKTHu; expires=Sat, 02-Jun-2018 22:54:26 GMT; path=/; domain=.google.ru; HttpOnly
    Accept-Ranges: none
    Vary: Accept-Encoding
    
    ******* anscode=200
    ***************** Ответ на запрос ******************************
    Результат               : 200 - Ok
    Cache-Control           : private, max-age=0
    Date                    : Fri, 01 Dec 2017 22:54:26 GMT
    P3P                     : CP="This is not a P3P policy! See g.co/p3phelp for more info."
    Server                  : gws
    X-XSS-Protection        : 1; mode=block
    Set-Cookie              : 1P_JAR=2017-12-01-22; expires=Sun, 31-Dec-2017 22:54:26 GMT; path=/; domain=.google.ru
    NID=118=Zw1AJcJux5jIiFp3Hb2aoVWE_pgb2h8ciC0b9jsZcD1jtUOYhiMb663bBOOpkZ0bBmBLV6Dbe5JT6h3DrOBNogJ0pxORDjEL6g-BHSh4xh32NE1r544LDxGQUMhFKTHu; expires=Sat, 02-Jun-2018 22:54:26 GMT; path=/; domain=.google.ru; HttpOnly
    Accept-Ranges           : none
    Vary                    : Accept-Encoding
    Content-Type            : text/html; charset=UTF-8
    ****************************************************************
    www-data@Moxa:~/nsite3$
    

    Утилита и простая, и довольно мощная!

    spp.sh.zip

  3. Собствено короткие испытания (прервано по нехватке времени ожидания):

    ЗАДАНИЕ:

                 IP адреса с 192.168.0.1 по 192.168.0.254

                 IP порты с 21 по 80 для каждого из адресов.

    :::::

    старт в 14:21; прерывание работы по CNTRL+C в 16:39.

    Отчёт по файлу в RAM-диске:

    www-data@Moxa:~$ cat /home/httpd/ramdisk/spp.dat
    
    192.168.0.1 23
    192.168.0.1 80
    192.168.0.3 21
    192.168.0.4 53
    192.168.0.8 23
    192.168.0.8 80
    192.168.0.9 23
    192.168.0.9 80
    192.168.0.10 23
    192.168.0.10 80
    192.168.0.11 23
    192.168.0.11 80
    192.168.0.12 23
    192.168.0.12 80
    192.168.0.13 80
    192.168.0.14 22
    192.168.0.14 23
    192.168.0.14 80
    192.168.0.16 80
    192.168.0.20 80
    192.168.0.22 80
    192.168.0.23 80
    192.168.0.26 21
    192.168.0.26 22
    192.168.0.26 23
    192.168.0.28 80
    192.168.0.29 80
    192.168.0.34 80
    192.168.0.35 80
    192.168.0.36 80
    192.168.0.39 21
    192.168.0.39 80
    192.168.0.40 21
    192.168.0.40 80
    192.168.0.41 21
    192.168.0.41 80
    192.168.0.42 21
    192.168.0.42 80
    192.168.0.43 80
    192.168.0.46 80
    192.168.0.47 80
    192.168.0.49 21
    192.168.0.49 23
    192.168.0.49 80
    192.168.0.53 42
    192.168.0.53 53
    192.168.0.55 21
    192.168.0.55 23
    192.168.0.67 80
    192.168.0.85 23
    192.168.0.85 80
    www-data@Moxa:~$ 
    
    

    В процессе пробы периодически просматривался отчёт по "top"  и содержимое файла отчёта по "cat". В процессе всего теста непрерывное подключенное состояние по SSH тремя соединениями. WEB сервер "apache" остановлен.

    Сосбственная оценка этому - "СОЙДЁТ"

     

  4. Доброго времени суток!

    ... и вот что вышло (кусок bash скрипта, ранее рассматриваемого):

    #!/bin/bash
    #
    
    vdate="30.11.2017"
    vversion="01.01"
    
    _nc="nc"
    _url=""
    _port=""
    _file_res=""
    _file_res_def="/home/httpd/ramdisk/spp.dat"
    ((_memmin=500))
    _sppfp1URL=""
    _sppfp1port=""
    
    #для MOXA
    #"cannot connect"
    
    #для Debian
    #"No route to host"
    
    function _help()
    {
    	echo "./spp.sh -ip <ip addr> -p <ip port>                - сканирование портов и адресов"
    	echo "./spp.sh -ip <ip addr> -p <ip port> -f <file_res>  - сканирование несколькими с записью в файл"
    	echo "./spp.sh -ip <ip addr> -p <ip port> -fp <file_res> - сканирование несколькими потоками с записью в файл"
    }
    
    function __help()
    {
    	echo -e "spp <ip addr> <start_port-stop_port>\t - сканирование портов и адресов"
    	echo -e "spps <ip addr> <ip port> <file_res>\t  - сканирование несколькими потоками с записью в файл"
    }
    
    function _sppfp1()
    {
    	str=$(nc -vnz -w 1 $_sppfp1URL $_sppfp1port 2>&1)
    	res=$(echo "$str" | grep "succeeded!")
    	if [ "$res" == "" ]; then
    	 res=$(echo "$str" | grep "open")
    	fi
    	if [ "$res" != "" ]; then
    	 echo "$_sppfp1URL $_sppfp1port" >> "$_file_res"
    	fi
    }
    
    function _sppfp()
    {
    	(( pcnt = 0 ))
    	echo "" > "$_file_res_def"
    	#адреса
    	str=$(echo -e $_url | sed "s/\./ /g")
    	echo "str=$str"
    	ip1=$(echo -e $str | awk '{print($1)}')
    	ip2=$(echo -e $str | awk '{print($2)}')
    	ip3=$(echo -e $str | awk '{print($3)}')
    	ip4=$(echo -e $str | awk '{print($4)}')
    	#
    	ip1=$(echo -e $ip1 | sed "s/-/ /g")
    	ip2=$(echo -e $ip2 | sed "s/-/ /g")
    	ip3=$(echo -e $ip3 | sed "s/-/ /g")
    	ip4=$(echo -e $ip4 | sed "s/-/ /g")
    	#
    	ip1_1=$(echo -e $ip1 | awk '{print($1)}')
    	ip1_2=$(echo -e $ip1 | awk '{print($2)}')
    	if [ "$ip1_2" == "" ]; then
    	ip1_2=$ip1_1
    	fi
    	ip2_1=$(echo -e $ip2 | awk '{print($1)}')
    	ip2_2=$(echo -e $ip2 | awk '{print($2)}')
    	if [ "$ip2_2" == "" ]; then
    	ip2_2=$ip2_1
    	fi
    	ip3_1=$(echo -e $ip3 | awk '{print($1)}')
    	ip3_2=$(echo -e $ip3 | awk '{print($2)}')
    	if [ "$ip3_2" == "" ]; then
    	ip3_2=$ip3_1
    	fi
    	ip4_1=$(echo -e $ip4 | awk '{print($1)}')
    	ip4_2=$(echo -e $ip4 | awk '{print($2)}')
    	if [ "$ip4_2" == "" ]; then
    	ip4_2=$ip4_1
    	fi
    	_startURL="$ip1_1.$ip2_1.$ip3_1.$ip4_1"
    	_stopURL="$ip1_2.$ip2_2.$ip3_2.$ip4_2"
    	echo "Start URL:$_startURL Stop URL:$_stopURL"
    	#порты
    	str=$(echo -e $_port | sed "s/-/ /g")
    	_startport=$(echo "$str" | awk '{print($1)}')
    	_stopport=$(echo "$str" | awk '{print($2)}')
    	if [ "$_stopport" == "" ]; then
    	 _stopport=$_startport
    	fi
    	#
    	while( ((ip1_1 <= ip1_2)) ); do
    	 while( ((ip2_1 <= ip2_2)) ); do
    	  while( ((ip3_1 <= ip3_2)) ); do
    	   while( ((ip4_1 <= ip4_2)) ); do
    	    ((_cntport=_startport))
    	    _startURL="$ip1_1.$ip2_1.$ip3_1.$ip4_1"
    	    while ( ((_cntport <= _stopport)) ); do
    	     mem=$(free | awk '/Mem:/ {print($4)}')
    	     echo "mem: $mem"
    	     if ( (( mem > _memmin )) ); then
    	      _sppfp1URL=$_startURL
    	      _sppfp1port=$_cntport
    	      _sppfp1 &
    	      ((_cntport += 1))
    	     fi
    	    done
    	    ((ip4_1 += 1))
               done
               ((ip3_1 += 1))
              done
    	  ((ip2_1 += 1))
    	 done
    	 ((ip1_1 += 1))
    	done
    	echo "end"
    }
    
    

    Работа по нескольким потокам... количество зависит от размера свободной памяти. Ограничение по нижнему значению выбрал 500 кБ. И... ничего себе довольно шустро, относительно конечно, работает. Для работы перед этим остановил apache.

     

    Вот отчёт занятости по "top":

    Load average: 4.58 4.67 3.37 3/57 1731
      PID  PPID USER     STAT   VSZ %MEM %CPU COMMAND
    22976   134 www-data S     2152   7%   8% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
      135   131 www-data S     6528  22%   4% /bin/sshd -i 
    12253   136 www-data R     2316   8%   3% top 
     1679  1677 www-data S     2152   7%   1% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
      129    77 root     S     6672  22%   0% /bin/sshd -i 
      137    77 root     S     6672  22%   0% /bin/sshd -i 
      131    77 root     S     6672  22%   0% /bin/sshd -i 
      139   137 www-data S     6616  22%   0% /bin/sshd -i 
      133   129 www-data S     6528  22%   0% /bin/sshd -i 
      134   133 www-data S     2496   8%   0% -sh 
      140   139 www-data S     2492   8%   0% -sh 
      136   135 www-data S     2492   8%   0% -sh 
     1727  1725 www-data R     2228   7%   0% awk /Mem:  {print($4)} 
     1638 22976 www-data S     2152   7%   0% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
     1719 22976 www-data S     2152   7%   0% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
     1725 22976 www-data S     2152   7%   0% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
     1621 22976 www-data S     2152   7%   0% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
     1655 22976 www-data S     2152   7%   0% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
     1660  1655 www-data S     2152   7%   0% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
     1669 22976 www-data S     2152   7%   0% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
     1677 22976 www-data S     2152   7%   0% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
     1694 22976 www-data S     2152   7%   0% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
     1702 22976 www-data S     2152   7%   0% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
     1623  1621 www-data S     2152   7%   0% [spp.sh]
     1695  1694 www-data S     2152   7%   0% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
     1707  1702 www-data S     2152   7%   0% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
     1723  1719 www-data S     2152   7%   0% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
     1643  1638 www-data S     2152   7%   0% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
     1671  1669 www-data S     2152   7%   0% /bin/bash ./spp.sh -ip 192.168.0.1-254 -p 9000-9100 -fp 
      113     1 root     S     2084   7%   0% /bin/sh --login 
     1627  1623 www-data S     1564   5%   0% [nc]
     1664  1660 www-data S     1564   5%   0% nc -vnz -w 1 192.168.0.8 9086 
     1672  1671 www-data S     1564   5%   0% nc -vnz -w 1 192.168.0.8 9087 
     1700  1695 www-data S     1564   5%   0% nc -vnz -w 1 192.168.0.8 9089 
     1714  1707 www-data S     1564   5%   0% nc -vnz -w 1 192.168.0.8 9090 
     1644  1643 www-data S     1564   5%   0% nc -vnz -w 1 192.168.0.8 9085 
     1686  1679 www-data S     1564   5%   0% nc -vnz -w 1 192.168.0.8 9088 
     1728  1723 www-data R     1336   4%   0% nc -vnz -w 1 192.168.0.8 9091 
       77     1 root     S     1284   4%   0% /bin/inetd 
      118     1 root     S     1280   4%   0% /bin/snmpd 
       49     1 root     S     1252   4%   0% dhcpcd eth0 
        1     0 root     S     1248   4%   0% init [3]  
       85     1 bin      S     1220   4%   0% /bin/portmap 
      122     1 root     S     1200   4%   0% /bin/reportip 
    www-data@Moxa:~$ 
    
    

    Не "Zenmap" конечно, что на PC, но всё же "скаблить" сеть уже реально можно...

    С адресами 192.168.0.1-254 и диапазоном портов 9000-9100... не на слуху понятное дело... но уходит уже не день, как просто "ping".

    Устройство UC-7112-LX-Plus в моём применении в работе сутками... удачная разработка инженеров и производителей. Вот бы ОЗУ побольше бы.

  5. Доброго времени суток!

    ...Должно получиться что-то наподобие "zenmap" точнее "nmap", только как автоматический круглосуточный скрипт. Правда для пробы пришлось оcтановить apache, иначе нагрузка (наличие ОЗУ) около 2 Мб... а без него аж 9 Мб.

    изменил скрипт(заготовку):

    #!/bin/bash
    #
    
    _nc="nc"
    _url=""
    _port=""
    vdate="27.11.2017"
    vversion="01.01"
    
    #для MOXA
    #"cannot connect"
    
    #для Debian
    #"No route to host"
    
    function _help()
    {
    	echo "./spp.sh -ip <ip addr> -p <ip port>"
    }
    
    function __help()
    {
    	echo -e "spp <ip addr> <start_port-stop_port>\t - сканирование портов и адресов"
    }
    
    function _spp()
    {
    	
    	#адреса
    	str=$(echo -e $_url | sed "s/\./ /g")
    	echo "str=$str"
    	ip1=$(echo -e $str | awk '{print($1)}')
    	ip2=$(echo -e $str | awk '{print($2)}')
    	ip3=$(echo -e $str | awk '{print($3)}')
    	ip4=$(echo -e $str | awk '{print($4)}')
    	#
    	ip1=$(echo -e $ip1 | sed "s/-/ /g")
    	ip2=$(echo -e $ip2 | sed "s/-/ /g")
    	ip3=$(echo -e $ip3 | sed "s/-/ /g")
    	ip4=$(echo -e $ip4 | sed "s/-/ /g")
    	#
    	ip1_1=$(echo -e $ip1 | awk '{print($1)}')
    	ip1_2=$(echo -e $ip1 | awk '{print($2)}')
    	if [ "$ip1_2" == "" ]; then
    	ip1_2=$ip1_1
    	fi
    	ip2_1=$(echo -e $ip2 | awk '{print($1)}')
    	ip2_2=$(echo -e $ip2 | awk '{print($2)}')
    	if [ "$ip2_2" == "" ]; then
    	ip2_2=$ip2_1
    	fi
    	ip3_1=$(echo -e $ip3 | awk '{print($1)}')
    	ip3_2=$(echo -e $ip3 | awk '{print($2)}')
    	if [ "$ip3_2" == "" ]; then
    	ip3_2=$ip3_1
    	fi
    	ip4_1=$(echo -e $ip4 | awk '{print($1)}')
    	ip4_2=$(echo -e $ip4 | awk '{print($2)}')
    	if [ "$ip4_2" == "" ]; then
    	ip4_2=$ip4_1
    	fi
    	_startURL="$ip1_1.$ip2_1.$ip3_1.$ip4_1"
    	_stopURL="$ip1_2.$ip2_2.$ip3_2.$ip4_2"
    	echo "Start URL:$_startURL Stop URL:$_stopURL"
    	#порты
    	str=$(echo -e $_port | sed "s/-/ /g")
    	_startport=$(echo "$str" | awk '{print($1)}')
    	_stopport=$(echo "$str" | awk '{print($2)}')
    	if [ "$_stopport" == "" ]; then
    	 _stopport=$_startport
    	fi
    	#
    	while( ((ip1_1 <= ip1_2)) ); do
    	 while( ((ip2_1 <= ip2_2)) ); do
    	  while( ((ip3_1 <= ip3_2)) ); do
    	   while( ((ip4_1 <= ip4_2)) ); do
    	    ((_cntport=_startport))
    	    _startURL="$ip1_1.$ip2_1.$ip3_1.$ip4_1"
    	    #echo "URL=$_startURL Port=$_cntport"
    	    while ( ((_cntport <= _stopport)) ); do
    	     str=$(nc -vnz $_startURL $_cntport 2>&1)
    	     #echo "--$str"
    	     res=$(echo "$str" | grep "succeeded!")
    	     if [ "$res" == "" ]; then
    	      res=$(echo "$str" | grep "open")
    	     fi
    	     if [ "$res" != "" ]; then
    	      echo "$_startURL $_cntport"
    	     fi
    	     res=$(echo "$str" | grep "No route to host")
    	     if [ "$res" != "" ]; then
    	      break
    	     fi
    	      res=$(echo "$str" | grep "cannot connect")
    	     if [ "$res" != "" ]; then
    	      break
    	     fi
    	     ((_cntport += 1))
    	    done
    	    ((ip4_1 += 1))
               done
               ((ip3_1 += 1))
              done
    	  ((ip2_1 += 1))
    	 done
    	 ((ip1_1 += 1))
    	done
    	echo "end"
    }
    
    case $1 in
    	"help")
    		_help
    	;;
    	"--help")
    		__help
    	;;
    	"version")
    		echo -e "******\tspp.sh Date:$vdate Version:$vversion\t******"
    	;;
    	"-ip")
    		_url=$2
    		case $3 in
    			"-p")
    				_port=$4
    				if [ "$_port" == "" ]
    				 then
    				  echo "-p parametr ?"
    				else
    				 _spp
    				fi
    			;;
    			*)
    				echo "parametr ???"
    			;;
    		esac
    	;;
    	"-p")
    		_port=$2
    		case $3 in
    			"-ip")
    				_url=$4
    				if [ "$_url" == "" ]
    				 then
    				  echo "-ip parametr ?"
    				else
    				 _spp
    				fi
    			;;
    			*)
    				echo "parametr ???"
    			;;
    		esac
    	;;
    	*)
    		echo "use \"help\""
    	;;
    esac
    

    И вот что вышло в домашней локальной сети:

    gor@debian-i:~/coding/bash/nsite3$ ./wnsite.sh spp 192.168.0.1-254 21-80
    URL:  192.168.0.1-254
    Port: 21-80
    str=192 168 0 1-254
    Start URL:192.168.0.1 Stop URL:192.168.0.254
    192.168.0.1 23
    192.168.0.1 53
    192.168.0.1 80
    192.168.0.31 21
    192.168.0.31 22
    192.168.0.31 23
    192.168.0.60 22
    192.168.0.67 21
    192.168.0.67 22
    192.168.0.67 80
    192.168.0.240 21
    192.168.0.240 22
    192.168.0.240 23
    192.168.0.241 21
    192.168.0.241 22
    192.168.0.241 23
    end
    igor@debian-i:~/coding/bash/nsite3$ 
    

    Правда приведённый скрипт запускается другим скриптом (wnsite.sh)

     

    ...Простите - исправление. Дело в том, что упомянутый "nc" в отличии от того, что в Debian 7 сообщение "cannot connect" вывводит и при отсутствии хоста, как такового... так и при отсутствии открытого порта.

    В то время как в Debian сообщение "No route to host" присутствует только при отсутствии хоста... и пинг по этому адресу не проходит. Для ускорения надо применить  ключ "-w <time>" вот так:

    str=$(nc -vnz -w 1 $_startURL $_cntport 2>&1)
    

    Работа продолжается...

     

  6. Доброго времени суток!

    ...Должно получиться что-то наподобие "zenmap" точнее "nmap", только как автоматический круглосуточный скрипт. Правда для пробы пришлось оcтановить apache, иначе нагрузка (наличие ОЗУ) около 2 Мб... а без него аж 9 Мб.

    изменил скрипт(заготовку):

    #!/bin/bash
    #
    
    _nc="nc"
    _url=""
    _port=""
    vdate="27.11.2017"
    vversion="01.01"
    
    #для MOXA
    #"cannot connect"
    
    #для Debian
    #"No route to host"
    
    function _help()
    {
    	echo "./spp.sh -ip <ip addr> -p <ip port>"
    }
    
    function __help()
    {
    	echo -e "spp <ip addr> <start_port-stop_port>\t - сканирование портов и адресов"
    }
    
    function _spp()
    {
    	
    	#адреса
    	str=$(echo -e $_url | sed "s/\./ /g")
    	echo "str=$str"
    	ip1=$(echo -e $str | awk '{print($1)}')
    	ip2=$(echo -e $str | awk '{print($2)}')
    	ip3=$(echo -e $str | awk '{print($3)}')
    	ip4=$(echo -e $str | awk '{print($4)}')
    	#
    	ip1=$(echo -e $ip1 | sed "s/-/ /g")
    	ip2=$(echo -e $ip2 | sed "s/-/ /g")
    	ip3=$(echo -e $ip3 | sed "s/-/ /g")
    	ip4=$(echo -e $ip4 | sed "s/-/ /g")
    	#
    	ip1_1=$(echo -e $ip1 | awk '{print($1)}')
    	ip1_2=$(echo -e $ip1 | awk '{print($2)}')
    	if [ "$ip1_2" == "" ]; then
    	ip1_2=$ip1_1
    	fi
    	ip2_1=$(echo -e $ip2 | awk '{print($1)}')
    	ip2_2=$(echo -e $ip2 | awk '{print($2)}')
    	if [ "$ip2_2" == "" ]; then
    	ip2_2=$ip2_1
    	fi
    	ip3_1=$(echo -e $ip3 | awk '{print($1)}')
    	ip3_2=$(echo -e $ip3 | awk '{print($2)}')
    	if [ "$ip3_2" == "" ]; then
    	ip3_2=$ip3_1
    	fi
    	ip4_1=$(echo -e $ip4 | awk '{print($1)}')
    	ip4_2=$(echo -e $ip4 | awk '{print($2)}')
    	if [ "$ip4_2" == "" ]; then
    	ip4_2=$ip4_1
    	fi
    	_startURL="$ip1_1.$ip2_1.$ip3_1.$ip4_1"
    	_stopURL="$ip1_2.$ip2_2.$ip3_2.$ip4_2"
    	echo "Start URL:$_startURL Stop URL:$_stopURL"
    	#порты
    	str=$(echo -e $_port | sed "s/-/ /g")
    	_startport=$(echo "$str" | awk '{print($1)}')
    	_stopport=$(echo "$str" | awk '{print($2)}')
    	if [ "$_stopport" == "" ]; then
    	 _stopport=$_startport
    	fi
    	#
    	while( ((ip1_1 <= ip1_2)) ); do
    	 while( ((ip2_1 <= ip2_2)) ); do
    	  while( ((ip3_1 <= ip3_2)) ); do
    	   while( ((ip4_1 <= ip4_2)) ); do
    	    ((_cntport=_startport))
    	    _startURL="$ip1_1.$ip2_1.$ip3_1.$ip4_1"
    	    #echo "URL=$_startURL Port=$_cntport"
    	    while ( ((_cntport <= _stopport)) ); do
    	     str=$(nc -vnz $_startURL $_cntport 2>&1)
    	     #echo "--$str"
    	     res=$(echo "$str" | grep "succeeded!")
    	     if [ "$res" == "" ]; then
    	      res=$(echo "$str" | grep "open")
    	     fi
    	     if [ "$res" != "" ]; then
    	      echo "$_startURL $_cntport"
    	     fi
    	     res=$(echo "$str" | grep "No route to host")
    	     if [ "$res" != "" ]; then
    	      break
    	     fi
    	      res=$(echo "$str" | grep "cannot connect")
    	     if [ "$res" != "" ]; then
    	      break
    	     fi
    	     ((_cntport += 1))
    	    done
    	    ((ip4_1 += 1))
               done
               ((ip3_1 += 1))
              done
    	  ((ip2_1 += 1))
    	 done
    	 ((ip1_1 += 1))
    	done
    	echo "end"
    }
    
    case $1 in
    	"help")
    		_help
    	;;
    	"--help")
    		__help
    	;;
    	"version")
    		echo -e "******\tspp.sh Date:$vdate Version:$vversion\t******"
    	;;
    	"-ip")
    		_url=$2
    		case $3 in
    			"-p")
    				_port=$4
    				if [ "$_port" == "" ]
    				 then
    				  echo "-p parametr ?"
    				else
    				 _spp
    				fi
    			;;
    			*)
    				echo "parametr ???"
    			;;
    		esac
    	;;
    	"-p")
    		_port=$2
    		case $3 in
    			"-ip")
    				_url=$4
    				if [ "$_url" == "" ]
    				 then
    				  echo "-ip parametr ?"
    				else
    				 _spp
    				fi
    			;;
    			*)
    				echo "parametr ???"
    			;;
    		esac
    	;;
    	*)
    		echo "use \"help\""
    	;;
    esac
    

    И вот что вышло в домашней локальной сети:

    gor@debian-i:~/coding/bash/nsite3$ ./wnsite.sh spp 192.168.0.1-254 21-80
    URL:  192.168.0.1-254
    Port: 21-80
    str=192 168 0 1-254
    Start URL:192.168.0.1 Stop URL:192.168.0.254
    192.168.0.1 23
    192.168.0.1 53
    192.168.0.1 80
    192.168.0.31 21
    192.168.0.31 22
    192.168.0.31 23
    192.168.0.60 22
    192.168.0.67 21
    192.168.0.67 22
    192.168.0.67 80
    192.168.0.240 21
    192.168.0.240 22
    192.168.0.240 23
    192.168.0.241 21
    192.168.0.241 22
    192.168.0.241 23
    end
    igor@debian-i:~/coding/bash/nsite3$ 
    

    Правда приведённый скрипт запускается другим скриптом (wnsite.sh)

  7. Я знал, что у вас получится :)

    Спасибо за поддержку!

    Только вот решил монтировать полностью /usr... а не по директориям. И "mc" туда же поместил. Совсем не надо "alias" стало. Не думал, что и "Perl" в родном /usr/bin есть... жаль, что я на нём не работаю (надо подумать).

     

  8. Вообще-то всё по идиотски... вот это:

    #определение принадлежности к MOXA
    _un=$(uname -a | awk '{print($2)}')
    case $_un in
    	Moxa)
    		_nc="/mnt/sd/nc/nc"
    	;;
    	*)
    		_nc="nc"
    	;;
    esac
    

    ... тупо и по незнанию. Может как-то умнее и проще надо но... убрав вышеуказанное сделал так:

    1) скопировал на SD в /mnt/sd/bin содержимое /usr/bin,

    2) примонтировал:

    #mount /usr/bin
    mount /mnt/sd/bin /usr/bin
    
    

    прямо в файле /etc/rc.d/rc.local

    3) удалил ранее установленные алиасы в /etc/bashrc и где только поставил

    И... вроде ничего лишнего и "nc" стал доступен из скриптов :)

     

    Можно конечно и в /etc/fstab, но страшно... а шнурком консоли давно не пользуюсь. Только по SSH.

     

    Что ж... буду убирать везде где можно хлам из UC-7112-LX-Plus

  9.  

    Ох :huh:. Навряд ли вы найдёте тут ответ...

     

    Если не трудно ткните меня носом на источник возможного ответа.

    Буду благодарен!

     

    Вот (тупость разумеется):

    #!/bin/bash
    #
    
    _nc=""
    _url=""
    _port=""
    
    
    #определение принадлежности к MOXA
    _un=$(uname -a | awk '{print($2)}')
    case $_un in
    	Moxa)
    		_nc="/mnt/sd/nc/nc"
    	;;
    	*)
    		_nc="nc"
    	;;
    esac
    
    function _help()
    {
    	echo "./spp.sh -ip <ip addr> -p <ip port>"
    }
    
    function _spp()
    {
    	str=$(echo -e $_port | sed "s/-/ /g")
    	_startport=$(echo "$str" | awk '{print($1)}')
    	_stopport=$(echo "$str" | awk '{print($2)}')
    	while ( ((_startport <= _stopport)) )
    	 do
    	  str=""
    	  str=$($_nc -vnz -4 $_url $_startport 2>&1)
    	  res=$(echo "$str" | grep "succeeded!")
    	  if [ "$res" == "" ]
    	   then
    	    res=$(echo "$str" | grep "open")
    	  fi
    	  if [ "$res" != "" ]
    	   then
    	    echo "$_url $_startport"
    	  fi
    	  ((_startport += 1))
    	done
    	echo "end"
    }
    
    case $1 in
    	"help")
    		_help
    	;;
    	"-ip")
    		_url=$2
    		case $3 in
    			"-p")
    				_port=$4
    				if [ "$_port" == "" ]
    				 then
    				  echo "-p parametr ?"
    				else
    				 _spp
    				fi
    			;;
    			*)
    				echo "parametr ???"
    			;;
    		esac
    	;;
    	"-p")
    		_port=$2
    		case $3 in
    			"-ip")
    				_url=$4
    				if [ "$_url" == "" ]
    				 then
    				  echo "-ip parametr ?"
    				else
    				 _spp
    				fi
    			;;
    			*)
    				echo "parametr ???"
    			;;
    		esac
    	;;
    	*)
    		echo "use \"help\""
    	;;
    esac
    
    

    Но работает и там и там. Понятно, что можно и nc -vnz <ip addr> <ip port start>-<ip port stop>, но вывод этого скрипта нужен для ввода в другой скрипт... а проверять вывод больше желания нет в другом(скрипте)... потому как надо конкретные данные.

     

  10. Доброго времени суток Люди Добрые!

    Собственно возник вопрос:

    Как получать результат в bash-скрипт из NetCat. Тестировал вот это на Debian (это заготовка):

    #!/bin/bash
    #
    
    _p1=$1
    _p2=$2
    _p3=$3
    _nc=""
    _url=""
    _port=""
    
    
    #определение принадлежности к MOXA
    _un=$(uname -a | awk '{print($2)}')
    case $_un in
    	Moxa)
    		_nc="/mnt/sd/nc/nc"
    	;;
    	*)
    		_nc="nc"
    	;;
    esac
    
    function _help()
    {
    	echo "help"
    }
    
    function _spp()
    {
    	str=$(echo -e $_port | sed "s/-/ /g")
    	_startport=$(echo "$str" | awk '{print($1)}')
    	_stopport=$(echo "$str" | awk '{print($2)}')
    	while ( ((_startport <= _stopport)) )
    	 do
    	  str=""
    	  str=$($_nc -vnz -4 $_url $_startport 2>&1)
    	  res=$(echo "$str" | grep "succeeded!")
    	  if [ "$res" != "" ]
    	   then
    	    echo "$_url $_startport"
    	  fi
    	  ((_startport += 1))
    	done
    }
    
    case $1 in
    	"help")
    		_help
    	;;
    	"-ip")
    		_url=$2
    		case $3 in
    			"-p")
    				_port=$4
    				if [ "$_port" == "" ]
    				 then
    				  echo "-p parametr ?"
    				else
    				 _spp
    				fi
    			;;
    			*)
    				echo "parametr ???"
    			;;
    		esac
    	;;
    	*)
    		echo "use \"help\""
    	;;
    esac
    

    понятно... в локальной сети:

    igor@debian-i:~/coding/bash/nsite2$ ./spp.sh -ip 192.168.0.1 -p 21-80
    192.168.0.1 23
    192.168.0.1 53
    192.168.0.1 80
    igor@debian-i:~/coding/bash/nsite2$ 
    

    И все бы не плохо но результат определял по слову в выводе

    В Debian на ПК:

    igor@debian-i:~/coding/bash/nsite2$ nc -vnz 192.168.0.1 80
    Connection to 192.168.0.1 80 port [tcp/*] succeeded!
    igor@debian-i:~/coding/bash/nsite2$ 
    

    А вот тоже самое на UC-7112-Lx-plus:

    www-data@Moxa:~$ nc -vnz 192.168.0.1 80
    192.168.0.1:80 (Dlink-Router.Dlink) open
    www-data@Moxa:~$ 
    

    Так по какому принципу (правилу) определять, что порт открыт. Мучение испытывал мой старенький роутер (DIR-620) от ПК и MOXA.

    Хочется что бы скрипт работал корректно и там и там

     

    Заранее благодарен за ответ!

    Спасибо!

  11. Очередной опыт применения для работы с устройством аналогового ввода МВ110-224.2А...

    Читаются все 12 регистров устройства и выводятся на консоль тестовой программой (прилагается). Реализовано через команду 3 Modbus RTU.

    kto@debian:~/coding/moxa/ia240_uc7112lpus/test_mv110_224_2a$ ./test_mv110_224_2a
    
    Ошибка!: Не определён параметр!
    "--help" для информации
    
    kto@debian:~/coding/moxa/ia240_uc7112lpus/test_mv110_224_2a$ ./test_mv110_224_2a --help
    
           --help             - Подсказка
    
           -ip <ip addr>      - IP адрес сервера Modbus RTU (modbusRTUerverS)
           -p <port>          - порт сервера Modbus RTU (modbusRTUserverS)
           -a <mAddr>         - адрес МВ110-224.2А по Modbus RTU
           -tw <time>         - время сна после обмена (микросекунд)
    
    kto@debian:~/coding/moxa/ia240_uc7112lpus/test_mv110_224_2a$ 
    

    И собственно отчёт:

    kto@debian:~/coding/moxa/ia240_uc7112lpus/test_mv110_224_2a$ ./test_mv110_224_2a -ip 192.168.0.246 -p 8971 -a 16 -tw 1000
    ip=192.168.0.246
    IP:192.168.0.246 PORT:8971
    ---- opening tcp/ip  8971 ----
    Err connect МВ110-224.2А (Rd InMask)------------------------------ addr:16  res:129
    
    Регистры 0...11: 0000 0043 0000 0873 4284 69A8 0000 0055 0000 0834 42A8 11FE
    (Рег.0) Положение десятичной точки в целом для входа 1..........: 0
    (Рег.1) Целое значение измерения входа 1 со смещением точки.....: 67
    (Рег.2) Статус измерения входа 1 (код исключительной ситуации)..: 0000(HEX)
    (Рег.3) Циклическое время измерения входа 1.....................: 2163
    (Рег.4,5) Измерение входа 1 в представлении с плавающей точкой..: 66.206360(FLOAT) 4284(HEX Reg4) 69A8(HEX Reg5)
    (Рег.6) Положение десятичной точки в целом для входа 1..........: 0
    (Рег.7) Целое значение измерения входа 1 со смещением точки.....: 85
    (Рег.8) Статус измерения входа 1 (код исключительной ситуации)..: 0000(HEX)
    (Рег.9) Циклическое время измерения входа 1.....................: 2100
    (Рег.10,11) Измерение входа 1 в представлении с плавающей точкой: 84.035141(FLOAT) 42A8(HEX Reg10) 11FE(HEX Reg11)
    
    Регистры 0...11: 0000 0043 0000 0873 4284 69A8 0000 0055 0000 0834 42A8 11FE
    (Рег.0) Положение десятичной точки в целом для входа 1..........: 0
    (Рег.1) Целое значение измерения входа 1 со смещением точки.....: 67
    (Рег.2) Статус измерения входа 1 (код исключительной ситуации)..: 0000(HEX)
    (Рег.3) Циклическое время измерения входа 1.....................: 2163
    (Рег.4,5) Измерение входа 1 в представлении с плавающей точкой..: 66.206360(FLOAT) 4284(HEX Reg4) 69A8(HEX Reg5)
    (Рег.6) Положение десятичной точки в целом для входа 1..........: 0
    (Рег.7) Целое значение измерения входа 1 со смещением точки.....: 85
    (Рег.8) Статус измерения входа 1 (код исключительной ситуации)..: 0000(HEX)
    (Рег.9) Циклическое время измерения входа 1.....................: 2100
    (Рег.10,11) Измерение входа 1 в представлении с плавающей точкой: 84.035141(FLOAT) 42A8(HEX Reg10) 11FE(HEX Reg11)
    
    Регистры 0...11: 0000 0043 0000 0973 4284 6883 0000 0055 0000 0933 42A8 1C46
    (Рег.0) Положение десятичной точки в целом для входа 1..........: 0
    (Рег.1) Целое значение измерения входа 1 со смещением точки.....: 67
    (Рег.2) Статус измерения входа 1 (код исключительной ситуации)..: 0000(HEX)
    (Рег.3) Циклическое время измерения входа 1.....................: 2419
    (Рег.4,5) Измерение входа 1 в представлении с плавающей точкой..: 66.204124(FLOAT) 4284(HEX Reg4) 6883(HEX Reg5)
    (Рег.6) Положение десятичной точки в целом для входа 1..........: 0
    (Рег.7) Целое значение измерения входа 1 со смещением точки.....: 85
    (Рег.8) Статус измерения входа 1 (код исключительной ситуации)..: 0000(HEX)
    (Рег.9) Циклическое время измерения входа 1.....................: 2355
    (Рег.10,11) Измерение входа 1 в представлении с плавающей точкой: 84.055222(FLOAT) 42A8(HEX Reg10) 1C46(HEX Reg11)
    

    Работа производиться с ПК с Linux в консоли. Подключение к устройству МК110-224.2А через ранее рассматриваемый сервер на устройстве MOXA.

     

    test_mv110_224_2a.zip

  12. Тест доступа к станции катодной защиты СКЗ НГК-ИПКЗ Евро 12Н/-02/24/-У1 где было обнаружено, что доступ поочерёдно к блокам не получается. В том смысле, что "перечитывать" как угодно не выходит... а именно при обращении к блоку с меньшим адресом теряется связь с более старшим адресом. Всё с циклическим опросом... но и с одиночным так же

    Всё делалось через UC-7101-Lx с рассматриваемым сервером:

    kto@debian:~/coding/moxa/ia240_uc7112lpus/catodeshield/test_module$ ./testSCS
    
    Ошибка!: Не определён параметр!
    "--help" для информации
    
    kto@debian:~/coding/moxa/ia240_uc7112lpus/catodeshield/test_module$ ./testSCS --help
    
           --help             - Подсказка
    
           -ip <ip addr>      - IP адрес сервера Modbus RTU (modbusRTUerverS)
           -p <port>          - порт сервера Modbus RTU (modbusRTUserverS)
           -a <mAddr>         - адрес блока по Modbus RTU
           -tw <time>         - время ожидания ответа (микросекнд)
           -ts <time>         - время сна после обмена (микросекунд)
           -tl <tloop>        - время жизни в циклах процесса Modbus RTU
    
    kto@debian:~/coding/moxa/ia240_uc7112lpus/catodeshield/test_module$ 
    
    

    При этом:

    kto@debian:~/coding/moxa/ia240_uc7112lpus/catodeshield/test_module$ ./testSCS -ip 192.168.0.246 -p 8971 -a 1 -tw 1000000 -ts 100000 -tl 2
    ip=192.168.0.246
    IP:192.168.0.246 PORT:8971
    ---- opening tcp/ip  8971 ----
    MODULE: 01   CMD: 02   RES(HEX): 81
    MODULE: 01   CMD: 03   RES(HEX): 81
    MODULE: 01   CMD: 04   RES(HEX): 81
    MODULE: 01   CMD: 02   RES(HEX): 00    DATA(HEX): 00
    MODULE: 01   CMD: 03   RES(HEX): 81
    MODULE: 01   CMD: 04   RES(HEX): 81
    MODULE: 01   CMD: 02   RES(HEX): 00    DATA(HEX): 00
    MODULE: 01   CMD: 03   RES(HEX): 00    DATA(HEX): 0031 FF38 FFA6 0001 0000  
    MODULE: 01   CMD: 04   RES(HEX): 00
    MODULE: 01   CMD: 02   RES(HEX): 00    DATA(HEX): 00
    MODULE: 01   CMD: 03   RES(HEX): 00    DATA(HEX): 0031 FF38 FFA6 0001 0000  
    MODULE: 01   CMD: 04   RES(HEX): 00
    MODULE: 01   CMD: 02   RES(HEX): 00    DATA(HEX): 00
    MODULE: 01   CMD: 03   RES(HEX): 00    DATA(HEX): 0031 FF38 FFA6 0001 0000  
    MODULE: 01   CMD: 04   RES(HEX): 00
    MODULE: 01   CMD: 02   RES(HEX): 00    DATA(HEX): 00
    MODULE: 01   CMD: 03   RES(HEX): 00    DATA(HEX): 0031 FF38 FFA6 0001 0000  
    MODULE: 01   CMD: 04   RES(HEX): 00
    MODULE: 01   CMD: 02   RES(HEX): 00    DATA(HEX): 00
    MODULE: 01   CMD: 03   RES(HEX): 00    DATA(HEX): 0031 FF38 FFA6 0001 0000 
    

    То есть связь налажена и данные идут в то время, как устройство по адресу 2 теряет связь, а по адресу 3 связь восстанавливается. Проба проведена с помощью запускаемых копий программы с разных компьютеров в одной сети. Тем не менее при обращении аналогично к распространённым портам ввода-вывода и другим устройствам всё в порядке.

    Работа потребовалась при написании клиент-сервера для данной станции катодной защиты.

     

    Выяснено, что требуется очень большое время между обращениями к разным блокам(адресам)... непрерывное обращение к одному блоку проходит нормально при любом раскладе.

    test_module.zip

  13. Доброго времени суток!

    Обнаружены две очень грубые ошибки в формировании функций 3 и 4 а именно:

    #if(_client == 1)
    //команда 3
    int	C_MRTU_CMD_0x03(U8	AddrMRTU,	//адрес устройства
    			U16	AddrReg,	//адрес регистра
    			U16	CntReg,		//количество регистров
    			U16 * 	Rdat,		//массив данных
    			U8	Frame,		//номер кадра
    			U32	TimeWait,	//время ожидания ответа от устройства
    			U32 	TimeLive,	//время жизни пакета
    			U32	TwSleep,	//время сна после обмена
    			U8	Flag		//флаг запроса MRTU
    			)
    {
    	int res;
    	U16	cntreg		= 0;
    	int	paddr		= 0;
    	U16	reg;
    	U8	dsend[256] 	= {0};
    	U8	drecv[256] 	= {0};
    	//
    	dsend[0]	= AddrMRTU;			//адрес устройства
    	dsend[1]	= 0x03;				//команда
    	dsend[2]	= (U8)((AddrReg >> 8) & 0xFF);	//адрес первого регистра
    	dsend[3]	= (U8)(AddrReg & 0xFF);		//
    	dsend[4]	= (U8)((CntReg >> 8) & 0xFF);	//количество регистров
    	dsend[5]	= (U8)(CntReg & 0xFF);		//
    	res =C_MRTU_CMD(&dsend[0],
                            &drecv[0],
                            6,				//размер запроса
                            Frame,
                            TimeWait,
                            TimeLive,
    			TwSleep,
                            Flag
                            );
    	while(cntreg < CntReg)
    	{
    		reg = drecv[0x03 + paddr + 1];
    		reg |= (drecv[0x03 + paddr] << 8);
                    //ранее было без сдвига влево на 8
     		paddr += 2;
    		*(Rdat + cntreg) = reg;
    		cntreg++;
    	}
    	//
    	return res;
    }
    #endif
    

    аналогично и для функции 4, но они только со стороны клиента в применении файла mrtusocket.c. Со стороны клиента при применении указанного файла эта команда выполнялась не правильно... была накладка - старшая часть слова и его младшая часть "слипалась" и помещалась в младшую часть результата приема по этим командам. Ниже приложено с исправлениями. Но в любом случае на сервер это не отражалось, а только со стороны клиента. Все ранее приведённые тестовые программы-клиенты для счётчиков, частотников и устройств ввода-вывода не использовали указанные команды. Там функции формировались "в ручную" с применением файла owen_modbus_rtu.c

    Прошу извинить! Работа продолжается.

     

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

    К сожалению, простого способа переноса нет.

    https://www.moxa.ru/forum/index.php?/topic/6697-uc-7112-plus-pomogite-chajniku/ посмотрите, там обсуждался данный вопрос.

     

    Простите за то, что сую свой нос... но по моему мнению самое простое это на машине (можно и виртуальной) с ОС Linux применяя "mc" на одной панели подключиться от ползователя ROOT по FTP к одному устройству, а на другой панели к другому устройству и тоже с правами ROOT. После чего произвести выборочное копирование с исходного устройства на новое. Хотя может имеет смысл использовать в том же "mc" не FTP соединение, а Shell соединение... возможностей больше. После чего проверить атрибуты и принадлежность пользователям в новом устройстве... при необходимостит поправить (я про Shell не просто так сказал). Конечно если надо что-то устанавливать(допустим Apache) это другое дело. А если работать только с /etc и /home, то вполне пригодно. И не забудьте про пользователей в /home их надо создать/добавить в новое устройство.

    И ещё: ряд прцессов не позволят доступ к файлам с которыми(от которых). Так, что их надо остановить... я имею ввиду тот софт который надо перенести. Остановите его выполнение на устройстве источнике.

    Если устройство приёмник работает с Ethernen и требует IP для взаимодействия(сетевой комплекс), то конфигурируйте его до  перезапуска... при этом устройство источник надо убрать из сети.

     

  15. Ух ты! :o

     

    Понимаю конечно, что смешно. Но в какой-то томент (давно было) скачал исходники игры "Elite" для PalmOS... и переделал на Windows Mobile. Конечно с косяками, но работало. Потом захотел что бы на разных устройствах (уже с Linux) одна и та же программа, поделённая на куски  и размещалась на разных устройствах соединенных по сети... но работала как единое целое. Началом было отображение с ВЕБ интерфейсом... эксперимент. В последствии отображение двух графиков с разных устройств на одной картинке. При этом устройства сами рисуют данные. Собственно можно было и по другому - используя средства WEB сервера (Apache), точнее ВЕБ страницы... что и применяется везде. Но целью начальной было... иметь один экран для отображения многими.

    Так что не ругайте меня за мою глупость!

     

  16. Собственно тут сервер, который видоизменяет картинку в BMP файле... которую располагаю в RAM диске. К серверу могут быть подключено несколько клиентов... и каждый из них будет изменять эту картинку не мешая другому клиенту. Картинка в свою очередь отображается браузером. Вот:

    -мы запускаем клиента и запрашиваем подсказку:

    emo-5@emo-5:~/coding/bmp/testBmpClient$ ./testBmpClient
    ==== test ====
    help
    ==========
    "help" -- current help screen
    "quit" -- for exit
    
    SRING MODE:
    "connect" -- connect to bmp_server
    "disconnect" -- disconnect from bmp_server
    
    "fileopen" -- open file for work (not creating)
    "fileclose" -- close opened file
    
    "setpixel" -- dawing one pixel in opened file (command "fileopen") <X and Y - coordinats>, <R,G,B - color>
    "line" -- dawing line in opened file (command "fileopen") <X1,Y1 and X2,Y2 - coordinats>, <R,G,B - color>
    "circle" -- dawing circle in opened file (command "fileopen") <X1 and X2 - coordinats>, <RADIUS - radius of circle>, <R,G,B - color>
    "circlefill" -- dawing filled circle in opened file (command "fileopen") <X1 and X2 - coordinats>, <RADIUS - radius of circle>, <R,G,B - color>
    "circlefill_fuzzy" -- dawing filled circle fuzzy in opened file (command "fileopen") <X1 and X2 - coordinats>, <RADIUS - radius of circle>, <R,G,B - color>
    "rect" -- dawing rectangle in opened file (command "fileopen") <X1,Y1 and X2,Y2 - coordinats>, <R,G,B - color>
    "rect_filled" -- dawing rectangle filled in opened file (command "fileopen") <X1,Y1 and X2,Y2 - coordinats>, <R,G,B - color>
    "triangle" -- dawing triangle in opened file (command "fileopen") <X1,Y1 and X2,Y2 and X3,Y3 - coordinats>, <R,G,B - color>
    
    BINARY MODE:
    "bconnect" -- connect to bmp_server
    "bdisconnect" -- disconnect from bmp_server
    
    "bfileopen" -- open file for work (not creating)
    "bfleclose" -- close opened file
    
    "bsetpixel" -- dawing one pixel in opened file (command "fileopen") <X and Y - coordinats>, <R,G,B - color>
    "bline" -- dawing line in opened file (command "fileopen") <X1,Y1 and X2,Y2 - coordinats>, <R,G,B - color>
    "bcircle" -- dawing circle in opened file (command "fileopen") <X1 and X2 - coordinats>, <RADIUS - radius of circle>, <R,G,B - color>
    "bcirclefill" -- dawing filled circle in opened file (command "fileopen") <X1 and X2 - coordinats>, <RADIUS - radius of circle>, <R,G,B - color>
    "bcirclefill_fuzzy" -- dawing filled circle fuzzy in opened file (command "fileopen") <X1 and X2 - coordinats>, <RADIUS - radius of circle>, <R,G,B - color>
    "brect" -- dawing rectangle in opened file (command "fileopen") <X1,Y1 and X2,Y2 - coordinats>, <R,G,B - color>
    "brect_filled" -- dawing rectangle filled in opened file (command "fileopen") <X1,Y1 and X2,Y2 - coordinats>, <R,G,B - color>
    "btriangle" -- dawing triangle in opened file (command "fileopen") <X1,Y1 and X2,Y2 and X3,Y3 - coordinats>, <R,G,B - color>
    
    ==========
    
    - делаем кодключение к серверу на устройстве IA-240/UC-7112-LX-PLUS
     
    
    
    connect
    input IP address:192.168.0.240
    input IP port:8881
    IP port: 8881
    

    -Указываем файл BMP (на RAM диске с которым работать предстоит):

    fileopen
    Path and filename:/home/httpd/ramdisk/bmp_monitor/work.bmp
    count 49
    Opened
    
    

    Рисуем из командной строки клиента

    rect_filled
    X1:200
    Y1:200
    X2:250
    Y2:250
    R:250
    G:250
    B:0
    Ok
    circle
    X:300
    Y:300
    RADIUS:200
    R:0
    G:250
    B:255
    Ok
    line
    X1:0
    Y1:100
    X2:150
    Y2:0
    R:255
    G:255
    B:255
    Ok
    triangle
    X1:10
    Y1:10
    X2:250
    Y2:250
    X3:300
    Y3:50
    R:100
    G:250
    B:250
    Ok
    triangle
    X1:20
    Y1:250
    X2:250
    Y2:200
    X3:150
    Y3:10
    R:250
    G:0
    B:0
    Ok
    circlefill
    X:250
    Y:250
    RADIUS:50
    R:255
    G:255
    B:255
    Ok
    
    

    Понятное дело, что используем подсказки в клиенте

    Собственно результат - картинка в браузере:

    post-8993-0-67369900-1508754077_thumb.png

     

    Соответственно сервер настраивается при запуске - имеется ввиду порт прослушивания. Картинка копируется в RAM диск из какого-нибудь файла BMP. Содержимое файла и соответственно размер по желанию... начальная картинка какая угодно... я выбрал чёрный фон 640х480 (сделана графическим редактором). Ну и сервер с клиентом прилагаются:

    bmp.zip

     

    Это всё или баловство... или как вариант реализации вывода данных в ВЕБ сервер множеством независимых автономных устройств.

     

    Содержимое страницы сервера:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html><head>
    
    
      
      <meta content="text/html; charset=UTF-8" http-equiv="content-type"><title>BMP Монитор</title></head><body style="color: rgb(0, 0, 0); background-color: rgb(51, 51, 51);" alink="#000099" link="#000099" vlink="#990099">
    <table style="text-align: left; width: 100%; margin-left: auto; margin-right: auto;" border="0" cellpadding="0" cellspacing="0">
    
      <tbody>
        <tr>
          <td style="vertical-align: top; text-align: center;"><img id="workimg" style="width: 640px; height: 480px;" alt="" src="/ramdisk/bmp_monitor/work.bmp"><br>
          </td>
    
        </tr>
      </tbody>
    </table>
    
    <br>
    
    <br>
    
    <SCRIPT LANGUAGE="JavaScript">
    
    
    function loadImg() {
        var imageUrl = "/ramdisk/bmp_monitor/work.bmp"  + "?" + new Date().getTime();
        document.getElementById("workimg").setAttribute("src", imageUrl);
        //setInterval('loadImg()',1000);
        //setInterval(loadImg, 1000);
        setTimeout(loadImg, 1000);  // Вызвать снова через 1 сек
    }
    
     
    setInterval(loadImg(),1000);
    
    </SCRIPT>
    
    </body></html>
    

    Конечно это как вариант.

  17. Доброго времени суток!

    Собственно данный сервер делал для себя. Ранее делал обращение из программы к устройствам ввода-вывода из серии ADAM(6000 серии)... внутри единой программы на контроллере ADAM 6501 если мне не изменяет память по протоколу стандартного IPModbusRTU... это приблизительное название (не на слуху). Но по данному протоколу не было достаточно параметров связи и по этой причине был выработан свой псевдопротокол. И ещё требовалось реализовать работу приближенную к реальному времени - на уровне единиц (до 2) секунд. Потому собственно и вышел данный (уже вполне нормальный с моей точки зрения) сервер.

    И собственно вопрос:

    Необходим ли проект (исходник) для работы с данным сервером из Windows, который я по ряду причин не могу отнести к работоспособным ОС (уже был опыт с тем же ADAM 6501 и UNO-1019... последний надёжнее в плане ОС - ранее боготворил Windows CE для устройств... пока не испытал на своей шкуре, а Линуксу можно(нужно) доверять!).

    Работа продолжается...

    Спасибо, если дадите знать!

  18. Доброго времени суток!

    Продолжаю "допиливать" упомянутый сервер... сейчас проблема в узких метах. На текущий момент подсчёт контрольной суммы по Modbus RTU изменён. В целях уменьшения времени выполнения применён табличный метод подсчёта. Фактически он полностью совместим и с указанным в предыдущем сообщении, только изменена функция подсчёта. И правила "молчания" на линии RS485.

    Прилагается тестовый пример управления частотным преобразователем ПЧВ3 (от OWEN). Понятное дело он должен быть настроен на управление по Modbus RTU. Для работы сервер запускается на устройстве, а тестовый пример на PC(Linux) В процессе запуска из командной строки задаются параметры, аналогичные примерам в предыдущем сообщении... но задаётся скорость вращения. Направление вращения определяется по знаку задания.

     

    Изменения на 12 октября 2017:

    - обнаружена ошибка - выравнивание данных в массиве данных для TCP обмена. На текущий момент изменено:

    Формат пакета по TCP
    */
    //
    #define _sizeL_tcp_pkt		0x0000			//размер пакета TCP (L)
    #define _sizeH_tcp_pkt		0x0001			//размер пакета TCP (H)
    #define _type_tcp_pkt		0x0002			//тип пакета (запроса-ответа)
    #define _cmd_tcp_pkt		0x0003			//режим обращения (пассивный, активный ...)
    #define _tlive0_tcp_pkt		0x0004			//время жизни сокета (0)
    #define _tlive1_tcp_pkt         0x0005                  //время жизни сокета (1)
    #define _tlive2_tcp_pkt         0x0006                  //время жизни сокета (2)
    #define _tlive3_tcp_pkt		0x0007			//время жизни сокета (3)
    #define _tsleepL_tcp_pkt	0x0008			//время сна процесса сокета (L)
    #define _tsleepH_tcp_pkt	0x0009 			//время сна процесса сокета (H)
    //запрос-ответ
    #define _answr_flag_mrtu	0x000A			//результат ответа устройства (флаг)
    #define _cmd_flag		0x000B			//флаг запроса
    #define _frame_num		0x000C			//номер кадра для выбранного устройства Modbus RTU
    #define _res1			0x000D			//резерв
    #define _res2			0x000E			//резерв
    #define _res3			0x000F			//резерв
    #define _time0_dev_mrtu		0x0010			//время ожидания ответа от устройства (0)
    #define _time1_dev_mrtu         0x0011                  //время ожидания ответа от устройства (1)
    #define _time2_dev_mrtu         0x0012                  //время ожидания ответа от устройства (2)
    #define _time3_dev_mrtu         0x0013                  //время ожидания ответа от устройства (3)
    #define _tlive0_mrtu_sleep	0x0014                  //время паузы после обмена (0)
    #define _tlive1_mrtu_sleep	0x0015                  //время паузы после обмена (1)
    #define	_tlive2_mrtu_sleep	0x0016                  //время паузы после обмена (2)
    #define _tlive3_mrtu_sleep	0x0017			//время паузы после обмена (2)
    #define _tlive0_mrtu_pkt	0x0018			//время жизни кадра mrtu (0)
    #define _tlive1_mrtu_pkt	0x0019			//время жизни кадра mrtu (1)
    #define _tlive2_mrtu_pkt	0x001A			//время жизни кадра mrtu (2)
    #define _tlive3_mrtu_pkt	0x001B			//время жизни кадра mrtu (3)
    #define _res6			0x001C			//резерв
    #define _res7			0x001D			//резерв
    #define _res8			0x001E			//резерв
    #define _res9			0x001F			//резерв
    //
    #define _addr_dev_MRTU		0x0020			//адрес устройства MRTU
    #define _func			0x0021			//функция
    #define _addrH_reg		0x0022			//адрес регистра в устройстве
    #define _addrL_reg		0x0023			//адрес регистра в устройстве
    

    Таким образом параметры:

    -Время "жизни соединения" по Modbus для циклического режима;

    -Время ожидания ответа устройства ( в ряде устройств это время больше, чем 3,5 символа по стандарту и надо добавить);

    -Время "молчания" ведущего на шине... это тоже для специфических устройств.

     

    На 13 октября приложено с указанными ранее изменениями и испытано:

    -modbusRTUserverS (Как и ранее Сервер Modbus RTU на MOXA IA-240-LX/UC-7112-LX-PLUS)

    -test_SI30 обращение к счётчику СИ30 (OWEN) запускается на ПК с Linux

    -test_mk110_8d4r обращение к устройству дискретного ввода-вывода МК110-8Д.4Р (OWEN) запускается на ПК с Linux

    -test_PCHV3 обращение к частотному преобразователю ПЧВ3 (OWEN) с возможностью управления приводом запускается на ПК с Linux

    для запуска на ПК или MOXA потребуется перекомпиляция. Для этого отредактируйте файл Makefile в соответственном проекте так:

     

    для ПК выбрать компилятор так:

    ###########################
    # Simple Generic Makefile #
    ###########################
    
    #CC=terminal-gcc
    
    CC=gcc
    
    #PREFIXPATH=/usr/local/arm-linux/bin
    #CC=$(PREFIXPATH)/arm-linux-gcc
    
    

    Для MOXA выбрать кимпилятор так:

    ###########################
    # Simple Generic Makefile #
    ###########################
    
    #CC=terminal-gcc
    
    #CC=gcc
    
    PREFIXPATH=/usr/local/arm-linux/bin
    CC=$(PREFIXPATH)/arm-linux-gcc
    
    

    Настройки параметров интервалов и режимов осуществляются со стороны клиентов и передаются серверу при обращении в прцессе обмена. Такие как время ожидания и время продолжения "теневого" опроса устройств при отсутствии обрашения клиента к серверу. Так же и режимы обращения. Сейчас производится тестирование, добавление режимов обмена и функционала.

     

    Сервер в последнем сообщении

    test_si30.zip

    test_mk110_8d4r.zip

    test_PCHV3.zip

  19. Доброго времени суток!

    Продолжаю "допиливать" упомянутый сервер... сейчас проблема в узких метах. На текущий момент подсчёт контрольной суммы по Modbus RTU изменён. В целях уменьшения времени выполнения применён табличный метод подсчёта. Фактически он полностью совместим и с указанным в предыдущем сообщении, только изменена функция подсчёта. И правила "молчания" на линии RS485.

    Прилагается тестовый пример управления частотным преобразователем ПЧВ3 (от OWEN). Понятное дело он должен быть настроен на управление по Modbus RTU. Для работы сервер запускается на устройстве, а тестовый пример на PC(Linux) В процессе запуска из командной строки задаются параметры, аналогичные примерам в предыдущем сообщении... но задаётся скорость вращения. Направление вращения определяется по знаку задания.

     

    Изменения на 12 октября 2017:

    - обнаружена ошибка - выравнивание данных в массиве данных для TCP обмена. На текущий момент изменено:

    Формат пакета по TCP
    */
    //
    #define _sizeL_tcp_pkt		0x0000			//размер пакета TCP (L)
    #define _sizeH_tcp_pkt		0x0001			//размер пакета TCP (H)
    #define _type_tcp_pkt		0x0002			//тип пакета (запроса-ответа)
    #define _cmd_tcp_pkt		0x0003			//режим обращения (пассивный, активный ...)
    #define _tlive0_tcp_pkt		0x0004			//время жизни сокета (0)
    #define _tlive1_tcp_pkt         0x0005                  //время жизни сокета (1)
    #define _tlive2_tcp_pkt         0x0006                  //время жизни сокета (2)
    #define _tlive3_tcp_pkt		0x0007			//время жизни сокета (3)
    #define _tsleepL_tcp_pkt	0x0008			//время сна процесса сокета (L)
    #define _tsleepH_tcp_pkt	0x0009 			//время сна процесса сокета (H)
    //запрос-ответ
    #define _answr_flag_mrtu	0x000A			//результат ответа устройства (флаг)
    #define _cmd_flag		0x000B			//флаг запроса
    #define _frame_num		0x000C			//номер кадра для выбранного устройства Modbus RTU
    #define _res1			0x000D			//резерв
    #define _res2			0x000E			//резерв
    #define _res3			0x000F			//резерв
    #define _time0_dev_mrtu		0x0010			//время ожидания ответа от устройства (0)
    #define _time1_dev_mrtu         0x0011                  //время ожидания ответа от устройства (1)
    #define _time2_dev_mrtu         0x0012                  //время ожидания ответа от устройства (2)
    #define _time3_dev_mrtu         0x0013                  //время ожидания ответа от устройства (3)
    #define _tlive0_mrtu_sleep	0x0014                  //время паузы после обмена (0)
    #define _tlive1_mrtu_sleep	0x0015                  //время паузы после обмена (1)
    #define	_tlive2_mrtu_sleep	0x0016                  //время паузы после обмена (2)
    #define _tlive3_mrtu_sleep	0x0017			//время паузы после обмена (2)
    #define _tlive0_mrtu_pkt	0x0018			//время жизни кадра mrtu (0)
    #define _tlive1_mrtu_pkt	0x0019			//время жизни кадра mrtu (1)
    #define _tlive2_mrtu_pkt	0x001A			//время жизни кадра mrtu (2)
    #define _tlive3_mrtu_pkt	0x001B			//время жизни кадра mrtu (3)
    #define _res6			0x001C			//резерв
    #define _res7			0x001D			//резерв
    #define _res8			0x001E			//резерв
    #define _res9			0x001F			//резерв
    //
    #define _addr_dev_MRTU		0x0020			//адрес устройства MRTU
    #define _func			0x0021			//функция
    #define _addrH_reg		0x0022			//адрес регистра в устройстве
    #define _addrL_reg		0x0023			//адрес регистра в устройстве
    

    Таким образом параметры:

    -Время "жизни соединения" по Modbus для циклического режима;

    -Время ожидания ответа устройства ( в ряде устройств это время больше, чем 3,5 символа по стандарту и надо добавить);

    -Время "молчания" ведущего на шине... это тоже для специфических устройств.

  20. Прошу извинений за прошлый пост... по поводу ошибок в коде. Сейчас изменены недочёты в рабочем цикле сервера, связанные с молчанием после последнего обмена... перед тем как выполнить другой. На текущий момент испытано с помощью кратких программ для устройств СИ30(счётчик импульсов от OWEN) и МК110-8Д.4Р(устройство ввода-вывода от OWEN). Данные маленькие проекты прилагаются и запускаются на PC в среде Linux. А сам сервер запускается на IA240/UC-7112-Plus.

     

    Файлы приложены в последнем сообщении!

  21. Доброго времени суток!

    Случилось так, что потребовалось иметь что-то наподобие прокси... или что-то с похожими функциями. Применял и telnet, нестандартно конечно, но судя по форумам все используют netcat... которого в uc7112plus/ia240 нет. И вот.:

    - скачал исходник nc-2.0;

    - распаковал и запустил configure в директории (так сказать из коробки);

    - "подключил" компилятор для moxa, отредактировав Makefile;

    ####
    #CC = gcc
    PREFIXPATH=/usr/local/arm-linux/bin
    CC=$(PREFIXPATH)/arm-linux-gcc
    ####
    

    собственно найдя строку CC = gcc, закоментировал её и добавил компилятор для moxa;

    - после всего этого команда make и получение файла nc;

    - скопировал по ftp в uc7112plus в /mnt/sd/nc (у меня установлена SD карта);

    - для того чтобы была как команда nc в командной строке, в файле /etc/profile добавил alias nc=/mnt/sd/nc/nc - это собственно путь к нашему файлу;

    - ну и  установить разрешения для него (в сессии root конечно)... я применял mc для этих целей, но в командной строке есть и chmod.

    Собственно после этого перезапустил устройство и вот:

    www-data@Moxa:~$ nc                                                                                                                                                                             
    nc 2.0                                                                                                                                                                                          
    connect to somewhere:   nc [-options] hostname port(s)...                                                                                                                                       
    listen for inbound:     nc -l [-options] [hostname [port]]                                                                                                                                      
    options:
            -4              use IPv4 addresses
            -6              use IPv6 addresses
            -b              allow broadcasts
            -ePROG          program to exec after establishing connection
            -h              this cruft
            -i[SECS]        delay interval for lines sent and ports scanned
            -l              listen mode, for inbound connects
            -n              numeric-only IP addresses, no DNS
            -oFILE          hex dump of traffic
            -pPORT          local port number (useful when listening)
            -q[SECS]         quit SECS after EOF on stdin
            -r              randomize local and remote ports
            -sADDR          local source address
            -t              answer Telnet negotiation
            -u              UDP mode
            -v              verbose [repeat to be more verbose]
            -wSECS          timeout for connects and final net reads
            -z              zero-I/O mode [used for scanning]
    
    When connecting, port numbers can be individual or inclusive ranges
    in the form LO-HI
    
    www-data@Moxa:~$ 
    
    

    Теперь эта команда есть. Понимаю что грубо сделано, но всё же.

     

    В приложенном архиве Makefile уже изменён и nc откомпилирован для IA240(1)LX и UC-7112LX-plus.

     

    nc-2.0.zip

  22. Вариант для IA240-LX; IA241-LX; UC7112-LX-plus.

    Поддерживаемые команды:

        со стороны сервера:

        1; 2; 3; 4; 5; 6; 16

      

        со стороны клиента:

        2; 3; 4; 6; 16 и заготовка при которой массив команды реализуется "вручную"

     

    Для применения со стороны клиента скопировать файлы mrtusocket.c и mrtusocket.h  в директорию проекта клиента и указать клиента в заголовочном файле cjnfig.h с содерржимым:

    #define _client			0		//1 - клиент, 0 - сервер
    #if(_client == 1)
    	#define _server		0
    #else
    	#define _server		1
    #endif
    

    Для сервера всё готово и компилируется командой make. Для иных линукс машин отредактировать makefile, который прилагается:

    ###########################
    # Simple Generic Makefile #
    ###########################
    
    #CC=terminal-gcc
    
    #CC=gcc
    
    PREFIXPATH=/usr/local/arm-linux/bin
    CC=$(PREFIXPATH)/arm-linux-gcc
    
    
    CFLAGS=-c -Wall
    LDFLAGS=-lpthread 
    
    #SOURCES=*.c
    SOURCES=$(shell ls *.c)
    
    OBJECTS=$(SOURCES:.c=.o)
    EXECUTABLE=modbusRTUserverS
    
    all: $(SOURCES) $(EXECUTABLE)
    
    $(EXECUTABLE): $(OBJECTS)
    	$(CC) $(LDFLAGS) $(OBJECTS) -o $@
    
    .c.o:
    	$(CC) $(CFLAGS) $< -o $@
    
    install:
    	install -m 0755 $(EXECUTABLE) $(HOME)/local/bin
    
    clean:
    	rm -rf *o $(EXECUTABLE)
    

    Следует только указать свой компилятор. Для Raspberry и простых PC с Debian раскомментировать GCC остальные убрать.  Возможно потребуется изменить имя устройства TTY в файле ia241serial.c исходя из имени в системе. (Со стороны клиента это не требуется).

    При запуске сервера на устройстве:

    www-data@Moxa:~/cabel$ ./modbusRTUserverS
    
    Parametrs not defined!
    "--help" for information
    
    

    будет предложено ввести "--help" и при использовании его:

    www-data@Moxa:~/cabel$ ./modbusRTUserverS --help
    modbudRTUserver <parameters> :
    
        --help          - current info
        --version       - vetsion and date of modifications
    
        -sp             - number of serial port 0...N (for moxa use devices /dev/ttyM<num>)
        -br             - baudrate: 110 300 1200 2400 4800 9600 19200 38400 57600 115200 230400 460800 500000 576000 921600
        -db             - databits: 5 6 7 8
        -sb             - stop bits: 1 2
    
        -p              - tcp port for listen
    

    Получите список всех параметров для запуска

     

    Для применения mrtusocket.c смотрите предыдущий пост.

    Для запуска при включении (В IA240-LX) в файл /etc/rc.d/rc.local  добавить строку запуска с ключами с завершающим "&". В моём случае производил запуск от пользователя. Эту проблему пытался решить в этой теме (успешно):

    https://www.moxa.ru/forum/index.php?/topic/6748-avtozapusk-ot-polzovatelia-v-ia240/

     

     

    Прошу не ругать за кривой английский... моя MOXA кирилицы не знает.

     

     

    Файлы приложены в последнем сообщении.

  23. Доброго времени суток!

    Простите за назойливость... Но довелось самому применять указанный выше сервер в нескольких проектах. Столкнулся с такой проблемой (конечно она уже решена), что некоторые устойства (именно с МВ110-224.2А) по Modbus RTU являясь тормозами никак не хотели работать в одной сети с другими устройствами. Именно было так:

    - станция катодной защиты "СКЗ НГК-ИПКЗ Евро 12Н/-02/24/-У1" в наличии у которой 12 блоков управления (каждй со своим адресом в сети и все на скорости 9600);

    - станция катодной защиты "Дон" без связи... но в роли сбора двух параметров МВ110-224.2А, который настроен на те же параметры сети.

    В роли ведущего устройства UC7101-Lx в задачу которого входит непрерывный опрос параметров со всех устройств... невзирая на то, опрашивают его клиенты по ETHERNET или нет. Одним словом опрос с максимально возможной частотой опроса.

     

    Выяснилось, что МВ110-224.2А желает быть опрошенным не ранее, чем 500 милисекунд после окончания последненго обмена (а это уж точно не 3,5 символа на скорости 9600). И было добавлено время сна после обмена. А выглядит это так:

    #if(_client == 1)
    //команда 3
    int	C_MRTU_CMD_0x03(U8	AddrMRTU,	//адрес устройства
    			U16	AddrReg,	//адрес регистра
    			U16	CntReg,		//количество регистров
    			U16 * 	Rdat,		//массив данных
    			U8	Frame,		//номер кадра
    			U32	TimeWait,	//время ожидания ответа от устройства
    			U32 	TimeLive,	//время жизни пакета
    			U32	TwSleep,			//время сна после обмена
    			U8	Flag		//флаг запроса MRTU
    			)
    {
    	int res;
    	U16	cntreg		= 0;
    	int	paddr		= 0;
    	U16	reg;
    	U8	dsend[256] 	= {0};
    	U8	drecv[256] 	= {0};
    	//
    	dsend[0]	= AddrMRTU;			//адрес устройства
    	dsend[1]	= 0x03;				//команда
    	dsend[2]	= (U8)((AddrReg >> 8) & 0xFF);	//адрес первого регистра
    	dsend[3]	= (U8)(AddrReg & 0xFF);		//
    	dsend[4]	= (U8)((CntReg >> 8) & 0xFF);	//количество регистров
    	dsend[5]	= (U8)(CntReg & 0xFF);		//
    	res =C_MRTU_CMD(&dsend[0],
                            &drecv[0],
                            6,				//размер запроса
                            Frame,
                            TimeWait,
                            TimeLive,
    						TwSleep,
                            Flag
                            );
    	while(cntreg < CntReg)
    	{
    		reg = drecv[0x03 + paddr + 1];
    		reg |= drecv[0x03 + paddr];
    		paddr += 2;
    		*(Rdat + cntreg) = reg;
    		cntreg++;
    	}
    	//
    	return res;
    }
    #endif
    

    Ну понятно, что это задаётся со стороны клиента... но выполняться будет на сервере. Эта функция в файле "mrtusocket.c" реализуется в прграмме клиента (ряд файлов что на сервере или клиенте одни и те же, только при компиляции указать сервер это или клиент в "config.h):

    #define _client			0		//1 - клиент, 0 - сервер
    #if(_client == 1)
    	#define _server		0
    #else
    	#define _server		1
    #endif
    

    Кроме того добавлены функции сразу реализующие команды, а не как ранее надо "собирать" массив, где только контрольная сумма автоматом. Сервер компилировался в среде CodeLite... и весь проект прилагается.

    Следует отметить, что команда 16 не реализовывалась со стороны клиента, но на сервере всё работает. Это Не Modbus TCP... потому и пакет запроса и ответа отличается:

    /*
    Формат пакета по TCP
    */
    //
    #define _sizeL_tcp_pkt		0x0000			//размер пакета TCP (L)
    #define _sizeH_tcp_pkt		0x0001			//размер пакета TCP (H)
    #define _type_tcp_pkt		0x0002			//тип пакета (запроса-ответа)
    #define _cmd_tcp_pkt		0x0003			//режим обращения (пассивный, активный ...)
    #define _tlive0_tcp_pkt		0x0004			//время жизни сокета (0)
    #define _tlive1_tcp_pkt         0x0005                  //время жизни сокета (1)
    #define _tlive2_tcp_pkt         0x0006                  //время жизни сокета (2)
    #define _tlive3_tcp_pkt		0x0007			//время жизни сокета (3)
    #define _tsleepL_tcp_pkt	0x0008			//время сна процесса сокета (L)
    #define _tsleepH_tcp_pkt	0x0009 			//время сна процесса сокета (H)
    //запрос-ответ
    #define _answr_flag_mrtu	0x000A			//результат ответа устройства (флаг)
    #define _cmd_flag		0x000B			//флаг запроса
    #define _time0_dev_mrtu		0x000C			//время ожидания ответа от устройства (0)
    #define _time1_dev_mrtu         0x000D                  //время ожидания ответа от устройства (1)
    #define _time2_dev_mrtu         0x000E                  //время ожидания ответа от устройства (2)
    #define _time3_dev_mrtu         0x000F                  //время ожидания ответа от устройства (3)
    #define _frame_num		0x0010			//номер кадра для выбранного устройства Modbus RTU
    #define _tlive0_mrtu_pkt        0x0011                  //время жизни кадра mrtu (0)
    #define _tlive1_mrtu_pkt        0x0012                  //время жизни кадра mrtu (1)
    #define _tlive2_mrtu_pkt        0x0013                  //время жизни кадра mrtu (2)
    #define _tlive3_mrtu_pkt        0x0014                  //время жизни кадра mrtu (3)
    #define _tlive0_mrtu_sleep		0x0015					//время паузы после обмена (0)
    #define _tlive1_mrtu_sleep		0x0016					//время паузы после обмена (1)
    #define _tlive2_mrtu_sleep		0x0017					//время паузы после обмена (2)
    #define _tlive3_mrtu_sleep		0x0018					//время паузы после обмена (3)
    //
    #define _addr_dev_MRTU		0x0020			//адрес устройства MRTU
    #define _func			0x0021			//функция
    #define _addrH_reg		0x0022			//адрес регистра в устройстве
    #define _addrL_reg		0x0023			//адрес регистра в устройстве
    
    /*
    ***************
    * флаг ответа *
    ***************
    */
    #define _answr_flag_no_data	0x81			//нет данных от Modebus RTU (при асинхронном обмене)
    #define _answr_flag_addr_err	0x82			//ошибка адреса по Modbus RTU
    #define _answr_flag_nfrane_err	0x84			//ошибка номера кадра
    #define _answr_flag_srv_cmd_err	0x88			//не поддерживаемая сервером команда
    #define _answr_flag_cmd_val_err	0x90			//ошибка параметра команды 
    

    На стороне клиента (в программе клиента выглядит так):

    //команда 6 - запись в регистр
    res = C_MRTU_CMD_0x06(cnt + 1, _rg_Mode, work16, _frame_WDATA_0306, _MRTUtimewait, _MRTU_TCP_live, _MRTU_TwSleepWr, _flag_WDATA_0306);
    
    /*
    причем:
    #define _sz_str_mrtu			100
    #define _scsADDR			1	//адрес устройства
    #define _MRTUtimewait			500000	//таймаут обмена (микросекунд)
    #define _MRTU_TCP_live			500	//таймаут TCP соединения (циклов потока)
    #define _MRTU_TwSleep			300000	//дополнительное ожидание после обмена (микросекунд)
    #define _MRTU_TwSleepWr			300000	//дополнительное ожидание после обмена (микросекунд) после записи
    //распределение кадров для обмена
    #define _frame_RDATA_04			0	//кадр чтения измерений 1
    #define _frame_RCOIL			1	//чтение датчиков
    #define _frame_RDATA_0306		2	//кадр чтения задания параметров
    #define _frame_WCOIL			3	//запись для управления
    #define _frame_WDATA_0306		4	//кадр обращения для записи парметров
    
    
    #define	_flag_RDATA_04			1	//чтение измерений непрерывное чтение
    #define _flag_RDATA_0306		1	//чтение задания параметров непрерывное чтение
    #define _flag_WDATA_0306		2	//однократная удачная запись задания
    #define	_flag_RCOIL			1	//непрерывное чтение датчиков
    #define	_flag_WCOIL			2	//однократная удачная запись управления
    */
    
    //ну и команда 4
    res = C_MRTU_CMD_0x04(AddrDev + 1, _rg_Uc1, _SZ_RG_RDATA_04, &scsRD[_rg_Uc1], _frame_RDATA_04, _MRTUtimewait, _MRTU_TCP_live, _MRTU_TwSleep, _flag_RDATA_04);
    
    //2
    res = C_MRTU_CMD_0x02(AddrDev + 1, _coil_door, 8, &scsRDu8[0], _frame_RCOIL, _MRTUtimewait, _MRTU_TCP_live, _MRTU_TwSleep, _flag_RCOIL);
    
    

    Ранее рассматриваемая DLL с изменениями не актуальна.

    modbusRTUserverS.zip

×
×
  • Create New...