PDA

Просмотр полной версии : Библиотека UNM, отправка и получение запроса.



приборист
30.10.2008, 08:06
Здравствуйте.
Все никак не могу разобраться с отправкой и получение посылок в rs485 с помощью библиотеки UNM.

В мурзилке на прибор написано следующее:
Есть 4 основные команды:
I - Десятичный код - 73 - Выдать идентификационный код устройства.
Т - Десятичный код -84 - Тест на эхо.
. - Десятичный код - 46 - Выдать ответ по бит маске.
К - Десятичный код - 75 - Имитация нажатий кнопок.
В свою очередь команда 46 имеет байт-параметр:
Бит 0 - Код АЦП
Бит 1 - Текущее значение брутто
Бит 2 - Текущее значение нетто
Бит 3 - Текущее значение тары
Бит 4 - Ноль
Бит 5 - Биты состояний
Бит 6 - Индикация (0-флаг мигания,1-позиция точки,2-состояние веса,3-светодиоды,4-9 - маски семисегментных индикаторов)
Бит 7 -Статус RS485 (0-битмаска ошибки,1-количество ошибок связи,2-количество принятых пакетов)

Пример:
Посылать в прибор нужно:
SOH <0x21> <0x20> <46> <1> <0xD1> ETX, где
0х21 - Адрес кому(1)
0х20 - Адрес от кого(0)
46 - Адрес команды "ответ по бит-маске"
1 - маска (только поле "Код АЦП")
0хD1 - значение CRC

В свою очередь на это прибор должен ответить:
SOH <0x20> <0x21> <46> <1> DLE <0> <0x6D> <0x52> <0x11> ETX,где
До DLE тоже самое что было в запросе,
DLE <0> - 0xFF - бит маска новостей
0x6D - Поле Код АЦП , старший бит
0x52 - Поле Код АЦП , младший бит
0х11 - CRC.

Кто-нибудь может подсказать как должна выглядеть правильная посылка?
Вообще необходимо получать вес из прибора.

Филоненко Владислав
30.10.2008, 19:55
1. Что такое SOH,DLE,ETX?
2. Мурзилку не выложите, многое может стать яснее.

приборист
31.10.2008, 13:56
SOH u ETX - Ограничители пакета, тоесть начало и конец пакета
DLE - служит для возможности передачи зарегистрированные символы как данные.

Вобщем часть мурзилки я написал выше. А полная версия вот:

Филоненко Владислав
31.10.2008, 18:18
Любят же извращаться...
Значит так.
В строке с CoDeSys забиваете нужные значения через $xx, где xx - требуемый 16-ти ричный код спецсимвола. И отправляете эту строку в порт. Приём - читаете побайтно и скрадываете в буфер в соотв. с байтами - ограничителями пакета.

приборист
01.11.2008, 08:42
Владислав, так я так понимаю команда будет выглядеть так:

SetByte(0,'$2e',1); (*Отправляем в прибор код . *)
GetByte(0);(*Получаем от прибора ответ*)

Так?

Филоненко Владислав
01.11.2008, 13:43
Можно и так.

приборист
01.11.2008, 14:14
Я сделал так :
var

a:dword;
b:POINTER TO rbdATA;
end_var;


LockDevice(0);
a:=SetByte(0,'$2E',1);
b:=GetByte(0);

В итоге
a=1 и иногда перескакивает в значение a=4294967295
b=<00000000>.

В чем поблема и почему ничего не показывает я понять не могу((

Филоненко Владислав
01.11.2008, 18:43
SetByte - возвращает число переданных символов, если возвращает -1, то это значит вы слишком много символов положили в буффер - он переполнился. Послали запрос - дождитесь ответа или разумного таймаута 50-150 мс. И только после этого новый запрос
GetByte - возвращает указатель на след. символ.
Если символа нет - то указатель нулевой, если есть - отличный от нуля, его надо разименовать и получить доступ к данным и флагам. Разименовывание через ^

приборист
05.11.2008, 15:07
Ну в общих чертах оно вроде понятно, но все такие непонимаю почему он нехочет отвечать.
Сейчас пробую так:
P:POINTER TO RBDATA;

IF
SetByte(0,'$2E',1)=1 THEN
P:=GetByte(0);
ELSE
error:=1;
end_if;

И запускаю пошагово. Получается что байт 2E он передает в прибор, а в ответ Нули.

По идее то при отправке единичного запроса он должен хоть чтото ответить.

И еще не дают мне покоя эти SOH, ETX,DLE. Почему мы отбрасываем их? Может быть прибор просто непонимает пустые 2Е?

Филоненко Владислав
05.11.2008, 16:05
Судя по мурзилке SOH, ETX,DLE - это символы , к-е надо тоже передавать.
Учитывая мурзилку Вам надо добавить SOH, 2 адреса, команду 2Е+1 байт данных, CRC и ETX, итого 7байт.

приборист
05.11.2008, 16:45
Кстати, вот есть программка теста связи с прибором. Отсылает и принимает пакеты. Тоесть я ввожу свои данные, что надо получить от прибора, тоесть запрос, она составляет такую строку:

FF 21 20 2E D0 03

Я отправляю эту строку в прибор, получаю от него ответ:

если на весах 0 кг:
+FF 20 21 2E D0 10 00 00 02 00 05 00 D9 10 00 10 00 10 00 10 00 40 C0 00 00 29 88 03
если на весах 5 кг:
+FF 20 21 2E D0 10 00 00 02 00 05 00 D5 10 00 10 00 10 00 10 00 12 C0 00 00 2A D5 03

В свою очередь в Кодесис пишу как запрос:

SetByte(0,'$ff$20$21$2E$D0$03',6)

И от прибора ничего не получаю:(

Малышев Олег
05.11.2008, 21:11
А почему
SetByte(0,'$ff$20$21$2E$D0$03',6)
а не
SetByte(0,'$ff$21$20$2E$D0$03',6) ????

приборист
06.11.2008, 07:39
Простите, моя ошибка.

Поставил
SetByte(0,'$ff$21$20$2E$D0$03',6);

ЗАпускаю пошаговое выполнение, получается иногда при выполнении выскакивает
P=<202daa90>.
Обычно появляется, при следуещем прохождении пропадае в <00000000>, и где то на 2-4 прохождении опять появляется.
Это значение неизменяется при изменении веса.

Малышев Олег
06.11.2008, 08:34
Давайте попробуем так
sndTON:TON;
rcvTON:TON;

sndTON(in:=not sndTON.q,pt:=t#500ms);
if sndTON.q then
SetByte....
rcvTON(in:=true,pt:=t#100ms);
end_if
rcvTON(pt:=t#100ms);
if rcvTON.q then
p:=GetByte(0)
s:=RBDATA_TO_STRING(p);
...
rcvTON(in:=false);

end_if
Таймауты поменяйте под себя

приборист
06.11.2008, 09:16
Давайте попробуем так
sndTON:TON;
rcvTON:TON;

sndTON(in:=not sndTON.q,pt:=t#500ms);
if sndTON.q then
SetByte....
rcvTON(in:=true,pt:=t#100ms);
end_if
rcvTON(pt:=t#100ms);
if rcvTON.q then
p:=GetByte(0)
s:=RBDATA_TO_STRING(p);
...
rcvTON(in:=false);

end_if
Таймауты поменяйте под себя

Попробовал, компилятор ругнулся на S, я заменил его на свою c:string;

Итак при запуске программы он опять через раз выводит
P=<202daa90>
и
с='$01', иногда '@' иногда '$05'

Меняешь вес - показания остаются прежними.

Филоненко Владислав
06.11.2008, 10:45
Так надо складывать символы, тогда и всё будет правильно.
GetByte возвращает 1 символ.
Складываете в буфер, ищите начало и конец пачки, проверяете CRC, если всё сошлось - анализируете содержимое.
Иначе никак.

приборист
06.11.2008, 12:56
Так надо складывать символы, тогда и всё будет правильно.
GetByte возвращает 1 символ.
Складываете в буфер, ищите начало и конец пачки, проверяете CRC, если всё сошлось - анализируете содержимое.
Иначе никак.

А можно поподробнее как это надо делать??
Складываете в буфер я так пнимаю просто писать все символы в отельную строку начиная с первого символа.
Как искать начало и конец пачки? И как проверить CRC?
:confused:

Малышев Олег
06.11.2008, 13:49
с:=RBDATA_TO_STRING(p);
all_str:=Concat(all_str,c);
получится строка, а как работать со строкой см описание CoDeSys

приборист
10.11.2008, 15:13
all_str='`x$01$07$01$01p$01@$01$01}$01$07@$07$02@@ $02$01$01$01'
И такую муть выводит бесконечно))))

какой либо зависимости я не смог определить, иногда появляются квадратики, иногда буквы, я так понимаю - все это мусор?

А можно как нибудь сделать чтобы запрос посылался один раз, а потом улавливать только ответы?
А то вот эти запросы-ответы постоянные путают ужасно(
Как можно определить начало и конец посылки? И как определять CRC?

И еще - Байт-параметр запроса, который мне нужен, тоесть вес БРУТТО или НЕТТО идет как тип Integer. Это на чтото влияет?

Филоненко Владислав
10.11.2008, 19:08
Нельзя, весы не знают когда передавать можно. Только в режиме мастер-slave.
Определить начало/конец можно по символам начала и конца. Из мурзилки.

Interger - значит целое число.

приборист
11.11.2008, 07:41
Филоненко Владислав
А куда запихивать всякие @,{,',x,p?

Я знаю что Integer это целое число, почему в книженции написано что байт
Текущее НЕТТО - передается типом Integer

А например
Биты состояния передаются типом Byte
Код АЦП передается типом word.

На что это влияет?

Малышев Олег
11.11.2008, 08:30
Найдите в строке где конкретно передается вес. Из байтов в 2-х и 4-х Можно преобразовать с помощью функций byte_TO_WORD,byte_TO_DWROD, shr,shl

приборист
11.11.2008, 11:38
Итак, в очередной раз мучая прибор дошел до такого этапа:

Подключил прибор напрямую к компу по rs232.
Параллельно прибор связан с контроллером по Rs 485.
Запускаю программу которую я выкладывал выше, где можно состовлять пакеты на компьютере и отправлять в прибор получая ответ.

Выяснил, что при отправке такого запроса:
FF 21 20 2E 32 E2 03
Я получаю ответ с нужным весом:
+FF 20 21 2E 32 10 00 00 2E 00 10 FC 04 00 00 00 34 03

2E - в данном ответе и есть вес в 16ричном виде без точки. Тоесть вес на весах 4.6 кг.

FF Это у нас SOH, ибо в мурзилке SOH - 255=> ff
FC это у нас ETX,(Получается 255-3)

Что после FC - я не знаю)


Итак, в Кодесисе я составляю запрос :
SetByte(0,'$ff$21$20$2E$32$e2$03',7);

И замечаю странную особенность:
При запуске программы в контроллере, программа проверки test485l начинает сама отвечать на этот запрос)
Тоесть начинают отображаться нужный вес.
Получается что запрос правильный и прибор на него отвечат.

Теперь самое интересное, программа отправлять то отправляет запрос, а вот командой GetByte получается одну ересь вида
'яяяяяяяя$01яяяяяяяяя$01p'

Почему программа виндовыми способами нормально может получить данные на запрос, а я в кодесисе немогу?((

Филоненко Владислав
11.11.2008, 20:15
1. FC 04 00 00 00 34 03 Очень напоминает ModBus - пачку, ничего лишнего не подключали?
2. В UNM правильно настроены частота и число битов посылки? Очень похоже, что частота в UNM сильно завышена.
3. 485 не мешает приёму - он точно в режим приёма переводится?

приборист
12.11.2008, 14:05
1. Даже при подключении только лишь ВЕСОВ к компьютеру - выводится эта строчка.
Тоесть отключая контроллер вообще, проверяя свзяь с ВЕСАМИ через rs232 + PC я получаю такой ответ.
2. Вроде все правильно
9600
No parity
8 bits
One stop bit
RS485
ASCII
0
No
3. Получается что у могу отправить через контроллер запрос по rs485 в ВЕСЫ, а получить на компьютере но уже по rs232. Осталось получить по rs485 обратно в контроллер.

Филоненко Владислав
12.11.2008, 19:20
Выложите проектик, может очепятка где?

приборист
13.11.2008, 07:44
PLC 100 R.M.
Target-файлы 2.05
Binary VERSION 2.02.8

Филоненко Владислав
13.11.2008, 12:50
1. LockDevice(0); надо делать 1 раз, а не каждый цикл ПЛК.
2. А вот считывать ответ - как можно чаще, а не раз в 10 мс. А то посылаете раз в 30 мс, читаете по 1 символу раз в 10 мс. Что тут можно получить с порта?
3.
Процедура считывания должна происходить до исчерпания символов в буфере или до нахождения ликв. пачки
p:=GetByte(0);
while (p<>0) do
p:=GetByte(0);
Вот тут должна быть проверка на наличие символа
IF p<>0 then
c:=RBDATA_TO_STRING(p);
А вот тут должна находится машина состояний для поиска символа начала, складывания символов в буфер до прихода символа конца или
превышения размера буфера, а после проверка CRC и только потом считывание значения (на забываем проверить код команды, вдруг не та команда!)

all_str:=CONCAT(all_str,c);
END_IF
END_WHILE

Надеюсь поможет

приборист
13.11.2008, 13:48
1. LockDevice убрал, он пока что ненужен. Подхватывает и так пока один.
2. Поставил отсылку раз 50 мс, прием раз в 3 мс.
3. Сделал так как описали. Пока не делал машину для поиска символов, так как не знаю что искать)) ДУмаю надо расшифровать данные приходящие из прибора - тогда и будем клепать поисковик)

Итак, кажется что-то уже получается, ибо ответы приходят стандартизированные, и строка повторяется.

При весе 0 кг:
all_str='!.2$10$10ь$1C$02$03!.2$10$10ь$1C$02$03!.2 $10'....Ну и далее также.
Я так понимаю
!.2$10$10ь$1C$02$03 - и есть сам ответ

При весе 4.6 кг:
all_str='!.2$10.$10ь$044$03!.2$10.$10ь$044$03!.2$1 0.$10ь'.....

!.2$10.$10ь$044$03 - это ответ.

При весе 9.6 кг:
all_str='!.2$10'$10ь$04z$03!.2$10'$10ь$04z$03!.2$1 0'$10ь'.......

!.2$10'$10ь$04z$03 - это ответ.

А теперь непонятное мне:
Что за мягкий знак всегда выскакивает? $10ь
Какой таблицой пользоваться для рассшифровки всего этого?

Филоненко Владислав
13.11.2008, 13:54
Просто анализируйте код в 16-ти ричной форме. И вместо string используте Array of BYTE - сразу всё станет понятно.

приборист
13.11.2008, 14:43
Просто анализируйте код в 16-ти ричной форме. И вместо string используте Array of BYTE - сразу всё станет понятно.
Простите за дурацкий вопрос, а как преобразовать string в byte?

приборист
13.11.2008, 14:44
И еще - непонятно почему бывают такие символы как $04z, $044. При переводе в 10 форму - бред какойто получается.

приборист
14.11.2008, 10:47
Сижу провожу тесты с весом.
Пока получил:

0кг:
!.2$10$10ь$1c$02$02

1кг:
!.2$10$N$10ь$14$03

1.3кг:
!.2$10$P$10ь$14$06$03

1.9кг:
!.2$10$13$10ь$14$19$03

4.0кг:
!.2$10($04$045$03

4.5кг:
!.2$10-$040$03

9.6кг:
!.2$10'$04$04}$03

10кг:
!.2$10d$04$04y$03

14.4кг:
!.2$10ђ$04$04Ќ$03

Все бы вроде ничего, но ђ,Ќ,ь,},( - к чему это вообще??
И как это расшифровывать. МУсором сложно назвать - почему каждый раз появляется?

Филоненко Владислав
14.11.2008, 12:50
aaa: pointer to byte;
bbb:string;


aaa:=ADR(bbb);

А лучше наоборот,
aaa:array [0...255] of byte;
pstring: pointer to string;

pstring:=adr(aaa);

и везде, где надо использовать STRING вставляете ^pstring;

Филоненко Владислав
14.11.2008, 12:53
И еще - непонятно почему бывают такие символы как $04z, $044. При переводе в 10 форму - бред какойто получается.

$04 = 0x04
z=0x7A (http://ascii.org.ru/)
$044 = 0x44

Соответственно $04z$044 == 0х04 0х7A 0х44

приборист
14.11.2008, 13:48
Владислав, спасибо . Я кажется понял где именно передается вес.

Вес передается после символов !.2$10
Например
4.5кг:
!.2$10-$040$03

Вес = -, переводя по таблице - это 45

14.4кг:
!.2$10ђ$04$04Ќ$03

В это случае ђ - 144.

Точка я так понимаю впринципе не нужна, ибо она выставляется в приборе, и как я понимаю - поменяв настройки в приборе и поставив измерение без сотых - мы уберем и точку.

Интересно как он поведет себя после окончания 255 символов?
Например если вес будет 50 кг?
или 60?
А если 100?
А ведь надо аш до 2000.

И еще непонял до конца как расшифровывать символы которые до 32? Которые в ASCII зарезервированные получаются?

Филоненко Владислав
14.11.2008, 18:38
Они и показываются в Codesys как $xx, где xx - 2 цифры в HEX.
А лучше воспользуйтесь массивом байтов и забудьте о проблемах. Сразу всё будет расшифровано :)

приборист
17.11.2008, 14:01
Они и показываются в Codesys как $xx, где xx - 2 цифры в HEX.
А лучше воспользуйтесь массивом байтов и забудьте о проблемах. Сразу всё будет расшифровано :)

Эм, а это как?:rolleyes:
Я попробовал преобразовать строку в байты как Вы предложили. Чтото не получилось..

Как я понял, надо получать данные из прибора сразу в типе Byte?
Но в UNM вроде нет такой функции?:confused:

приборист
19.11.2008, 15:38
Так все таки, как надо правильно воспользоваться массивом байтов, чтобы передаваемые данные сразу расшифровывались?

Филоненко Владислав
19.11.2008, 16:58
bytes:array [0..32] of byte ;
counter:int;
prb:pointer to RBDATA;

rb:=GetByte();
while (rb) do

bytes[counter]:=^rb.data;
counter +=1;

rb:=GetByte();
end_while

А потом + нажимаете в массиве

приборист
20.11.2008, 07:56
bytes[counter]:=^rb.data;
counter +=1;

А потом + нажимаете в массиве

Компилятор усердно ругается на эту строчку
bytes[counter]:=^rb.data;

Сообщение 4268 Необходимо выражение.

НО ведь у нас rb: pointer to RBDATA;
А флаги и data могут же быть только если
rb:rbdata;
Так?

Непонял строку -
counter +=1;

Я так понял - она просто указывает, какой байт нам нужно брать, так?

И что значит нажимать + в массиве?



Что-то вроде чувствуется что все оно рядом, но неполучается. Аж злость берет:mad:

Филоненко Владислав
20.11.2008, 10:30
Очепяточка, привык к Си :)
bytes[counter]:=rb^.data;

counter:=counter+1;

Филоненко Владислав
20.11.2008, 10:33
И что значит нажимать + в массиве?



Когда залогинетесь, рядом с определением массива появится плюсик...

приборист
20.11.2008, 14:43
О чудо)
Все работает)))
Выводится то разное количество байт, но именно в виде, который мне нужен))

Только вот байты передаются постоянно, и массив получается динамический.
Нашел в каком байте у меня передается вес.
Получилось что 8 по счету байт после команды 255 - и есть нужный вес.

я попробовал вытащить его так:
IF bytes[i]=255 THEN
b:=bytes[i+8];
END_IF;

Что-то не получается.

Филоненко Владислав
20.11.2008, 15:52
Вы мои предыдущие посты про машину состояний читали?

приборист
20.11.2008, 16:03
Вы мои предыдущие посты про машину состояний читали?

Я читал.

Может быть звучит глупо, но мне кажется что проще было бы сделать так:

Ищем символ начала ответа(в нашем случае) - 255
Отсчитываем 8 принятый бит от него, который и будет его результатом.

Соединение вроде устойчивое, 8 бит всегда остается на месте. И всегда показывает наш вес уже в нормальной форме.

Не испытывал только при весе больше 100 кг. Но по идее то проблем не должно быть?

Или я неправильно мыслю?

Филоненко Владислав
20.11.2008, 16:17
Неправильно. Тут только одно решение надежно, и я его озвучил.
Остальные гарантии не дают. Это сложно, муторно, но иначе надежную систему не сделать

приборист
20.11.2008, 16:36
Кхм......Ясно.
Ладно, тогда такой вопрос, получается создавая энту машину, мы перебираем каждый байт, переводим его в строку, сравниваем с оригиналом, если все сходится - кладем в общую строку, так?
Потом из этой строки вытаскиваем опять таки нам нужную циферку.

Полстроки я то знаю как расшифровать. А вот как остальную половину даже предположить не могу.
Как с этим быть?

И можно ли вообще работать с Byte в кодесис?
Или надо обязательно переводить сначала в другое чтото?

Так по хорошему если бы можно было работать с Byte из массива - было бы неочень сложно. А вот если все это переводить - вот это да...


Вроде казалось все просто и близко, а оказалось все нетак((

Филоненко Владислав
20.11.2008, 18:34
1. Прочитайте мурзилку на весы. Там каждый байт описан.
2. А почему нельзя работать с Byte[]? Очень даже можно.

Сергей Сподрин
19.09.2013, 16:33
Позанимаюсь некропостингом, потому что данная тема помогла некоторое время назад разобраться со связью с измерителем иммитанса, сейчас зашла речь подключить к плк100 блок управления коллекторными двигателями BMSD.
Здесь исходя из мануала команда управления идет в 5 байт:
байт1 - Е6 - заголовок (фиксированный)
байт2 - 02 - в моем случае это адрес блока. Его я прописал, когда присоединил блок к ноутбуку и через утилиту сконфигурировал его.
байт3 - Одна из 10 команд управления: задание скорости, ускорения\замедления двигателя, вкл.\выкл. двигатель и т.п.
байт4 - Данные, относящиеся к конкретной команде
байт5 - CRC по алгоритму CRC8
В принципе, используя данные выше в теме рассуждения, удается принимать данные от устройства, однако, к примеру, исходя из нижеприведенного кода:
state:=LockDevice(0);
Setdata:=SetByte(0,'$E6$02$A5$01$00',5);
GetData:=GetByte(0);
WHILE getdata<>0 DO
getdata:=GetByte(0);
getdataarray[j]:=getdata^.data;
j:=j+1;
END_WHILE;
j:=0;
по такой команде устройство дает ответ, записываемый в массив, также из 5 байт. И на все команды ответ подается, кроме команд пуска и выключения движка. Их оператор SetByte отправляет, но в GetByte ничего не приходит, то есть команда теряется неизвестно где. Соответственно, программно запустить двигатель не удается. Когда он запущен вручную - регулировка скорости и параметров из программы работает.

При аналогичных манипуляциях через преобразователь АС4 от ОВЕН, с пом. утилиты com port toolkit вбиваю те же команды в порт и получаю адекватные ответы, все пускается, работает, ускоряется\замедляется, выключается.
Например на серию команд
$E6$02$A5$01$00
$E6$02$A6$0C$A8
$E6$02$A7$01$91
$E6$02$A3$08$36
$E6$02$51$00$FC
Происходит подготовка двигателя, задание начальных параметров работы и его пуск.
Аналогичная серия команд в codesys приводит к тому, что обрабатываются первые 4 команды, все как положено, на пятой, т.е. при пуске двигателя по команде 51 в GetByte возвращается 0 и ничего не происходит.

UkNik
01.10.2013, 14:54
Сергей Сподрин, скорее всего все приходит, просто есть некоторый временной промежуток между ответом на команду пуска/останова. Т.е. между SetByte и GetByte надо или сделать фиксированную задержку (плохой вариант), или заменить условие выхода из цикла while.

Сергей Сподрин
01.10.2013, 17:24
Тогда в таком случае является странным, что устройство не реагирует на команду.

capzap
01.10.2013, 19:10
IF state = 0 THEN
SetByte(Handle,request^,LEN(request^)); (* непосредственно передача данных в порт *)
state:=1; (* переход к следующему этапу *)
respons := ''; (* делаем строку пустой *)
ELSIF state = 1 THEN
rbd := GetByte(Handle); (* прием данных из порта *)
IF rbd <> 0 AND rbd^.data<>0 THEN (* если пришли данные *)
respons:=CONCAT(respons,byToSt(rbd^.data)); (* формируем строку *)
END_IFкак то так у меня передаются и принимаются данные, пауза между отправкои и приемом всего один цикл

Дмитрий Артюховский
01.10.2013, 20:17
Тогда в таком случае является странным, что устройство не реагирует на команду.

вы ему не даете возможность выполнять команду, передавая ее заново в каждом цикле ПЛК.... обратите внимание у "сарзар-а" однократная отправка, а потом многоцикловое чтение - накопление ответной строки...

Сергей Сподрин
07.10.2013, 11:56
Попробовал по такому алгоритму, да пауза в один цикл есть, однако от этого ничего не изменилось в ситуации. Те же яйца, только в профиль - в GetByte ничего не приходит. 5 байт команды в порт ушли, в ответ - тишина. Как только команда изменилась с пуск/стоп на любую другую - в порт сразу же сыплются данные.
С одной поправкой(странность заметил) - команда в ответ должна приходить тоже из 5 байт, однако к каждому ответу в конце "приклеивается" байт 0х18 - по ASCII это Cancel.

capzap
07.10.2013, 12:02
Ну так может и Вы при отправке запроса забываете добавить стмволы конца

Сергей Сподрин
07.10.2013, 12:11
Они не предусмотрены мурзилкой на этот прибор. Только 5 байт команды (которая, как описывал выше) - оканчивается CRC и такая команда нормально воспринимается, при отправке её с компьютера в порт.

capzap
07.10.2013, 12:19
Разве на компьютере Вы не нажимаете ни какой enter? Просто набираете пять байт и сразу приходит ответ?

Сергей Сподрин
07.10.2013, 12:25
Ну если вопрос в таком ключе :) Да, отправлять в порт приходится по нажатию "Send". Но, если я не ошибаюсь, команда SetByte выполняет схожую функцию - передать в интерфейс строку байт?

capzap
07.10.2013, 12:30
Сами сказали что в ответе приходит не описанный байт, ну сделайте следущим образом отправте с компа запрос на плк, а в плк оставте только слушателя, если придет тодько пять байт значит проблема не в этом, а вот если будет снова шестой байт, то значит его надо добавить и в Ваш запрос с плк

Сергей Сподрин
07.10.2013, 12:38
Ну я как раз так и делал. Пробовал уже по-разному:
- запускал руками этот блок и прослушивал с ПЛК состояние устройства (когда двигатель запущен - устройство постоянно отсылает свой статус в порт) - в порт шло то, что нужно;
- отправлял команду с компьютера в порт и просто слушал сам порт - тоже получал правильный ответ;
- отправлял команду, к примеру, задания скорости вращения, из КоДеСис и слушал порт с помощью ПЛК и собирал то, что шлет устройство в массив - вот тут этот байт и всплывал.

capzap
07.10.2013, 12:45
в порт шло то, что нужно или то что хотели услышать? Возьмите и пошлите свой запрос с добавлением этого байта, несложно ведь, больше времени потратили на писанину, чем попробовать

Сергей Сподрин
08.10.2013, 15:23
И нет, ничего не получилось все равно. Такое чувство, что просто происходит ошибка при передаче команды, но она не видна, т.к. SetByte свою задачу выполняет.