Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 1
Регистрация: 06.02.2018
Сообщений: 6
1

Сервер на контроллере ICP DAS i-8831-80

07.02.2018, 00:18. Показов 2287. Ответов 1

Author24 — интернет-сервис помощи студентам
Доброго всем времени суток!

Есть привод и периферия к нему (датчики давления, перемещения и проч.), и встала задача всё это дело автоматизировать. В своё время был куплен контроллер ICP CON i-8831-80 фирмы ICP DAS, ещё пара модулей АЦП/ЦАП к нему. Пытаюсь разобраться, как сделать на контроллере сервер, чтобы с компа к нему подключаться и в дальнейшем управлять всей системой.
Контроллер не поддерживает Modbus, на сайте производителя есть апишные libs для TCP/IP (контроллер прогается на Си), написал к нему по образу и подобию шаблонов простенький сервер на Си, для компа (Win) - консольный клиент на С++, чтобы хоть эхо можно было сделать.

Но что-то делаю не так. Запускаю контроллер, он сообщает на 7-сегментной панельке, что готов к подключению, запускаю клиент, комп немного думает и выдаёт ошибку #10060. Посмотрел в WSAGetLastError, это ошибка таймаута - сервер просто не ответил.

Контроллер и комп находятся в одной локальной сети, оба подключены к роутеру (TP-LINK какой-то древний). В режиме программирования (когда на контроллере не исполняется рабочая программа и на него можно наливать свою программу) он прозванивается пингом через cmd, пакеты идут, всё ок. Но в обычном режиме, когда выполняется программа, ping выдаёт, что узел недоступен. Когда клиент только запустил и тот ещё не выдал ошибку, ради интереса запустил netstat, в разделе "Внешние подключения" появился 192.168.1.10 (как раз адрес контроллера), в статусе было, что SYN-сегмент отправлен. Может, контроллер не высылает ответный сегмент, вот только почему...

Пробовал и с "0.0.0.0" (у контроллера нет константы INADDR_ANY), и без неё.

Код сервера:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/* Встроенные C библиотеки */
 
#include <BIOS.H>
#include <CONIO.H>
#include <FCNTL.H>
#include <FLOAT.H>
#include <ERRNO.H>
#include <MATH.H>
#include <STDARG.H>
#include <STDIO.H>
#include <STDLIB.H>
#include <STRING.H>
#include <TIME.H>
#include <SYS/TIMEB.H>
#include <SYS/TYPES.H>
 
/* API Библиотеки контроллера */
 
#include <8000e.h>
#include <8017h.h>
#include <8024.h>
#include <tcpip32.h>
#include <vxcomm.h>
 
#define BUFSIZE         1024            //размер буфера в байтах
#define SERVER_PORT     15989   //порт сервера
#define ERR_NINIT           0       //далее идут коды ошибок
#define ERR_PORTINIT        1
#define ERR_SOCKET          2
#define ERR_BIND            3
#define ERR_LISTEN          4
#define ERR_ACCEPT          5
#define ERR_RECV            6
#define ERR_SEND            7
#define ERR_PTON            8
#define time_ms         1000            //время для отображения на индикаторах
 
/* Глобальные переменные */
 
unsigned char recv_buf[BUFSIZE], send_buf[BUFSIZE];     //буфер для обмена по TCP
struct sockaddr_in server_addr, client_addr;                //структуры для хранения адреса сервера и клиента
int s, sock;                                        //sockets
int server_len, client_len;
 
/* Главная программа */
 
void main(void)
{
    int i, rc;
    InitLib();                                                   //инициируем библиотеки
    Init5DigitLed();                                         //инициируем индикацию 7-сегментной панели
    
    rc = Ninit();                       //инициализация сети
    if (rc < 0)
    {
        errorLED(ERR_NINIT);
        Nterm();                        //закрываем сеть в случае неудачи
        exit(1);
    }
    
    rc = Portinit("*");                 //инициализация всех портов
    if (rc < 0)
    {
        errorLED(ERR_PORTINIT);
        Portterm("*");                  //закрываем все порты в случае неудачи
        exit(1);
    }
    
    s = socket(PF_INET, 1, 0);              //получаем сокет потокового типа
    if (s < 0)
    {
        errorLED(ERR_SOCKET);
        closesocket(s);                 //закрываем сокет в случае неудачи
        exit(1);
    }
    
    memset(&server_addr, 0, sizeof(server_addr));           //обнуляем структуру адреса сервера
    server_addr.sin_family = AF_INET;                   //заполняем структуру адреса сервера
    server_addr.sin_port = htons(SERVER_PORT);
    //server_addr.sin_addr.s_addr = inet_addr("0.0.0.0");          //принятие по всем адресам (INADDR_ANY)
    
    rc = bind(s, (struct sockaddr *)&server_addr, sizeof(server_addr));     //связываем сокет с локальным адресом сервера
    if (rc < 0)
    {
        errorLED(ERR_BIND);
        exit(1);
    }
    
    rc = listen(s, 5);
    if (rc < 0)
    {
        errorLED(ERR_LISTEN);
        exit(1);
    }
    
    ready_LED();                                //отображаем, что сервер готов к сеансу связи
 
    client_len = sizeof(client_addr);
    memset(&client_addr, 0, sizeof(client_addr));       //обнуляем структуру адреса клиента
    client_addr.sin_family = AF_INET;
    sock = accept(s, (struct sockaddr *)&client_addr, &client_len);
    if (sock < 0)
    {
        errorLED(ERR_ACCEPT);
        exit(1);
    }
    
    do
    {
        rc = recv(sock, recv_buf, BUFSIZE, 0);
        if (rc < 0)
        {
            errorLED(ERR_RECV); 
            exit(1);
        }
        
        if (rc > 0)
        {
            rc = send(sock, send_buf, BUFSIZE, 0);
            if (rc < 0)
            {
                errorLED(ERR_SEND);
                exit(1);
            }               
        }
    } while (rc > 0);
    
    closesocket(sock);
    Portterm("*");
    Nterm();
}
 
void errorLED(int err1)                            //эта процедура показывает код ошибки в случае её возникновения
{
    int i;
    
    for (i = 0; i < 4; i++)
    {
        Disable5DigitLed();
        DelayMs(time_ms);
        
        Show5DigitLedSeg(1, 0x4F);  /*E*/
        Show5DigitLedSeg(2, 0x05);  /*R*/
        Show5DigitLedSeg(3, 0x05);  /*R*/
        Show5DigitLedSeg(4, 0x01);  /*-*/
        Show5DigitLed(5, err1);     /*ERR CODE*/
        
        Enable5DigitLed();
        DelayMs(time_ms);
    }
}
 
void ready_LED(void)                               //процедура сообщает, что сервер готов к подключению
{
    int i;
 
    for (i = 0; i < 4; i++)
    {
        Disable5DigitLed();
        DelayMs(time_ms);
        
        Show5DigitLedSeg(1, 0x05);  /*r*/
        Show5DigitLedSeg(2, 0x4F);  /*E*/
        Show5DigitLedSeg(3, 0x77);  /*A*/
        Show5DigitLedSeg(4, 0x3D);  /*d*/
        Show5DigitLedSeg(5, 0x3B);  /*y*/
        
        Enable5DigitLed();
        DelayMs(time_ms);
    }
}
Код клиента:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <winsock2.h>
#include <WS2tcpip.h>
 
#pragma comment(lib, "ws2_32.lib")
using namespace std;
 
#define BUFSIZE             1024        //buffer
#define SERVER_PORT     15989   //server port #
 
int main(void)
{
    //Initialize WinSocket
    string ipAdress = "192.168.1.10";
    WSAData data;
    WORD ver = MAKEWORD(2, 2);
    int wsResult = WSAStartup(MAKEWORD(2,2), &data);
    if (wsResult != 0)
    {
        cerr << "WSAStartup failed, Err #" << wsResult << endl;
        cin.get();
        return 0;
    }
    
    //Creating Socket
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);  
    if (sock == INVALID_SOCKET)
    {
        cerr << "Can't create a socket, Err #" << WSAGetLastError() << endl;
        cin.get();
        WSACleanup();
        return 0;
    }
    
    //Fill in a hint structure
    sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(SERVER_PORT);
    inet_pton(AF_INET, "192.168.1.10", &(server_addr.sin_addr));
    
    //Connecting to the server
    int connResult = connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr));    //вот тут ошибка возникает
    if (connResult == SOCKET_ERROR)
    {
        cerr << "Can't connect to the server, Err #" << WSAGetLastError() << endl;
        cin.get();
        closesocket(sock);
        WSACleanup();
        return 0;
    }
    
    //Do-While Loop to send and recieve data
    char buf[BUFSIZE];
    string userInput;
    
    do
    {
        //Prompt to type some text
        cout << "> ";
        getline(cin, userInput);
        
        if (userInput.size() > 0)
        {
            //Send the text
            int sendResult = send(sock, userInput.c_str(), userInput.size() + 1, 0);
            if (sendResult != SOCKET_ERROR)
            {   
                //Wait for response
                ZeroMemory(buf, BUFSIZE);
                int bytesRecieved = recv(sock, buf, BUFSIZE, 0);
                if (bytesRecieved > 0)
                {
                    //Echo the text to the console
                    cerr << "SERVER> " << string(buf, 0, bytesRecieved) << endl;
                }           
            }           
        }       
    } while(userInput.size() > 0);
 
    //Shutdown the connection
    cin.get();
    closesocket(sock);
    WSACleanup();
    return 0;
}
Кстати, клиент не компилируется (Microsoft VS 2017) при отсутствии using namespace std, хотя это, вроде, считается дурным тоном.

Буду очень признателен всем неравнодушным!

P.S. В программировании не очень силён, TCP/IP недавно стал изучать, так что могу подтупливать)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.02.2018, 00:18
Ответы с готовыми решениями:

Работа с модулем ICP DAS I-8831 по Modbus RTU
Доброго времени суток, господа. Прошу Вас подкинуть и указать путь к заголовочным файлам на &quot;C&quot;,...

Обмен с I-87068 (ICP DAS)
Здравствуйте! Помогите пожалуйста!!! Я написал программку с использованием библиотеки CPort, RS-485...

Работа с DCON протоколом (ICP DAS)
Здравствуйте уважаемые программисты. Я начинающий чайник. Начал изучать Delphi. Остановился на...

Работа с ICP DAS i-7043 по протоколу DCON
Дано: устройство i-7043, связано с компьютером по Ethernet через другое устройство ICP DAS...

1
0 / 0 / 1
Регистрация: 06.02.2018
Сообщений: 6
10.04.2018, 18:22  [ТС] 2
Что выяснилось - TCP данный контроллер не поддерживает, только UDP. Долго мучился с UDP, писал в техподдержку, в конце-концов осилил, эхо-сервер заработал
0
10.04.2018, 18:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2018, 18:22
Помогаю со студенческими работами здесь

RAID на контроллере LSI SAS1064I, сервер DELL CS24SC
Доброго времени суток! Имеем сервер DELL CS24SC У него RAID контроллер LSI SAS1064E В...

Как поднять ДНС-сервер на первичном домен-контроллере и что для этого нужно?
Здравствуйте! Как поднять ДНС-сервер на первичном домен-контроллере ? Что для этого нужно ?

Нужно развернуть DHCP-сервер на контроллере домена. Как бы сделать так, что бы он не менял выданные ранее...
Нужно развернуть DHCP-сервер на контроллере домена. Как бы сделать так, что бы он не менял выданные...

НЕ Самовосстанавливающиеся предохранители ICP-Nxx
Коллеги - не нашел нигде время восстановления таких предохранителей. Или почти мгновенно? И какой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru