Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2011.12.18;
Скачать: [xml.tar.bz2];

Вниз

МЭК 80670-5-104   Найти похожие ветки 

 
Sonoleo ©   (2009-07-29 10:28) [0]

Уважаемые дельфисты! Отзовитесь, кто реализовывал клиента по ТСР/IP с сервером по протоколу МЭК104? Могу приложить кусочки текста клиента. У меня коннект с тестовым сервером появляется, но на любой мой запрос типа:
Type U[FCT=TESTFR_ACT], (68 04 43 00 00 00); Type U[FCT=STARTDT_ACT], (68 04 07 00 00 00) - выдаёт
28.07.2009 16:50:18   ====== Запуск ======
28.07.2009 16:50:26   IEC: Connection request from address 127.0.0.1, port 8710
28.07.2009 16:50:26   IEC: wrong format request. Можете подсказать в чём причина?


 
Palladin ©   (2009-07-29 10:53) [1]

причина в wrong format request


 
Sonoleo ©   (2009-07-29 11:22) [2]

перевод понятен, а причина?
Форматы я привёл - (68 04 43 00 00 00). Это 16-ный формат тестового запроса по APCI. Стартовый 68H, длина APDU - 04. управляющая функция TESTFR_ACT - 43H (расшифровка: 01 00 00 11). Пользовался тестовым клиентом и он показывал точно такой же формат запроса. Пробовал передавать поток строкой и массивом байт - не помогает.


 
Palladin ©   (2009-07-29 11:38) [3]


> а причина?

это и есть причина


> Форматы я привёл

и что с того? ты же не привел ни код посыла, ничего не привел... я тоже могу спросить в чем причина: я отсылаю на http сервер запрос по формату "GET /"  а мне ошибку пишет? что ты мне на это ответишь? или ты считаешь что если привел стандарт формата значит и код уже не нужен?

вот странные люди...


 
Sonoleo ©   (2009-07-29 12:07) [4]

мож я и странный (тупой), даю текст:
//====================================
procedure Mess(var S : string; b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16 : char);
begin
// $TX Type U[FCT=TESTFR_ACT] ============ управление без нумерации
// 68 04 43 00 00 00
// $TX Type U[FCT=TESTFR_CON] ============ управление без нумерации
// 68 04 83 00 00 00
// $TX Type U[FCT=STARTDT_ACT] =========== управление без нумерации
// 68 04 07 00 00 00
// #RX Type U[FCT=STARTDT_CON] =========== управление без нумерации
// 68 04 0B 00 00 00
// $TX Type I[LEN= 10, ACK=0, SEQ=0] ===== передача информации с нумерацией
// 68 0E 00 00 00 00 64 01 06 01 01 00 00 00 00 14
// $RX Type I[LEN= 10, ACK=1, SEQ=0] ===== передача информации с нумерацией
// 68 82 02 00 02 00 24 08 14 00 01 00 01 00 00 33
 S := "";
 S := S+Char(b1);  // СТАРТ 68H определяет точку начала внутри потока данных
 S := S+Char(b2);
 S := S+Char(b3);   S := S+Char(b4); // по умолчанию Type U[FCT=STOPDT_ACT]
 S := S+Char(b5);   S := S+Char(b6);   S := S+Char(b7);  S := S+Char(b8);
 S := S+Char(b9);   S := S+Char(b10);  S := S+Char(b11); S := S+Char(b12);
 S := S+Char(b13);  S := S+Char(b14);  S := S+Char(b15); S := S+Char(b16);
end;
//=============================================
procedure TForm2.Button1Click(Sender: TObject);
var
 SResponse: string;
 Buff : array[1..255] of byte;
begin
 TCPClient.Port := 2404;
 with TCPClient do
 begin
   Connect;
   while Connected do
   begin
     try
       Mess(SResponse,char($68),char($04),char($43),char($0),char($0),char($0),char($0) ,char($0),
                      char($0),char($0),char($0),char($0),char($0),char($0),char($0),char($0));
       WriteLn(SResponse);       // № 1 - посылка Type U[FCT=TESTFR_ACT]
     finally
       Disconnect;
       BStream.Free;
     end;
   end;
 end;
end;
Тестируюсь с программой "Пример КП МЭК104", открытая  в ООО "ЕНТЭЛС", 2008 www.entels.ru. Они выставили исходники оболочки на Билдере, главное скрыто в DLL"ках. На мои вопросы пока не отвечают.


 
Dennis I. Komarov ©   (2009-07-29 12:31) [5]

Еще один любитель стрингов...

Бери сниф и смотри все что прога-пример отправляет


 
Palladin ©   (2009-07-29 12:33) [6]

а не нужно делать WriteLn, у тебя в строке встречается символ #0, что означает конец строки... делай SendBuff или как его там... просто send, не помню точного названия


 
Sonoleo ©   (2009-07-29 12:52) [7]

Вы думаете, что я впервые на велосипед сел? Были варианты ...
//====================================
procedure Bytes(var B : array of byte; b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16 : byte);
begin
// $TX Type U[FCT=TESTFR_ACT] ============ управление без нумерации
// 68 04 43 00 00 00
// $TX Type U[FCT=TESTFR_CON] ============ управление без нумерации
// 68 04 83 00 00 00
// $TX Type U[FCT=STARTDT_ACT] =========== управление без нумерации
// 68 04 07 00 00 00
// #RX Type U[FCT=STARTDT_CON] =========== управление без нумерации
// 68 04 0B 00 00 00
 B[0] := b1;  // СТАРТ 68H определяет точку начала внутри потока данных
 B[1] := b2;
 B[2] := b3;   B[3] := b4; // по умолчанию Type U[FCT=STOPDT_ACT]
 B[4] := b5;   B[5] := b6;    B[6]  := b7;  B[7] := b8;
 B[8] := b9;   B[9] := b10;   B[10] := b11; B[11] := b12;
 B[12] := b13; B[13] := b14;  B[14] := b15; B[15] := b16;
end;
//=============================================
var
 Buff : array[1..255] of byte;//integer;
...
       Bytes(Buff,$68,$04,$43,$0, $0, $0, $0, $0, $0, $0, $0, $0, $0, $0, $0,$0);
       WriteBuffer(Buff,4,false);       // № 1 - посылка Type U[FCT=TESTFR_ACT]

В дельфийской строке в первом байте длина строки, WriteBuffer это от Indy. Результат прежний. В WriteBuffer был и false и true. Не помогло.
Dennis - а сниф - это что по русски?


 
Palladin ©   (2009-07-29 12:58) [8]

WriteBuffer(Buff,4,false)

почему 4 байта?


 
Dennis I. Komarov ©   (2009-07-29 13:01) [9]


> Dennis - а сниф - это что по русски?

Прога, которая покажет все что происходит внутри TCP при связи проги-примера с сервером.
http://ru.wikipedia.org/wiki/Sniffer

З.Ы.
 А на кой тут индеец, если есть стандартный TTCPClient?


 
Sonoleo ©   (2009-07-29 13:51) [10]

Type U[FCT=TESTFR_ACT], (68 04 43 00 00 00); - это процедура испытания (тестирования). Открытые соединения могут периодически проверяться путем посылки тестового APDU (TESTFR=act), который подтверждается приемной станцией с помощью (TESTFR=con). Это кадр типа U в формате:
--------------------------
СТАРТ 68H - 1 байт = 68
Длина APDU (максимум 253) - 2-ой байт = 04
Поле управления байт 1 = 43
Поле управления байт 2 = 00
Поле управления байт 3 = 00
Поле управления байт 4 = 00
--------------------------
мой тестовый (как и стартовый) кадр не распознается сервером в таком формате.
Есть клиент немецкий тестовик DemoWinPP104, еще CybServer870-5-104M, который работает и выдает подробный протокол, начиная с команды на сервер STARTDT_ACT и STARTDT_CON. А у меня ошибка в формате.

P.S. Некоторые программисты считают, что такой протокол - "высший пилотаж"


 
Sonoleo ©   (2009-07-29 13:54) [11]

Вот пример протокола:
29.07.2009 13:45:25:578 Пример ПК МЭК 104 Open Link (ISP870_OK)
29.07.2009 13:45:25:671 Пример ПК МЭК 104 $TX:  68 04 07 00 00 00
29.07.2009 13:45:25:671 Пример ПК МЭК 104 $TX: Type U [FCT=STARTDT_ACT]
29.07.2009 13:45:25:781 Пример ПК МЭК 104 #RX:  68 04 0B 00 00 00
29.07.2009 13:45:25:781 Пример ПК МЭК 104 #RX: Type U [FCT=STARTDT_CON]
29.07.2009 13:45:25:781 Пример ПК МЭК 104 Init Link (ISP870_OK)
29.07.2009 13:45:25:828 Пример ПК МЭК 104 $TX:  68 0E 00 00 00 00 64 01 06 01 01 00 00 00 00 14
29.07.2009 13:45:25:828 Пример ПК МЭК 104 $TX: Type I [LEN= 10, ACK=0, SEQ=0]
29.07.2009 13:45:25:828 Пример ПК МЭК 104 #RX:  68 0E 00 00 02 00 64 01 07 01 01 00 00 00 00 14
29.07.2009 13:45:25:828 Пример ПК МЭК 104 #RX: Type I [LEN= 10, ACK=1, SEQ=0]


 
Dennis I. Komarov ©   (2009-07-29 14:16) [12]

Серверу до лайпочки от кого он получил данные...


 
Palladin ©   (2009-07-29 14:35) [13]


> В дельфийской строке в первом байте длина строки

неправда

ты не ответил на вопрос в [8]


 
Sonoleo ©   (2009-07-29 15:52) [14]

Прошу прощения, во втором байте стоит 04, а это Длина APDU (максимум 253) - 2-ой байт = 04. Всего должно быть 10 байт, а не 04. В моем примере [7] закладывается 16 байт. Я ещё разок проверил WriteBuffer(Buff,10,false);- бестолку. По сути сервер должен анализировать только первых 3 байта согласно протоколу. В третьем байте (управляющее поле) задана функция TESTFR_ACT:
      8       7   |    6       5   |    4       3    |    2   |    1   |
      TESTFR        STOPDT       STARTDT   |         |        |
    con  |  act |  con | act  |  con  | act   |    1   |    1   | Байт 1
                                       0                                     | Байт 2
                                       0                           |    0   | Байт 3
                                       0                                     | Байт 4

     0        1        0       0        0       0          1         1   = $43
а насчет "неправда", когда-то очень-но давно ковырялся в строке паскаля и в си. В нулевой строке паскаля сидит длина строки, а у си конец строки в конце и равен #0. В частности между ними (си и паскаль) и в этом есть.


 
Palladin ©   (2009-07-29 15:59) [15]


> а насчет "неправда", когда-то очень-но давно ковырялся в
> строке паскаля и в си. В нулевой строке паскаля сидит длина
> строки, а у си конец строки в конце и равен #0. В частности
> между ними (си и паскаль) и в этом есть.

Ковырятся не надо, надо справку читать. В Делфи есть Паскалевские строки (ShortString, макс 255 символов), они содержат длинну в нулевом байте, но есть и длинные строки (String, 2гб в теории) у них более хитрая система, и уж тем более они содержат длинну строки совсем не там.


 
Sonoleo ©   (2009-07-29 16:17) [16]

это не очень интересно. А как всё-таки насчет:
28.07.2009 16:50:18   ====== Запуск ======
28.07.2009 16:50:26   IEC: Connection request from address 127.0.0.1, port 8710
28.07.2009 16:50:26   IEC: wrong format request. Можете подсказать в чём причина?


 
Dennis I. Komarov ©   (2009-07-29 16:21) [17]


> Sonoleo ©   (29.07.09 16:17) [16]

Так и будешь в партизанов играть?


> Можете подсказать в чём причина?

Русским по белому wrong format request


 
Palladin ©   (2009-07-29 16:29) [18]


> [16] Sonoleo ©   (29.07.09 16:17)

поставь winsniff и посмотри что же на самом деле бегает между клиентом и сервером


 
Sonoleo ©   (2009-07-29 16:31) [19]

Судя по всему идей ни у кого нет. Извините!


 
Сергей М. ©   (2009-07-29 16:49) [20]


> WriteBuffer это от Indy


Заметался, горемычный ..
То TTCPClient, то Indy ..

const
 Test: array[0..5] of byte = ($68, $04, $43, $00, $00, $00);

TCPClient.BlockMode := bmBlocking;
..
TCPClient.SendBuf(Test, SizeOf(Test))


 
Dennis I. Komarov ©   (2009-07-29 16:55) [21]


> TCPClient.BlockMode := bmBlocking;

он вроде и так по дефолту


 
Сергей М. ©   (2009-07-29 17:04) [22]


> он вроде и так по дефолту


Может и по дефолту, не помню..
Тем проще)


 
Дмитрий Белькевич   (2009-07-30 22:40) [23]

Стоит всегда исходить из очень простого принципа. Байты везде одинаковы (с). Ставь сниффер и побайтно смотри, что не так. Это помогает в 100% случаев. Как в работе с сетью так и при работе с файлами.



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2011.12.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.004 c
2-1315226772
rammic
2011-09-05 16:46
2011.12.18
Получение данных из 3ds Max


15-1314168862
OW
2011-08-24 10:54
2011.12.18
Два простых вопроса по Oracle и PL/SQL Developer


2-1315514369
Германн
2011-09-09 00:39
2011.12.18
Компонент для вывода текста.


2-1315421110
Эцилоп
2011-09-07 22:45
2011.12.18
Эмуляция работы мышки


6-1248848880
Sonoleo
2009-07-29 10:28
2011.12.18
МЭК 80670-5-104





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский