0 / 0 / 0
Регистрация: 31.10.2023
Сообщений: 12

Подключение и чтение данных с ПЛК MELSEC-Q Series (Q03UDECPU) при помощи C#

08.11.2024, 15:42. Показов 2743. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую коллеги! Ранее уже обращался с подобным вопросом, но с другим ПЛК (Siemens), с этим разобрался... Но пришел черед Mitsubishi...
В чем суть данной темы, мне нужно подключиться к контроллеру и считать его данные, сам контроллер "MELSEC-Q Series (его цпу - Q03UDECPU)". Я уже приличное количество библиотек перепробовал, и единственно что получилось: получить ответ True, но данные не читаются...
Подскажите какую библиотеку или какими средствами можно реализовать Подключение и чтение данных?
Я знаю IP контроллера и адреса нужных тэгов. Пожалуйста!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.11.2024, 15:42
Ответы с готовыми решениями:

PLC (ПЛК) Mitsubishi MELSEC FX1S-14MR-DS
Mitsubishi MELSEC FX1S-14MR-DS(б/у)+кабель для программирования с ПК +софт на русском языке.-5т.р. Отправлю почтой.

[GX Works3] Управление ПЧВ A800 при помощи ПЛК FX5U
Всем привет! Я начинающий в данном деле. Имеется ПЛК FX5U+ПЧ A800. Задумал в целях развития запрограммировать ПЛК на управление...

Управление скоростью вращения двигателя при помощи плавного торможение через ПЛК
Здравствуйте. Каким образом можно подключить к ПЛК тахогенератор который выдает постоянное напряжение 6-60В в зависимости от скорости...

18
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3419 / 2738 / 575
Регистрация: 04.09.2018
Сообщений: 8,598
Записей в блоге: 3
08.11.2024, 15:48
rshepet, с Mitsubishi все несколько сложнее.. Самый оптимальный (и простой) путь - через использование OPC-сервера. Он общается с ПЛК, и взаимодействует с приложением C# на ПК.
1
 Аватар для kaii-h
59 / 49 / 12
Регистрация: 23.02.2021
Сообщений: 163
08.11.2024, 18:27
Мицубиши вроде свой протокол описывали.
Первая попавшаяся ссылка на библиотеку вот - пишет что Q поддерживает, хоть и для ардуинки похоже.
Расширение сразу с modbus - QJ71MT91.
1
0 / 0 / 0
Регистрация: 31.10.2023
Сообщений: 12
11.11.2024, 08:42  [ТС]
Я вот и понял, что с этими контроллерами все намного веселее... И про OPC сервер знаю, он в целом щас и используется, но задача и заключается в том, чтобы ути от OPC, а может в последствии свой написать OPC-сервер... но это пока только мечтания))
Разобраться бы сперва как общаться с митсубиши через C#, а там уже видно будет.
Если у вас будут какие-нибудь идеи, или есть некий опыт в работе с подобной задачей, я буду очень рад если вы поделитесь им! Я новенький в этой сфере, можно сказать только изучаю и познаю глубины, но безумный интерес испытываю к этому делу.

Добавлено через 8 минут
kaii-h, спасибо большое за наводку, я изучу материал!
Библиотеку бегло просмотрел, наверное немного не то, что нужно, но все равно попробую! Спасибо!

Вот есть загвоздка с библиотеками, которые я пробовал, подключение во всех этих библиотеках "TRUE", а вот когда данные запрашиваю по адресам (типа "D2203" и тд), то в ответ пустота или ноль...
Сверяюсь с данными через "MX OPC Configurator", ну и смотрю всю область памяти в "GX Works2"
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3419 / 2738 / 575
Регистрация: 04.09.2018
Сообщений: 8,598
Записей в блоге: 3
11.11.2024, 14:40
rshepet, в этом деле есть две существенные проблемы, которые трудно решить "своими руками":
1. заставить "поверить" CPU ПЛК в то, что с ним "общается" легитимное устройство;
2. постоянная конвертация числовых значений.

Со второй проблемой если более-менее понятно, то первая задаст жару.
Дело в том, что нужно очень точно выдерживать тайминги передачи команд и приема сообщений. Это означает, что один не влезший бит в заголовок за отведенное время или наоборот, лишний бит там оказавшийся - сразу приводят к отбрасыванию этого сообщения ПЛК: устройство не валидно.
Все эти времена рассчитываются исходя из скорости передачи и длине сообщений в пакетном режиме.

Причем бывало так, что на одной линейке моделей это работало, а на другой уже нет.
Если все же работать с этим на шарпах, то сразу исключается обмен с ПЛК из потока UI (окон) - это будет очень нестабильное соединение. Обмен должен быть только в своих собственных потоках, отличных от других. А это влечет за собой более-менее уверенные знания о многопоточной работе в C#.
0
0 / 0 / 0
Регистрация: 31.10.2023
Сообщений: 12
20.01.2025, 13:50  [ТС]
Приветствую коллеги! Я тут пытаюсь реализовать проток MC (MC Protocol), но у меня все больше вопросов чем ответов...
В чем суть данной, мне нужно подключиться к контроллеру и считать его данные, сам контроллер "MELSEC-Q Series (его цпу - Q03UDECPU)".
В целом написал небольшой код, который в свою очередь подключается и отправляет команду, даже ответ приходит.
Трафик мониторю через Wireshark.
Но я не понимаю как команды формируются, пытаюсь опереться на документацию, но тяжело идет... еще все на английском
В чем вопрос то, помогите пожалуйста разобраться с этими командами и их расшифровками, недели три воюю с этим, а толку ноль.

примеры команд, что отправляются с моего ПК на ПЛК:

1. 57000900001111070000FFFF030000FE0300001A 001C080A0800000000000000040B052800000005 01000006000000

2. 5a0000ff

3. 5700fd00001111070000ffff030000fe03000012 001c080a080000000000000004080231000000

4. 57000200001111070000ffff030000fe03000032 001c080a08000000000000000401140300000088 8f5b8bd7fa30fd251ead837ef8af442430807868 d7fca9812de86688855974

5. 57000000001111070000ffff030000fe03000014 001c080a08000000000000000401010100000000 01

Заметил лишь закономерность некую в этих запросах, всегда встречаются: "5700", "1111070000ffff030000fe030000", "001c080a0800000000000000040".
0
120 / 112 / 16
Регистрация: 30.10.2014
Сообщений: 324
20.01.2025, 16:18
на гитхабе есть готовые библиотеки.
В поиске наберите
MELSEC language:C#
0
0 / 0 / 0
Регистрация: 31.10.2023
Сообщений: 12
20.01.2025, 16:37  [ТС]
я уже весь гитхаб облазил, многое пробовал
большая часть на китайском или японском, но это затрудняет в анализе кода, который они предоставляют
да и не работают они с моим плк,, почему тоже понять не могу.
0
120 / 112 / 16
Регистрация: 30.10.2014
Сообщений: 324
20.01.2025, 16:44
Тогда скачайте EasyBuilder Pro https://www.weintek.com/global... erPro.aspx
Создайте проект со своим контроллером и одним числовым индикатором и запустите симулятор панели с подключением к вашему контроллеру.
в Wireshark увидите правильные запросы и будете точно знать что в ответе от контроллера.
0
0 / 0 / 0
Регистрация: 31.10.2023
Сообщений: 12
21.01.2025, 11:28  [ТС]
Олег, я попробовал ваш совет, но он не принес результатов.
Делал все по руководству, но ответа от плк никакого, да и сам запрос сформирован как я понял не правильно.
Вот запрос "Data: 3530303030303030303346463030303031383030 31303034303130303030442a3030323234373030 303130303038"

Запросы что описывал ранее, они взяты из Wireshark при включенном MX OPC Configurator, так же пробовал и через GX Work2, когда выгружал программу из ПЛК.
И при это во всех запросах присутствуют вот эти значения: "5700", "1111070000ffff030000fe030000", "001c080a0800000000000000040".
0
120 / 112 / 16
Регистрация: 30.10.2014
Сообщений: 324
21.01.2025, 12:02
Цитата Сообщение от rshepet Посмотреть сообщение
3530303030303030303346463030303031383030 31303034303130303030442a3030323234373030 303130303038
это ASCII, т.е.
5000000003FF000018001004010000D*00224700 010008
т.е. у вас почему то всё вперемешку, то Hex, то ASCII
----------------------
Т.е. вы через MX OPC сервер успешно читаете с контроллера значение с одного адреса памяти, в Wireshark видите байты запроса и ответа и зная что MX OPC отображает значение из контроллера "1234", не можете его найти в байтах ответа?

Первые запросы от MX OPC не отслеживайте, там может быть что то служебное.
0
0 / 0 / 0
Регистрация: 31.10.2023
Сообщений: 12
21.01.2025, 12:24  [ТС]
Я видимо уже совсем запутался...
При рабочем MX OPC данные отправляются в виде HEX (Data: 57003000001111070000ffff030000fe03000012 001c080a08000000000000000408026b000000- это же hex?), и ответ от ПЛК есть в виде (Data: d700ac0000111107000000e40300ffff0300002a 009c000c080000000004040000000008026b0000 00000000006400010080020000e80f01406e3b00 00f7f9)

Но когда отправляются ASCII (353030303030303030334646303030303138303 031303034303130303030442a303032323437303 0 303130303038 - запрос отправленный выше) ответа никакого нет.
Но вы прислали расшифровку - 5000000003FF000018001004010000D*00224700 010008, пока я искал и изучал всю инфу, и лишь понимаю, что в этом запросе есть адрес D2247, его то я и пытаюсь вытащить в качестве примера.

Сама программа в ПЛК не маленькая, на ней заводы асфальтосмесительные работают, и написана китайцами...

Могу прислать код, который я написал на C#, где я отправляю запрос и есть ответ. (Код будет в следующем сообщении)

Добавлено через 1 минуту
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
 static void Main(string[] args)
{ 
  string ipAddress = "*.*.*.*"; // IP-адрес PLC
    int port = 5007; // Порт подключения
 
    try
    {
        Console.WriteLine("Connecting to PLC...\n");
        using (TcpClient client = new TcpClient(ipAddress, port))
        using (NetworkStream stream = client.GetStream())
        {
            Console.WriteLine("Connected!\n");
 
            // Сформировать запрос
            byte[] requestBytes = CreateCustomReadRequest(); //CreateReadCommand
            Console.WriteLine($"Request:\t\n {BitConverter.ToString(requestBytes)}\n");
 
            
            // Отправить запрос
            stream.Write(requestBytes, 0, requestBytes.Length);
            
            Console.WriteLine("Request sent!\n");
 
            // Получить ответ
            byte[] responseBytes = new byte[512];
            int bytesRead = stream.Read(responseBytes, 0, responseBytes.Length);
 
            if (bytesRead > 0)
            {
                Console.WriteLine("Response received!\n");
                string responseHex = BitConverter.ToString(responseBytes, 0, bytesRead).Replace("-", "");
                Console.WriteLine($"Response (Hex):\t\n {responseHex}\n");
 
                // Расшифровать ответ
                ParseResponse(responseBytes, bytesRead);
            }
            else
            {
                Console.WriteLine("No response received.");
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error: {ex.Message}");
    }
}
 
//static byte[] CreateReadCommand()
//{
//    byte[] command = new byte[21];
 
//    // Subheader (2 байта)
//    command[0] = 0x57; // Subheader: запрос через MC Protocol
//    command[1] = 0x00;
 
//    // Network number (1 байт)
//    command[2] = 0x00;
 
//    // PC number (1 байт)
//    command[3] = 0xFF;
 
//    // Request destination module I/O (2 байта)
//    command[4] = 0xFF;
//    command[5] = 0x03;
 
//    // Request destination station number (1 байт)
//    command[6] = 0x00;
 
//    // Request data length (2 байта) - Длина команды от Command до конца
//    command[7] = 0x0C; // Длина данных = 12 байт
//    command[8] = 0x00;
 
//    // Monitoring timer (2 байта)
//    command[9] = 0x10;
//    command[10] = 0x00;
 
//    // Command (2 байта): 0401 = Read Word Data
//    command[11] = 0x01;
//    command[12] = 0x04;
 
//    // Subcommand (2 байта): 0000
//    command[13] = 0x00;
//    command[14] = 0x00;
 
//    // Device address (3 байта): D2247 = 2247, device type D = 0xA8
//    ushort address = 2247; // Адрес устройства
//    command[15] = (byte)(address & 0xFF);        // Младший байт
//    command[16] = (byte)((address >> 8) & 0xFF); // Старший байт
//    command[17] = 0xA8; // Device type: D
 
//    // Number of points to read (2 байта): 1 слово
//    command[18] = 0x01; // Количество слов (младший байт)
//    command[19] = 0x00; // Количество слов (старший байт)
 
//    return command;
//}
 
 
static byte[] CreateCustomReadRequest()
{
    // Пример запроса на основе вашего примера
    string hexRequest1 = "57000900001111070000FFFF030000FE0300001A001C080A0800000000000000040B05280000000501000006000000"; //ответ есть 996
    string hexRequest2 = "5a0000ff"; 
 
    string hexRequest3 = "5700 fd0000 1111070000ffff030000fe030000 12 001c080a0800000000000000040 80231000000";
    string hexRequest4 = "5700 020000 1111070000ffff030000fe030000 32 001c080a0800000000000000040 11403000000888f5b8bd7fa30fd251ead837ef8af442430807868d7fca9812de86688855974";
    string hexRequest5 = "5700 040000 1111070000ffff030000fe030000 1a 001c080a0800000000000000040 40104000000bfbfbaba00000200"; 
    string hexRequest6 = "5700 000000 1111070000ffff030000fe030000 14 001c080a0800000000000000040 101010000000001";
    string hexRequest7 = "5700 010000 1111070000ffff030000fe030000 1a 001c080a0800000000000000040 40102000000a9001e0100001a00"; //996 
    string hexRequest8 = "57000000011111070000FFFF030000fe0300001a001c080a080000000000000004040102000000a9001e0100001a00";
 
 
    return HexStringToByteArray(hexRequest8);
}
 
 
//static void ParseResponse(byte[] response, int length)
//{
//    try
//    {
//        Console.WriteLine($"Raw Response: {BitConverter.ToString(response, 0, length).Replace("-", "")}");
 
//        // Код завершения (End Code)
//        string endCode = BitConverter.ToString(response, 9, 2).Replace("-", "");
//        Console.WriteLine($"End Code: {endCode}");
 
//        if (endCode != "00-00")
//        {
//            Console.WriteLine("Error in response: End Code indicates failure.");
//            return;
//        }
 
//        // Данные начинаются с 22-го байта (смещение полезной нагрузки)
//        int dataOffset = 22; // Уточнено по вашему ответу
//        int dataValue = BitConverter.ToInt16(response, dataOffset);
//        Console.WriteLine($"Read Value: {dataValue}");
//    }
//    catch (Exception ex)
//    {
//        Console.WriteLine($"Error parsing response: {ex.Message}");
//    }
//}
 
 
static void ParseResponse(byte[] response, int length)
{
    try
    {
 
        //Console.WriteLine($"Raw Response: {BitConverter.ToString(response, 0, length).Replace("-", "")}");
 
 
        // Пример разбора ответа
        string header = BitConverter.ToString(response, 0, 4); // Заголовок
        string endCode = BitConverter.ToString(response, 9, 2); // Код завершения
        Console.WriteLine($"Header: {header}\n");
        Console.WriteLine($"End Code: {endCode}\n");
 
        if (endCode != "00-00")
        {
            Console.WriteLine("Error in response: End Code indicates failure.");
            return;
        }
 
 
        // Данные начинаются с определенного смещения
        int dataStartIndex = 1; // Смещение до полезных данных | "2" идет счет от 0 до 255 и обратно...
        int dataLength = length - dataStartIndex;
        byte[] dataBytes = new byte[dataLength];
        Array.Copy(response, dataStartIndex, dataBytes, 0, dataLength);
 
        string dataHex = BitConverter.ToString(dataBytes).Replace("-", "");
        Console.WriteLine($"Data (Hex): {dataHex}\n");
 
        // Преобразование данных в число
        if (dataLength >= 1)
        {
            int dataValue = BitConverter.ToInt16(dataBytes, 0);
            Console.WriteLine($"Read Value: {dataValue}");
 
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error parsing response: {ex.Message}");
    }
}
 
static byte[] HexStringToByteArray(string hex)
{
    int length = hex.Length / 2;
    byte[] byteArray = new byte[length];
    for (int i = 0; i < length; i++)
    {
        byteArray[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);
    }
    return byteArray;
}
Вот ответ из консоли:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Connecting to PLC...
 
Connected!
 
Request:
 57-00-00-00-01-11-11-07-00-00-FF-FF-03-00-00-FE-03-00-00-1A-00-1C-08-0A-08-00-00-00-00-00-00-00-04-04-01-02-00-00-00-A9-00-1E-01-00-00-1A-00
 
Request sent!
 
Response received!
 
Response (Hex):
 D7000F0100111107000000E40300FFFF0300001E009C000C080640000004040000000004010200000001006410280555060620
 
Header: D7-00-0F-01
 
End Code: 00-00
 
Data (Hex): 000F0100111107000000E40300FFFF0300001E009C000C080640000004040000000004010200000001006410280555060620
 
Read Value: 3840
Добавлено через 5 минут
Строка Read Value не верная 100%, ибо по сути я даже не знаю что запрашиваю тут... просто скопировал один запрос отправленный для проверки и что-то сдвинулось с мест, но после этого конкретно топчусь на одном месте...

Еще, меняя dataStartInde, то Read Value совершенно по разному себя ведет, то какой-то перебор идет, то какое-то статичное значение (например: 996, при dataStartInde = 11)
0
120 / 112 / 16
Регистрация: 30.10.2014
Сообщений: 324
21.01.2025, 16:01
Тут есть тема
OPC клиент (OPC_DA v2.05) для платформы NET

и если у вас есть MX OPC и вы его настроили на обмен и всё работает, попробуйте с него данные забрать.
В инетах тоже есть простые примеры для подключения к OPC серверу.
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3419 / 2738 / 575
Регистрация: 04.09.2018
Сообщений: 8,598
Записей в блоге: 3
21.01.2025, 16:37
Ломали мы как-то с ребятами этот протокол... на примере FX3U. Ну как ломали: сниферили обмен по COMу, пытались вычленить коды команд/данных. Кое что у нас получилось - собрали схемку на STM32 (она в FX'ах применяется), накидал я небольшой интерпретатор, который переворачивает LADDER в IL и отправляет в наш самодельный "CPU FX".
Так, несколько инструкций удалось повторить, а так же обмен туда-сюда. Даже где-то выкладывали результаты своей работы, не то на Казусе, не то еще где-то, типа такого же профильного форума. Давно было, не вспомню.

Точно могу сказать одно - кардинальных отличий в протоколе между линейкой FX и Q как-бы нет, однако там точно есть некая идентификация конкретного типа устройства, которая содержится в потоке передачи. Т.е. команда для FX серии точно не подойдет для Q. Где именно этот идентификатор находится в блоке данных и как его изъять - я не на тот момент не нашел.

Короче, интерес к этому пропал, дальше ковырять это дело я не стал. При необходимости общения с ПЛК юзал нативные OPC-сервера. По идее, при желании, можно и его обмен "ломануть" и посмотреть как он общается с тем или иным устройством. Но это надо прям сильно хотеть.
По моему мнению, работа по "взлому" протокола ME намного дороже, чем любой условно-бесплатный OPC. Особенно, если передаваемых тегов не много.
1
0 / 0 / 0
Регистрация: 31.10.2023
Сообщений: 12
22.01.2025, 08:45  [ТС]
Олег, спасибо! Попробую этот способ.
Вообще я весь разговор начал потому, что прилетела задача "написать свой OPC сервер", но когда начал этим заниматься понял что трэш полный...
Теперь я называю его "Псевдо OPC"
Програмку для Siemens S7-200 SMART я написал и очень успешно (спасибо библиотекам)! Но вот для Mitsubishi Q ничего не получается...

Добавлено через 3 минуты
Очень занятно
Если я сейчас начну заниматься подобным, то это путь в бесконечность X-D...
Даже если работать исключительно с протоколом MC, то все формы запросов и типы кадров (frame) будто бы не сходятся с моими запросами, на которые наткнулся при анализе трафика.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3419 / 2738 / 575
Регистрация: 04.09.2018
Сообщений: 8,598
Записей в блоге: 3
22.01.2025, 08:47
Цитата Сообщение от rshepet Посмотреть сообщение
Програмку для Siemens S7-200 SMART я написал и очень успешно (спасибо библиотекам)!
Эти библиотеки в основном ре-инженерили западные "специалисты", т.к. сименсы там очень распространены.
Митсубиси реже, поэтому для них вразумительного ничего нет. Не удивительно, почему все материалы по ним преимущественно на японо-китайских языках...
0
0 / 0 / 0
Регистрация: 31.10.2023
Сообщений: 12
22.01.2025, 08:49  [ТС]
Это я заметил...
Даже библиотеки, что нашел на гите, все на японо-китайском...
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3419 / 2738 / 575
Регистрация: 04.09.2018
Сообщений: 8,598
Записей в блоге: 3
22.01.2025, 08:51
rshepet, в азии митсубиси более в ходу, чем сименсы, что логично..
И там тоже ребята хотят ими "рулить" из своих приложений, чтобы за OPC не платить.
0
0 / 0 / 0
Регистрация: 31.10.2023
Сообщений: 12
22.01.2025, 08:53  [ТС]
Ну я нашел ломаный MX OPC и работает вообще прекрасно, но для SCADA нужен прям сервер, а вот за ключ для него... ценники бешенные.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.01.2025, 08:53
Помогаю со студенческими работами здесь

Чтение HTML при помощи ASP
Situatsiya takaya. Mne nado programno prochitat HTML stranitsu s dannim URL pri pomoshi ASP i skriptov. Potom pomenat yeyo format i vidat...

Чтение сектора HDD при помощи asm
Доброго времени суток. Задача состоит в следующем - написать код чтения сектора диска, используя ассемблерную вставку. Перепробовал кучу...

Подключение к mysql из delphi при помощи anydac
делаю приложение на delphi, при помощи anydac.все работает нормально,НО.когда таблица появляется в dbgrid все русские символы имеют вид ?...

Чтение файла при помощи FCB (пример из книги Абеля)
Программа из Абеля.. должна считать записи из файла и выдать их на экран.. Гляньте кому не трудно Сам файл в формате DAT и исходник...

Чтение REAL из PLC Siemens S300 при помощи библиотеки Snap7
Всем привет! Пишу приложение Windows на C++ Builder для работы с PLC Siemens. Для подключения к PLC использую библиотеку Snap7. ...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
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 Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru