Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 20
1

Использование классов в modbus TCP

16.10.2019, 08:40. Показов 5364. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вообщем, необходимо было написать для одного человека модбас, что в принципе я и сделал. Поставили замечание, что мой код является процедурным и так не правильно делать, сказали сделать классы (как я понял переделать что имеется, а еще много повторов), и в дальнейшем объяснять ничего не стали. Можете помочь, что от меня хотят? (С примерами)

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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
using System.Threading;
 
namespace TCPModbus
{
    class Program {
 
        //Для заголовка: id-идентефикатор(в дальнейшем он конвертируется в байты(можно было и его через байты), IdProt-Идентификатор протокола, lenghtMod-длинна сообщения протокола модбас
        static ushort id = 1;
        static byte[] IdProt = { 0, 0 };
        static byte lenghtMod = 0;
 
        //Для формирования функции: len- длинна сообщения, func-функция
        static byte[] len = { 6, 11, 8 };
        static byte unit = 1;
        static byte[] func = { 1, 2, 3, 4, 5, 6, 15, 16 };
 
        //Для стартого адреса, везде стоит 0.1, в некоторых длинна сообщения, и кол во байт выставлены сразу как константы!(для примера)
        static byte[] startAddress = { 0, 1 };
 
        //заголовок первые 5 байт
        static byte[] Header(ushort id, byte[] IdProt, byte lenghtMod)
        {   byte[] data = new byte[5];
            byte[] _id = BitConverter.GetBytes((short)id);
            data[0] = _id[1];       
            data[1] = _id[0];
            data[2] = IdProt[0];
            data[3] = IdProt[1];
            data[4] = lenghtMod;
            return data;
        }
 
        // Тут надеюсь всё понятно...
        static byte[] ReadCoilStatus(byte[] len,byte unit, byte[] func, byte[] startAddress)
        {
            byte[] data = new byte[7];
            data[0] =len[0];
            data[1] = unit;
            data[2] = func[0];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
            //Количество регистров, далее сделано всё так же
            data[5] = 0;
            data[6] = 2;
            return data;
        }
        static byte[] ReadInputStatus(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
            byte[] data = new byte[7];
            data[0] = len[0];
            data[1] = unit;
            data[2] = func[1];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
            data[5] = 0;
            data[6] = 2;
            return data;
        }
        static byte[] ReadHoldingReg(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
            byte[] data = new byte[7];
            data[0] = len[0];
            data[1] = unit;
            data[2] = func[2];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
            data[5] = 0;
            data[6] = 61;
            return data;
        }
        static byte[] ReadInputReg(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
            byte[] data = new byte[7];
            data[0] = len[0];
            data[1] = unit;
            data[2] = func[3];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
            data[5] = 0;
            data[6] = 1;
            return data;
        }
        static byte[] ForceSingleCoil(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
            byte[] data = new byte[7];
            data[0] = len[0];
            data[1] = unit;
            data[2] = func[4];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
            data[5] = 0;
            data[6] = 1;
            return data;
        }
        static byte[] PresetSingleReg(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
            byte[] data = new byte[7];
            data[0] = len[0];
            data[1] = unit;
            data[2] = func[5];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
            data[5] = 1;
            data[6] = 2;
            return data;
        }
        static byte[] ForceMultipleCoil(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
            byte[] data = new byte[9];
            data[0] = len[2];
            data[1] = unit;
            data[2] = func[6];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
            data[5] = 0;
            data[6] = 5;
            data[7] = 1;
            data[8] = 19;
            return data;
        }
        static byte[] PresetMultipleReg(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
            byte[] data = new byte[12];
            data[0] = len[1];
            data[1] = unit;
            data[2] = func[7];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
            data[5] = 0;            
            data[6] = 2;         
            data[7] = 4;        
            data[8] = 0;           
            data[9] = 10;           
            data[10] = 1;         
            data[11] = 2;          
            return data;
        }
 
        #region 
        //Можно было и так...
        //byte[] _id = BitConverter.GetBytes((short)id);
        //static byte[] PocketByte1 = { _id[1], _id[0], 0, 0, 0, 6, 1, 1, 0, 1, 3, 4 };
        //static byte[] PocketByte2 = { 0, 1, 0, 0, 0, 6, 1, 2, 0, 1, 0, 2 };
        //static byte[] PocketByte3 = { 0, 1, 0, 0, 0, 6, 1, 3, 0, 1, 0, 6 };
        //static byte[] PocketByte4 = { 0, 1, 0, 0, 0, 6, 1, 4, 0, 1, 0, 6 };
        //static byte[] PocketByte5 = { 0, 1, 0, 0, 0, 6, 1, 5, 0, 1, 0, 1 };
        //static byte[] PocketByte6 = { 0, 1, 0, 0, 0, 6, 1, 6, 0, 1, 1, 2 };
        //static byte[] PocketByte7 = { 0, 1, 0, 0, 0, 8, 1, 15, 0, 3, 0, 5, 1, 19 };
        //static byte[] PocketByte8 = { 0, 1, 0, 0, 0, 11, 1, 16, 0, 3, 0, 2, 4, 0, 10, 1, 2 };
        #endregion
 
        static void Main(string[] args) {
            TcpClient TCPMBus = new TcpClient();
            TCPMBus.ReceiveBufferSize = 48;
            TCPMBus.Connect("127.0.0.1", 506);
            NetworkStream tcpStream = TCPMBus.GetStream();
            Console.Write(" Выберите пункт меню: ");
            String strr = Console.ReadLine();
            switch (strr)  {
                //
                case "1":
                    //Concat соедениение заголовока и последущего пакета
                    byte[] mess1 = Header(id,  IdProt, lenghtMod).Concat(ReadCoilStatus( len, unit, func,  startAddress)).ToArray();
                    tcpStream.Write(mess1, 0, mess1.Length);
                    string msd1 = BitConverter.ToString(mess1);
                    Console.WriteLine("Запрос Read Coil Status: " + msd1);
                    break;
                //
                case "2":
                    byte[] mess2 = Header(id, IdProt, lenghtMod).Concat(ReadInputStatus(len, unit, func, startAddress)).ToArray();
                    tcpStream.Write(mess2, 0, mess2.Length);
                    string msd2 = BitConverter.ToString(mess2);
                    Console.WriteLine("Запрос Read Input Status: " + msd2);
                    break;
                //
                case "3":
                    byte[] mess3 = Header(id, IdProt, lenghtMod).Concat(ReadHoldingReg(len, unit, func, startAddress)).ToArray();
                    tcpStream.Write(mess3, 0, mess3.Length);
                    string msd3 = BitConverter.ToString(mess3);
                    Console.WriteLine("Запрос Read Input Status: " + msd3);
                    break;
                //
                case "4":
                    byte[] mess4 = Header(id, IdProt, lenghtMod).Concat(ReadInputReg(len, unit, func, startAddress)).ToArray();
                    tcpStream.Write(mess4, 0, mess4.Length);
                    string msd4 = BitConverter.ToString(mess4);
                    Console.WriteLine("Запрос Read Input Registers: " + msd4);
                    break;
                //
                case "5":
                    byte[] mess5 = Header(id, IdProt, lenghtMod).Concat(ForceSingleCoil(len, unit, func, startAddress)).ToArray();
                    tcpStream.Write(mess5, 0, mess5.Length);
                    string msd5 = BitConverter.ToString(mess5);
                    Console.WriteLine("Запрос Force Single Coil: " + msd5);
                    break;
                //
                case "6":
                    byte[] mess6 = Header(id, IdProt, lenghtMod).Concat(PresetSingleReg(len, unit, func, startAddress)).ToArray();
                    tcpStream.Write(mess6, 0, mess6.Length);
                    string msd6 = BitConverter.ToString(mess6);
                    Console.WriteLine("Запрос Preset Single Register: " + msd6);
                    break;
                //
                case "7":
                    byte[] mess7 = Header(id, IdProt, lenghtMod).Concat(ForceMultipleCoil(len, unit, func, startAddress)).ToArray();
                    tcpStream.Write(mess7, 0, mess7.Length);
                    string msd7 = BitConverter.ToString(mess7);
                    Console.WriteLine("Запрос Force Single Coil: " + msd7);
                    break;
                //
                case "8":
                    byte[] mess8 = Header(id, IdProt, lenghtMod).Concat(PresetMultipleReg(len, unit, func, startAddress)).ToArray();
                    tcpStream.Write(mess8, 0, mess8.Length);
                    string msd8 = BitConverter.ToString(mess8);
                    Console.WriteLine("Запрос Preset Multiple Registers: " + msd8);
                    break;
            }
            //////////////////////////////////////
            byte[] bytes = new byte[TCPMBus.ReceiveBufferSize];
                    int bytesRead = tcpStream.Read(bytes, 0, TCPMBus.ReceiveBufferSize);
                    byte[] bytes1 = new byte[TCPMBus.ReceiveBufferSize];
                    int bytesRead1 = tcpStream.Read(bytes1, 0, TCPMBus.ReceiveBufferSize);
                    TCPMBus.Close();
                    // Строка, содержащая ответ от сервера
                    string returnData = BitConverter.ToString(bytes);
  //                  string returnData1 = BitConverter.ToString(bytes1);
                    Console.WriteLine("RX: " + returnData);
                    byte[] values = new byte[2];
                    int str = Convert.ToInt32(strr);
                    for (int j = 0; j < 8; j++)
                    {
                        values[1] = (byte)(bytes[9 + (j * 2)]);
                        values[0] = (byte)(bytes[10 + (j * 2)]);
                        if (str == 3)
                            Console.WriteLine("распознанные данные, регистр " + (j + 1) + ": " + BitConverter.ToUInt16(values, 0));
                    }
            Console.ReadLine();
            Console.ReadLine();
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.10.2019, 08:40
Ответы с готовыми решениями:

Проблемы с подключенияем по Modbus TCP
Один и тот же код в разных программах. Одна библиотека подключена. Тем не менее в одной программе...

Как работать с modbus tcp?
кто знает как работать с modbus tcp подскажите плиз и подкинте пару примеров заранее блогадарен

Modbus TCP/IP
Здравствуйте, форумчане. Появилась задача, в которой необходимо реализовать несколько устройств...

MODBUS TCP SLAVE
Всем привет. Создать клиент модбас тсп без проблем получается на сокетах. А вот сервер сокет...

14
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
16.10.2019, 09:00 2
Цитата Сообщение от Artur9961 Посмотреть сообщение
необходимо было написать для одного человека модбас, что в принципе я и сделал
и
Цитата Сообщение от Artur9961 Посмотреть сообщение
и в дальнейшем объяснять ничего не стали
что-то как-то не вяжется
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 20
16.10.2019, 09:05  [ТС] 3
То что написано снизу (код), не совсем правильно написано, так понимаю процедурный код, нужно по принципам ооп переделать. Про создание классов сам пока не въехал.
0
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
16.10.2019, 09:14 4
Цитата Сообщение от Artur9961 Посмотреть сообщение
что в принципе я и сделал.
отлично, значит с кодом знакомы, осталось только создать пару классов, и методы к ним прописать.
Цитата Сообщение от Artur9961 Посмотреть сообщение
нужно по принципам ооп переделать
а что не получается ?
0
544 / 352 / 119
Регистрация: 17.08.2014
Сообщений: 1,335
16.10.2019, 09:25 5
Artur9961,
это
C#
1
2
3
4
5
6
 byte[] _id = BitConverter.GetBytes((short)id);
            data[0] = _id[1];       
            data[1] = _id[0];
            data[2] = IdProt[0];
            data[3] = IdProt[1];
            data[4] = lenghtMod;
и это
C#
1
2
3
4
5
6
7
  data[0] = len[0];
            data[1] = unit;
            data[2] = func[1];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
            data[5] = 0;
            data[6] = 2;
Очень похоже на структуры или классы не находите?

причем
C#
1
2
3
4
5
6
7
8
9
10
11
12
 static byte[] ReadInputStatus(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
            byte[] data = new byte[7];
            data[0] = len[0];
            data[1] = unit;
            data[2] = func[1];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
            data[5] = 0;
            data[6] = 2;
            return data;
        }
передаете byte[] len в виде массива а используете только первый байт причем всегда, для чего тогда передавать массив. и так же с другими методами и параметрами. Все правильно вам сказали переделать.
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 20
16.10.2019, 09:47  [ТС] 6
Да похожи, необходимо их по отдельно в классы забить? смысл в этом... len не везде используется только первый элемент, в последних двух структурах 2 и 3 используется, изначально там вообще использовались константы, но опять же пытался сделать по красивее. Щас будет диковатый вопрос, class Program, а это не тот класс который от меня хотели?)
0
1514 / 905 / 328
Регистрация: 17.05.2015
Сообщений: 3,417
16.10.2019, 11:07 7
Artur9961, читайте что такое ооп. Нет, это не он.
0
544 / 352 / 119
Регистрация: 17.08.2014
Сообщений: 1,335
16.10.2019, 12:45 8
Artur9961, Структура или класс в простом примере это упорядоченное описание объекта. Создайте в вашем примере животное кота и жирафа, Да даже на свой код посмотрите в нем почти в каждой строке Ctrl+C -> Ctrl+V
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 20
16.10.2019, 16:08  [ТС] 9
Andreyip, Не могли бы, что то вроде конструктора написать? в стиле что в начале должно быть, где метод и тд тп, просто у меня пока в голове, что зачем то мне нужно взять разбивать все структуры на классы...(нет класс животных мне не думаю что нужен)
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 20
29.10.2019, 07:38  [ТС] 10
Перепилил код, примерно так, все ровно не то, сказано что это получился "набор функций, а не класс", сказано было создай класс модбас...



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
200
201
202
203
204
205
206
207
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
using System.Threading;
 
namespace ModbusTest2
{
 
    public class Reg
    {
        public static byte[] func1 = { 0, 1, 0, 0, 0 };
    }
 
    public class Master
    {
        private static TcpClient TCPMBus= new TcpClient();
        //private static byte[] TCPMBusBuffer = new byte[2048];
 
        #region
        public static void Connect(string server, int port)
        {
            //TcpClient TCPMBus = new TcpClient();
            TCPMBus.ReceiveBufferSize = 48;
            TCPMBus.Connect(server, port);
            NetworkStream tcpStream = TCPMBus.GetStream();
 
 
        }
        #endregion
 
 
 
 
        public static void WriteData(/*string server, int port,*/byte[] data)
        {
            //TcpClient TCPMBus = new TcpClient();
            //TCPMBus.ReceiveBufferSize = 48;
            //TCPMBus.Connect(server, port);
            NetworkStream tcpStream = TCPMBus.GetStream();
            tcpStream.Write(data, 0, data.Length);
            
            byte[] bytes = new byte[TCPMBus.ReceiveBufferSize];
            int bytesRead = tcpStream.Read(bytes, 0, TCPMBus.ReceiveBufferSize);
            byte[] bytes1 = new byte[TCPMBus.ReceiveBufferSize];
            int bytesRead1 = tcpStream.Read(bytes1, 0, TCPMBus.ReceiveBufferSize);
            TCPMBus.Close();
            // Строка, содержащая ответ от сервера
            string returnData = BitConverter.ToString(bytes);
            Console.WriteLine("Ответ: " + returnData);
            byte[] values = new byte[2];
            int str = Convert.ToInt32(data[7]);
            for (int j = 0; j < 8; j++)
            {
                values[1] = (byte)(bytes[9 + (j * 2)]);
                values[0] = (byte)(bytes[10 + (j * 2)]);
                if (str == 3)
                    Console.WriteLine("распознанные данные, регистр " + (j + 1) + ": " + BitConverter.ToUInt16(values, 0));
            }
            Console.ReadLine();
            Console.ReadLine();
        }
 
        public static byte[] FullPocket(byte[] data)
        {
            byte[] mess1 = Reg.func1.Concat(data).ToArray();
            WriteData(mess1);
            return mess1;
        }
 
 
        public static byte[] ReadCoilStatus(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
            byte[] data = new byte[7];
            data[0] = len[0];
            data[1] = unit;
            data[2] = func[0];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
                //Количество регистров, далее сделано всё так же
            data[5] = 0;
            data[6] = 2;
            //byte[] mess1 = Reg.func1.Concat(data).ToArray();
            string msd1 = BitConverter.ToString(data);
            Console.WriteLine("Запрос Read Coil Status:  00-01-00-00-00-" + msd1);
            FullPocket(data);
            return data;
            //return data;
 
        }
        public static void ReadInputStatus(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
            byte[] data = new byte[7];
            data[0] = len[0];
            data[1] = unit;
            data[2] = func[1];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
            data[5] = 0;
            data[6] = 2;
            byte[] mess1 = Reg.func1.Concat(data).ToArray();
            string msd1 = BitConverter.ToString(mess1);
            Console.WriteLine("Запрос Read Input Status: " + msd1);
            FullPocket(data);
        }
        public static void ReadHoldingReg(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
            byte[] data = new byte[7];
            data[0] = len[0];
            data[1] = unit;
            data[2] = func[2];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
            data[5] = 0;
            data[6] = 2;
            byte[] mess1 = Reg.func1.Concat(data).ToArray();
            string msd1 = BitConverter.ToString(mess1);
            Console.WriteLine("Запрос Read Holding Registers: " + msd1);
            FullPocket(data);
        }
        public static void ReadInputReg(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
            byte[] data = new byte[7];
            data[0] = len[0];
            data[1] = unit;
            data[2] = func[3];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
            data[5] = 0;
            data[6] = 1;
            byte[] mess1 = Reg.func1.Concat(data).ToArray();
            string msd1 = BitConverter.ToString(mess1);
            Console.WriteLine("Запрос Read Input Registers: " + msd1);
            FullPocket(data);
        }
        public static void ForceSingleCoil(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
            byte[] data = new byte[7];
            data[0] = len[0];
            data[1] = unit;
            data[2] = func[4];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
            data[5] = 0;
            data[6] = 1;
            byte[] mess1 = Reg.func1.Concat(data).ToArray();
            string msd1 = BitConverter.ToString(mess1);
            Console.WriteLine("Запрос Force Single Coil: " + msd1);
            FullPocket(data);
        }
        public static void PresetSingleReg(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
            byte[] data = new byte[7];
            data[0] = len[0];
            data[1] = unit;
            data[2] = func[5];
            data[3] = startAddress[0];
            data[4] = startAddress[1];
            data[5] = 1;
            data[6] = 2;
            byte[] mess1 = Reg.func1.Concat(data).ToArray();
            string msd1 = BitConverter.ToString(mess1);
            Console.WriteLine("Запрос Preset Single Register: " + msd1);
            FullPocket(data);
        }
        public static void ForceMultipleCoil(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
                byte[] data = new byte[9];
                data[0] = len[2];
                data[1] = unit;
                data[2] = func[6];
                data[3] = startAddress[0];
                data[4] = startAddress[1];
                data[5] = 0;
                data[6] = 5;
                data[7] = 1;
                data[8] = 19;
            byte[] mess1 = Reg.func1.Concat(data).ToArray();
            string msd1 = BitConverter.ToString(mess1);
            Console.WriteLine("Запрос Force Multiple Coils: " + msd1);
            FullPocket(data);
        }
        public static void PresetMultipleReg(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
                byte[] data = new byte[12];
                data[0] = len[1];
                data[1] = unit;
                data[2] = func[7];
                data[3] = startAddress[0];
                data[4] = startAddress[1];
                data[5] = 0;            // количество регистров
                data[6] = 2;           // для чтения
                data[7] = 4;            // количество байт далее
                data[8] = 0;           // значение ст
                data[9] = 10;           // значение мл
                data[10] = 1;           // значение ст
                data[11] = 2;           // значение мл
            byte[] mess1 = Reg.func1.Concat(data).ToArray();
            string msd1 = BitConverter.ToString(mess1);
            Console.WriteLine("Запрос Preset Multiple Registers: " + msd1);
            FullPocket(data);
        }
    }
}

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using ModbusTest2;
 
namespace TCPModbus
{
 
    #region   
    class Header
    {
 
        ////Для заголовка: id-идентефикатор(в дальнейшем он конвертируется в байты(можно было и его через байты), IdProt-Идентификатор протокола, lenghtMod-длинна сообщения протокола модбас
        //static ushort id = 1;
        //static byte[] IdProt = { 0, 0 };
        //static byte lenghtMod = 0;
 
        ////Для формирования функции: len- длинна сообщения, func-функция
        //static byte[] len = { 6, 11, 8 };
        //static byte unit = 1;
        //static byte[] func = { 1, 2, 3, 4, 5, 6, 15, 16 };
 
        ////Для стартого адреса, везде стоит 0.1, в некоторых длинна сообщения, и кол во байт выставлены сразу как константы!(для примера)
        //static byte[] startAddress = { 0, 1 };
 
 
 
        public byte[] func1 = {0, 1, 0, 0, 0};
        public byte[] Header1(ushort id, byte[] IdProt, byte lenghtMod)
        {
            byte[] data = new byte[5];
            byte[] _id = BitConverter.GetBytes((short)id);
            data[0] = _id[1];
            data[1] = _id[0];
            data[2] = IdProt[0];
            data[3] = IdProt[1];
            data[4] = lenghtMod;
            return data;
        }
    }
 
    class Podkl
    {
        public const int port = 506;
        public const string server = "127.0.0.1";
    }
    #endregion
    public class Program
    {
 
        //Для заголовка: id-идентефикатор(в дальнейшем он конвертируется в байты(можно было и его через байты), IdProt-Идентификатор протокола, lenghtMod-длинна сообщения протокола модбас
        static ushort id = 1;
        static byte[] IdProt = { 0, 0 };
        static byte lenghtMod = 0;
 
        //Для формирования функции: len- длинна сообщения, func-функция
        static byte[] len = { 6, 11, 8 };
        static byte unit = 1;
        static byte[] func = { 1, 2, 3, 4, 5, 6, 15, 16 };
 
        //Для стартого адреса, везде стоит 0.1, в некоторых длинна сообщения, и кол во байт выставлены сразу как константы!(для примера)
        static byte[] startAddress = { 0, 1 };
 
 
 
        #region 
        //Можно было и так...
        //byte[] _id = BitConverter.GetBytes((short)id);
        //static byte[] PocketByte1 = { _id[1], _id[0], 0, 0, 0, 6, 1, 1, 0, 1, 3, 4 };
        //static byte[] PocketByte2 = { 0, 1, 0, 0, 0, 6, 1, 2, 0, 1, 0, 2 };
        //static byte[] PocketByte3 = { 0, 1, 0, 0, 0, 6, 1, 3, 0, 1, 0, 6 };
        //static byte[] PocketByte4 = { 0, 1, 0, 0, 0, 6, 1, 4, 0, 1, 0, 6 };
        //static byte[] PocketByte5 = { 0, 1, 0, 0, 0, 6, 1, 5, 0, 1, 0, 1 };
        //static byte[] PocketByte6 = { 0, 1, 0, 0, 0, 6, 1, 6, 0, 1, 1, 2 };
        //static byte[] PocketByte7 = { 0, 1, 0, 0, 0, 8, 1, 15, 0, 3, 0, 5, 1, 19 };
        //static byte[] PocketByte8 = { 0, 1, 0, 0, 0, 11, 1, 16, 0, 3, 0, 2, 4, 0, 10, 1, 2 };
        #endregion
 
//        public ModbusTest2.Master MB;
//        static ModbusTest2.Podkl P;
 
        public const int port = 507;
        public const string server = "127.0.0.1";
        static void Main(string[] args)
        {
            ModbusTest2.Master.Connect(server, port);
            Console.Write(" Выберите пункт меню: ");
            String strr = Console.ReadLine();
 
 
            switch (strr)
            {
                //
                case "1":
 
                    byte[] data1 = ModbusTest2.Master.ReadCoilStatus(len, unit, func, startAddress);
                    break;
                //
                case "2":
                    ModbusTest2.Master.ReadInputStatus(len, unit, func, startAddress);
                    break;
 
                case "3":
                    ModbusTest2.Master.ReadHoldingReg(len, unit, func, startAddress);
                    break;
 
                case "4":
                    ModbusTest2.Master.ReadInputReg(len, unit, func, startAddress);
                    break;
                //    //
                case "5":
                    ModbusTest2.Master.ForceSingleCoil(len, unit, func, startAddress);
                    break;
                //    //
                case "6":
                    ModbusTest2.Master.PresetSingleReg(len, unit, func, startAddress);
                    break;
                //    //
                case "7":
                    ModbusTest2.Master.ForceMultipleCoil(len, unit, func, startAddress);
                    break;
                //    //
                case "8":
                    ModbusTest2.Master.PresetMultipleReg(len, unit, func, startAddress);
                    break;
                    //}
            }
 
 
        }
    }
}
0
544 / 352 / 119
Регистрация: 17.08.2014
Сообщений: 1,335
29.10.2019, 08:26 11
Artur9961, Фуфуфу на это вам скажут.
давайте так:
разберемся с этим
C#
1
2
3
4
5
6
7
8
9
10
static byte[] Header(ushort id, byte[] IdProt, byte lenghtMod)
        {   byte[] data = new byte[5];
            byte[] _id = BitConverter.GetBytes((short)id);
            data[0] = _id[1];       
            data[1] = _id[0];
            data[2] = IdProt[0];
            data[3] = IdProt[1];
            data[4] = lenghtMod;
            return data;
        }
это структура размером в 5 байт.
описываем
C#
1
2
3
4
public class Header
{
 
}
далее разбираемся id и IdProt это 2-x байтные значения причем в первом случает понятно что это беззнаковое со вторым скорее всего так же
описываем дальше
C#
1
2
3
4
5
6
7
8
9
public class Header
{
//2байта
ushort _id;
/2байта
ushort _IdProt;
//1байт
byte _lenghtMod;
}
далее делаем конструктор
C#
1
2
3
4
5
6
7
8
9
10
public class Header
{
ushort _id;
ushort _IdProt;
byte _lenghtMod;
public Header(ushort id,ushort IdProt,byte lenghtMod)
{
_id=id; _IdProt = IdProt;_lenghtMod = lenghtMod;
}
}
Далее к нашей структуре прикручиваем метод возвращающий массив байт, для этого будем юзать маршалинг потому что так быстрее
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 public class Header
    {
        ushort _id;
        ushort _IdProt;
        byte _lenghtMod;
        public Header(ushort id, ushort IdProt, byte lenghtMod)
        {
            _id = id; _IdProt = IdProt; _lenghtMod = lenghtMod;
        }
        public byte[] GetBytes()
        {
            int size = Marshal.SizeOf(this);
            byte[] result = new byte[size];
            IntPtr pointer = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(this, pointer, false);
            Marshal.Copy(result, 0, pointer, size);
            Marshal.FreeHGlobal(pointer);
            return result;
        }
    }
далее используем как и ранее,
Можно вообще создать все остальные классы куда запилить хидер в виде поля. а метод GetBytes() сделать универсальным под нужную структуру. думаю по аналогии сообразите.

Добавлено через 5 минут

Не по теме:

Artur9961, я бы мог вам описать все что нужно но мне немного лень))

0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 20
29.10.2019, 08:49  [ТС] 12
Andreyip , Спасибо, еще не много вопросов стало)
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
 
public class Header
    {
        ushort _id;
        ushort _IdProt;
        byte _lenghtMod;
 
        byte[] len;
        byte unit;
        byte[] func;
 
        public Header(ushort id, ushort IdProt, byte lenghtMod)
        {
            _id = id; _IdProt = IdProt; _lenghtMod = lenghtMod;
        }
        public byte[] GetBytes()
        {
            int size = Marshal.SizeOf(this);
            byte[] result = new byte[size];
            IntPtr pointer = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(this, pointer, false);
            Marshal.Copy(result, 0, pointer, size);
            Marshal.FreeHGlobal(pointer);
            return result;
        }
        public ForceMultipleCoil(byte[] len, byte unit, byte[] func, byte[] startAddress)
        {
                _len = len[2];
                _unit = unit;
                _func = func[6];
                _startAdress = startAddress[];
//Понимаю что где-то пишу не правильно, с комбилятором разберусь
        public byte[] GetBytes()
        {
         .....
         }
 
        }
    }


Правильнее дальше так...структуры...или методы(не уверен как это называется) или создавать по аналогии отдельные классы? как правильнее?


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public class Master
    {
        private static TcpClient TCPMBus= new TcpClient();
        //private static byte[] TCPMBusBuffer = new byte[2048];
 
        #region
        public static void Connect(string server, int port)
        {
            //TcpClient TCPMBus = new TcpClient();
            TCPMBus.ReceiveBufferSize = 48;
            TCPMBus.Connect(server, port);
            NetworkStream tcpStream = TCPMBus.GetStream();
 
 
        }
самый главный вопрос к этому моменту, сейчас попробую написать как это должно примерно быть...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public class Master
    {
        public const int port = 507;
        public const string server = "127.0.0.1";
        
        public TCP (string server, int port)
        {
            //TcpClient TCPMBus = new TcpClient();
            TCPMBus.ReceiveBufferSize = 48;
            TCPMBus.Connect(server, port);
            NetworkStream tcpStream = TCPMBus.GetStream();
 
 
        }

В таком стиле? и нужно так понимаю продумать закрытие после отправки пакета...оту реально нелепо выглядит
0
544 / 352 / 119
Регистрация: 17.08.2014
Сообщений: 1,335
29.10.2019, 10:09 13
Artur9961, я немного косякнул, копирования надо делать так
C#
1
 Marshal.Copy(pointer, result, 0, size);
Добавлено через 59 секунд
Artur9961, немного подождите, сейчас сделаю примерную реализацию дальше вы сами справитесь.

Добавлено через 50 минут
Artur9961, пока сделал так, но так как много мне неизвестно много непонятно
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
 
namespace TCPModbus
{
    public  class TcpModbus
    {
       
        [StructLayout( LayoutKind.Sequential,Pack = 1)]
        public class Header
        {
 
            ushort _id=1;
            ushort _IdProt;
            byte _lenghtMod;
            public Header()
            {
 
            }
            public Header(ushort id, ushort IdProt, byte lenghtMod)
            {
                _id = id; _IdProt = IdProt; _lenghtMod = lenghtMod;
            }
        }
 
        [StructLayout(LayoutKind.Sequential,Pack = 1)]
        public class ReadCoilStatus
        {
           
            Header _head =new Header();
            public ReadCoilStatus()
            {
               
            }
            public ReadCoilStatus(Header head, byte unit)
            {
                _head = head;
                _unit = unit;
            }
            byte _size = 6;
            byte _unit=1;
            byte _func =1;
            ushort _startaddres = 256;
            ushort _reg = 512;
            
        }
       
 
        public static byte[] GetByte<T>(T basetcp) 
        {
            int size = Marshal.SizeOf(typeof(T));
            byte[] result = new byte[size];
            GCHandle gcs = GCHandle.Alloc(result,GCHandleType.Pinned);
            Marshal.StructureToPtr(basetcp, gcs.AddrOfPinnedObject(), true);
            gcs.Free();
            return result;
        } 
 
 
    }
}
По идее смотрите func можно описать Enum-om этим определяется какая функция вызывается
далее. Мне непонятно какие данные изменяемые а какие постоянные, вот допустим номер юнита, это постоянное значение или нет?
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 20
29.10.2019, 11:12  [ТС] 14
Andreyip , да постоянная =1(если про unit)
все они...статичные...константы...

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        
static ushort id = 1;
        static byte[] IdProt = { 0, 0 };
        static byte lenghtMod = 0;
 
        //Для формирования функции: len- длинна сообщения, func-функция
        static byte[] len = { 6, 11, 8 };
        static byte unit = 1;
        static byte[] func = { 1, 2, 3, 4, 5, 6, 15, 16 };
 
        //Для стартого адреса, везде стоит 0.1, в некоторых длинна сообщения, и кол во байт выставлены сразу как константы!(для примера)
        static byte[] startAddress = { 0, 1 };
        public const int port = 507;
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 20
31.10.2019, 09:21  [ТС] 15
Andreyip Как то так, правильно? классы дополнил нужными переменными(слегка не красиво, но пока так). Есть возможность tcpclient как нибудь тоже в класс превратить? или только так в метод. "Сборку сообщений" для отправки сам не понял как сделал, чисто на интуиции, GetByte<T>(T basetcp) что это за T? что это значит? и как сделать чтобы, к определенному сообщению(к примеру ReadCoilStatus , ForceMultipleCoil) можно было обращаться через switch или как то иначе?

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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Runtime.InteropServices;
//using ModbusTest2;
 
namespace TCPModbus
{
    public class TcpModbus
    {
 
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public class Header
        {
            byte _id1;
            byte _id = 1;
            byte _IdProt = 0;
            byte _lenghtMod = 0;
            byte _lenghtMod1;
            public Header()
            {
 
            }
            public Header(byte id, byte IdProt, byte lenghtMod)
            {
                _id1 = 0; _id = id; _IdProt = IdProt; _lenghtMod = lenghtMod; _lenghtMod1 = 0;
            }
        }
 
 
 
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public class ReadCoilStatus
        {
 
            Header _head = new Header();
            public ReadCoilStatus()
            {
 
            }
            public ReadCoilStatus(Header head, byte unit)
            {
                _head = head;
                _unit = unit;
            }
            byte _size = 6;
            byte _unit = 1;
            byte _func = 1;
            //ushort _startaddres = 256;
            //ushort _reg = 512;
            ushort _startaddres = 0;
            //ushort _reg = 512;
            byte _reg = 0;
            byte _reg1 = 5;
        }
 
 
 
 
        //
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public class ReadInputStatus
        {
 
            Header _head = new Header();
            public ReadInputStatus()
            {
 
            }
            public ReadInputStatus(Header head, byte unit)
            {
                _head = head;
                _unit = unit;
            }
            byte _size = 6;
            byte _unit = 1;
            byte _func = 2;
            //ushort _startaddres = 256;
            //ushort _reg = 512;
            ushort _startaddres = 0;
            //ushort _reg = 512;
            byte _reg = 0;
            byte _reg1 = 2;
        }
 
 
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public class ReadHoldingReg
        {
 
            Header _head = new Header();
            public ReadHoldingReg()
            {
 
            }
            public ReadHoldingReg(Header head, byte unit)
            {
                _head = head;
                _unit = unit;
            }
            byte _size = 6;
            byte _unit = 1;
            byte _func = 3;
            //ushort _startaddres = 256;
            //ushort _reg = 512;
            ushort _startaddres = 0;
            //ushort _reg = 512;
            byte _reg = 0;
            byte _reg1 = 61;
        }
 
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public class ReadInputReg
        {
 
            Header _head = new Header();
            public ReadInputReg()
            {
 
            }
            public ReadInputReg(Header head, byte unit)
            {
                _head = head;
                _unit = unit;
            }
            byte _size = 6;
            byte _unit = 1;
            byte _func = 4;
            //ushort _startaddres = 256;
            //ushort _reg = 512;
            ushort _startaddres = 0;
            //ushort _reg = 512;
            byte _reg = 0;
            byte _reg1 = 1;
        }
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public class ForceSingleCoil
        {
 
            Header _head = new Header();
            public ForceSingleCoil()
            {
 
            }
            public ForceSingleCoil(Header head, byte unit)
            {
                _head = head;
                _unit = unit;
            }
            byte _size = 6;
            byte _unit = 1;
            byte _func = 5;
            //ushort _startaddres = 256;
            //ushort _reg = 512;
            ushort _startaddres = 0;
            //ushort _reg = 512;
            byte _reg = 0;
            byte _reg1 = 1;
        }
 
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public class PresetSingleReg
        {
 
            Header _head = new Header();
            public PresetSingleReg()
            {
 
            }
            public PresetSingleReg(Header head, byte unit)
            {
                _head = head;
                _unit = unit;
            }
            byte _size = 6;
            byte _unit = 1;
            byte _func = 6;
            //ushort _startaddres = 256;
            //ushort _reg = 512;
            ushort _startaddres = 0;
            //ushort _reg = 512;
            byte _reg = 1;
            byte _reg1 = 2;
        }
 
 
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public class ForceMultipleCoil
        {
 
            Header _head = new Header();
            public ForceMultipleCoil()
            {
 
            }
            public ForceMultipleCoil(Header head, byte unit)
            {
                _head = head;
                _unit = unit;
            }
            byte _size = 6;
            byte _unit = 1;
            byte _func = 15;
            //ushort _startaddres = 256;
            //ushort _reg = 512;
            ushort _startaddres = 0;
            //ushort _reg = 512;
            byte _reg = 0;
            byte _reg1 = 5;
            byte _st = 1;
            byte _st1 = 19;
        }
 
 
 
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public class PresetMultipleReg
        {
 
            Header _head = new Header();
            public PresetMultipleReg()
            {
 
            }
            public PresetMultipleReg(Header head, byte unit)
            {
                _head = head;
                _unit = unit;
            }
            byte _size = 6;
            byte _unit = 1;
            byte _func = 16;
            //ushort _startaddres = 256;
            //ushort _reg = 512;
            ushort _startaddres = 0;
            //ushort _reg = 512;
            byte _reg = 0;
            byte _reg1 = 2;
            byte _dl = 4;
            byte _st = 0;
            byte _st1 = 10;
            byte st2 = 1;
            byte st3 = 2;
        }
        //
        public static byte[] GetByte<T>(T basetcp)
        {
            int size = Marshal.SizeOf(typeof(T));
            byte[] result = new byte[size];
            GCHandle gcs = GCHandle.Alloc(result, GCHandleType.Pinned);
            Marshal.StructureToPtr(basetcp, gcs.AddrOfPinnedObject(), true);
            gcs.Free();
            return result;
        }
 
        public static byte[] TcpClient(byte[] sendBytes)
        {
            //ReadCoilStatus p1 = new ReadCoilStatus();
            //byte[] dataa= ECHETESTMODBUS.TcpModbus.GetByte;
            TcpClient TCPMBus = new TcpClient();
            TCPMBus.ReceiveBufferSize = 48;
            TCPMBus.Connect("127.0.0.1", 507);
            NetworkStream tcpStream = TCPMBus.GetStream();
 
            //byte[] sendBytes = Encoding.UTF8.GetBytes("Простой тест");
            tcpStream.Write(sendBytes, 0, sendBytes.Length);
 
            byte[] bytes = new byte[TCPMBus.ReceiveBufferSize];
            int bytesRead = tcpStream.Read(bytes, 0, TCPMBus.ReceiveBufferSize);
            byte[] bytes1 = new byte[TCPMBus.ReceiveBufferSize];
            int bytesRead1 = tcpStream.Read(bytes1, 0, TCPMBus.ReceiveBufferSize);
            TCPMBus.Close();
            return bytes;
        }
    }
    //class Podkl
    //{
    //    public const int port = 506;
    //    public const string server = "127.0.0.1";
    //}
  
    public class Program
    {
 
        static byte unit = 1;
 
 
 
 
        public const int port = 507;
        public const string server = "127.0.0.1";
        static void Main(string[] args)
        {
            byte[] head = { 1, 1 };
            //TcpModbus.ReadCoilStatus p1 = new TcpModbus.ReadCoilStatus(/*head, unit*/);
            TcpModbus.Header p = new TcpModbus.Header();
            Console.Write(" Выберите пункт меню: ");
 
            String strr = Console.ReadLine();
 
            TcpModbus.ForceSingleCoil p1 = new TcpModbus.ForceSingleCoil(p, unit);
            byte[] p2 = TcpModbus.GetByte(p1);
            string p3 = BitConverter.ToString(p2);
            //ModbusTest2.Master.Connect(server, port);
            Console.Write(" Выберите пункт меню: "+p3);
            //Console.ReadLine();
 
 
            byte[] p4 = TcpModbus.TcpClient(p2);
            string p5 = BitConverter.ToString(p4);
            Console.Write(" RX: " + p5);
            byte[] values = new byte[2];
            //int str = Convert.ToInt32(strr);
            for (int j = 0; j < 8; j++)
            {
                values[1] = (byte)(p4[9 + (j * 2)]);
                values[0] = (byte)(p4[10 + (j * 2)]);
                //if (str == 3)
                    Console.WriteLine("распознанные данные, регистр " + (j + 1) + ": " + BitConverter.ToUInt16(values, 0));
            }
            Console.ReadLine();
            Console.ReadLine();
 
        }
 
 
    }
 
 }
0
31.10.2019, 09:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.10.2019, 09:21
Помогаю со студенческими работами здесь

МК vs WinCC через Modbus TCP
Добрый день. Начинаю осваивать siemens. Ранее выполняемые работы: программирование МК, ПЛИС,...

Qt Modbus ответ сервера по TCP
Приветствую! Есть готовая программа клиент для опроса инвертора по протоколу ModBus через RTU,...

MODBUS-TCP обмен данными
Моё простенькое чудо-приложение должно принимать/посылать данные от/на внешнее устройство. Внешнее...

Мигаем лампочками ModBus TCP
Посоветуйте надёжное бюджетное решение для помигать лампочками. Протокол ModBus TCP. Чем больше...


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

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