powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
25 сообщений из 26, страница 1 из 2
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37082370
floboss444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, All.

Предлагаю всем желающим подключиться к моему проекту. Конечной целью проекта
является написание програмки под Windows которая будет отображать на окне
все мгновенные показания с Вычислителя расхода Floboss 103 (Emerson)

Та текущий момент сделана оболочка программы. При старте программы автоконектится
СОМ порт № 3, ну ещё можно отправить пачку данных в порт (неизвестно кому и неизвестно куда :)).

Текущая задача - научиться формировать в памяти запрос и отсылать данные в вычислитель Floboss103
посредством MODBUS RTU команд и научиться принимать ответ с последующей расшифровкой
в десятичном формате с выводом на экран.

Вопросов на данный момент куча: 1) в каком адресном пространстве floboss103 находятся
данные, даже зная через фирменную утилиту (ROCLINK 800) адресса там как-то что-то смешается.
2) как формировать запрос с последующей отсылкой в "СОМ порт" 3) и т.д...
В общем если кто-то занимался подобным - подсобите чем могете.
Если кто-то занимается сейчас чем то подобным присоединяйтесь к моему проекту (одному мне скучновато :)

*вложил проект для Borlan builder C++ 6.0. Проект компилируется без проблем...


Borlan builder C++ 6.0 + библиотека для COM порта + MODBUS RTU для
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37082372
floboss444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
архив не прикрепился.
исправляю..
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37083139
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
floboss444,

Найди описание протокола.
Сниффером посмотри, какик запросы формирует фирменная утилита(или найди доку).

Вообще типовая задача и решается без изобретений велосипедов. Но для себя написать полезно.
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37083932
floboss444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemargl,

Что такое "сниффер" ?
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37083940
floboss444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemarglfloboss444,

Найди описание протокола.
Сниффером посмотри, какик запросы формирует фирменная утилита(или найди доку).

-что такое "сниффер" ?

Вообще типовая задача и решается без изобретений велосипедов.

-ты знаешь где можно посмотреть готовое решение этой "типовой" задачи?


Но для себя написать полезно.

- ты писал что-то подобное, я правильно тебя понимаю?
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37084025
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
floboss444Siemargl,

Что такое "сниффер" ?
Сниффер, это например /serial-port-monitor

Писал. Написался разных протоколов до полного удовлетворения )
Для разных систем и приборов.
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37084116
floboss444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemargl,

Поделись кодом, не будь жадиной :) интересуют MODBUS запросы в COM порт.
или что нибудь около того. моё мыло dbfone@mail.ru , или сссылку на архив чиркни.
буду бесконечно тебе благодарен.
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37084223
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
floboss444,

Не поделюсь. Такой win32 код у меня старый и некрасивый.
Суть одна - сформировал пакет - записал в порт, считал - разобрал. Чтение/запись типовая ReadFile/WriteFile но нудная.
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37087580
floboss444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemargl,

1) в коде главное алгоритм а не правильно расставленные символы табуляции. ;)
Если так уж стесняешься мне весь код показать, скопируй хотя-бы сюда фрагмент,
где формируется строка запроса (адрес подчинённого устройства, номер функции, .... и т.д.) и его расшифровка...

2) Предположим, мы составили запрос и отправили в СОМ порт. Вопрос - как скоро ждать широковещательного ответа
подчинённого устройства в сети? Насколько эффективно будет рассчитать задержку исходя из скорости канала и размера пакета (по уму вроде так делают) или всё же сразу после запроса Master-Slave в цикле сделать ожидание ответа (так мне больше нравится и по логике вероятность "прозевать" ответ сводится к нулю...) ?
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37087678
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
floboss444,
Вот накопал 1) Это переделанный из модбаса протокол. Все крутилось в отдельном треде. MSVC6/MFC
Код: plaintext
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.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
//----------------------------------------------------------------------------
BOOL 
ComProt::WriteProt (LPBYTE pDataBuffer, DWORD dwBytesToWrite, PDWORD pdwBytesWritten)
{
	int OldPriority;
	HANDLE hThread;
	BOOL ok = FALSE;
	COMSTAT ComStat;
	DWORD dwComError;

	if ((pDataBuffer == NULL) || (dwBytesToWrite ==  0 ))
	{
		TRACE("ComProt::WriteProt: ERROR_PARAMETER");
		return FALSE;
	}

	hThread = GetCurrentThread();
	OldPriority = GetThreadPriority(hThread);
	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);

	// Sender belegen
	//TRACE("SendModBus: Warten auf Senderfreigabe...\n");
	if (WaitForSingleObject(hSenden, nErrTimeout) != WAIT_OBJECT_0){
		SetThreadPriority(hThread, OldPriority);
		TRACE("ComProt::WriteProt: Com Mutex busy\n");
		//DbgTrace(TRACE_WARNING, "SendModBus: ..Sender NICHT verfьgbar!\n");
		//SetLastError (ERROR_MODBUS_WAIT_SENDER);
		return FALSE;
	}
	//DbgTrace(TRACE_INFO+5, "SendModBus: ..Sender verfьgbar..\n");
 

	// Empfangspuffer-Inhalt lцschen
	PurgeComm(hIdCom, PURGE_RXCLEAR);
	ClearCommError(hIdCom, &dwComError, &ComStat);
	if (dwComError !=  0 )
		TRACE("WriteModBus: ClearCommError returned 0x%08x\n", dwComError);

/*
	// Hack.... Win95 OSR2 loses last 2 byte of packet. Suxx.
	*pDst++ = 0x44;
	*pDst++ = 0x44;
*/

/*	ResetEvent(pCB->hCommRxdByte);*/
	
	// really start to write
//	OVERLAPPED	TxOverlapped;

	if( !EscapeCommFunction(hIdCom, SETRTS) )
	{
		TRACE("ComProt::WriteProt: set RTS failed\n");
	}

	if (bIsRadio)
	{
		Sleep(nTangenTime ); 
	}
/**
	ClearCommError(hIdCom, &dwComError, &ComStat);
	if (dwComError)
		TRACE("WriteComm: Comm-Error %08x\n", dwComError);

	if (ComStat.cbInQue > 1)
	{
		TRACE("WriteComm: %d Bytes in Rx-Queue\n", ComStat.cbInQue);
		//
		// HACK - HACK - HACK
		///
		// Falls (unter Windows95) zwei COM-Ports auf dem gleichen Interrupt arbeiten,
		// wird ein ReadFile-Aufruf nicht mehr beendet, nachdem ein Programm den anderen
		// COM-Port geцffnet hat.
		// Um wenigstens nach dessen SchlieЯen den ReadFile-Aufruf beendet zu bekommen,
		// wird bei jedem Sendeversuch mit PurgeComm die Rx-Queue gelцscht, falls darin 
		// mehr als 1 Zeichen ist:
		PurgeComm(hIdCom, PURGE_RXCLEAR);
	}
 */
	if (!WriteFile (hIdCom, pDataBuffer, dwBytesToWrite, pdwBytesWritten, NULL/*&TxOverlapped*/))
	{
		DWORD dwError = GetLastError();
		if (dwError != ERROR_IO_PENDING)
		{
			DWORD dwComError;
			//???pCB->dwLastError = dwError;
			ClearCommError(hIdCom, &dwComError, &ComStat);
			if (dwComError)
			{
				TRACE("ComProt::WriteProt: Comm-Error %08x\n", dwComError);
				//???pCB->LastError.dwErrorCOM = dwComError;
				//MessageBox (HWND_DESKTOP, "WriteFile Comm-Error!", "", MB_OK | MB_ICONHAND);
			}
		}
		else
		{
			TRACE("WriteComm: WriteFile returns ERROR_IO_PENDING");
		}
	}
	if (*pdwBytesWritten == dwBytesToWrite)
	{
		TRACE("ComProt::WriteProt: Success\n");
		ok = TRUE;
	}
	else
		TRACE("ComProt::WriteProt: ..No Success..\n");

	TRACE("Write > %5.3f\n", (float)clock() / CLOCKS_PER_SEC);

	// wait to end transfer  ??????
	//Sleep(10);
	if (bIsRadio)
	{
		Sleep(nTangenTime ); 
	}

	if( !EscapeCommFunction(hIdCom, CLRRTS) )
	{
		TRACE("WriteComm: reset RTS failed\n");
	}

//	if( !PurgeComm(hIdCom, PURGE_RXCLEAR | PURGE_RXABORT) )
//	{
//		TRACE("WriteComm: Purge input buffer failed\n");
//	}

#ifndef NDEBUG
	// dump data
	CString		msg = "ComProt::WriteProt sent:";

	if( dwBytesToWrite )
	{
		TRACE("ComProt::WriteProt sent:");
		for( int i =  0 ; i < (int)dwBytesToWrite; i++ )
		{
			char buf[ 30 ];
			TRACE("%x ", pDataBuffer[i]);
			msg += itoa(pDataBuffer[i], buf,  16 );
			msg += " ";
		}
		TRACE("\n");
	}
	WriteLog(msg);
#endif
	
	// Sender wieder freigeben
	ReleaseMutex(hSenden); 
	SetThreadPriority(hThread, OldPriority);

	return ok;	
}


//----------------------------------------------------------------------------
BOOL 
ComProt::ReadProt (LPVOID pDataBuffer, DWORD dwBufferSize, PDWORD pdwBytesRead)
{
	BOOL bOk = FALSE;
	DWORD dwEventMask =  0 ;
	DWORD nRead =  0 ;
	BYTE szReadBfr[ 256 ];
	DWORD dwBytesRead;
	DWORD dwComError =  0 ;
	COMSTAT ComStat;
//	OVERLAPPED	RxOverlapped;
	int OldPriority;
	HANDLE hThread;

	if (WaitForSingleObject(hSenden, nErrTimeout) != WAIT_OBJECT_0){
		TRACE("ComProt::ReadProt:  Com Mutex busy\n");
		//DbgTrace(TRACE_WARNING, "SendModBus: ..Sender NICHT verfьgbar!\n");
		//SetLastError (ERROR_MODBUS_WAIT_SENDER);
		return FALSE;
	}


	hThread = GetCurrentThread();
	OldPriority = GetThreadPriority(hThread);
	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);

	TRACE("Read > %5.3f\n", (float)clock() / CLOCKS_PER_SEC);

	if (!ReadFile(hIdCom, szReadBfr, sizeof szReadBfr, &dwBytesRead, NULL/*&RxOverlapped*/))
	{
		DWORD dwError = GetLastError();
		TRACE("ReadModBus: ReadFile FAILED %d\n ", dwError);
	}

	ClearCommError(hIdCom, &dwComError, &ComStat);
/**
	// this must work, but with Prot won't. Why???
	if (dwComError != 0){
//			SetLastError(ERROR_MODBUS_COMERROR);//???
		TRACE("ReadModBus: ClearCommError FAILED %d\n", dwComError);
		return FALSE;
	}
 */
/* 1st-order frame check
	// searching DLE, checking size
	LPBYTE	ptr = szReadBfr; 
	BYTE byFrameLen;
	BOOL found = FALSE;
	while (ptr <= szReadBfr + dwBytesRead - FRAME_SZ - 2)
	{
		if (ptr[0] == DLE && ptr[2] == Options.byPuNum) // 1st fast check
		{
			byFrameLen = ptr[1];	// expected position
			if (byFrameLen > FRAME_SZ &&
				ptr + byFrameLen < szReadBfr + dwBytesRead)
			{
				found = TRUE;
				break;
			}
		}
		ptr++;
	}

	if( found )// ein RTU-Telegramm besteht aus mindestens Zeichen, weniger bedeutet Fehler
	{						
		WORD crc16;
		int nByte;
		crc16 = 0;
		for (nByte = 1; nByte <= byFrameLen - 2; nByte++)
		{
			crc16 = crc_byte(ptr[nByte], crc16);
		}
		if (LOBYTE(crc16) == ptr[byFrameLen - 1] &&
			HIBYTE(crc16) == ptr[byFrameLen])
		{
			*pdwBytesRead = byFrameLen - 2;
			memcpy(pDataBuffer, ptr + 1, *pdwBytesRead);
			bOk = TRUE;
		}
		else
			TRACE("ReadModBus: faked CRC\n");
	}
	else
	{
	 	// kleines data oder schlechte blok empfangen !!
		TRACE("ReadModBus: Broken or short frame\n");
	}
*/
	// only translate data 
	LPBYTE	ptr = szReadBfr; 
	*pdwBytesRead = dwBytesRead;
	memcpy(pDataBuffer, ptr, *pdwBytesRead);
	bOk = TRUE;

#ifndef NDEBUG
	// dump data
	CString		msg = "ComProt::ReadProt read:";

	if( dwBytesRead )
	{
		TRACE("ComProt::ReadProt read:");
		for( int i =  0 ; i < (int)dwBytesRead; i++ )
		{
			char buf[ 30 ];
			TRACE("%x ", szReadBfr[i]);
			msg += itoa(szReadBfr[i], buf,  16 );
			msg += " ";
		}
		TRACE("\n");
	}
	WriteLog(msg);
#endif

	if (bIsRadio)
	{
		Sleep(nPilotTime);
	}
	
	SetThreadPriority(hThread, OldPriority);

	ReleaseMutex(hSenden); 

	return bOk;
}


2) Ждать отчета сразу. У меня использовалось асинхронное чтение. Как Ивент сработал, так значит ответ пришел. Таймауты только надо подобрать.

3) Модбас понимают все. Найди бесплатную SCADA и не придется трахаться с написанием.
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37089447
bac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37110918
floboss444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо за документацию.
Будем почитать ;)
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37111988
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, что в wiki попасть нелбзя?
http://ru.wikipedia.org/wiki/Modbus
И что-то мне подсказывает, что порт там 485-й, а не 232-й
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37111993
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, работать с COM-портами лучше через это: http://moxa.com.ua/product/new_pr/pcomm_pro.htm
Библиотеки из состава маст-дая глючат безбожно.
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37112006
nik_x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nik_xДа, работать с COM-портами лучше через это: http://moxa.com.ua/product/new_pr/pcomm_pro.htm
Библиотеки из состава маст-дая глючат безбожно.
Вернее это: http://www.moxa.com/support/download.aspx?d_id=1189
(бесплатно)
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37114292
floboss444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оказывается есть библиотеки "от moxa" для работы с СОМ портом?!
Будем посмотреть. Спасибо.

*в основном использую плату "moxa CP-132". Ни разу не подводила...
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37125161
procurator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl,
сам писал протокол RTU и ASCII работает причем даже почти мультиплатформенно))) использовал во множестве проектов, код получился универсальный, поддерживает всего несколько функций, но из-за универсальности быстро наращивается. Документация по modbus в инете свободная, разжевано все хорошо все времена транзакции. Для участия нужна заинтерисованность.
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37126606
floboss444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
procurator,

заинтересованность какого рода нужна?
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37126969
procurator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
floboss444procurator,

заинтересованность какого рода нужна?
смысл учавствовать в проекте?
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37129389
floboss444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
дело добровольное. всё что мне интересно это исходники и люди которые их написали.
для этого форума это норма.
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37146490
procurator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37154430
dasg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть билиотека на C, реализующая Modbus через COM порт. Как ей пользоваться есть статья здесь .
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37163588
floboss444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dasg,

Спасибо за статью. Прочитал, понравилась. Автор написал что скоро напишет полную версию статьи.
Ждёмс...
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37185119
floboss444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
procuratorfloboss444procurator,

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

кто-то заставляет ?
...
Рейтинг: 0 / 0
Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
    #37249457
procurator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
floboss444procuratorпропущено...

смысл учавствовать в проекте?

кто-то заставляет ?
свои проекты есть, как успехи кстати? может как нибудь сделаю сайт с собственной библиотекой, если время будет.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Borlan builder C++ 6.0 + библиотека для COM порта + реализация MODBUS RTU для Floboss 103
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]