modbuimp.htm

来自「串口调试工具 用于串口调 试的很方便」· HTM 代码 · 共 691 行 · 第 1/2 页

HTM
691 行
字号

<p>extern CModbus* pModbus; // this pointer is created by a derived class. </p>

<p>WORD wError;<br>
wError = pModbus-&gt;<font size="3">PresetSingleRegister(17,1,3</font>) ; //preset
register 40002 to 03 in slave device 17 </p>

<p><font size="3"><strong>See also: <a href="excep.htm">CModbusExcetion</a> , <a
href="Errors.htm">Error Codes</a> ,<a href="#CModbus::PresetMultipleRegisters">PresetMultipleRegisters</a>
,<a href="#CModbus::ReadOutputRegisters">ReadOutputRegisters</a></strong></font></p>

<p><a name="CModbus::ForceSingleCoil"></a><font size="5"><strong>CModbus::ForceSingleCoil</strong></font></p>

<p><font size="3"><strong>WORD ForceSingleCoil(WORD nAddr, WORD nCoil, BOOL bCoilValue)</strong></font></p>

<p><font size="3"><strong>Return Value </strong></font></p>

<p><font size="3">A error code if the function failed or CModbus::ERR_OK if succeed. Use <a
href="#CModbus::ErrorMessage">ErrorMessage</a> to return an error description.</font></p>

<p><font size="3"><strong>Parameters </strong></font></p>

<p><font size="3">nAddr - Slave Address</font></p>

<p><font size="3">nCoil - Coil Address</font></p>

<p><font size="3">bCoilValue - Force Data - TRUE (ON) , FALSE (OFF).</font></p>

<p><font size="3"><strong>Remarks</strong></font></p>

<p>Force a single Coil (0<i>x</i> reference) , the first coil 00001 is 0, second 00002 is
1 and so on.</p>

<p><strong>example</strong>:</p>

<p>extern CModbus* pModbus; // this pointer is created by a derived class. </p>

<p>WORD wError;<br>
wError = pModbus-&gt;<font size="3">ForceSingleCoil(17,172,</font>TRUE) ; //force coil 173
ON in slave device 17</p>

<p><font size="3"><strong>See also: <a href="excep.htm">CModbusExcetion</a> , <a
href="Errors.htm">Error Codes</a> ,<a href="#CModbus::PresetMultipleRegisters">PresetMultipleRegisters</a></strong></font></p>

<p><a name="CModbus::PresetMultipleRegisters"></a><font size="5"><strong>CModbus::PresetMultipleRegisters</strong></font></p>

<p><strong>WORD PresetMultipleRegisters(WORD nAddr, WORD nDataStart , WORD nQtd ,
CWordArray&amp; anRegValues) </strong></p>

<p><strong>WORD PresetMultipleRegisters(WORD nAddr, WORD nDataStart , WORD nQtd ,
CShortArray&amp; anRegValues);</strong></p>

<p><strong>WORD PresetMultipleRegisters(WORD nAddr, WORD nDataStart ,WORD nQtd ,
CDblArray&amp; anRegValues,WORD wRealType = REAL_NORMAL); </strong></p>

<p><strong>WORD PresetMultipleRegisters(WORD nAddr, WORD nDataStart ,WORD nQtd ,
CFloatArray&amp; afRegValues,WORD wRealType = REAL_NORMAL); </strong></p>

<p><font size="3"><strong>Return Value </strong></font></p>

<p><font size="3">Error code if the function failed or CModbus::ERR_OK if succeed. Use <a
href="#CModbus::ErrorMessage">ErrorMessage</a> to return an error description.</font></p>

<p><font size="3"><strong>Parameters </strong></font></p>

<p><font size="3">nAddr - Slave Address</font></p>

<p><font size="3">nDataStart - Starting Address</font></p>

<p><font size="3">nQtd - number of registers to set. When setting 1 float number you are
actually setting 2 registers and 1 double means 4 registers.</font></p>

<p>anRegValues - Presets values Data</p>

<p><font size="3">wRealType - inverse the order of registers when reading real number
REAL_NORMAL (not reversed) REAL_REVERSE (reverse order).</font></p>

<p><font size="3"><strong>Remarks</strong></font></p>

<p>Presets values of holding registers (4<i>x</i> references) , the first register 40001
is 0, second 40002 is 1 and so on. When the data is a float number you are actually
setting 2 registers and with a double number 4 registers are set.</p>

<p><strong>example</strong>:</p>

<p>extern CModbus* pModbus; // this pointer is created by a derived class. </p>

<p>WORD wError;<br>
CWordArray anRegs;<br>
<br>
//preset two registers starting at 40002 to 00 0A and 01 02 hex, in slave device 17. </p>

<p>anRegs.SetSize(2);</p>

<p>anRegs(0)=0x000A;<br>
anRegs(1)=0x0102;<br>
wError = pModbus-&gt;<font size="3">PresetMultipleRegisters(17,2,</font>anRegs) ;</p>

<p><font size="3"><strong>See also: <a href="excep.htm">CModbusExcetion</a> , <a
href="Errors.htm">Error Codes</a> ,<a href="#CModbus::PresetSingleRegister">PresetSingleRegister</a></strong></font></p>

<p>&nbsp;</p>

<p><a name="CModbus::ForceMultipleCoils"></a><font size="5"><strong>CModbus::ForceMultipleCoils</strong></font></p>

<p><strong>WORD CModbus::ForceMultipleCoils(WORD nAddr, WORD nDataStart , WORD nQtd ,
CByteArray&amp; abCoilValues) </strong></p>

<p>&nbsp;</p>

<p><font size="3"><strong>Return Value </strong></font></p>

<p><font size="3">Error code if the function failed or CModbus::ERR_OK if succeed. Use <a
href="#CModbus::ErrorMessage">ErrorMessage</a> to return an error description.</font></p>

<p><font size="3"><strong>Parameters </strong></font></p>

<p><font size="3">nAddr - Slave Address</font></p>

<p><font size="3">nDataStart - Starting Address</font></p>

<p><font size="3">nQtd - number of registers to read </font></p>

<p>abCoilValues - Force values Data TRUE (ON) , FALSE (OFF).</p>

<p><font size="3"><strong>Remarks</strong></font></p>

<p>Force values of coils (0<i>x</i> references). , the first coil 00001 is 0, second 00002
is 1 and so on.</p>

<p><strong>example</strong>:</p>

<p>extern CModbus* pModbus; // this pointer is created by a derived class. </p>

<p>WORD wError;<br>
CWordArray anCoils;<br>
<br>
//force a series of 2 coils starting at coil 00020 in slave device 17. </p>

<p>anCoils.SetSize(2);</p>

<p>anCoils(0)=TRUE; //ON<br>
anCoils(1)=FALSE;//OFF</p>

<p><br>
wError = pModbus-&gt;<font size="3">ForceMultipleCoils(17,19,</font>2,anCoils) ;</p>

<p><font size="3"><strong>See also: <a href="excep.htm">CModbusExcetion</a> , <a
href="Errors.htm">Error Codes</a> ,<a href="#CModbus::ForceSingleCoil">ForceSingleCoil</a></strong></font></p>

<p>&nbsp;</p>

<p><a name="CModbus::ErrorMessage"></a><font size="5"><strong>CModbus::ErrorMessage</strong></font></p>

<p><strong>virtual CString ErrorMessage(WORD wErrorCode); </strong></p>

<p><font size="3"><strong>Return Value </strong></font></p>

<p>String message with error description.</p>

<p><font size="3"><strong>Parameters </strong></font></p>

<p>wErrorCode - An Error code returned by CModbus class function.</p>

<p><font size="3"><strong>Remarks</strong></font></p>

<p><font size="3">The return string is empty if the </font>wErrorCode is not found.</p>

<p>&nbsp;</p>

<p><font size="3"><strong>example:</strong></font></p>

<p>&nbsp;</p>

<p>extern CModbus* pModbus; // this pointer is created by a derived class. </p>

<p>WORD wError;<br>
wError = pModbus-&gt;<font size="3">ForceSingleCoil(17,172,</font>TRUE) ; //force coil 173
ON in slave device 17</p>

<p>if (CModbus::ERR_OK!=wError) {</p>

<p>AfxMessageBox(pModbus-&gt;ErrorMessage(wError)); //show error message</p>

<p>}</p>

<p>&nbsp;</p>

<p><font size="3"><strong>See also: <a href="excep.htm">CModbusException</a> , <a
href="Errors.htm">Error Codes</a></strong></font></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><a name="CModbus::TxRxMessage"></a><font size="5"><strong>CModbus::TxRxMessage</strong></font></p>

<p><strong>virtual WORD TxRxMessage(CByteArray&amp; abyQuery, WORD wLengthQuery,
CByteArray&amp; abyResponse, WORD wLengthResponse, WORD* pwNumOfBytesRead=NULL)=0;</strong></p>

<p>&nbsp;</p>

<p><font size="3"><strong>Return Value </strong></font></p>

<p><font size="3">Error code if the function failed or CModbus::ERR_OK if succeed. Use <a
href="#CModbus::ErrorMessage">ErrorMessage</a> to return an error description.</font></p>

<p><font size="3"><strong>Parameters </strong></font></p>

<p>abyQuery - Query message using RTU- Frame format. (input)</p>

<p>wLengthQuery - Query size. (input)</p>

<p>abyResponse - Response from device (output)</p>

<p>wLengthResponse - Response Size. (input) . This value must be 0 if you do not know the
response size, all bytes the slave sent to master will be in abyResponse buffer.</p>

<p>pwNumOfBytesRead - pointer of WORD variable the will be set with the number of bytes
read from device.</p>

<p><font size="3"><strong>Remarks</strong></font></p>

<p><font size="3">This function allow to send general modbus function to a slave or create
new modbus functions implemented in a particular device model.</font></p>

<p><font size="3"><strong>example:</strong></font></p>

<p><font size="3">This example show how to create a new modbus function in CModbus class.
Suppose we want to implement Modbus function 8 (Diagnostics) for checking communication.
The function will be called LoopbackTest, it just send message and verify if the device
return the same bytes of the query.</font></p>

<p><font size="3">WORD CModbus::LoopbackTest(WORD nAddr) {<br>
<br>
static const WORD QUERY_LENGHT=(6);<br>
static const WORD nReplyLength=(6);<br>
CByteArray abyQuery; <br>
CByteArray abyReply;<br>
WORD nError;<br>
int iReg;<br>
int iRetry=0;<br>
<br>
abyQuery.SetSize(QUERY_LENGHT);<br>
abyReply.SetSize(nReplyLength);<br>
//new modbus message see modbus protocol on www.modicon.com<br>
abyQuery[0]=(BYTE)nAddr; //ADDR <br>
abyQuery[1]=8; //Function <br>
abyQuery[2]=HIBYTE(0); //diag. code=0<br>
abyQuery[3]=LOBYTE(0);<br>
abyQuery[4]=0xA5;<br>
abyQuery[5]=0x37;<br>
<br>
do {<br>
nError=TxRxMessage(abyQuery,abyQuery.GetSize(),abyReply,nReplyLength); //send message to
device</font></p>

<p><font size="3">if (nError==ERR_OK) { //interpret response ,<br>
<br>
for (iReg=0;iReg&lt;QUERY_LENGHT;iReg++){<br>
if (abyReply[iReg]!=abyQuery[iReg]) {<br>
nError=ERR_INV_RESP;<br>
break;<br>
}<br>
}<br>
<br>
}<br>
<br>
iRetry++;<br>
<br>
} while ((iRetry&lt;m_wRetries)&amp;&amp;(ERR_OK!=nError)); <br>
<br>
ThrowModbusException(nError); <br>
<br>
return(nError);<br>
<br>
}//end LoopBackTest<br>
</font></p>

<p><font size="3"><strong>See also:</strong></font></p>

<p><a name="CModbus::Retries"></a><font size="5"><strong>CModbus::Retries</strong></font></p>

<p><strong>WORD Retries() const ;<br>
void Retries(WORD wRetries);</strong></p>

<p><font size="3"><strong>Remarks</strong></font></p>

<p>Get/Set number of times the message is sent to a slave before the function return an
error code. For instance,</p>

<p>if Retries() = 3 , when a messages is sent to a device and occur an error, that message
will be sent again more 2 times.</p>

<p><a name="CModbus::ThrowException"></a><font size="5"><strong>CModbus::ThrowException</strong></font></p>

<p><font size="3"><strong>BOOL ThrowException() const;<br>
void ThrowException(BOOL bThrow);</strong></font></p>

<p><font size="3"><strong>Remarks</strong></font></p>

<p><font size="3">When this property is TRUE, the CModbus class functions throw <a
href="excep.htm">CModbusException</a> instead of returning an error code. By Default this
property is FALSE.</font></p>

<p><strong>example</strong></p>

<p>&nbsp;</p>

<p><font size="2">extern CModbus* pModbus; // this pointer is created by a derived class. </font></p>

<p><font size="2">pModbus-&gt;ThrowException(TRUE);</font></p>

<p><font size="2">try {</font></p>

<blockquote>
  <p><font size="2">//It's not needed to verify each call for errors</font></p>
  <p><font size="2">pModbus-&gt;ForceSingleCoil(17,172,TRUE) ; //force coil 173 ON in slave
  device 17<br>
  pModbus-&gt;PresetSingleRegister(17,1,3) ; //preset register 40002 to 03 in slave device
  17 </font></p>
</blockquote>

<p><font size="2">}</font></p>

<p><font size="2">catch(CModbusException* pException) {</font></p>

<blockquote>
  <p><font size="2">TCHAR szCause[255]; </font></p>
  <p><font size="2">CString strFormatted; </font></p>
  <p><font size="2">pException-&gt;GetErrorMessage(szCause, 255); <br>
  strFormatted = _T(&quot;Modbus Function Error-&quot;);</font></p>
  <p><font size="2">strFormatted += szCause; AfxMessageBox(strFormatted);</font></p>
  <p><font size="2">AfxMessageBox(strFormatted);</font></p>
  <p><font size="2">pException-&gt;Delete();</font></p>
</blockquote>

<p><font size="2">}</font></p>

<p><font size="3"><strong>See also: <a href="excep.htm">CModbusException</a></strong></font></p>
</body>
</html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?