С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 1
Регистрация: 10.07.2023
Сообщений: 22
1

Sikora RS-485

04.11.2023, 20:33. Показов 1299. Ответов 33
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, форумчане.
Требуется соединить измеритель диаметра "Сикора" с компьютером по Rs-485. Все что есть на данный момент - это следующие данные из руководства пользователядобавил во вложение).
Устройство соединено по 485-му.
запрос. делается по формуле.
STX+ IDB1+IDB2+IDB3+ETX+BCC
STX = 02H
ETX =03H
IDB1+IDB2+IDB3 ="001" (заранее известный запрос)
BBC = IDB1 xor IDB2 xor IDB3 xor ETX

В Delphi это выглядит следующим образом:
Delphi
1
2
3
4
5
6
function SN(s:string):string;
var f:integer;
begin
f:= ord(copy(s,1,1)) xor ord(copy(s,2,1)) xor ord(copy(s,3,1)) xor ord(3);
result:= chr(2)+'001'+chr(3)+chr(f);
end;
и далее эта строка засылается в СОМ порт.

при отправке запроса как в инструкции в ответ приходит одно и то же сообщение. Причем вне зависимости от того, измеряется сейчас что-либо или нет. смущает длина этого сообщения. Приходит 5 байт. В случае ошибки должно приходить 4 байта или 9 без ошибки.
Подскажите в какую сторону рыть.
Вложения
Тип файла: pdf LASER2000_302_Eng.pdf (2.22 Мб, 22 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.11.2023, 20:33
Ответы с готовыми решениями:

Sikora интерфейс RS-485
Здравствуйте. Есть ли на форуме работающие с измерителями диаметра фирмы Sikora. Есть вопросы по...

Проверка подключения RS-485 через преобразователь USB/RS-485
Добрый вечер, форумчане! Я относительно навичек софт-программист, и уж тем более навичек в...

RS-485
Здравствуйте. Подскажите пожалуйста, в RS-485 где все таки +, а где -, просто в разных...

STM32 + RS-485
Добрый день! Пару дней назад начал осваивать STM32 с целью реализации конкретной задачи:...

Вопросы по RS-485
Как-то никогда раньше не работал с RS-485, все больше с обычным уартом. А тут по работе надо...

33
Злостный нарушитель
9592 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,492
04.11.2023, 20:45 2
sizeof(char) в твоём delphi чему равен?
0
1 / 1 / 1
Регистрация: 10.07.2023
Сообщений: 22
05.11.2023, 11:05  [ТС] 3
Цитата Сообщение от Verevkin Посмотреть сообщение
sizeof(char) в твоём delphi чему равен?
в данном случае в результате работы функции получается строка, равная 6 символам, т.е. 6 байт. или я где-то лажаю?
Миниатюры
Sikora RS-485  
0
Злостный нарушитель
9592 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,492
05.11.2023, 12:54 4
Цитата Сообщение от ragwolf Посмотреть сообщение
строка, равная 6 символам, т.е. 6 байт. или я где-то лажаю?
Чувак, пойми, я про sizeof(char) не просто так спросил. 6 символов НЕ ВСЕГДА занимают 6 байт.
-------
При работе с передачей данных на периферию категорически не рекомендую использовать символьные типы (char, pchar, string и т.п.), это чревато появлением подобных тредов на форумах.
0
1 / 1 / 1
Регистрация: 10.07.2023
Сообщений: 22
05.11.2023, 14:40  [ТС] 5
Цитата Сообщение от Verevkin Посмотреть сообщение
Чувак, пойми, я про sizeof(char) не просто так спросил. 6 символов НЕ ВСЕГДА занимают 6 байт.
-------
При работе с передачей данных на периферию категорически не рекомендую использовать символьные типы (char, pchar, string и т.п.), это чревато появлением подобных тредов на форумах.
вы имеете в виду big -endian и little-endian форматы?
наверное, я не правильно формулирую. Приходит в ответ 5 символов.
просто, может это я не правильно понимаю инструкцию по составлению запроса. прочтите, пожалуйста, главу 4.2 (страницы 23-26). Может что-то увидите, чего я не вижу.
0
Злостный нарушитель
9592 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,492
05.11.2023, 14:56 6
Цитата Сообщение от ragwolf Посмотреть сообщение
вы имеете в виду big -endian и little-endian форматы?
нет.
Цитата Сообщение от ragwolf Посмотреть сообщение
прочтите, пожалуйста, главу 4.2 (страницы 23-26). Может что-то увидите, чего я не вижу.

Цитата Сообщение от ragwolf Посмотреть сообщение
наверное, я не правильно формулирую. Приходит в ответ 5 символов.
Sikora RS-485


Пока ты не перестанешь оперировать символами, ничего не взлетит. В цифровой электронике есть биты и байты. А символы - это только их интерпретация.
0
1 / 1 / 1
Регистрация: 10.07.2023
Сообщений: 22
05.11.2023, 18:34  [ТС] 7
спасибо. буду думать.
0
541 / 241 / 27
Регистрация: 05.05.2022
Сообщений: 1,571
06.11.2023, 11:24 8
Начнем с того, что у вас RS-485 преобразователь правильно настроен (если он требует настройки, а такие бывают, если это USB<->RS-485), прибор правильно настроен?

А вообще у вас в инструкции написано:

STX START OF TEXT 02H
ACK ACKNOWLEDGE 06H
NAK NEGATIVE ACKNOWLEDGE 15H
ETX END OF TEXT 03H
Это не текст, это значения байтов в Hex. и 15H в Delphi это $15
1
1 / 1 / 1
Регистрация: 10.07.2023
Сообщений: 22
06.11.2023, 12:28  [ТС] 9
я правильно понимаю, что 15H это символ с номером 15 из аски таблицы? или нужно обязательно отправлять именно данный байт?

ЗЫ. НОмер порта, скорость четность и настроены.
0
541 / 241 / 27
Регистрация: 05.05.2022
Сообщений: 1,571
06.11.2023, 13:06 10
Delphi
1
2
3
const
  STX=$2;
  ETX=$15;
Далее коды значений, как я понимаю, текст. Т. е. да, 6 байт. А Delphi какая? Старая 7-ка? Или современная юникодовая версия?

Если юникодовая, то вместо Char используем ANSIChar однобайтовый, и ANSIString.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const
  cdStatusAndActualValueDiameter:ANSIString='001';
 
type
TCMD=array[0..5] of Byte;
 
var
  CMD:TCMD;
 
function CreateRequest(cd:ANSIString):TCMD;
var
  i:Integer;
begin
Result[0]:=STX;
for i:=1 to 3 do Result[i]:=Ord(cd[i]);
Result[4]:=ETX;
Result[5]:=<Расчет CRC>;
end
 
CMD:=CreateRequest(cdStatusAndActualValueDiameter);
Я понял инструкцию так.
1
Злостный нарушитель
9592 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,492
06.11.2023, 13:13 11
Лучший ответ Сообщение было отмечено ragwolf как решение

Решение

Цитата Сообщение от ragwolf Посмотреть сообщение
я правильно понимаю, что 15H это символ с номером 15 из аски таблицы?
Да ты задолбал со своими символами! [Удалено]
Туда 6 байт, оттуда 5 байт.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type
  TRequest = packed record
    STX, IDB1, IDB2, IDB3, ETX, BCC: Byte;
  end;
  
procedure SendRequest;
var
  r: TRequest;
begin
  r.STX:= 2;
  r.ETX:= 3;
  r.IDB1:= 0;
  r.IDB2:= 0;
  r.IDB3:= 1;
  r.BCC:= r.IDB1 xor r.IDB2 xor r.IDB3 xor ETX;
  
  // далее - отправка данных в порт
end;
1
541 / 241 / 27
Регистрация: 05.05.2022
Сообщений: 1,571
06.11.2023, 13:35 12
А я еще с ETX опечатался. Ну ладно.

Добавлено через 6 минут
Delphi
1
2
3
 r.IDB1:= 0;
  r.IDB2:= 0;
  r.IDB3:= 1;
Там ASCII написано, я думаю, что это именно символы. Но вообще, можно проверить и так, и так.
0
Злостный нарушитель
9592 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,492
06.11.2023, 13:48 13
Цитата Сообщение от Beltar Посмотреть сообщение
Но вообще, можно проверить и так, и так.
Вот именно. Главное, чтоб это байты были.
0
Модератор
3756 / 2260 / 782
Регистрация: 15.11.2015
Сообщений: 8,989
06.11.2023, 13:55 14
Лучший ответ Сообщение было отмечено ragwolf как решение

Решение

ragwolf, уже написали, что это всё - байты. Просто некоторые из них могут быть интерпретированы в виде символов.

Цитата Сообщение от ragwolf Посмотреть сообщение
нужно обязательно отправлять именно данный байт?
В передаваемом потоке байт со значением $02 означает начало текста. Следующая группа байт, до байта со значением $03 интерпретируется, как текст. Если написано "019", значит, отправляются соответствующие ASCII коды этих символов $30,$31,$39.

В юникодных версиях дельфи можно задать строку типа AnsiString, присвоить туда нужные символы и потом копировать из строки в выходной поток, получая код символа функцией Ord().

Добавлено через 3 минуты
Ну да, с record ещё проще и удобнее должно быть.

Добавлено через 1 минуту
Думаю, так будет верно:
Delphi
1
2
3
  r.IDB1:= Ord('0');
  r.IDB2:= Ord('0');
  r.IDB3:= Ord('1');
1
1 / 1 / 1
Регистрация: 10.07.2023
Сообщений: 22
07.11.2023, 18:17  [ТС] 15
Спасибо всем, за помощь.
Как оказалось, проблема была не программной, а аппаратной. При использовании ICP-CON для конвертации 232 в 485 ответ не правильно интерпретировался. При прямом соединении (использовал переходниу 485-USB) ответы стали приходить "читаемые".
НО все равно, пока "ковырял" переписал часть программы.
За основу взял вариант с record'ом . И, действительно, получилось красивее.
Зато, благодаря вам, я чуть больше узнал о битах, байтах, символах и словах.
СПАСИБО.
0
Злостный нарушитель
9592 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,492
07.11.2023, 18:21 16
Цитата Сообщение от ragwolf Посмотреть сообщение
За основу взял вариант с record'ом . И, действительно, получилось красивее.
Да не в красоте дело-то. Ты так и не врубился, штоли?

Я устал от всего этого....
0
541 / 241 / 27
Регистрация: 05.05.2022
Сообщений: 1,571
07.11.2023, 18:53 17
ICP-7250? У меня на заводе это хлама сотни, наверное, были. Проблем не припоминаю. Скорее всего, либо конкретный преобразователь неисправен, либо что-то с RS-232 портом.

Работа с USB-преобразователем может отличаться от работы с родным, или USB'шным RS-232, через внешний RS-485. У меня USB-преобразователь позволял писать адрес с переключением четности без задержки и давал гарантированные полные ответы, что в общем случае не так.

И вообще, как правильно-то в итоге? Вдруг нам такая же или похожая штука попадется.
0
пофигист широкого профиля
4753 / 3190 / 860
Регистрация: 15.07.2013
Сообщений: 18,475
08.11.2023, 02:35 18
Цитата Сообщение от Beltar Посмотреть сообщение
У меня USB-преобразователь позволял писать адрес с переключением четности без задержки и давал гарантированные полные ответы, что в общем случае не так.
Можно подумать, что этот преобразователь имеет мозги!
Не верю!
0
541 / 241 / 27
Регистрация: 05.05.2022
Сообщений: 1,571
08.11.2023, 09:20 19
Во что? Что конкретно попавшая мне модель ведет себя так? XR21B1411 USB UART
Обычный обмен запрос-ответ, макс. размер ответа 246 байт. Адресация устройства на линии через смену четности.

Запись так:

Delphi
1
2
3
4
5
6
Port.Parity.Check:=True;
Port.Parity.Bits:=prMark;
Result:=Result+Port.Write(M[Offset],1);
if Result=0 then Exit;
Port.Parity.Bits:=prSpace;
Result:=Result+Port.Write(M[Offset+1],Count-1);
На приеме все целиком приходит в onRXChar компонента порта. Все прекрасно и удобно.

А потом оказывается, что у мужиков моя прога для тестирования контроллеров не работает. У них как раз эти ICPCON'ы. А старая прога к которой, конечно, исходников нет, работает. Начал разбираться, благо у меня аж 3 шт. этих ICPCON'ов появилось, сниффер, вроде, никаких отличий не показывает, подумал, а не вставить ли задержку между посылками адреса и запроса. Начали отвечать, но ответы кусками.
У меня 20 разных преобразователей для опытов нету, так что я просто констатирую, что с разными моделями могут быть разные нюансы, и код может оказаться непереносимым.
0
пофигист широкого профиля
4753 / 3190 / 860
Регистрация: 15.07.2013
Сообщений: 18,475
09.11.2023, 01:29 20
Цитата Сообщение от Beltar Посмотреть сообщение
Во что? Что конкретно попавшая мне модель ведет себя так? XR21B1411 USB UART
Именно в это. Вот уж не думал, что кто-то решит смастерить такую штуку!
0
09.11.2023, 01:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.11.2023, 01:29
Помогаю со студенческими работами здесь

Развязка RS-485
Доброе время суток. Есть несколько приборов, который будут работать под RS-485. Хочу намутить...

Интерфейс RS-485
Подскажите книги или другую полезную литературу по данному интерфейсу. Гугл походу не знает таких...

Интерфейс RS-485
Продолжение ранее начатой темы. Тема берет начало...

Команда по RS-485
Всем доброго времени суток. Как мне по RS-485 отправить команду на контроллер и получить ответ? Для...

USB-UART -> RS-485
Есть девайс USB2UART собраный на основе cp2102. Схема практически из даташита, только к выходам TX...

RS-485 и витая пара
Добрый день! у меня такой вопрос: есть обычный &quot;домашний интернет&quot;, он подключен к некому...


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

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