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

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

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

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

Есть привод и периферия к нему (датчики давления, перемещения и проч.), и встала задача всё это дело автоматизировать. В своё время был куплен контроллер 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.02.2018, 00:18
Ответы с готовыми решениями:

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

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

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

1
1 / 1 / 1
Регистрация: 06.02.2018
Сообщений: 6
10.04.2018, 18:22  [ТС]
Что выяснилось - TCP данный контроллер не поддерживает, только UDP. Долго мучился с UDP, писал в техподдержку, в конце-концов осилил, эхо-сервер заработал
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.04.2018, 18:22
Помогаю со студенческими работами здесь

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

RAID на контроллере LSI SAS1064I, сервер DELL CS24SC
Доброго времени суток! Имеем сервер DELL CS24SC У него RAID контроллер LSI SAS1064E В корзины вставлено 4 жестких диска по 1...

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru