!!!! README BEFORE COMPILED !!!!
-----------------------------------------------------------------------------------------------------------------------------------
* ICPDAS.
* Power Meter Visual C++6.0 Demo Program
------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------
1. What is it?
------------------------------------------------------------------------------------------------------------------------------------
A simple program to read/write ICPDAS power meter.
This program use CModbus source code to implement modbus protocol.
------------------------------------------------------------------------------------------------------------------------------------
2. What is CModbus?
------------------------------------------------------------------------------------------------------------------------------------
CModbus is a free Windows Modbus Master project.
Free to download its Visual C++ 6.0 Source Code, Executables and Documentation.
------------------------------------------------------------------------------------------------------------------------------------
3. Before your first compiler this program!
------------------------------------------------------------------------------------------------------------------------------------
(1). Download [ modsrc02.zip ] file from http://mbserver.tripod.com/index.htm
(2). Decompress [ modsrc02.zip ] file, then you will see the [ utilclasses ] folder.
(3). Copy the [ utilclasses ] folder.
(4). Paste to the location that is the same layer with the [ Power Meter program ] folder.
(5). Now you can open [ mfcApp.dsw ] demo program project, and compiler it.
--------------------------------------------------------------------------------------------------------------------------------------
4. Modify CModbus CRC Error! (Optional)
--------------------------------------------------------------------------------------------------------------------------------------
When use the read/write register command of CModbus, it probably get a "CRC ERROR".
Because CModbus receive the return data form a modbus slave device just once.
If modbus master (ex: your programm) can't receive all return datas at a time, "CRC ERROR" will happen!
Modify CModbus "CRC Error" is optional ,not nessary.
Do the changes listed below to avoid "CRC ERROR":
(1). Open the "include\LocalModbus.h" and "scr\LocalModbus.cpp" file.
(2). Add one parameter "fullLengthResponse" in function ReadResponseRTU().
LocalModbus.h:
BOOL ReadResponseRTU(CByteArray& abyResponse, //Modbus Response with crc
DWORD& dwRead, //Real Number of bytes read from serial port
WORD fullLengthResponse); //Total Number of bytes should read from serial port
LocalModbus.cpp:
BOOL CLocalModbus::ReadResponseRTU(CByteArray& abyResponse,//bytes read
DWORD& dwRead, //Real Number of bytes read from serial port
WORD fullLengthResponse){ //Total Number of bytes should read from serial port
(3). In function CLocalModbus::ReadResponseRTU(go to the Line 932 at LocalModbus.cpp).
Use the following codes in blue color to add at Line 945:
****************************************
iRespMaxSize = abyResponse.GetSize();
dwRead=0;
DWORD dwTimeOut = 0;
WORD wError;
dwTimeOut = ::timeGetTime() + m_lTimeOut;
****************************************
(4). In function CLocalModbus::ReadResponseRTU(go to the Line 932 at LocalModbus.cpp).
Use the following codes instead of the original codes at Line 960 to 990, or add the folloing codes in blue color :
****************************************
if (INITIAL_READ==dwNumberOfBytesRead) {
if (dwRead>DWORD(iRespMaxSize-INITIAL_READ)) {
return FALSE;
}
fullLengthResponse = fullLengthResponse + 2; // CRC has 2 bytes
do{
if( !::ReadFile(m_hComHandle,&abyResponse[dwRead],(iRespMaxSize-INITIAL_READ),&dwNumberOfBytesRead,NULL) )
{ //read one charcter
if (::ClearCommError(m_hComHandle,&dwErrors,&cstStatus))
{ TRACE("ReadFile Errors 0x=%xd",dwErrors); }
else
{ TRACE(" ClearCommError Failed reading"); }
return (FALSE);
}
dwRead = dwRead+dwNumberOfBytesRead;
//if no data to receive,or baudrate/stopbit changed
if( dwTimeOut<::timeGetTime() )
{
wError=(ERR_TIMEOUT);
dwRead=0;
break; // break do-while
}
}while(dwRead < fullLengthResponse);
}
****************************************
(5). In function CLocalModbus::TxRxMessage(), to use ReadResponseRTU like that:
ReadResponseRTU(m_abyBuffer, dwNumberOfBytesRead, wLengthResponse)
The "wLengthResponse" is a variance already declared in function TxRxMessage().
Example:
if (!ReadResponseRTU(m_abyBuffer, dwNumberOfBytesRead, wLengthResponse))
{
TRACE("ReadResponse Failed");
wError=ERR_RD_PORT);
goto TxRxError;
}
(6). Compiler the program project again!