PDA

Просмотр полной версии : Нестандартный протокол



Klik
18.01.2008, 13:30
Необходимо послать запрос термостату фирмы Huber с блоком управления СС3.
Протокол нестандартный, запрос в виде SP?<CR><LF>.
Каким образом отсылать спецсимволы <CR><LF> (#13#10).

SergeyNG
19.01.2008, 10:30
Из книжки:

При необходимости помещения в строку кода, не имеющего печатного изображения, используется знак ($) и следующий за ним код из двух цифр в шестнадцатиричной системе исчисления.

K.I.V.
30.01.2008, 09:57
Из книжки:

п.п. может вы вычитали как принимать блок байт hex данных и переводить в обычную цифру :confused:

Филоненко Владислав
30.01.2008, 10:14
Расшифруйте, что же вы хотели сказать, K.I.V? Надо осуществить преобразование степени счисления 16->10? Или что-то ещё?

SergeyNG
30.01.2008, 12:40
Тоже не понял, что и во что вы хотите перевести? Поподробнее

K.I.V.
01.02.2008, 01:45
да я хотел ... хочу ( просто отвлекли более важные дела ), может в понедельник продолжу и зря вас отвлекаю, но от помощи не откажусь ...

делаю протокол обмена по 485 :
- посылаю в hex запрос прибору
- прибор сразу отвечает n кол-вом байт в hex формате ( девять байт, из них 8-мь цифр с индикатора и один байт наверно положение точки ( постараюсь обойтись без точки, но может понадобиться)).
- на данной стадии принимаю в буфет какой-то бред
- но после решения (надеюсь) этой проблемы, надо как-то из это буфера с значениями полулить нормальное число в формате dec :confused:
пока своих мыслей нет, но если только взять пример с модемом, перевести в железо и гонять ...

зы понимаю, что не для этой темы, но суть описал ...
Если кто-нибудь поделился бы готовым понятным кодом (я делаю на ST), то жить станет легче.
зарание спасибо.

SergeyNG
01.02.2008, 05:13
А описание протокола есть, можно посмотреть?
Или привидите пример запроса и ответа с прибора.

K.I.V.
01.02.2008, 10:34
с протоколом конечно загнул, опрос ...


запрос : 10h
ответ: 3dh 20h 20h 20h 20h 32h 37h 20h 25h
(h - hex)

по идеи, аналог терминалки на пк...

Малышев Олег
01.02.2008, 11:35
Примерно так
var
bufer_ptr:POINTER TO BYTE;
value:DWORD;
power10:DWORD:=1;
values_arr:ARRAY [1..10] of DWORD;
arr_index:BYTE:=1;
end_var
bufer_ptr:=str_incom;
for iter:=0 to len(str_incom) do
if bufer_ptr^>16#30 and bufer_ptr^<16#39 then
value:=value+(bufer_ptr^-16#30)*power10;
power10:=power10*10;
else
values_arr[arr_index]:=value;
arr_index:=arr_index+1;
value:=0;
power10:=1;
end_if
bufer_ptr:=bufer_ptr+1;
end_for

K.I.V.
26.02.2008, 13:44
Примерно так

странно ... а полный текст можно?
здесь, слуайно, на выходе не цикл мгноеных значей должен получиться?

хотя у меня не полуаеться съесть всю сточку, а только первые 5-6 байт, допустим байт другой откиним, но пустшки "20h" пропадают - ну и ладно но число не собрать ...

Эх ... начал скчать по API ///

mettled
26.02.2008, 15:32
Честно говоря у меня была похожая проблемма... надо было с датчика температуры считывать показания по RS485.
Т.е. я отсылаю запрос, от выдает ответ с пакзаниями. Если я подключал датчик через преобразователь АС3 к контроллеру ( датчик - RS 485 - АС3 - RS 232 - контроллер ) то ответ от датчика был правильным, но если напрямую подрубал датчик к контроллеру, в буфере порта появлялись неправильные данные. Так и не разобрался откуда они брались и почему так получалось.
В связи с чем вопрос такой появляется, вы используетет RS 485 для подключения к контроллеру прибора ?

K.I.V.
26.02.2008, 15:32
а между прочим ...
считываю данные с порта :
"х:=SysComRead(com_num,ADR(rcvBUF),9,0);"
но в массиве "rcvBUF" беред, данные не восринимаются, как hex байты, если просто принимать в переменную STRING, то в нём проскакивает действительное звачение, но оно пляшит - как отловить?

K.I.V.
26.02.2008, 15:34
В связи с чем вопрос такой появляется, вы используетет RS 485 для подключения к контроллеру прибора ?
конечно ...
попробую через 232- ас3 ...

mettled
26.02.2008, 15:40
моя тема по этому вопросу... может чего инетресного вычитаешь
http://www.owen.ru/forum/showthread.php?t=868&highlight=mettled

Филоненко Владислав
26.02.2008, 16:28
а между прочим ...
считываю данные с порта :
"х:=SysComRead(com_num,ADR(rcvBUF),9,0);"
но в массиве "rcvBUF" беред, данные не восринимаются, как hex байты, если просто принимать в переменную STRING, то в нём проскакивает действительное звачение, но оно пляшит - как отловить?

А не пробовали UNM.lib

K.I.V.
26.02.2008, 16:44
А не пробовали UNM.lib

не пробывал ...

зы буквы кончаются ...

K.I.V.
27.02.2008, 13:30
А не пробовали UNM.lib

пробую ...
1 - пример, который в описании явно не рабочий ( но это как всегда :rolleyes: )
2 - сейчас делаю приём, постоянно ругается на target ...
3 - пошел ещё один глюк ... "ругается на аналоговый толь вход, толь выход ... забыл, попадется ещё уточню" - при этом в проекте только уни. циф. порт ....

Филоненко Владислав
27.02.2008, 15:18
А проектик можно посмотреть? Таргет и прошивка совпадают (иногда таргет не устанавливается поверх старого, версию можно посмотреть в начале файла hardware.cfg).
Standart configuration делали?

K.I.V.
27.02.2008, 16:57
А проектик можно посмотреть? Таргет и прошивка совпадают (иногда таргет не устанавливается поверх старого, версию можно посмотреть в начале файла hardware.cfg).
Standart configuration делали?


с таргетом отлегло ... переустановил codesys & пошло поехало ...

я явно не догоняю с "RBDATA" и ...
var
dd: POINTER TO RBDATA;

IF n1_out THEN LockDevice(0);
SetByte(0, Line, LEN); ...
dd:=GetByte(0);
END_IF

...
при этом
dd:=<202в57с4>
всегда

наивно думал, что в dd сложиться 9 байт, ... но они даже по парядку не хотят там повиться ... :confused:


зы на пк мне горазно проще реализовать приём в скаду,
...
а у вас нет примера ... но не с модемом ?

Филоненко Владислав
27.02.2008, 19:05
RBDATA - структура из 2-х байт, в первом - принятый символ, во втором - флаги.

В приведённом коде:

IF n1_out THEN LockDevice(0);
SetByte(0, Line, LEN); ...
dd:=GetByte(0);
END_IF

dd - это указатель, его надо разименовать.

data:byte;

data:=dd^.data;
Переменной "data" присваивается значение принятого символа. Далее его можно складывать в массив, анализировать и пр.

Расшифровка флагов:

/* //Осталось со времен динозавров
typedef struct {
unsigned char parity_error: 1;
unsigned char frame_error: 1;
unsigned char overrun: 1;
unsigned char noktime: 1;
unsigned char new_frame: 1;
unsigned char end_frame: 1;
unsigned char temp_el_full: 1;
unsigned char reserved1: 1;
} RBOPTIONS;*/

Интересуют первые 3 бита - это ошибки приёма
и бит end_frame - признак конца пачки по стандарту RTU (пауза более 3,5 символов)
Если поднят noktime - пауза между символами >1.5 и <3.5 символов - возможно устройство не успевает складывать байты запроса/ответа в свой передающий буффер, особенно этим грешат древние/самопальные приборы и Windows. Обрабатывать ли этот флаг -решать Вам.

/* Определение типа данных, хранящихся в кольцевом буфере приема/передачи */
typedef struct {
unsigned char data;
unsigned char flags;
}RBDATA;

Филоненко Владислав
28.02.2008, 13:03
Пример работы с SysLibCom.

K.I.V.
28.02.2008, 17:02
Прошу прощение … ручник довёл … оказывается как круто можно тормозить ... даже стыдно

зы это я не про пример, про свои дикие тормоза с протоколом ... что-то нашло :rolleyes:

Филоненко Владислав
28.02.2008, 17:07
Пример работоспособности примера (тавтология, но чё делать).
Связь с ПК по 485 через АС3М
P.S. перед выкладыванием мы проверяем примеры на железе:

K.I.V.
29.02.2008, 11:31
P.S. перед выкладыванием мы проверяем примеры на железе:

огульно сказал, не проверил, т.к. по COM1 у меня порт не открывается, а тут :rolleyes: ...

Филоненко Владислав
29.02.2008, 11:39
RBDATA - структура из 2-х байт, в первом - принятый символ, во втором - флаги.


Расшифровка флагов:

Интересуют первые 3 бита - это ошибки приёма
и бит end_frame - признак конца пачки по стандарту RTU (пауза более 3,5 символов)
Если поднят noktime - пауза между символами >1.5 и <3.5 символов - возможно устройство не успевает складывать байты запроса/ответа в свой передающий буффер, особенно этим грешат древние/самопальные приборы и Windows. Обрабатывать ли этот флаг -решать Вам.




дико извиняюсь, неправильно выложил месторасположение флагов.
Правильный вариант:
unsigned char reserved1: 1;

unsigned char noktime: 1;
unsigned char new_frame: 1;
unsigned char end_frame: 1;
unsigned char temp_el_full: 1;

unsigned char overrun: 1;
unsigned char frame_error: 1;
unsigned char parity_error: 1;

K.I.V.
29.02.2008, 23:06
...
бубны, бубны ...

1) отмечу, так "не честно задавать порт", как в вашем примере ...
см. другой ваш пример ...

2)
далее …
… я упоминал про мусор в буфере (и в ARRAY, и в STRING) при приеме … то есть 9-ть байт принимаютья "со смещением", +/- биты ... так вот …
При схеме подключения: терминал <485 - 485> плк150 – есть мусор.
При схеме подключения: терминал <232 - 232> АС3-М <485 - 485> плк150 – есть мусор. добавил ... не факт, надо проверить, возможно ошибся
При схеме подключения: терминал <485 - 485> АС3-М <232 - 232> плк150 - :)

ПК через АС3-М принимает нормально.

кто виноват? вывод жду от вас ... :rolleyes:

Филоненко Владислав
29.02.2008, 23:21
Замечу, бубен есть необходимейший инструмент отладки для программиста :)

Про мусор. В понедельник проведу доп.исследования, но прежде никогда с этим не сталкивались.
1.А Вы терминальные резисторы на АС3М включили?
2. Меня гложат смутные сомнения, что дело в терминале. Это что за устройство? Нельзя ли осцилографом посмотреть что на линии от терминала и выложить осцилограммы? особенно интересуют число стоп-битов и точность удержания терминалом частоты. Концы АС3М по определению неравнозначны и со стороны 485 фильтрация помех и джитера выше. Вот наводки и фильтруются. А ПК их не даёт.

K.I.V.
01.03.2008, 00:43
Замечу, бубен есть необходимейший инструмент отладки для программиста :)

а я не отрицаю.
да поможет нам.



Про мусор. В понедельник проведу доп.исследования, но прежде никогда с этим не сталкивались.
1.А Вы терминальные резисторы на АС3М включили?

наверно нет, не увлекаюсь...



2. Меня гложат смутные сомнения, что дело в терминале. Это что за устройство? Нельзя ли осцилографом посмотреть что на линии от терминала и выложить осцилограммы? особенно интересуют число стоп-битов и точность удержания терминалом частоты. Концы АС3М по определению неравнозначны и со стороны 485 фильтрация помех и джитера выше. Вот наводки и фильтруются. А ПК их не даёт.

наверно пятница, не очень понял :rolleyes:
может имеется ввиду, что плк150 = 485 не фильтрует помехи ... может и в терминале, но это не снимает вину с плк.

если в теминале => потру плк150 = 485 требуется доработка :rolleyes: , до уровня АС3-М.

зы
господи, из-за этого глюка такую хр...... чуть не начал клепать ...
даже не смотря на свои глюки :D

Филоненко Владислав
01.03.2008, 09:51
Возможно терминал не соответствует стандарту 485. ПЛК не причём. Просто при разработке АС3М (сам не участвовал) видимо положили дополнительный толстый слой соломы.

Для проверки:
в схеме: терминал <485 - 485> АС3-М <232 - 232> АС3-М <485 - 485> плк150 я думаю тоже мусора не будет.
А про терминальные резисторы всё-же посмотрите. рядом с разъёмом 485 2 дип-переключателя. А что значит не увлекаетесь? чем?

K.I.V.
01.03.2008, 14:42
Возможно терминал не соответствует стандарту 485. ПЛК не причём. Просто при разработке АС3М (сам не участвовал) видимо положили дополнительный толстый слой соломы.

Для проверки:
в схеме: терминал <485 - 485> АС3-М <232 - 232> АС3-М <485 - 485> плк150 я думаю тоже мусора не будет.

аналогично.



А про терминальные резисторы всё-же посмотрите. рядом с разъёмом 485 2 дип-переключателя. А что значит не увлекаетесь? чем?

я практически ни когда не использовал резисторы при продключениях по 485-му... это и называется не увлекаюсь :cool:
схема терминал <232> АС3-М <485> плк ... нормально работает.

Филоненко Владислав
01.03.2008, 17:15
аналогично.

Есть мусор или нет?



я практически ни когда не использовал резисторы при продключениях по 485-му... это и называется не увлекаюсь :cool:
схема терминал <232> АС3-М <485> плк ... нормально работает.
А в предидущем посте говорили что есть мусор. Что-то изменилось?

K.I.V.
01.03.2008, 22:02
Есть мусор или нет?
не проверял, но думаю не будет ... надо второй АС3-М сдёргивать с объекта ...



А в предидущем посте говорили что есть мусор. Что-то изменилось?

не чего, на работе не был ;)

Филоненко Владислав
02.03.2008, 09:32
Да, что это за терминал такой, мультиинтерфейсный?

K.I.V.
03.03.2008, 10:29
Да, что это за терминал такой, мультиинтерфейсный?
ответил в личку

mettled
03.03.2008, 11:48
Ну так в итоге что?
Как подключить прибор к ПЛК по 485 и без мусора в буфере?
Как я говорил, у нас возникла такая же проблемма.Хотели подключать датчики к контроллеру сразу, без МВА. Но все застопорилось из-за этого мусора в буфере порта. А идея подключать датчики по 485 интерфейсу сразу к контроллеру (без расширителя) сгласитесь, очень уж заманчива.

Филоненко Владислав
03.03.2008, 12:05
Мы использовали с ПЛК разл. приборы - мусора не было.
Сам использовал с ПЛК по 485 самопальный прибор на ModBus - мусора не было. Даже DCON панель, жутко глючная - мусора не было.
Если бы Вы подвезли (при возможности) к нам такой датчик/терминал с "мусором", можно было бы на стенде посмотреть причины сбоев.
Пока предположений 2:
1. Нет нагрузочного/терминального сопротивления.
2. датчик/терминал не совсем соответствует либо стандарту RS485 (например по уровню сигнала) либо стандарту UART (точность удержания частоты).

K.I.V.
03.03.2008, 13:49
Ну так в итоге что?
Как подключить прибор к ПЛК по 485 и без мусора в буфере?
Как я говорил, у нас возникла такая же проблемма.Хотели подключать датчики к контроллеру сразу, без МВА. Но все застопорилось из-за этого мусора в буфере порта. А идея подключать датчики по 485 интерфейсу сразу к контроллеру (без расширителя) сгласитесь, очень уж заманчива.
... п.п. работы много ...

по теме:
подключился через ас3-м, т.е.
плк 232 <-> 232 ас3-м 485 <-> терминалы.

глупость, конечно полная, но что делать :rolleyes: