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

oiv_1968

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

    163
  • Joined

  • Last visited

Everything posted by oiv_1968

  1. Доброго времени суток! Если не затруднит хотелось бы сначала узнать что есть в директории /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. ...Простите - исправление. Дело в том, что упомянутый "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. Если не трудно ткните меня носом на источник возможного ответа. Буду благодарен! Вот (тупость разумеется): #!/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. Если не трудно ткните меня носом на источник возможного ответа. Буду благодарен!
  11. Доброго времени суток Люди Добрые! Собственно возник вопрос: Как получать результат в 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. Хочется что бы скрипт работал корректно и там и там Заранее благодарен за ответ! Спасибо!
  12. Очередной опыт применения для работы с устройством аналогового ввода МВ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
  13. Тест доступа к станции катодной защиты СКЗ НГК-ИПКЗ Евро 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
  14. Доброго времени суток! Обнаружены две очень грубые ошибки в формировании функций 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 Прошу извинить! Работа продолжается.
  15. Простите за то, что сую свой нос... но по моему мнению самое простое это на машине (можно и виртуальной) с ОС Linux применяя "mc" на одной панели подключиться от ползователя ROOT по FTP к одному устройству, а на другой панели к другому устройству и тоже с правами ROOT. После чего произвести выборочное копирование с исходного устройства на новое. Хотя может имеет смысл использовать в том же "mc" не FTP соединение, а Shell соединение... возможностей больше. После чего проверить атрибуты и принадлежность пользователям в новом устройстве... при необходимостит поправить (я про Shell не просто так сказал). Конечно если надо что-то устанавливать(допустим Apache) это другое дело. А если работать только с /etc и /home, то вполне пригодно. И не забудьте про пользователей в /home их надо создать/добавить в новое устройство. И ещё: ряд прцессов не позволят доступ к файлам с которыми(от которых). Так, что их надо остановить... я имею ввиду тот софт который надо перенести. Остановите его выполнение на устройстве источнике. Если устройство приёмник работает с Ethernen и требует IP для взаимодействия(сетевой комплекс), то конфигурируйте его до перезапуска... при этом устройство источник надо убрать из сети.
  16. Понимаю конечно, что смешно. Но в какой-то томент (давно было) скачал исходники игры "Elite" для PalmOS... и переделал на Windows Mobile. Конечно с косяками, но работало. Потом захотел что бы на разных устройствах (уже с Linux) одна и та же программа, поделённая на куски и размещалась на разных устройствах соединенных по сети... но работала как единое целое. Началом было отображение с ВЕБ интерфейсом... эксперимент. В последствии отображение двух графиков с разных устройств на одной картинке. При этом устройства сами рисуют данные. Собственно можно было и по другому - используя средства WEB сервера (Apache), точнее ВЕБ страницы... что и применяется везде. Но целью начальной было... иметь один экран для отображения многими. Так что не ругайте меня за мою глупость!
  17. Собственно тут сервер, который видоизменяет картинку в 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 Понятное дело, что используем подсказки в клиенте Собственно результат - картинка в браузере: Соответственно сервер настраивается при запуске - имеется ввиду порт прослушивания. Картинка копируется в 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> Конечно это как вариант.
  18. Доброго времени суток! Собственно данный сервер делал для себя. Ранее делал обращение из программы к устройствам ввода-вывода из серии ADAM(6000 серии)... внутри единой программы на контроллере ADAM 6501 если мне не изменяет память по протоколу стандартного IPModbusRTU... это приблизительное название (не на слуху). Но по данному протоколу не было достаточно параметров связи и по этой причине был выработан свой псевдопротокол. И ещё требовалось реализовать работу приближенную к реальному времени - на уровне единиц (до 2) секунд. Потому собственно и вышел данный (уже вполне нормальный с моей точки зрения) сервер. И собственно вопрос: Необходим ли проект (исходник) для работы с данным сервером из Windows, который я по ряду причин не могу отнести к работоспособным ОС (уже был опыт с тем же ADAM 6501 и UNO-1019... последний надёжнее в плане ОС - ранее боготворил Windows CE для устройств... пока не испытал на своей шкуре, а Линуксу можно(нужно) доверять!). Работа продолжается... Спасибо, если дадите знать!
  19. Сервер в последнем сообщении test_si30.zip test_mk110_8d4r.zip test_PCHV3.zip
  20. Доброго времени суток! Продолжаю "допиливать" упомянутый сервер... сейчас проблема в узких метах. На текущий момент подсчёт контрольной суммы по 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 символа по стандарту и надо добавить); -Время "молчания" ведущего на шине... это тоже для специфических устройств.
  21. Прошу извинений за прошлый пост... по поводу ошибок в коде. Сейчас изменены недочёты в рабочем цикле сервера, связанные с молчанием после последнего обмена... перед тем как выполнить другой. На текущий момент испытано с помощью кратких программ для устройств СИ30(счётчик импульсов от OWEN) и МК110-8Д.4Р(устройство ввода-вывода от OWEN). Данные маленькие проекты прилагаются и запускаются на PC в среде Linux. А сам сервер запускается на IA240/UC-7112-Plus. Файлы приложены в последнем сообщении!
  22. Доброго времени суток! Случилось так, что потребовалось иметь что-то наподобие прокси... или что-то с похожими функциями. Применял и 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
  23. Вариант для 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 кирилицы не знает. Файлы приложены в последнем сообщении.
  24. Доброго времени суток! Простите за назойливость... Но довелось самому применять указанный выше сервер в нескольких проектах. Столкнулся с такой проблемой (конечно она уже решена), что некоторые устойства (именно с МВ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...