0 / 0 / 0
Регистрация: 21.12.2015
Сообщений: 2
1

Протокол обмена KS-NET газозаправочной колонки KwangShin

21.12.2015, 18:34. Показов 1281. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
shyub,
Добрый день. Подскажите пожалуйста не найдется ли у Вас информация по KwangShin-му протоколу? Сейчас столкнулись с перспективой подключения к данной колонке. Необходимо реализовать взаимодействие с системой управления, но самой электроники колонки пока нет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2015, 18:34
Ответы с готовыми решениями:

Полный перечень ошибок газонаполнительной колонки KwangShin
Здравствуйте. Ищу полный перечень ошибок газонаполнительной колонки KwangShin. Поделитесь...

Протокол обмена данными
Помогите пожалуйста, в написании протокола обмена данными составленном на С#

Протокол обмена GasKitLink
Помогите найти GasKitLink Communication Protocol Specification – Revision 1.2, который используется...

Определить протокол обмена
Есть устройство, которое общается с компьютером (используя RS-485 и фирменную программу) через...

Протокол обмена с COM устройством
Уважаемые умные люди нужна ваша помощь) Есть COM устройство и устаревшая утилита которая с этим...

9
Почетный модератор
Эксперт по компьютерным сетямЭксперт Windows
28046 / 15779 / 983
Регистрация: 15.09.2009
Сообщений: 67,752
Записей в блоге: 78
21.12.2015, 18:57 2
ну как то так. если не ошибаюсь.
Вложения
Тип файла: rar CNG Dispenser Full Manual.rar (9.64 Мб, 171 просмотров)
3
0 / 0 / 0
Регистрация: 21.12.2015
Сообщений: 2
21.12.2015, 19:00  [ТС] 3
Спасибо огромное, это настоящее спасение)
Позвольте еще полюбопытствовать не сталкивались ли Вы с колонками Hyosung (CNG)?
0
Почетный модератор
Эксперт по компьютерным сетямЭксперт Windows
28046 / 15779 / 983
Регистрация: 15.09.2009
Сообщений: 67,752
Записей в блоге: 78
21.12.2015, 21:10 4
не сталкивался. с ТРК я прекратил работать лет 8 назад.
0
392 / 191 / 48
Регистрация: 11.07.2013
Сообщений: 1,178
22.12.2015, 10:07 5
Спасибо magirus за описание, однако в прилагаемом там описании кориолисового расходомера в разделе 5.3.5 MODBUS register addresses есть то ли умышленно, то ли случайно опущенный один важный момент, на котором я "прокололся", связанный с адресацие регистров по Modbus-у MODBUS register address model, который есть в описании Endress+Hauser BA123DEN_0410.pdf на стр. 23 (BA123DEN_0410.pdf). Суть в том, что при чтении содержимого регистра его номер необходимо увеличивать на 30000.
2
392 / 191 / 48
Регистрация: 11.07.2013
Сообщений: 1,178
22.12.2015, 10:35 6
ia87
По вашему интересу я понял, что примерно предстоит вам делать.
Цитата Сообщение от ia87 Посмотреть сообщение
но самой электроники колонки пока нет
Для отладки ПО я написал небольшую утилиту и использовал виртуальный COM-порт. Думаю, вам это тоже поможет: Имитатор_KwangShin.rar

Второе. Пока вы с этим, скорее всего, не сталкнулись. В процессе эксплуатации АГНКС очень "мудрые" опереторы научились подбирать пароль от колонки и изменять её настройки. При этом колонка показывает значительно меньше, чем реально заправлено, а разницу - себе "в карман". (Собственно и подбирать пароль не надо, т.к. KwangShin имеет универсальный пароль, который подходит ко всей серии региональной поставки колонок.) Так вот, через какое-то время вам придётся дорабатывать свою программу, чтобы она сверяла результат заправки с данными расходомера (8FF), собственно пэтому я сделал уточнение в предыдущем сообщении.
3
magirus
22.12.2015, 17:36
  #7

Не по теме:

ну описание расходомера я не смотрел, я даже не уверен что протокол самой ТРК там верно описан, я всего лишь убедился в его наличии в документе.

0
0 / 0 / 0
Регистрация: 06.02.2022
Сообщений: 2
21.02.2022, 11:35 8
shyub

Добавлено через 6 минут
Здравствуйте у мне нужен помощь с протоколом KS-NET. Я делаю простую программу на C# для управления с KwangShin-ской газовой колонки. Использую Имитатор_KwangShin.rar для проверки.

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace ks_net
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            serialPort1.PortName = "COM1";
            serialPort1.BaudRate = 9600;
            serialPort1.Parity = Parity.None;
            serialPort1.DataBits = 8;
            serialPort1.StopBits = StopBits.One;
            serialPort1.Handshake = Handshake.None;
            serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
 
            serialPort1.Open();
            //serialPort1.Close();
        }
 
        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            Invoke((MethodInvoker)delegate {
                richTextBox1.Text = serialPort1.ReadExisting();
            });
        }
 
        #region CMD
        private byte[] FillingStartCmd()
        {
            byte[] bytes = new byte[8];
            bytes[0] = Convert.ToByte(1);                                                           // SOH
            bytes[1] = Convert.ToByte(48);                                                          // 0
            bytes[2] = Convert.ToByte(49);                                                          // 1
            bytes[3] = Convert.ToByte(2);                                                           // STX
            bytes[4] = Convert.ToByte(83);                                                          // S
            bytes[5] = Convert.ToByte(83);                                                          // S
            bytes[6] = Convert.ToByte(3);                                                           // ETX
            bytes[7] = (byte)(bytes[1] ^ bytes[2] ^ bytes[3] ^ bytes[4] ^ bytes[5] ^ bytes[6]);     // LRC
            return bytes;
        }
 
        private byte[] FillingStopCmd()
        {
            byte[] bytes = new byte[8];
            bytes[0] = Convert.ToByte(1);                                                           // SOH
            bytes[1] = Convert.ToByte(48);                                                          // 0
            bytes[2] = Convert.ToByte(49);                                                          // 1
            bytes[3] = Convert.ToByte(2);                                                           // STX
            bytes[4] = Convert.ToByte(83);                                                          // S
            bytes[5] = Convert.ToByte(69);                                                          // E
            bytes[6] = Convert.ToByte(3);                                                           // ETX
            bytes[7] = (byte)(bytes[1] ^ bytes[2] ^ bytes[3] ^ bytes[4] ^ bytes[5] ^ bytes[6]);     // LRC
            return bytes;
        }
 
        private byte[] EnquiryCmd()
        {
            byte[] bytes = new byte[3];
            bytes[0] = Convert.ToByte(5);                                                           // SOH
            bytes[1] = Convert.ToByte(48);                                                          // 0
            bytes[2] = Convert.ToByte(49);                                                          // 1
            return bytes;
        }
 
        private byte[] AcknowledgeCmd()
        {
            byte[] bytes = new byte[1];
            bytes[0] = Convert.ToByte(6);                                                           // ACK
            return bytes;
        }
 
        private byte[] FillingApprovalCmd()
        {
            byte[] bytes = new byte[8];
            bytes[0] = Convert.ToByte(1);                                                           // SOH
            bytes[1] = Convert.ToByte(48);                                                          // 0
            bytes[2] = Convert.ToByte(49);                                                          // 1
            bytes[3] = Convert.ToByte(2);                                                           // STX
            bytes[4] = Convert.ToByte(65);                                                          // A
            bytes[5] = Convert.ToByte(80);                                                          // P
            bytes[6] = Convert.ToByte(3);                                                           // ETX
            bytes[7] = (byte)(bytes[1] ^ bytes[2] ^ bytes[3] ^ bytes[4] ^ bytes[5] ^ bytes[6]);     // LRC
            return bytes;
        }
 
        private byte[] TotalCountCmd()
        {
            byte[] bytes = new byte[8];
            bytes[0] = Convert.ToByte(1);                                                           // SOH
            bytes[1] = Convert.ToByte(48);                                                          // 0
            bytes[2] = Convert.ToByte(49);                                                          // 1
            bytes[3] = Convert.ToByte(2);                                                           // STX
            bytes[4] = Convert.ToByte(67);                                                          // C
            bytes[5] = Convert.ToByte(81);                                                          // Q
            bytes[6] = Convert.ToByte(3);                                                           // ETX
            bytes[7] = (byte)(bytes[1] ^ bytes[2] ^ bytes[3] ^ bytes[4] ^ bytes[5] ^ bytes[6]);     // LRC
            return bytes;
        }
 
        private byte[] PumpInitializeCmd()
        {
            byte[] bytes = new byte[8];
            bytes[0] = Convert.ToByte(1);                                                           // SOH
            bytes[1] = Convert.ToByte(48);                                                          // 0
            bytes[2] = Convert.ToByte(49);                                                          // 1
            bytes[3] = Convert.ToByte(2);                                                           // STX
            bytes[4] = Convert.ToByte(73);                                                          // I
            bytes[5] = Convert.ToByte(78);                                                          // N
            bytes[6] = Convert.ToByte(3);                                                           // ETX
            bytes[7] = (byte)(bytes[1] ^ bytes[2] ^ bytes[3] ^ bytes[4] ^ bytes[5] ^ bytes[6]);     // LRC
            return bytes;
        }
 
        private byte[] UnitPriceChangeCmd()
        {
            byte[] bytes = new byte[14];
            bytes[0] = Convert.ToByte(1);                                                           // SOH
            bytes[1] = Convert.ToByte(48);                                                          // 0
            bytes[2] = Convert.ToByte(49);                                                          // 1
            bytes[3] = Convert.ToByte(2);                                                           // STX
            bytes[4] = Convert.ToByte(80);                                                          // P
            bytes[5] = Convert.ToByte(67);                                                          // C
            bytes[6] = Convert.ToByte(48);                                                          // 0
            bytes[7] = Convert.ToByte(48);                                                          // 0
            bytes[8] = Convert.ToByte(49);                                                          // 1
            bytes[9] = Convert.ToByte(50);                                                          // 2
            bytes[10] = Convert.ToByte(51);                                                         // 3
            bytes[11] = Convert.ToByte(52);                                                         // 4
            bytes[12] = Convert.ToByte(3);                                                          // ETX
            bytes[13] = (byte)(bytes[1] ^ bytes[2] ^ bytes[3] ^ bytes[4] ^ bytes[5] ^ bytes[6] ^ bytes[7] ^ bytes[8] ^ bytes[9] ^ bytes[10] ^ bytes[11] ^ bytes[12]);     // LRC
            return bytes;
        }
 
        private byte[] TransactionCmd()
        {
            byte[] bytes = new byte[8];
            bytes[0] = Convert.ToByte(1);                                                           // SOH
            bytes[1] = Convert.ToByte(48);                                                          // 0
            bytes[2] = Convert.ToByte(49);                                                          // 1
            bytes[3] = Convert.ToByte(2);                                                           // STX
            bytes[4] = Convert.ToByte(84);                                                          // T
            bytes[5] = Convert.ToByte(81);                                                          // Q
            bytes[6] = Convert.ToByte(3);                                                           // ETX
            bytes[7] = (byte)(bytes[1] ^ bytes[2] ^ bytes[3] ^ bytes[4] ^ bytes[5] ^ bytes[6]);     // LRC
            return bytes;
        }
 
        private byte[] PresetCancelCmd()
        {
            byte[] bytes = new byte[8];
            bytes[0] = Convert.ToByte(1);                                                           // SOH
            bytes[1] = Convert.ToByte(48);                                                          // 0
            bytes[2] = Convert.ToByte(49);                                                          // 1
            bytes[3] = Convert.ToByte(2);                                                           // STX
            bytes[4] = Convert.ToByte(83);                                                          // S
            bytes[5] = Convert.ToByte(67);                                                          // C
            bytes[6] = Convert.ToByte(3);                                                           // ETX
            bytes[7] = (byte)(bytes[1] ^ bytes[2] ^ bytes[3] ^ bytes[4] ^ bytes[5] ^ bytes[6]);     // LRC
            return bytes;
        }
 
        private byte[] PresetCmd()
        {
            byte[] bytes = new byte[16];
            bytes[0] = Convert.ToByte(1);                                                           // SOH
            bytes[1] = Convert.ToByte(48);                                                          // 0
            bytes[2] = Convert.ToByte(49);                                                          // 1
            bytes[3] = Convert.ToByte(2);                                                           // STX
            bytes[4] = Convert.ToByte(83);                                                          // S
            bytes[5] = Convert.ToByte(84);                                                          // T
            bytes[6] = Convert.ToByte(70);                                                          // F - Full
            bytes[7] = Convert.ToByte(48);                                                          // 0
            bytes[8] = Convert.ToByte(48);                                                          // 0
            bytes[9] = Convert.ToByte(48);                                                          // 0
            bytes[10] = Convert.ToByte(48);                                                         // 0
            bytes[11] = Convert.ToByte(48);                                                         // 0
            bytes[12] = Convert.ToByte(48);                                                         // 0
            bytes[13] = Convert.ToByte(48);                                                         // 0
            bytes[14] = Convert.ToByte(3);                                                          // ETX
            bytes[15] = (byte)(bytes[1] ^ bytes[2] ^ bytes[3] ^ bytes[4] ^ bytes[5] ^ bytes[6] ^ bytes[7] ^ bytes[8] ^ bytes[9] ^ bytes[10] ^ bytes[11] ^ bytes[12] ^ bytes[13] ^ bytes[14]);     // LRC
            return bytes;
        }
        #endregion
 
        #region callback
        private void BtnFillingStart_Click(object sender, EventArgs e)
        {
            byte[] bytes = FillingStartCmd();
            if (serialPort1.IsOpen) serialPort1.Write(bytes, 0, bytes.Length);
        }
 
        private void BtnFillingStop_Click(object sender, EventArgs e)
        {
            byte[] bytes = FillingStopCmd();
            if (serialPort1.IsOpen) serialPort1.Write(bytes, 0, bytes.Length);
        }
 
        private void BtnEnquiry_Click(object sender, EventArgs e)
        {
            byte[] bytes = EnquiryCmd();
            if (serialPort1.IsOpen) serialPort1.Write(bytes, 0, bytes.Length);
        }
 
        private void BtnAcknowledge_Click(object sender, EventArgs e)
        {
            byte[] bytes = AcknowledgeCmd();
            if (serialPort1.IsOpen) serialPort1.Write(bytes, 0, bytes.Length);
        } 
 
        private void BtnFillingApproval_Click(object sender, EventArgs e)
        {
            byte[] bytes = FillingApprovalCmd();
            if (serialPort1.IsOpen) serialPort1.Write(bytes, 0, bytes.Length);
        }
 
        private void BtnTotalCount_Click(object sender, EventArgs e)
        {
            byte[] bytes = TotalCountCmd();
            if (serialPort1.IsOpen) serialPort1.Write(bytes, 0, bytes.Length);
        }
 
        private void BtnPumpInitialize_Click(object sender, EventArgs e)
        {
            byte[] bytes = PumpInitializeCmd();
            if (serialPort1.IsOpen) serialPort1.Write(bytes, 0, bytes.Length);
        }
 
        private void BtnUnitPriceChange_Click(object sender, EventArgs e)
        {
            byte[] bytes = UnitPriceChangeCmd();
            if (serialPort1.IsOpen) serialPort1.Write(bytes, 0, bytes.Length);
        }
 
        private void BtnTransaction_Click(object sender, EventArgs e)
        {
            byte[] bytes = TransactionCmd();
            if (serialPort1.IsOpen) serialPort1.Write(bytes, 0, bytes.Length);
        }
 
        private void BtnPresetCancel_Click(object sender, EventArgs e)
        {
            byte[] bytes = PresetCancelCmd();
            if (serialPort1.IsOpen) serialPort1.Write(bytes, 0, bytes.Length);
        }
 
        private void BtnPreset_Click(object sender, EventArgs e)
        {
            byte[] bytes = PresetCmd();
            if (serialPort1.IsOpen) serialPort1.Write(bytes, 0, bytes.Length);
        }
        #endregion
    }
}
Вот и основной код из программы, я не знаю может я что то делаю не так некоторые команды не правильна работают.
0
392 / 191 / 48
Регистрация: 11.07.2013
Сообщений: 1,178
24.09.2023, 07:31 9
В CNG CPU VER 2.16 появились два нововведения:
1. При начале обмена или после кратковременного перерыва связи (несколько секунд) на запрос ENQ колонка посылаете пароль, например:
01 30 31 02 50 31 32 38 32 39 03 60 (P12829), пульт должен подтвердить: 01 30 31 02 50 31 30 36 39 36 03 68 (P10696).
Если 4 раза подтверждение будет содержать ошибку, то колонка блокируется и до перезагрузки на запросы пульта не отвечает.
2. Результат хода выполнения заправки вместо 26 байт содержит теперь 30 байт (после информации о давлении идут ещё 4 байта 20 20 39 35, вероятно, связанные с номером кредитной карты).
Таким образом старое ПО и старые пульты управления новые колонки не поддерживают.
1
0 / 0 / 0
Регистрация: 06.02.2022
Сообщений: 2
15.09.2024, 12:33 10
2829 это пароль колонки? Тогда почему при подтверждении возвращается 0696?
0
15.09.2024, 12:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2024, 12:33
Помогаю со студенческими работами здесь

Протокол обмена устройства (весы)
народ не подскажете как по протоколу обмена устройства (весы) написать драйвер или как с этим...

Протокол для файлого обмена
Доброго времени суток, возможно промахнулся веткой форума, простите. Возник вопрос, имеется...

Протокол обмена между 2 микроконтроллерами
Привет все. Попробую кратко обрисовать проблему. Есть девайс, у девайса 2 микроконтроллера...

RFID RC522 протокол обмена
Переделал модуль как в этой статье. Хочу подключить модуль к PIC через UART. Пытался нагуглить, но...

протокол обмена устройства (весы)
народ не подскажете как по протоколу обмена устройства (весы) написать драйвер или как с этим...

Протокол обмена с сайтом CommerceML
Здравствуйте. Делаем интернет магазин на python/django и есть задача сделать выгрузку и обмен...


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

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

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