Форум программистов, компьютерный форум, киберфорум
КИП, датчики
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/65: Рейтинг темы: голосов - 65, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88

Работа с весовым терминалом CI-5010A по RS-232/422

08.09.2014, 15:42. Показов 13976. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане! Я только начинаю изучение c, программирование микроконтроллеров!

Мне поставили такую интересную задачу - наглядно вывести данные с Com-порта весового устройства.


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

Трудности:
Отсечь лишние. В день может быть примерно 10-20 взвешиваний тяжелых машин. Но мне не надо (3*60*60*24) данных веса за 1 день.
Т.е. выводить бы примерно каждые 3 секунды или только когда будет взвешивание.
Ноль, который будет бОльшую часть времени не нужен.

Взвешивание:
Грузовик заезжает на платформу. Весы моментально реагируют и пулеметом выстреливают (примерно 3 раза/сек) данные - нарастающий вес. Когда грузовик останавливается, вес успокаивается в верхней точке. НО, он может колебаться +- несколько десятков кг. Так устроено оборудование. Затем он уезжает, вес стремительно уменьшается до +-нуля.

Ребят, помогите. Задача интересная, но я сам не осилю.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.09.2014, 15:42
Ответы с готовыми решениями:

Автономная работа с весовым терминалом по RS-232
Здравствуйте! На весах есть выход COM, Hyper Terminal-ом удается считать с него данные такого вида 0000.10 -00.001, задача заключается...

Работа с весовым терминалом в qt
Здравствуйте, дорогие друзья. Краткая история. Имеется у меня программа (делал в QT), рассчитанная на работу на абз, конкретнее на...

Преобразователь интерфейсов RS-232/422/485 ADAM 4542+
Добрых суток Спецы. Вопрос вот в чем: есть два ADAM 4542+, есть турникеты с 485 интерфейсом и есть сервер с платой расширения на 485...

46
 Аватар для vantfiles
1018 / 1913 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
08.09.2014, 17:44
Задача и правда интересная. Я бы разбил ее на три части - определение событий "машина приехала", "машина уехала" и "машина на платформе".

Первые два определить просто - невесомых машин не бывает, можно выставить порог срабатывания, ниже которого мы считаем, что на платформе ничего нет.

В верхней же точке я бы применил апериодический фильтр первого порядка - и как только на его выходе изменение сигнала станет меньше некоего заданного - производить запись.

PS: если нужно подробнее, могу набросать на си что и как.
1
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88
08.09.2014, 21:41  [ТС]
vantfiles, Был бы очень благодарен!

Уже подумывал выводить данные просто каждые 5 секунд. Залез в программирование последовательного порта - так там вообще тьма тьмущая..) Сам в С не особо) так там совсем мрак)
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
08.09.2014, 23:09
1- укажите наименование весового терминала (контроллера) и ссылку на его описание, документацию.
2- приложите полный дамп посылок с весового терминала в теме в текстовом виде и в виде HEX, снятом PortMon-итором, начиная с момента отсутствия машины на платформе, далее ее заездом и съездом. Дамп должен быть полным, т.е. даже с настройками порта, это делает с успехом PortMon.
3- из опыта общения с разного рода весами, поток они гонят постоянно по последовательному порту с неизменной структурой (не считая аварийные сигналы) прямо в аски, меняются лишь данные. Но далеко не факт, также возможны и различные предварительные команды инициализации.
4- задача ваша должна быть разделена на подзадачи: получение данных с порта, накопление данных, фильтрация и выборка, далее логгирование в файл.

Рекомендую

Работа с COM-портом с помощью потоков.pdf
Литература по ЦОС и алгоритмам
0
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88
09.09.2014, 08:43  [ТС]
raxp

1. Этот зверь CI-5010A.pdf
http://cas.ru/4_tehn/pdf/CI-5010A.pdf
http://www.scale.ru/UserFiles/... -guide.pdf
2. Скачал PortMon. Как понял, мне нужно - connect, выбрать hex, сделать Log to file as... ?
4. Думаю, на первый раз достаточно просто выводить данные каждые 3 секунды.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
09.09.2014, 09:20
1- согласно описанию фича цифровой фильтрации встроена в сам весоизмерительный терминал (F04, F10 вплоть до усреднения). Среди прочего режим передачи определяется F14 (непрерывная, передача после успокоения и в ждущем).
2- да.
4- рано об этом думать, да и при активации фильтрации возможно и не нужно.

Протокол обмена (стр.16): 8 бит данных, 1 стоп-бит, 0 бит проверки четности.
Код данных ASCII.
Скорость обмена данными : 1200 бит/с - 19200 бит/с.
Данные форматируются в сообщение длиной 22 байта:


p.s.: под DOS примеры считывания в руководстве, а под винды - см. в приложенной мною книженции.
Вложения
Тип файла: pdf CI-5010A.pdf (739.6 Кб, 45 просмотров)
0
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88
09.09.2014, 11:26  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Программа передачи данных на языке C:
#include <bios.h> 
#include <conio.h> 
#define COM1 0 
#define DATA_READY Ox100 
#define TRUE 1 
#define FALSE 0 
#define SETTING ( 0x00 ⎪ 0xE0 ⎪ 0x00 ⎪ 0x03 ) 
int main(void) 
{ 
 int in, out, status, DONE = FALSE; 
 bioscom(0, SETTING, COM1); 
 cprintf(". . . BIOSCOM [ESC] to exit . . .\n); 
 while(!DONE) 
 { 18
 status = bioscom(3, 0, com1); 
 if (status & DATA_READY) 
 if (( out = bioscom(2, 0, com1) & 0x7F) ! = 0) 
 putch(out); 
 if ( kbhit()) 
 { 
 if ((in =getch()) == '\x1B') 
 DONE = TRUE; 
 bioscom(1, in, COM1); 
 } 
 } 
 return 0; 
}
Добавлено через 44 секунды
Вот что нашел в руководстве. Комрады, помогите с программкой
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
09.09.2014, 11:56
...мда уж, камрад. Об этом я упомянул в посте выше, а вы под виндами. На книженцию ноль внимания по работе с потоками и COM-портом в виндах, а между тем там готовые примеры.

Где дамп полный? Жду.
0
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88
09.09.2014, 13:31  [ТС]
raxp
Где дамп полный? Жду.
Еду на предприятие...

raxp
Где дамп полный? Жду.
Еду на предприятие...
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
09.09.2014, 21:56
...пока вы там едете, я уже библиотеку считывания и дешифровки данных написал. Мне нужны реальные данные, ибо в жизни часто оказывается в протоколе одно, а на деле есть нюансы.

Добавлено через 8 часов 1 минуту
...ехали, ехали и заблудились

Альфа: https://sourceforge.net/projec... allci5010/
По-прежнему жду дамп и видео всего процесса.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
11.09.2014, 15:41
1
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88
11.09.2014, 16:15  [ТС]
raxp
Спасибо, что откликнулись! Правда, не от меня все зависит. Снимает показания друг, который на днях должен это сделать. Попросил его сделать всё как Вы сказали. Я сам в режиме ожидания...
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
11.09.2014, 16:26
1- оки, оки ...альфу-то готовую ему передали c последнего релиза https://sourceforge.net/projec... t/download ?
2- смотрю вы на два фронта
0
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88
12.09.2014, 13:15  [ТС]
друг на объекте, пытается подключится portmon'ом, пока что-то не выходит...

Добавлено через 16 минут
сейчас прописывает

Добавлено через 3 часа 14 минут
raxp Свершилось! Надеюсь это то самое, что ты просил!

https://yadi.sk/d/5GuMSjoBbSHWn
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
12.09.2014, 18:09
...что-то нестыковка в логах. См. MEDIA.LOG в HEX:
90760 10:02:53 ttermpro.exe IRP_MJ_READ Serial6 SUCCESS Length 22: 53 54 2C 47 53 2C 30 BE 2C 20 20 20 20 20 20 20 30 20 6B 67 0D

90773 10:02:53 ttermpro.exe IRP_MJ_READ Serial6 SUCCESS Length 22: 53 54 2C 47 53 2C 30 BE 2C 20 20 20 20 20 20 20 30 20 6B 67 0D

90786 10:02:53 ttermpro.exe IRP_MJ_READ Serial6 SUCCESS Length 22: 53 54 2C 47 53 2C 30 BE 2C 20 20 20 20 20 20 20 30 20 6B 67 0D
написано буфер на 22 байта, а приходит 21, последний 22-й байт 0x0A сжевало.

Теперь смотрим лог Portmon.log в символьном:
9:57:43 SUCCESS Length 22: ST,GS,0., 0 kg..
тут "ST,GS,0., 0 kg.." 22 символа, т.е. 22 байта. Потом чуть дальше в этом же логе:
10:00:54 SUCCESS Length 22: 53 54 2C 47 53 2C 30 BE 2C 20 20 20 20 20 20 20 30 20 6B 67 0D
написано 22, а отображено 21 байт, 0A снова съело. Чудеса.

У меня в библиотеке идет проверка строго по протоколу на 22 байта, либо сразу, либо накоплением с проверкой на начало и конечные символы. Ваш друг снял дамп 'dump.txt', создаваемый моей либой автоматически из прилагаемого демо-примера? В вашем архиве их не вижу, там временные метки (см. видео на сурсфорже).

Добавлено через 15 минут

Не по теме:

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

1
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88
12.09.2014, 20:37  [ТС]
Я понял, что здесь тема грамотней развивается, ибо ты спрашиваешь конкретные вопросы и я стараюсь ответить, предоставить инф-цию) понял, что на том форуме (я постил еще + на парочке), работа создается методом проб и ошибок и когда настанет финал, народ, скорее-всего, спросит подобный вопросы о конкретных пересылаемых данных)

Добавлено через 3 минуты
Друг одновременно поставил на запись - в тера терм снимались буквенные символы, в port mon нажал на "hex", т.е. были видны 1 и 0лики. Только portmon реагировал когда запускался terminal, а так ничего не отображал. Скинул два файла с каждой программы.
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
12.09.2014, 21:11
Portmon - это сниффер того, что пересылается по уже занятому порту. По сути это монитор, который позволяет подсмотреть за фактически пересылаемыми данными, даже если порт монопольно занят другой программой.

Добавлено через 13 минут
...модифицировал библиотеку с учетом возможного несоответствия протоколу. Забирайте готовый комплект https://www.cyberforum.ru/blog... g2693.html с примером ее использования и исходниками (ссылки прежние).
1
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88
13.09.2014, 21:17  [ТС]
raxp
Portmon - это сниффер того, что пересылается по уже занятому порту. По сути это монитор, который позволяет подсмотреть за фактически пересылаемыми данными, даже если порт монопольно занят другой программой.

Добавлено через 13 минут
...модифицировал библиотеку с учетом возможного несоответствия протоколу. Забирайте готовый комплект https://www.cyberforum.ru/blog... g2693.html с примером ее использования и исходниками (ссылки прежние).
raxp
Спасибо большое тебе за грандиозную работу!)) Возможно, последний вопрос в студию) У меня есть Borland C++ Builder 6.0. как на нем скомпилировать программу, мог бы cpp или что-то в этом роде скинуть, чтобы я просто com порт поменял и скомпилил? Как уже говорил, не силен я в этой теме, поэтому, возможно, столь интересные вопросы задаю)
0
 Аватар для raxper
10236 / 6614 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
14.09.2014, 00:08
COM порт задается при подключении в процедуре инициализации библиотеки, вы вольны задавать такой какой вам будет нужно, если он свободен в ОС. Подключать либу вы можете из любого языка в среде Windows. Хотите дядюшку Борланда BCB? А как же понимание механизма динамического использования библиотек и маршаллинга?

Оки, оки, вот вам под С++ Builder IDE 6 (накидал по-быстрому, красявости сами добавите):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma link "Grids"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
 
// ГЛОБАЛЬНЫЕ ---------------------------------------------------------------
 
HINSTANCE LibHandle;
 
// описываем прототипы функции согласно соглашению STDCALL (см. мое описание)
typedef void (__stdcall *getdata)(unsigned char *& mode,
                                  unsigned char *& weight,
                                  unsigned char *& weightu,
                                  byte & numdevice,
                                  byte & stable,
                                  byte & high,
                                  byte & loww,
                                  byte & hold,
                                  byte & gross,
                                  byte & tare,
                                  byte & zero,
                                  double & vvalue,
                                  int & glcount);
 
typedef void (__stdcall *reinit)(byte comnum,
                                 int baud,
                                 boolean enable,
                                 boolean log);
 
FARPROC agetdata;
FARPROC areinit;
 
unsigned char * mode;
unsigned char * weight;
unsigned char * weightu;
byte numdevice;
byte stable;
byte high;
byte loww;
byte hold;
byte gross;
byte tare;
byte zero;
double vvalue;
int glcount;
 
 
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 LibHandle = LoadLibrary("test\\CI5010RS422.dll"); // указание отн.пути в билдере
 if (LibHandle!=0) {
  agetdata = GetProcAddress(LibHandle, "getdata");
  areinit = GetProcAddress(LibHandle, "reinit");
 
  ((reinit)areinit)(5,
                    9600,
                    true,
                    true);
  Form1->Caption = "ok";
 }
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
if (LibHandle) {
  // деактивируем поток захвата
  ((reinit)areinit)(5,
                    9600,
                    false,
                    false);
 
  FreeLibrary(LibHandle);
  }
    
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (LibHandle!=0) {
  // визуализация
  Memo1->Clear();
 
  ((getdata)agetdata)(mode,
                      weight,
                      weightu,
                      numdevice,
                      stable,
                      high,
                      loww,
                      hold,
                      gross,
                      tare,
                      zero,
                      vvalue,
                      glcount
                      );
        
   // отобразить результаты
   Memo1->Lines->Add("Packet: " + IntToStr(glcount));
 
   Memo1->Lines->Add("Mode work: " + AnsiString((char *)mode));
   Memo1->Lines->Add("Weight brutto/netto: " + AnsiString((char *)weight));
   Memo1->Lines->Add("Weight unit: " + AnsiString((char *)weightu));
 
   Memo1->Lines->Add("Value: " + FloatToStr(vvalue));
  }
 
}
//---------------------------------------------------------------------------
Пример отработки либы из BCB прожекта:


p.s.: прожект под C++BCB добавлен в архив по прежним ссылкам.
0
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88
14.09.2014, 22:19  [ТС]
raxp
Под прикольную музыку, всё красиво и понятно) Скачал прожект. Следующий этап ехать к другу, там установить билдер, в соответствие с используемым ком портом выставить значение в процедуре 'reinit()'. Лог я как понял сейчас true и все ок. Далее, скомпилировать и, собственно, загнать фуру на весы)

Большое тебе спасибо за громадную работу! Друг-программист когда узнал что мне надо, сказал, что это задача решаема только дядьками с большими бородами с бубном подмышкой)))

Как приеду на завод, взвесимся, обязательно отпишусь! (надеюсь завтра-послезавтра)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.09.2014, 22:19
Помогаю со студенческими работами здесь

Работа с терминалом
Всем привет, по случаю окончания зимних праздников хочу спросить уважаемых знатоков: Вот код: import subprocess subprocess.call() ...

Работа с терминалом
На хабре есть статья http://habrahabr.ru/post/143341/ &quot;Консоль для маководов&quot;. При встрече с первой командой, что устанавливает Midnight...

Работа с терминалом
Привет. Меня тут взяли на работу по компам. А у них там еще и терминал стоит (сенсорный манитор). Дак вот. Я даже не знаю как там им...

работа с терминалом
1. UNIX. Разработать программу, осуществляющую взаимодействие с терминалом через специальный файл устройства /dev/tty. Программа должна...

Работа с платежным терминалом
Здравствйте. Кто сталкивался, подскажите, есть ли библиотеки и примеры на C# для подключения и работы с терминалом приема карт (POS...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru