Консультация № 184862
19.12.2011, 21:32
167.35 руб.
0 31 0
Здравствуйте, уважаемые эксперты! Прошу у Вас консультации не много не по теме возможно, но тем не менее надеюсь на помощь.
На просторах интернета отыскал такой девайс Jerom Заказал, получил. Хочу его использовать для своих нужд (подкупило что можно использовать WI-FI), вроде и описание есть и примеры на С+. Но как с Delphi подружить?! Как говорится новичек в програмировании. Я так понимаю нужно и сервер и клиента делать в моем приложении. На этой странице есть пример на С+ Пример на С+ Подскажите если возможно. Заранее благодарю за советы.

Обсуждение

давно
Посетитель
352040
133
20.12.2011, 08:17
общий
Забыл добавить. В управлении используются "КЕ" команды.
Из мануала.
Для управления модулем Jerome предназначен набор команд в текстовом формате,
называемых КЕ командами. Для управления модулем с помощью KE-команд необходимо
установить сетевое соединение с адресом 192.168.0.101 (по умолчанию) по порту 2424. После
успешного установления соединения можно отправлять управляющие команды и получать
ответы модуля.
В качестве программного обеспечения можно использовать любую терминальную
программу позволяющую устанавливать сетевое соединение по протоколу TCP/IP, например
программу HyperTerminal, по умолчанию входящую в состав ОС Windows.
Для защиты модуля от несанкционированного доступа в нем реализована система
контроля доступа с помощью пароля. Модуль не выполняет команды управления до тех пор,
пока не будет введен пароль (можно провести аналогию с консолью ОС Linux).
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
20.12.2011, 09:34
общий
Адресаты:
Привет, всё выглядит довольно просто.. главное - соединится.
там в приложении 2 програмки jerom - это стандартный клиент и Project1.exe - это не менее стандартный сервер
адрес и порт устройства ты знаешь - укажи, нажми "Aplicar" и пошли устройству КЕ команды из списка.
главное - получить ответ.
Прикрепленные файлы:
bedd01c5e9598efa6d940face201ac50.rar
давно
Посетитель
352040
133
20.12.2011, 10:17
общий
Спасибо Алексей. Програмка Jerom пишет что коннект есть, а вот передать команду не получается. Можно попросить выложить исходники программ?
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
20.12.2011, 17:42
общий
Вероятно, придётся посмотреть исходники на С...
Пробовал подключиться "сервером" - Project1.exe?
*исходники
я использовал TClientSocket и TServerSocket со вкладки Internet... но ты их там не найдёшь.
дабы они там появились, нужно открыть Component / Install Packages -> Add
и добавить c:\Archivos de Programa\Borland\Delphi7\Bin\dclsockets70.bpl
если вдруг чего-то не обнаружится, то можно скачать отсюда
http://zetblog.ru/forum/downloadf/components/dclsockets70.rar
Конечно, в принципе, 2-х приложений быть не должно... и не будет.
Прикрепленные файлы:
c7dd8b90555a5aca95217af0c9d5e8f6.rar
давно
Посетитель
352040
133
20.12.2011, 19:13
общий
Благодарю еще раз Алексей за помощь. За исходники так же. TClientSocket и TServerSocket со вкладки Internet у меня уже открыты. Пытаюсь сам разобраться. Подключится с помощью TClientSocket у меня получилось (если верить индикации). Я сделал так
Код:
procedure TForm1.CS1Connecting(Sender: TObject; Socket: TCustomWinSocket);
begin
Shape3.Brush.Color:=clLime;
end;

procedure TForm1.CS1Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
Label1.Caption := 'Подключен';
end;


Еще вопрос по подключению. Я отключаю девайс, а программа пишет что соединение установленно? Как такое возможно?

И еще, вот как и было написано выше ПРИМЕР на С+

Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
20.12.2011, 22:30
общий
если девайс отключён, то клиент должен выдать ошибку 10061 при попытке подключения...
если программа пишет, что подключение установлено, то значит, что подключилась к чему-то другому.
я думаю, что девайс создаёт подключение типа сервер. поэтому нужно использовать подключение типа клиент (jerom.exe)
1. девайс отключён
1.1 запустить Project1.exe затем jerom.exe. проверить подключение, используя настройки (порт) аналогичные девайсу.
2.1 закрыть Project1.exe. jerom.exe должен выдать ошибку 10061 при подключении - подключаться некуда.
2.2 подключить девайс и установить соединение через jerom.exe.

было бы любопытно попробовать CMD -> ping

в любом случае, качай KeTerm http://www.kernelchip.ru/articles/KA005.php
проверив соединение избавишься от сомнений, что уже хорошо.

в примере на С+ используются сокеты WinSockets API.. эта тема уже была затронута на этом форуме.
если не подключится TClientSocket, можно поменять.
Неизвестный
23.12.2011, 22:18
общий
Адресаты:

Скажите, пожалуйста, вы решили вопрос? Будете отвечать, или продлить надо?
Неизвестный
24.12.2011, 03:19
общий
нет, я этот вопрос не решил. Это простой вопрос, но
Чтобы сделать следующий шаг, нужно знать результат предыдущего.
Есть большая вероятность того, что Владимир разобрался сам, возможно, с использованием исходников, которые я выложил.
Но выложенные исходники можно классифицировать как помощь в решении а не решение.
На счёт целесообразности продления вопроса стоит спросить у владимира.
давно
Посетитель
352040
133
24.12.2011, 10:32
общий
Продлеваем вопрос. Еще не решил вопрос с управлением. Если верить индикации то подключение к модулю осуществляется. А вот отправить какую либо команду не получается.
Информация что подключился я получаю так
Код:
procedure TForm1.CS1Connect(Sender: TObject; Socket: TCustomWinSocket);
begin
Shape1.Brush.Color:=clLime;
Label1.Caption := 'Подключились';
BitBtn2.Enabled:=True;
logs('Подключились');
end;


А так я пытаюсь послать команду
Код:
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
CS1.Socket.SendText(ComboBox1.Text);
end;

В ComboBox1 у меня команда "$KE"
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
24.12.2011, 19:09
общий
Адресаты:
Пример на С+ работает с Winsock2.h, что есть аналог стандартного модуля WINSOCK в DELPHI
по WINSOCK смотри вопрос № 184655
на самом деле особой разницы нет - в обеих случаях должно работать.
ты не ответил на предыдущий вопрос...
1. при отключённом девайсе программа должна выдавать ошибку при подключении.
2. проверь соединение программой, предложенной продавцом KeTerm http://www.kernelchip.ru/articles/KA005.php
исходя из этих двух шагов можно идти дальше.
пока-что всё выглядит просто.
но за неимением доступа к ентой штуковине придётся задать ещё пару вопросов..
давно
Посетитель
352040
133
24.12.2011, 19:24
общий
24.12.2011, 19:27
Благодарю за внимание к моему вопросу. Процесс управления у меня получился. Подсказали на форуме. Управление не сложно организовать, все получилось. Подача лог 1 на первый канал
Код:
CS1.Socket.SendText('$KE,WR,1,1'#13#10); 
Где CS1: TClientSocket;
У меня теперь вопрос, как из потока выдернуть данными, но там прибор подключается к USB и определяется как СОМ порт. Если можно подскажите.Выбор данных с АЦП в потоке данных.
Если я отправляю запрос
Код:
CS1.Socket.SendText('$KE,ADC,1'#13#10) 
Вижу ответ в Мемо, а мне нужно данные из АЦП записать в Edit, как в приммере по ссылке.
Код:
Memo1.Text:=Socket.ReceiveText;
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
24.12.2011, 19:42
общий
24.12.2011, 20:01
Адресаты:
здрасти вам...
во первых, свойство "text" есть и у Tmemo и у Tedit, так что можно записать
Edit1.text := Socket.ReceiveText;
или взять из Memo... Edit1.text := Memo1.Lines.Strings[0]
что довольно криво, но может быть полезно во время отладки.
в принципе, вопрос решён.
соединение установлено.
осталось написать удобный интерфейс, с чем проблем у тебя быть не должно.
если требуется помощь по этой части - кидай твой исходник, дабы подключить команды.
Неизвестный
25.12.2011, 00:05
общий
Адресаты:
Прошу прощения, не успела продлить, не могла выйти в Интернет. Можете либо тут обсуждение продолжить, либо задать его повторно.
давно
Посетитель
352040
133
25.12.2011, 20:26
общий
25.12.2011, 20:31
Совсем уже заработался.
Вопрос опять о снятии данных с АЦП.
Так я отправляю запрос на снятие показаний с АЦП-1.
Код:
procedure TForm1.Button4Click(Sender: TObject);
begin
CS1.Socket.SendText('$KE,ADC,1'#13#10);
Edit1.Text:=s;
end;

Код:
procedure TForm1.CS1Read(Sender: TObject;Socket: TCustomWinSocket);
begin
s := Socket.ReceiveText;
end;

В Edite я получаю такой ответ
Код:
#ADC,1,0271

Если по нормальному на АЦП-1 0271 вольт.
Можно сказать что ответ я получаю, но мне нужно получить другой результат, без #ADC,1.
На этой странице есть пример как правильно сделать. Но тут опять работа с СОМ портом. Как приведенный пример привязать к моему случаю? У меня работа идет через Ethernet порт. Может у специалистов быстрее получится разобратся. Заранее благодарю за ответ.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
25.12.2011, 21:00
общий
откуда взялась эта формула ( ADCFloat := (StrToInt(ADC_Res)/1024)*5;) - не понятно
но, если так преобразуют ответ в примере, то , вероятно, так и должно быть.
тут прикреплена програмка, которая разбирает твой ответ на части
в принципе, это тоже самое, что в примере, но с привязкой к твоей программе
(исходника которой у меня нет)
просто скопируй кусок кода - переменная "s" - получит данные не из Edit а из Socket.ReceiveText
и все дела.
Прикрепленные файлы:
b45822e87492884d67f5641b80e041ec.rar
давно
Посетитель
352040
133
26.12.2011, 08:33
общий
Еще раз благодарю за помощь Алексей. Сегодня переделаю Ваш код как нужно мне, и выложу на сайт "тестовую" версию. Ваша програмка прекрасно "разделяет" входящие данные.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Посетитель
352040
133
26.12.2011, 13:46
общий
26.12.2011, 13:48
Снова к Вам обращаюсь Алексей. Эта формула (( ADCFloat := (StrToInt(ADC_Res)/1024)*5;) )берется для расчета температуры. Не до конца я написал. С помощью этой формулы производится расчет. К этому устройству можно подключить [http://www.kernelchip.ru/KTS-1.php]датчик температуры[/url]. И в программе получить такое окно Вот и пытаюсь их подружить, но не получается.
Тут еще нюанс, что нужно проверять в потоке данных что есть "#ADC,1" и тогда вытаскивать эти данные. После подачи какой либо команды, от модуля приходит ответ. К примеру чтобы начать работу с модулем, нужно подать на него пароль для авторизации. Подаю пароль, в ответ получаю
Код:
#PSW,SET,OK
Авторизовались, даю запрос на снятие показаний с канала1
Код:
CS1.Socket.SendText('$KE,ADC,1'#13#10);

данные в сокете считываются и снимаем "ОК", получаю ошибку. Понаписал!!! Прицепил свой тестовый вариант, уж не ругайте сильно .
Програмка позволяет подключатся, подавать команды, просматривать ответы от модуля. А вот как получить температуру?
Прикрепленные файлы:
9bca5fd8d4f4dcbfc6d2b8638d41bb98.rar
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
26.12.2011, 21:25
общий
Адресаты:
привет! тебе нужно обрабатывать данные, исходя из контекста - типа, что там должно быть..
то есть в принципе, стоит в начале настроить программу - указать какой порт устройства чем занимается
а потом посылать и считывать данные.
ошибки в моём примере (который тут прицеплен)
1. подсчёт напряжения в примерах на Delphi и C++ различается (я оставил оба варианта)
2 подсчёт температуры в примере на С++ использует оператор "log" что-то я его не помню..
избавление от ошибок:
я просто прицепил формулы из примеров.
нужно прочитать описание устройства и взять формулы от туда.

Прикрепленные файлы:
92eccebd50424402a40c4b2107b3f84a.rar
давно
Посетитель
352040
133
27.12.2011, 17:02
общий
27.12.2011, 17:10
Еще раз благодарю за помощь Алексей. Переделал как Вы посоветовали. Можно сказать, работает. По портам если верить мануалу на устройство, работает через порт 2424, хотя смотря на сетевую активность в Касперском, портов работает несколько. Меня интересует управление и снятие температур. Так что пока достаточно. На данном этапе показывает температуру в момент включения таймера, больше изменений в Edite нет . На Мемо я вижу что данные меняются, а вот в Edite не хотят показания менятся. Что я тут накосячил? Мой проект в прицепе.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Посетитель
352040
133
27.12.2011, 17:11
общий
Забыл проект прицепить
Прикрепленные файлы:
d4e659ade54d91602ec79c69a6ac06fa.rar
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
27.12.2011, 19:04
общий
Привет, тут
(*)логическая ошибка в коде
которая, вообщем-то незаметна.. но всё равно -стоит исправить
f i > 5 then break; - прерывает цикл в случае, если не обнаружено запятой на разумном отрезке
иначе можно получить бесконечный цикл (который конечно кончится, когда дочитает данные из "S")
дело в том что i := 6; до цикла и if i > 5 сработает при первом проходе.

(**) содержимое окна может не меняться в связи с проверками на '#' и 'ADC' - будет понятнее, если в случае
отрицательного результата программа выдаст сообщение
а в принципе. просто прогони по шагам.

это разборка "гипотетического" ответа устройства - у меня нет на руках реальных ответов устройства на запросы.
поэтому возможна необходимость ..настройки.
на самом деле - это очень простая задача. наверняка, ты легко с этим справишься.
если что - можно скопировать ответы устройства в текстовый файл из Memo1
(вместе с запросами, на которые были получены эти ответы, конечно)
с таким списком можно протестировать программу.
единственно что "непечатные" символы не отобразятся в Memo - если они присутствуют, то этот способ не годится.



CS1.Socket.SendText('$KE,ADC,1'#13#10);
Memo1.Text:=s;
{s := edit2.Text;
}if s[1] = '#' then begin
if copy(s,2,3) = 'ADC' then begin
i := 6;
while s[i] <> ',' do begin
if i > 5 then break; // (*) if i > 10 then break;
inc(i);
end;
inc(i);
s := copy(s,i+1,length(s));
Vadc:=f/1023.0*3.3;//
RT:= (Rm*Vadc)/(3.3 - Vadc);///
f := (3988.0/({log}(RT/3000.0) + 3988.0/298.0))-273;//
Form1.Edit1.Text := FormatFloat('0.0000 C"',f);
end; // (**) else Form1.Edit1.Text :=' No ADC';
end; // (**) else Form1.Edit1.Text :=' No #';
end;
давно
Посетитель
352040
133
27.12.2011, 19:19
общий
27.12.2011, 19:22
Понимаю что без устройства на руках тяжело что то советовать. Но тем не менее Ваши советы дали хороший рузультат для меня. Сейчас попробую поигратся с циклом. Может вообще его убрать? Пусть таймер отправляет запрос и проверяет. Там команд не так и много, если есть интерес посмотрите, там есть докумен с описанием команд.
Пример из мануала.
Код:
Пример:
Установим высокий уровень напряжения на линии ввода/вывода под номером 16:
запрос: $KE,WR,16,1
ответ: #WR,OK

Как говорится, все "просто". Нечатные" символы которые не отображаются в Мемо при подачи команды, перевод строки (#13#10). А так в Мемо отображается как в примере ($KE,WR,16,1) без (#13#10), ну и соответсвенно ответ (#WR,OK).
Благодарю за помощь. Отпишусь о результате.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Посетитель
352040
133
27.12.2011, 21:29
общий
27.12.2011, 21:30
Отыскал ошибку в коде. Опять же в расчете температуры.
Код:
Vadc:=f/1023.0*3.3;

Тут f входной аргумент, то есть s
Если я ставлю s то получаю такую ошибку
Код:
 Unit1.pas(185): Incompatible types: 'String' and 'Extended'

Что собственно и должно быть, так как S обьявлена как String. Как мне с этой ошибкой справится?
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
27.12.2011, 22:31
общий
привет!
я слегка занят - часов через 6 выложу подправленную программку..
хотелось бы по-больше ответов устройства типа

Установим высокий уровень напряжения на линии ввода/вывода под номером 16:
запрос: $KE,WR,16,1
ответ: #WR,OK

на основании этих данных уже можно что-то сделать
давно
Посетитель
352040
133
29.12.2011, 18:40
общий
Здраствуйте Алексей. Наработал такой код (все в приложении, ошибка тоже). Но есть ошибка при работе от устройства. При тестировании с Edit2 все вроде нормально, подключаю устройство, и ошибка. Посмотрите, может подскажите.
Прикрепленные файлы:
73ce81eb2d554c9289d72f70bc04306f.rar
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
03.01.2012, 03:34
общий
Адресаты:
Привет!
... работы было многовато.
- ошибки не смотрел, но набросал, как на мой взгляд, могла бы выглядеть программка..
посмотри вторую вкладку - там в общем и целом всё работает.. или почти всё.
может, даже, заработает с устройством. на самом деле - это просто пример незамысловатого оформления.
Прикрепленные файлы:
bce8c44e3f9bb484f762a4f6d9359cca.rar
давно
Посетитель
352040
133
03.01.2012, 12:01
общий
Здраствуйте Алексей. Ваш вариант работает. Измеряет напряжение, температуру. Пробую перенести в свою програму, при работе с устройством выбираю "Модуль Jerom" жму "Verify", ошибку выдает. Не нравится ему тип данных. Если данные из Edita, ошибки нет. Все в архиве. Посмотрите мой код, может укажите ошибку.
Прикрепленные файлы:
888a74b62e06ff0098840b3af610317f.rar
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Посетитель
352040
133
03.01.2012, 16:32
общий
03.01.2012, 16:42
Еще раз здраствуйте Алексей. Не получается победить у меня сие чудо прибор. Тут еще обратил внимание на такой момент. При получении данных от устройства, данные разделяются вроде корректно, тип данных, номер канала. А вот сами данные, получается ерунда. В окне я их вижу (в приложении 0368), ну ошибка выходит это понятно. Пытаюсь стереть данные из окна клавишей Backspace, удаление происходит после третьего нажатия. То есть два нажатия клавиши проходят без последствий, не удаляет цифры. Если брать данные из Edit2, то нет ошибок. Прошу Вас посмотреть мой код, правильно ли у меня идет разделяются входные данные.
Прикрепленные файлы:
60e0883ceccac8f3988450d49cc5c43f.jpg
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Неизвестный
03.01.2012, 19:09
общий
привет! тут и смотреть-то нечего..
или используй функцию s :=trim(s) - она вычистит все "непечатные символы" из текста
или копируй 4 символа после запятой (если уверен, что данные - это всегда 4 символа
s :=copy(s,pos(',',s)+1,4)
в моём варианте нужно проверить формулы преобразования данных с устройства в напряжение и температуру.
я их взял из одного из примеров, который может содержать ошибки.
давно
Посетитель
352040
133
03.01.2012, 19:41
общий
04.01.2012, 13:36
Благодарю за помощь Алексей. Все получилось. Вот код который я вставил в таймер. Все работает. Если нужно, код подправлю, и завтра выложу.
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin

CRbyte := 13; // HEX 0x0D
LFbyte := 10; // HEX 0x0A

CS1.Socket.SendText('$KE,ADC,1' + Char(CRbyte) + Char(LFbyte));
Sleep(500);
Memo1.Text:=s;

If RadioButton1.Checked = true
then
z:=edit2.Text
else
z := CS1.Socket.ReceiveText;

{z :=trim(z);
}
i := pos(',',z);
if copy(z,0,i-1) = '#ADC' then begin///Если данные от АЦП
z := copy(z,i+1,length(z));
i := pos(',',z);
if copy(z,0,i-1) = '1' then begin///Если это данные с первого канала АЦП
z := copy(z,pos(',',z)+1,4);///Собственно данные от АЦП

RM :=5060.0;
Vadc:=StrToFloat(z)/1023.0*3.3;///Расчет напряжения АЦП в вольтах
RT:= (Rm*Vadc)/(3.3 - Vadc);///Расчет сопротивленипя терморезистора в омах
f := (3988.0/({log}(RT/3000.0) + 3988.0/298.0))-273;///Расчет температуры в градусах Цельсия
{DecimalSeparator:='.';///Ставим разделителем точку вместо запятой (если критично)
}Form1.Edit1.Text := FormatFloat('0.0000 C"',f);///Вывод температуры
end;
end;
end;
Об авторе:
Пользуюсь Delphi Enterprise Version7.
Форма ответа