Просмотр полной версии : Нестандартный протокол
Необходимо послать запрос термостату фирмы Huber с блоком управления СС3.
Протокол нестандартный, запрос в виде SP?<CR><LF>.
Каким образом отсылать спецсимволы <CR><LF> (#13#10).
SergeyNG
19.01.2008, 10:30
Из книжки:
При необходимости помещения в строку кода, не имеющего печатного изображения, используется знак ($) и следующий за ним код из двух цифр в шестнадцатиричной системе исчисления.
Из книжки:
п.п. может вы вычитали как принимать блок байт hex данных и переводить в обычную цифру :confused:
Филоненко Владислав
30.01.2008, 10:14
Расшифруйте, что же вы хотели сказать, K.I.V? Надо осуществить преобразование степени счисления 16->10? Или что-то ещё?
SergeyNG
30.01.2008, 12:40
Тоже не понял, что и во что вы хотите перевести? Поподробнее
да я хотел ... хочу ( просто отвлекли более важные дела ), может в понедельник продолжу и зря вас отвлекаю, но от помощи не откажусь ...
делаю протокол обмена по 485 :
- посылаю в hex запрос прибору
- прибор сразу отвечает n кол-вом байт в hex формате ( девять байт, из них 8-мь цифр с индикатора и один байт наверно положение точки ( постараюсь обойтись без точки, но может понадобиться)).
- на данной стадии принимаю в буфет какой-то бред
- но после решения (надеюсь) этой проблемы, надо как-то из это буфера с значениями полулить нормальное число в формате dec :confused:
пока своих мыслей нет, но если только взять пример с модемом, перевести в железо и гонять ...
зы понимаю, что не для этой темы, но суть описал ...
Если кто-нибудь поделился бы готовым понятным кодом (я делаю на ST), то жить станет легче.
зарание спасибо.
SergeyNG
01.02.2008, 05:13
А описание протокола есть, можно посмотреть?
Или привидите пример запроса и ответа с прибора.
с протоколом конечно загнул, опрос ...
запрос : 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
Примерно так
странно ... а полный текст можно?
здесь, слуайно, на выходе не цикл мгноеных значей должен получиться?
хотя у меня не полуаеться съесть всю сточку, а только первые 5-6 байт, допустим байт другой откиним, но пустшки "20h" пропадают - ну и ладно но число не собрать ...
Эх ... начал скчать по API ///
Честно говоря у меня была похожая проблемма... надо было с датчика температуры считывать показания по RS485.
Т.е. я отсылаю запрос, от выдает ответ с пакзаниями. Если я подключал датчик через преобразователь АС3 к контроллеру ( датчик - RS 485 - АС3 - RS 232 - контроллер ) то ответ от датчика был правильным, но если напрямую подрубал датчик к контроллеру, в буфере порта появлялись неправильные данные. Так и не разобрался откуда они брались и почему так получалось.
В связи с чем вопрос такой появляется, вы используетет RS 485 для подключения к контроллеру прибора ?
а между прочим ...
считываю данные с порта :
"х:=SysComRead(com_num,ADR(rcvBUF),9,0);"
но в массиве "rcvBUF" беред, данные не восринимаются, как hex байты, если просто принимать в переменную STRING, то в нём проскакивает действительное звачение, но оно пляшит - как отловить?
В связи с чем вопрос такой появляется, вы используетет RS 485 для подключения к контроллеру прибора ?
конечно ...
попробую через 232- ас3 ...
моя тема по этому вопросу... может чего инетресного вычитаешь
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
А не пробовали UNM.lib
не пробывал ...
зы буквы кончаются ...
А не пробовали UNM.lib
пробую ...
1 - пример, который в описании явно не рабочий ( но это как всегда :rolleyes: )
2 - сейчас делаю приём, постоянно ругается на target ...
3 - пошел ещё один глюк ... "ругается на аналоговый толь вход, толь выход ... забыл, попадется ещё уточню" - при этом в проекте только уни. циф. порт ....
Филоненко Владислав
27.02.2008, 15:18
А проектик можно посмотреть? Таргет и прошивка совпадают (иногда таргет не устанавливается поверх старого, версию можно посмотреть в начале файла hardware.cfg).
Standart configuration делали?
А проектик можно посмотреть? Таргет и прошивка совпадают (иногда таргет не устанавливается поверх старого, версию можно посмотреть в начале файла 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.
Прошу прощение … ручник довёл … оказывается как круто можно тормозить ... даже стыдно
зы это я не про пример, про свои дикие тормоза с протоколом ... что-то нашло :rolleyes:
Филоненко Владислав
28.02.2008, 17:07
Пример работоспособности примера (тавтология, но чё делать).
Связь с ПК по 485 через АС3М
P.S. перед выкладыванием мы проверяем примеры на железе:
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;
...
бубны, бубны ...
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 фильтрация помех и джитера выше. Вот наводки и фильтруются. А ПК их не даёт.
Замечу, бубен есть необходимейший инструмент отладки для программиста :)
а я не отрицаю.
да поможет нам.
Про мусор. В понедельник проведу доп.исследования, но прежде никогда с этим не сталкивались.
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 дип-переключателя. А что значит не увлекаетесь? чем?
Возможно терминал не соответствует стандарту 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> плк ... нормально работает.
А в предидущем посте говорили что есть мусор. Что-то изменилось?
Есть мусор или нет?
не проверял, но думаю не будет ... надо второй АС3-М сдёргивать с объекта ...
А в предидущем посте говорили что есть мусор. Что-то изменилось?
не чего, на работе не был ;)
Филоненко Владислав
02.03.2008, 09:32
Да, что это за терминал такой, мультиинтерфейсный?
Да, что это за терминал такой, мультиинтерфейсный?
ответил в личку
Ну так в итоге что?
Как подключить прибор к ПЛК по 485 и без мусора в буфере?
Как я говорил, у нас возникла такая же проблемма.Хотели подключать датчики к контроллеру сразу, без МВА. Но все застопорилось из-за этого мусора в буфере порта. А идея подключать датчики по 485 интерфейсу сразу к контроллеру (без расширителя) сгласитесь, очень уж заманчива.
Филоненко Владислав
03.03.2008, 12:05
Мы использовали с ПЛК разл. приборы - мусора не было.
Сам использовал с ПЛК по 485 самопальный прибор на ModBus - мусора не было. Даже DCON панель, жутко глючная - мусора не было.
Если бы Вы подвезли (при возможности) к нам такой датчик/терминал с "мусором", можно было бы на стенде посмотреть причины сбоев.
Пока предположений 2:
1. Нет нагрузочного/терминального сопротивления.
2. датчик/терминал не совсем соответствует либо стандарту RS485 (например по уровню сигнала) либо стандарту UART (точность удержания частоты).
Ну так в итоге что?
Как подключить прибор к ПЛК по 485 и без мусора в буфере?
Как я говорил, у нас возникла такая же проблемма.Хотели подключать датчики к контроллеру сразу, без МВА. Но все застопорилось из-за этого мусора в буфере порта. А идея подключать датчики по 485 интерфейсу сразу к контроллеру (без расширителя) сгласитесь, очень уж заманчива.
... п.п. работы много ...
по теме:
подключился через ас3-м, т.е.
плк 232 <-> 232 ас3-м 485 <-> терминалы.
глупость, конечно полная, но что делать :rolleyes:
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot